From 567cf679633bb81b63c8081315c9cc76cdbef0a0 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Wed, 20 Oct 2021 21:37:08 +0200 Subject: pervasive_aurora_mb: add partial update support --- src/driver/pervasive_aurora_mb.cc | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/driver/pervasive_aurora_mb.cc b/src/driver/pervasive_aurora_mb.cc index c244a72..c83f16b 100644 --- a/src/driver/pervasive_aurora_mb.cc +++ b/src/driver/pervasive_aurora_mb.cc @@ -56,7 +56,7 @@ void PervasiveAuroraMb::initialize(signed char temperature) spiWrite(0xe3, (const unsigned char[]){0x88}, 1); } -void PervasiveAuroraMb::sendImage(unsigned char *frame) +void PervasiveAuroraMb::sendImage(unsigned char *frame, unsigned int x, unsigned int y, unsigned int w, unsigned int h) { unsigned char null_int[2] = {0x00, 0x00}; spiWrite(0x10, 0, 0); @@ -71,8 +71,30 @@ void PervasiveAuroraMb::sendImage(unsigned char *frame) */ spiWrite(0x13, 0, 0); gpio.write(PERVASIVE_AURORA_CS_PIN, 0); - for (unsigned int i = 0; i < 300*(400/16); i++) { - spi.xmit(2, null_int, 0, frame); + if (w == 0 || h == 0) { + for (unsigned int i = 0; i < 300*(400/16); i++) { + spi.xmit(2, null_int, 0, frame); + } + } else { + unsigned int y1_mod = y % 8; + unsigned int y2_mod = (y + h) % 8; + for (unsigned int x_pos = 0; x_pos < 300; x_pos++) { + for (unsigned int y_pos = 0; y_pos < 400/8; y_pos++) { + if (x_pos < x || x_pos >= x+w || y_pos < y/8 || y_pos > (y+h)/8) { + // outside of update area + null_int[0] = 0xff; + } else if (y/8 == (y+h)/8) { + null_int[0] = (0xff << y2_mod) | (0xff >> (8-y1_mod)); + } else if (y_pos == y/8) { + null_int[0] = 0xff << y1_mod; + } else if (y_pos == (y+h)/8) { + null_int[0] = 0xff >> (8-y2_mod); + } else { + null_int[0] = 0x00; + } + spi.xmit(1, null_int, 0, frame); + } + } } gpio.write(PERVASIVE_AURORA_CS_PIN, 1); } -- cgit v1.2.3