From 0ae7e92de3d01eac0489a87dc391106f9aa97b85 Mon Sep 17 00:00:00 2001 From: Jelmer Date: Tue, 21 Feb 2023 01:04:44 +0100 Subject: [PATCH] support for direct-to-epd-fb-draw 1.54" --- tag_fw/drawing.c | 19 ++++++++++++++++++- tag_fw/drawing.h | 2 +- tag_fw/fw154.bin | Bin 54622 -> 55131 bytes tag_fw/syncedproto.c | 33 ++++++++++++++++++++++++++++++++- tag_fw/syncedproto.h | 2 +- 5 files changed, 52 insertions(+), 4 deletions(-) diff --git a/tag_fw/drawing.c b/tag_fw/drawing.c index 1e0d577a..1211384b 100644 --- a/tag_fw/drawing.c +++ b/tag_fw/drawing.c @@ -334,7 +334,24 @@ void ByteDecode(uint8_t byte) { epdSend(prev); } } - +#if (SCREEN_WIDTH == 152) +void drawImageFromBuffer(uint8_t* buffer, const uint8_t lut) { + pr("Doing raw 1bpp\n"); + epdSetup(); + if (lut) selectLUT(lut); + beginFullscreenImage(); + clearScreen(); + beginWriteFramebuffer(EPD_COLOR_BLACK); + epdSelect(); + for (uint16_t c = 0; c < (SCREEN_HEIGHT * (SCREEN_WIDTH / 8)); c++) { + epdSend(buffer[c]); + } + epdDeselect(); + endWriteFramebuffer(); + addOverlay(); + drawWithSleep(); +} +#endif void drawImageAtAddress(uint32_t addr, uint8_t lut) { struct EepromImageHeader* __xdata eih = (struct EepromImageHeader*)mClutMap; eepromRead(addr, mClutMap, sizeof(struct EepromImageHeader)); diff --git a/tag_fw/drawing.h b/tag_fw/drawing.h index cdd1c939..8ed12e96 100644 --- a/tag_fw/drawing.h +++ b/tag_fw/drawing.h @@ -8,6 +8,6 @@ void set_offline(__bit state); #pragma callee_saves drawImageAtAddress void drawImageAtAddress(uint32_t addr, uint8_t lut); - +void drawImageFromBuffer(uint8_t* buffer, const uint8_t lut); #endif diff --git a/tag_fw/fw154.bin b/tag_fw/fw154.bin index 840f1840c7c55ba936b4a11ac9716219278e6075..9282512b8deaeae8c24ec2013fe9473eca4da40d 100644 GIT binary patch literal 55131 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 Z0{O2N@A+N-n>Q#`n7Z%-;qTv;KLPZ-w|xKr literal 54622 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 xFa!(%L%dataType) { +#if (SCREEN_WIDTH == 152) + // the 1.54" screen is pretty small, we can write an entire 1bpp image from the block transfer buffer directly to the EPD buffer + case DATATYPE_IMG_RAW_1BPP_DIRECT: + pr("Direct draw image received\n"); + if (curDataInfo.dataSize == 0 && xMemEqual((const void *__xdata) & avail->dataVer, (const void *__xdata) & curDataInfo.dataVer, 8)) { + // we've downloaded this already, we're guessing it's already displayed + pr("currently shown image, send xfc\n"); + powerUp(INIT_RADIO); + sendXferComplete(); + powerDown(INIT_RADIO); + return true; + } + xMemCopyShort(&curDataInfo, (void *)avail, sizeof(struct AvailDataInfo)); + if (avail->dataSize > 4096) avail->dataSize = 4096; + + if (getDataBlock(avail->dataSize)) { + powerUp(INIT_RADIO); + sendXferComplete(); + powerDown(INIT_RADIO); + + curDataInfo.dataSize = 0; // mark as transfer not pending + powerUp(INIT_EPD); + drawImageFromBuffer(blockXferBuffer, drawWithLut); + powerDown(INIT_EPD); + drawWithLut = 0; // default back to the regular ol' stock/OTP LUT + return true; + } + return false; + break; +#endif case DATATYPE_IMG_BMP: case DATATYPE_IMG_DIFF: case DATATYPE_IMG_RAW_1BPP: diff --git a/tag_fw/syncedproto.h b/tag_fw/syncedproto.h index b5bd6139..fe39ec87 100644 --- a/tag_fw/syncedproto.h +++ b/tag_fw/syncedproto.h @@ -17,7 +17,7 @@ extern void killRadio(void); extern struct AvailDataInfo *__xdata getAvailDataInfo(); extern struct AvailDataInfo *__xdata getShortAvailDataInfo(); extern void drawImageFromEeprom(const uint8_t imgSlot); -extern bool processAvailDataInfo(const struct AvailDataInfo *__xdata avail); +extern bool processAvailDataInfo(struct AvailDataInfo *__xdata avail); extern void initializeProto(); extern uint8_t detectAP(const uint8_t channel);