diff --git a/firmware/common/lcd_ili9341.cpp b/firmware/common/lcd_ili9341.cpp index 0f0dd319..ddda0f8c 100644 --- a/firmware/common/lcd_ili9341.cpp +++ b/firmware/common/lcd_ili9341.cpp @@ -179,6 +179,11 @@ void lcd_ramwr_start() { io.lcd_data_write_command_and_data(0x2c, {}); } +void lcd_ramrd_start() { + io.lcd_data_write_command_and_data(0x2e, {}); + io.lcd_read_word(); +} + void lcd_caset(const uint_fast16_t start_column, uint_fast16_t end_column) { lcd_set(0x2a, start_column, end_column); } @@ -196,12 +201,27 @@ void lcd_start_ram_write( lcd_ramwr_start(); } +void lcd_start_ram_read( + const ui::Point p, + const ui::Size s +) { + lcd_caset(p.x, p.x + s.w - 1); + lcd_paset(p.y, p.y + s.h - 1); + lcd_ramrd_start(); +} + void lcd_start_ram_write( const ui::Rect& r ) { lcd_start_ram_write(r.pos, r.size); } +void lcd_start_ram_read( + const ui::Rect& r +) { + lcd_start_ram_read(r.pos, r.size); +} + void lcd_vertical_scrolling_definition( const uint_fast16_t top_fixed_area, const uint_fast16_t vertical_scrolling_area, @@ -299,6 +319,19 @@ void ILI9341::draw_pixels( io.lcd_write_pixels(colors, count); } +void ILI9341::read_pixels( + const ui::Rect r, + ui::ColorRGB888* const colors, + const size_t count +) { + /* TODO: Assert that rectangle width x height < count */ + lcd_start_ram_read(r); + io.lcd_read_bytes( + reinterpret_cast(colors), + count * sizeof(ui::ColorRGB888) + ); +} + void ILI9341::draw_bitmap( const ui::Point p, const ui::Size size, diff --git a/firmware/common/lcd_ili9341.hpp b/firmware/common/lcd_ili9341.hpp index 7c5cda38..c277f407 100644 --- a/firmware/common/lcd_ili9341.hpp +++ b/firmware/common/lcd_ili9341.hpp @@ -65,6 +65,14 @@ public: draw_pixels(r, colors.data(), colors.size()); } + template + void read_pixels( + const ui::Rect r, + std::array& colors + ) { + read_pixels(r, colors.data(), colors.size()); + } + void draw_bitmap( const ui::Point p, const ui::Size size, @@ -101,6 +109,7 @@ private: scroll_t scroll_state; void draw_pixels(const ui::Rect r, const ui::Color* const colors, const size_t count); + void read_pixels(const ui::Rect r, ui::ColorRGB888* const colors, const size_t count); }; } /* namespace lcd */