Skip to content

Commit

Permalink
Merge pull request #16 from pimoroni/patch-picographics-animation-unp…
Browse files Browse the repository at this point in the history
…acking

Region and filename support for load_animation.
  • Loading branch information
Gadgetoid authored Sep 12, 2023
2 parents cf525b7 + 079d1d9 commit 76bcbbf
Show file tree
Hide file tree
Showing 15 changed files with 2,853 additions and 2,391 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/micropython.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:

env:
MICROPYTHON_VERSION: 856e08b1931b88271816a2f60648f6ff332235b2
PIMORONI_PICO_VERSION: v1.20.5
PIMORONI_PICO_VERSION: main
WORKFLOW_VERSION: v1

jobs:
Expand Down
55 changes: 43 additions & 12 deletions drivers/dv_display/dv_display.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,10 @@ namespace pimoroni {

void DVDisplay::flip() {
if (mode == MODE_PALETTE) {
write_palette();
if (rewrite_palette > 0) {
write_palette();
--rewrite_palette;
}
if (pixel_buffer_location.y != -1) {
ram.write(point_to_address_palette(pixel_buffer_location), pixel_buffer, pixel_buffer_x);
pixel_buffer_location.y = -1;
Expand Down Expand Up @@ -230,6 +233,18 @@ namespace pimoroni {
i2c->read_bytes(I2C_ADDR, I2C_REG_EDID, edid, 128);
}

void DVDisplay::set_display_palette_index(uint8_t idx) {
i2c->reg_write_uint8(I2C_ADDR, I2C_REG_PALETTE_INDEX, idx);
}

void DVDisplay::set_local_palette_index(uint8_t idx) {
current_palette = idx;
}

uint8_t DVDisplay::get_local_palette_index() {
return current_palette;
}

void DVDisplay::write(uint32_t address, size_t len, const uint16_t colour)
{
uint32_t val = colour | ((uint32_t)colour << 16);
Expand Down Expand Up @@ -368,28 +383,44 @@ namespace pimoroni {
rewrite_header = true;
set_scroll_idx_for_lines(-1, 0, display_height);
if (mode == MODE_PALETTE) {
write_palette();
rewrite_palette = 2;
}
}

void DVDisplay::set_palette(RGB888 new_palette[PALETTE_SIZE])
void DVDisplay::set_palette(RGB888 new_palette[PALETTE_SIZE], int palette_idx)
{
for (int i = 0; i < PALETTE_SIZE; ++i) {
set_palette_colour(i, new_palette[i]);
set_palette_colour(i, new_palette[i], palette_idx);
}
}

void DVDisplay::set_palette_colour(uint8_t entry, RGB888 colour, int palette_idx)
{
uint8_t* palette_entry = palette + (palette_idx * PALETTE_SIZE + entry) * 3;
palette_entry[0] = (colour >> 16) & 0xFF;
palette_entry[1] = (colour >> 8) & 0xFF;
palette_entry[2] = colour & 0xFF;
rewrite_palette = 2;
}

void DVDisplay::set_palette(RGB888 new_palette[PALETTE_SIZE])
{
set_palette(new_palette, current_palette);
}

void DVDisplay::set_palette_colour(uint8_t entry, RGB888 colour)
{
palette[entry * 3] = (colour >> 16) & 0xFF;
palette[entry * 3 + 1] = (colour >> 8) & 0xFF;
palette[entry * 3 + 2] = colour & 0xFF;
set_palette_colour(entry, colour, current_palette);
}

void DVDisplay::write_palette()
{
uint addr = (display_height + 7) * 4;
ram.write(addr, (uint32_t*)palette, PALETTE_SIZE * 3);
ram.write(addr, (uint32_t*)palette, NUM_PALETTES * PALETTE_SIZE * 3);
}

RGB888* DVDisplay::get_palette(uint8_t idx) {
return (uint32_t*)palette;
}

void DVDisplay::write_palette_pixel(const Point &p, uint8_t colour)
Expand Down Expand Up @@ -445,8 +476,8 @@ namespace pimoroni {
buf[2] = full_width << 16;
buf[3] = (uint32_t)display_height << 16;
buf[4] = 0x00000001;
buf[5] = 0x00010000 + display_height + ((uint32_t)bank << 24);
buf[6] = 0x04000001;
buf[5] = 0x00000000 + display_height + ((uint32_t)bank << 24);
buf[6] = 0x04000000 + NUM_PALETTES;
ram.write(0, buf, 7 * 4);
ram.wait_for_finish_blocking();
}
Expand All @@ -456,7 +487,7 @@ namespace pimoroni {
constexpr uint32_t buf_size = 32;
uint32_t buf[buf_size];

uint addr = (display_height + 7) * 4 + PALETTE_SIZE * 3;
uint addr = (display_height + 7) * 4 + NUM_PALETTES * PALETTE_SIZE * 3;
uint sprite_type = (uint)mode << 28;
for (uint32_t i = 0; i < max_num_sprites; i += buf_size) {
for (uint32_t j = 0; j < buf_size; ++j) {
Expand Down
36 changes: 26 additions & 10 deletions drivers/dv_display/dv_display.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@
namespace pimoroni {

// This is ARGB1555 only for now
class DVDisplay : public IDirectDisplayDriver<uint16_t>, public IDirectDisplayDriver<RGB888>, public IPaletteDisplayDriver {
class DVDisplay {
public:
static constexpr int PALETTE_SIZE = 32;
static constexpr int NUM_PALETTES = 2;

enum Mode {
MODE_PALETTE = 2,
Expand Down Expand Up @@ -50,6 +51,7 @@ namespace pimoroni {
static constexpr uint I2C_REG_GPIO_HI_PULL_UP = 0xCB;
static constexpr uint I2C_REG_GPIO_HI_PULL_DOWN = 0xCC;
static constexpr uint I2C_REG_EDID = 0xED;
static constexpr uint I2C_REG_PALETTE_INDEX = 0xEE;
static constexpr uint I2C_REG_SCROLL_BASE = 0xF0;

//--------------------------------------------------
Expand Down Expand Up @@ -133,14 +135,14 @@ namespace pimoroni {
}

// 16bpp interface
void write_pixel(const Point &p, uint16_t colour) override;
void write_pixel_span(const Point &p, uint l, uint16_t colour) override;
void write_pixel(const Point &p, uint16_t colour);
void write_pixel_span(const Point &p, uint l, uint16_t colour);
void write_pixel_span(const Point &p, uint l, uint16_t *data);
void read_pixel_span(const Point &p, uint l, uint16_t *data) override;
void read_pixel_span(const Point &p, uint l, uint16_t *data);

// 24bpp interface
void write_pixel(const Point &p, RGB888 colour) override;
void write_pixel_span(const Point &p, uint l, RGB888 colour) override;
void write_pixel(const Point &p, RGB888 colour);
void write_pixel_span(const Point &p, uint l, RGB888 colour);

void init(uint16_t width, uint16_t height, Mode mode = MODE_RGB555, uint16_t frame_width = 0, uint16_t frame_height = 0);
void flip();
Expand Down Expand Up @@ -168,9 +170,16 @@ namespace pimoroni {
// 32 colour palette mode. Note that palette entries range from 0-31,
// but when writing colour values the palette entry is in bits 6-2, so the
// entry value is effectively multiplied by 4.
// The palette idx
void set_mode(Mode new_mode);
void set_palette(RGB888 palette[PALETTE_SIZE], int palette_idx = 0);
void set_palette(RGB888 palette[PALETTE_SIZE]);
void set_palette_colour(uint8_t entry, RGB888 colour, int palette_idx);
void set_palette_colour(uint8_t entry, RGB888 colour);
void set_display_palette_index(uint8_t idx);
void set_local_palette_index(uint8_t idx);
uint8_t get_local_palette_index();
RGB888* get_palette(uint8_t idx = 0);

void write_palette_pixel(const Point &p, uint8_t colour);
void write_palette_pixel_span(const Point &p, uint l, uint8_t colour);
Expand Down Expand Up @@ -208,9 +217,19 @@ namespace pimoroni {
// The supplied buffer must be at least 128 bytes long
void get_edid(uint8_t* edid);

// Raw access to frame buffer
uint32_t point_to_address(const Point& p) const;
int pixel_size() const;
int frame_row_stride() const { return (int)frame_width * 6; }
void raw_read_async(uint32_t address, uint32_t* data, uint32_t len_in_words) { ram.read(address, data, len_in_words); }
void raw_write_async(uint32_t address, uint32_t* data, uint32_t len_in_words) { ram.write(address, data, len_in_words << 2); }
void raw_wait_for_finish_blocking() { ram.wait_for_finish_blocking(); }

protected:
uint8_t palette[PALETTE_SIZE * 3] alignas(4);
uint8_t palette[NUM_PALETTES * PALETTE_SIZE * 3] alignas(4);
bool rewrite_header = false;
uint8_t rewrite_palette = 0;
uint8_t current_palette = 0;

virtual void write_palette();
virtual void write_header();
Expand All @@ -233,9 +252,6 @@ namespace pimoroni {

void define_sprite_internal(uint16_t sprite_data_idx, uint16_t width, uint16_t height, uint32_t* data, uint32_t bytes_per_pixel);

uint32_t point_to_address(const Point& p) const;
int pixel_size() const;

uint32_t point_to_address16(const Point &p) const {
return base_address + ((p.y * (uint32_t)frame_width * 3) + p.x) * 2;
}
Expand Down
Loading

0 comments on commit 76bcbbf

Please sign in to comment.