From b3e7a3f9e8d98947b2098521fd281b4280a0345b Mon Sep 17 00:00:00 2001 From: Jonas Niesner Date: Fri, 3 Oct 2025 17:54:51 +0200 Subject: [PATCH 1/5] Delete src/GxEPD2_display_selection_new_style.h --- src/GxEPD2_display_selection_new_style.h | 264 ----------------------- 1 file changed, 264 deletions(-) delete mode 100644 src/GxEPD2_display_selection_new_style.h diff --git a/src/GxEPD2_display_selection_new_style.h b/src/GxEPD2_display_selection_new_style.h deleted file mode 100644 index 7bba7b7..0000000 --- a/src/GxEPD2_display_selection_new_style.h +++ /dev/null @@ -1,264 +0,0 @@ -// select the display class (only one), matching the kind of display panel -#define GxEPD2_DISPLAY_CLASS GxEPD2_BW -//#define GxEPD2_DISPLAY_CLASS GxEPD2_3C -// #define GxEPD2_DISPLAY_CLASS GxEPD2_4C -// #define GxEPD2_DISPLAY_CLASS GxEPD2_7C - -// select the display driver class (only one) for your panel -// #define GxEPD2_DRIVER_CLASS GxEPD2_102 // GDEW0102T4 80x128, UC8175, (WFT0102CZA2) -// #define GxEPD2_DRIVER_CLASS GxEPD2_150_BN // DEPG0150BN 200x200, SSD1681, (FPC8101), TTGO T5 V2.4.1 -// #define GxEPD2_DRIVER_CLASS GxEPD2_154 // GDEP015OC1 200x200, IL3829, (WFC0000CZ07), no longer available -// #define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681, (HINK-E154A07-A1) -// #define GxEPD2_DRIVER_CLASS GxEPD2_154_T8 // GDEW0154T8 152x152, UC8151 (IL0373), (WFT0154CZ17) -// #define GxEPD2_DRIVER_CLASS GxEPD2_154_M09 // GDEW0154M09 200x200, JD79653A, (WFT0154CZB3) -// #define GxEPD2_DRIVER_CLASS GxEPD2_154_M10 // GDEW0154M10 152x152, UC8151D, (WFT0154CZ17) -// #define GxEPD2_DRIVER_CLASS GxEPD2_154_GDEY0154D67 // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213 // GDE0213B1 122x250, IL3895, (HINK-E0213-G01), phased out -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 122x250, SSD1675A (IL3897), (HINK-E0213A22-A0 SLH1852) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 122x250, SSD1675B, (HINK-E0213A22-A0 SLH1914) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_B74 // GDEM0213B74 122x250, SSD1680, FPC-7528B) // # FIXME: this is the one I have -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_flex // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_M21 // GDEW0213M21 104x212, UC8151 (IL0373), (WFT0213CZ16) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_T5D // GDEW0213T5D 104x212, UC8151D, (WFT0213CZ16) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_BN // DEPG0213BN 122x250, SSD1680, (FPC-7528B), TTGO T5 V2.4.1, V2.3.1 -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) -// #define GxEPD2_DRIVER_CLASS GxEPD2_260 // GDEW026T0 152x296, UC8151 (IL0373), (WFT0154CZ17) -// #define GxEPD2_DRIVER_CLASS GxEPD2_260_M01 // GDEW026M01 152x296, UC8151 (IL0373), (WFT0260CZB2) -// #define GxEPD2_DRIVER_CLASS GxEPD2_266_BN // DEPG0266BN 152x296, SSD1680, (FPC7510), TTGO T5 V2.66, TTGO T5 V2.4.1 -// #define GxEPD2_DRIVER_CLASS GxEPD2_266_GDEY0266T90 // GDEY0266T90 152x296, SSD1680, (FPC-A003 HB) -// #define GxEPD2_DRIVER_CLASS GxEPD2_270 // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) -// #define GxEPD2_DRIVER_CLASS GxEPD2_270_GDEY027T91 // GDEY027T91 176x264, SSD1680, (FB) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290 // GDEH029A1 128x296, SSD1608 (IL3820), (E029A01-FPC-A1 SYX1553) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_T5 // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) -//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5D // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) -//#define GxEPD2_DRIVER_CLASS GxEPD2_290_I6FD // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) -//#define GxEPD2_DRIVER_CLASS GxEPD2_290c // GDEW029Z10 128x296, UC8151 (IL0373), (WFT0290CZ10) -#define GxEPD2_DRIVER_CLASS GxEPD2_426_GDEQ0426T82 // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_T94 // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_T94_V2 // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b), Waveshare 2.9" V2 variant -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) -// #define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) -// #define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" -// #define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) -// #define GxEPD2_DRIVER_CLASS GxEPD2_420_M01 // GDEW042M01 400x300, UC8176 (IL0398), (WFT042CZ15) -// #define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T91 // GDEY042T91 400x300, SSD1683 (no inking) -// #define GxEPD2_DRIVER_CLASS GxEPD2_583 // GDEW0583T7 600x448, UC8159c (IL0371), (missing) -// #define GxEPD2_DRIVER_CLASS GxEPD2_583_T8 // GDEW0583T8 648x480, EK79655 (GD7965), (WFT0583CZ61) -// #define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) -// #define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) // FIXME: this is the big one I have -// #define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) -// #define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) -// #define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) -// 3-color e-papers -// #define GxEPD2_DRIVER_CLASS GxEPD2_154c // GDEW0154Z04 200x200, IL0376F, (WFT0000CZ04), no longer available -// #define GxEPD2_DRIVER_CLASS GxEPD2_154_Z90c // GDEH0154Z90 200x200, SSD1681, (HINK-E154A07-A1) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213c // GDEW0213Z16 104x212, UC8151 (IL0373), (WFT0213CZ16) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_Z19c // GDEH0213Z19 104x212, UC8151D, (HINK-E0213A20-A2 2020-11-19) -// #define GxEPD2_DRIVER_CLASS GxEPD2_213_Z98c // GDEY0213Z98 122x250, SSD1680, (FPC-A002 20.04.08) -// #define GxEPD2_DRIVER_CLASS GxEPD2_266c // GDEY0266Z90 152x296, SSD1680, (FPC-7510) -// #define GxEPD2_DRIVER_CLASS GxEPD2_270c // GDEW027C44 176x264, IL91874, (WFI0190CZ22) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290c // GDEW029Z10 128x296, UC8151 (IL0373), (WFT0290CZ10) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_Z13c // GDEH029Z13 128x296, UC8151D, (HINK-E029A10-A3 20160809) -// #define GxEPD2_DRIVER_CLASS GxEPD2_290_C90c // GDEM029C90 128x296, SSD1680, (FPC-7519 rev.b) -// #define GxEPD2_DRIVER_CLASS GxEPD2_420c // GDEW042Z15 400x300, UC8176 (IL0398), (WFT0420CZ15) -// #define GxEPD2_DRIVER_CLASS GxEPD2_420c_Z21 // GDEQ042Z21 400x300, UC8276, (hidden) -// #define GxEPD2_DRIVER_CLASS GxEPD2_583c // GDEW0583Z21 600x448, UC8159c (IL0371), (missing) -// #define GxEPD2_DRIVER_CLASS GxEPD2_583c_Z83 // GDEW0583Z83 648x480, EK79655 (GD7965), (WFT0583CZ61) -// #define GxEPD2_DRIVER_CLASS GxEPD2_750c // GDEW075Z09 640x384, UC8159c (IL0371), (WF0583CZ09) -// #define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z08 // GDEW075Z08 800x480, EK79655 (GD7965), (WFT0583CZ61) -// #define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90 880x528, SSD1677, (HINK-E075A07-A0) -// #define GxEPD2_DRIVER_CLASS GxEPD2_1248c // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) -// 4-color e-paper -// #define GxEPD2_DRIVER_CLASS GxEPD2_437c // Waveshare 4.37" 4-color -// 7-color e-paper -// #define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color -// #define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) -// grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT -// #define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 -// #define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 -// #define GxEPD2_DRIVER_CLASS GxEPD2_it78_1872x1404 // ED078KC2 1872x1404 -// #define GxEPD2_DRIVER_CLASS GxEPD2_it103_1872x1404 // ES103TC1 1872x1404 - -#if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) - -// somehow there should be an easier way to do this -#define GxEPD2_BW_IS_GxEPD2_BW true -#define GxEPD2_3C_IS_GxEPD2_3C true -#define GxEPD2_4C_IS_GxEPD2_4C true -#define GxEPD2_7C_IS_GxEPD2_7C true -#define GxEPD2_1248_IS_GxEPD2_1248 true -#define GxEPD2_1248c_IS_GxEPD2_1248c true -#define IS_GxEPD(c, x) (c##x) -#define IS_GxEPD2_BW(x) IS_GxEPD(GxEPD2_BW_IS_, x) -#define IS_GxEPD2_3C(x) IS_GxEPD(GxEPD2_3C_IS_, x) -#define IS_GxEPD2_4C(x) IS_GxEPD(GxEPD2_4C_IS_, x) -#define IS_GxEPD2_7C(x) IS_GxEPD(GxEPD2_7C_IS_, x) -#define IS_GxEPD2_1248(x) IS_GxEPD(GxEPD2_1248_IS_, x) -#define IS_GxEPD2_1248c(x) IS_GxEPD(GxEPD2_1248c_IS_, x) - -#include "GxEPD2_selection_check.h" - -#if defined(ESP8266) -#define MAX_DISPLAY_BUFFER_SIZE (81920ul - 34000ul - 5000ul) // ~34000 base use, change 5000 to your application use -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -// adapt the constructor parameters to your wiring -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=D8*/ EPD_CS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); -// mapping of Waveshare e-Paper ESP8266 Driver Board, new version -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); -// mapping of Waveshare e-Paper ESP8266 Driver Board, old version -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); -#undef MAX_DISPLAY_BUFFER_SIZE -#undef MAX_HEIGHT -#endif - -#if defined(NRF52840_XXAA) -#define MAX_DISPLAY_BUFFER_SIZE 65536ul // e.g. -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -// adapt the constructor parameters to your wiring -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=D8*/ EPD_CS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); -// mapping of Waveshare e-Paper Universal HAT -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(EPD_CS,EPD_DC,EPD_RST,EPD_BUSY)); - -#undef MAX_DISPLAY_BUFFER_SIZE -#undef MAX_HEIGHT -#endif - -#if defined(ESP32) -#define MAX_DISPLAY_BUFFER_SIZE 65536ul // e.g. -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -// adapt the constructor parameters to your wiring -#if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) -#if defined(ARDUINO_LOLIN_D32_PRO) -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/0, /*RST=*/2, /*BUSY=*/15)); // my LOLIN_D32_PRO proto board -#else -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/17, /*RST=*/16, /*BUSY=*/4)); // my suggested wiring and proto board - // GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 - // GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 19, /*RST=*/ 4, /*BUSY=*/ 34)); // LILYGO® TTGO T5 2.66 - // GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // e.g. TTGO T8 ESP32-WROVER - // GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare ESP32 Driver Board -#endif -#else // GxEPD2_1248 or GxEPD2_1248c -// Waveshare 12.48 b/w or b/w/r SPI display board and frame or Good Display 12.48 b/w panel GDEW1248T3 or b/w/r panel GDEY1248Z51 -// general constructor for use with all parameters, e.g. for Waveshare ESP32 driver board mounted on connection board -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*sck=*/13, /*miso=*/12, /*mosi=*/14, - /*cs_m1=*/23, /*cs_s1=*/22, /*cs_m2=*/16, /*cs_s2=*/19, - /*dc1=*/25, /*dc2=*/17, /*rst1=*/33, /*rst2=*/5, - /*busy_m1=*/32, /*busy_s1=*/26, /*busy_m2=*/18, /*busy_s2=*/4)); -#endif -#undef MAX_DISPLAY_BUFFER_SIZE -#undef MAX_HEIGHT -#endif - -// can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics) -#if defined(ARDUINO_ARCH_STM32) -#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -// adapt the constructor parameters to your wiring -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=PA4*/ EPD_CS, /*DC=*/PA3, /*RST=*/PA2, /*BUSY=*/PA1)); -#undef MAX_DISPLAY_BUFFER_SIZE -#undef MAX_HEIGHT -#endif - -#if defined(__AVR) -#if defined(ARDUINO_AVR_MEGA2560) // Note: SS is on 53 on MEGA -#define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200 -#else // Note: SS is on 10 on UNO, NANO -#define MAX_DISPLAY_BUFFER_SIZE 800 // -#endif -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -// adapt the constructor parameters to your wiring -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/EPD_CS, /*DC=*/8, /*RST=*/9, /*BUSY=*/7)); -// for Arduino Micro or Arduino Leonardo with CS on 10 on my proto boards (SS would be 17) uncomment instead: -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 10, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); -#endif - -#if defined(ARDUINO_ARCH_SAM) -#define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -// adapt the constructor parameters to your wiring -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=10*/ EPD_CS, /*DC=*/8, /*RST=*/9, /*BUSY=*/7)); -#undef MAX_DISPLAY_BUFFER_SIZE -#undef MAX_HEIGHT -#endif - -#if defined(ARDUINO_ARCH_SAMD) -#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -// adapt the constructor parameters to your wiring -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/7, /*RST=*/6, /*BUSY=*/5)); -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // my Seed XIOA0 -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // my other Seed XIOA0 -#undef MAX_DISPLAY_BUFFER_SIZE -#undef MAX_HEIGHT -#endif - -#if defined(ARDUINO_ARCH_RP2040) -#define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) -#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) -#endif -#if defined(ARDUINO_NANO_RP2040_CONNECT) -// adapt the constructor parameters to your wiring -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/EPD_CS, /*DC=*/8, /*RST=*/9, /*BUSY=*/7)); -#endif -#if defined(ARDUINO_RASPBERRY_PI_PICO) -// adapt the constructor parameters to your wiring -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board -// mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! -GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/3, /*DC=*/2, /*RST=*/1, /*BUSY=*/0)); // DESPI-PICO -// GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified -#endif -#undef MAX_DISPLAY_BUFFER_SIZE -#undef MAX_HEIGHT -#endif - -#endif From b045aa015b46447d6d6eda0a1f0dd0309bded11f Mon Sep 17 00:00:00 2001 From: Jonas Niesner Date: Fri, 3 Oct 2025 17:55:02 +0200 Subject: [PATCH 2/5] Delete src/GxEPD2_selection_check.h --- src/GxEPD2_selection_check.h | 141 ----------------------------------- 1 file changed, 141 deletions(-) delete mode 100644 src/GxEPD2_selection_check.h diff --git a/src/GxEPD2_selection_check.h b/src/GxEPD2_selection_check.h deleted file mode 100644 index 3a5f061..0000000 --- a/src/GxEPD2_selection_check.h +++ /dev/null @@ -1,141 +0,0 @@ -#define GxEPD2_102_IS_BW true -#define GxEPD2_150_BN_IS_BW true -#define GxEPD2_154_IS_BW true -#define GxEPD2_154_D67_IS_BW true -#define GxEPD2_154_T8_IS_BW true -#define GxEPD2_154_M09_IS_BW true -#define GxEPD2_154_M10_IS_BW true -#define GxEPD2_154_GDEY0154D67_IS_BW true -#define GxEPD2_213_IS_BW true -#define GxEPD2_213_B72_IS_BW true -#define GxEPD2_213_B73_IS_BW true -#define GxEPD2_213_B74_IS_BW true -#define GxEPD2_213_flex_IS_BW true -#define GxEPD2_213_M21_IS_BW true -#define GxEPD2_213_T5D_IS_BW true -#define GxEPD2_213_BN_IS_BW true -#define GxEPD2_213_GDEY0213B74_IS_BW true -#define GxEPD2_260_IS_BW true -#define GxEPD2_260_M01_IS_BW true -#define GxEPD2_266_BN_IS_BW true -#define GxEPD2_266_GDEY0266T90_IS_BW true -#define GxEPD2_270_IS_BW true -#define GxEPD2_270_GDEY027T91_IS_BW true -#define GxEPD2_290_IS_BW true -#define GxEPD2_290_T5_IS_BW true -#define GxEPD2_290_T5D_IS_BW true -#define GxEPD2_290_I6FD_IS_BW true -#define GxEPD2_290_T94_IS_BW true -#define GxEPD2_290_T94_V2_IS_BW true -#define GxEPD2_290_BS_IS_BW true -#define GxEPD2_290_M06_IS_BW true -#define GxEPD2_290_GDEY029T94_IS_BW true -#define GxEPD2_290_GDEY029T71H_IS_BW true -#define GxEPD2_310_GDEQ031T10_IS_BW true -#define GxEPD2_371_IS_BW true -#define GxEPD2_370_TC1_IS_BW true -#define GxEPD2_370_GDEY037T03_IS_BW true -#define GxEPD2_397_GDEM0397T81_IS_BW true -#define GxEPD2_420_IS_BW true -#define GxEPD2_420_M01_IS_BW true -#define GxEPD2_420_GDEY042T81_IS_BW true -#define GxEPD2_420_GYE042A87_IS_BW true -#define GxEPD2_420_SE0420NQ04_IS_BW true -#define GxEPD2_426_GDEQ0426T82_IS_BW true -#define GxEPD2_579_GDEY0579T93_IS_BW true -#define GxEPD2_583_IS_BW true -#define GxEPD2_583_T8_IS_BW true -#define GxEPD2_583_GDEQ0583T31_IS_BW true -#define GxEPD2_750_IS_BW true -#define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_GDEY075T7_IS_BW true -#define GxEPD2_1020_GDEM102T91_IS_BW true -#define GxEPD2_1085_GDEM1085T51_IS_BW true -#define GxEPD2_1160_T91_IS_BW true -#define GxEPD2_1248_IS_BW true -#define GxEPD2_1330_GDEM133T91_IS_BW true -#define GxEPD2_it60_IS_BW true -#define GxEPD2_it60_1448x1072_IS_BW true -#define GxEPD2_it78_1872x1404_IS_BW true -#define GxEPD2_it103_1872x1404_IS_BW true -// 3-color e-papers -#define GxEPD2_154c_IS_3C true -#define GxEPD2_154_Z90c_IS_3C true -#define GxEPD2_213c_IS_3C true -#define GxEPD2_213_Z19c_IS_3C true -#define GxEPD2_213_Z98c_IS_3C true -#define GxEPD2_266c_IS_3C true -#define GxEPD2_270c_IS_3C true -#define GxEPD2_290c_IS_3C true -#define GxEPD2_290_Z13c_IS_3C true -#define GxEPD2_290_C90c_IS_3C true -#define GxEPD2_420c_IS_3C true -#define GxEPD2_420c_Z21_IS_3C true -#define GxEPD2_420c_GDEY042Z98_IS_3C true -#define GxEPD2_579c_GDEY0579Z93_IS_3C true -#define GxEPD2_583c_IS_3C true -#define GxEPD2_583c_Z83_IS_3C true -#define GxEPD2_583c_GDEQ0583Z31_IS_3C true -#define GxEPD2_750c_IS_3C true -#define GxEPD2_750c_Z08_IS_3C true -#define GxEPD2_750c_Z90_IS_3C true -#define GxEPD2_1160c_GDEY116Z91_IS_3C true -#define GxEPD2_1248c_IS_3C true -#define GxEPD2_1330c_GDEM133Z91_IS_3C true -// 4-color e-paper -#define GxEPD2_213c_GDEY0213F51_IS_4C true -#define GxEPD2_266c_GDEY0266F51H_IS_4C true -#define GxEPD2_290c_GDEY029F51H_IS_4C true -#define GxEPD2_300c_IS_4C true -#define GxEPD2_420c_GDEY0420F51_IS_4C true -#define GxEPD2_437c_IS_4C true -#define GxEPD2_0579c_GDEY0579F51_IS_4C true -#define GxEPD2_1160c_GDEY116F51_IS_4C true -// 7-color e-paper -#define GxEPD2_565c_IS_7C true -#define GxEPD2_565c_GDEP0565D90_IS_7C true -#define GxEPD2_730c_GDEY073D46_IS_7C true -#define GxEPD2_730c_ACeP_730_IS_7C true -#define GxEPD2_730c_GDEP073E01_IS_7C true - -#if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) -#define IS_GxEPD2_DRIVER(c, x) (c##x) -#define IS_GxEPD2_DRIVER_BW(x) IS_GxEPD2_DRIVER(x, _IS_BW) -#define IS_GxEPD2_DRIVER_3C(x) IS_GxEPD2_DRIVER(x, _IS_3C) -#define IS_GxEPD2_DRIVER_4C(x) IS_GxEPD2_DRIVER(x, _IS_4C) -#define IS_GxEPD2_DRIVER_7C(x) IS_GxEPD2_DRIVER(x, _IS_7C) -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_BW used with 3-color driver class" -#endif -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_BW used with 4-color driver class" -#endif -#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_BW used with 7-color driver class" -#endif -#if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_3C used with b/w driver class" -#endif -#if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_3C used with 4-color driver class" -#endif -#if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_3C used with 7-color driver class" -#endif -#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_4C used with b/w driver class" -#endif -#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_4C used with 3-color driver class" -#endif -#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_4C used with 7-color driver class" -#endif -#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) -#error "GxEPD2_7C used with less colors driver class" -#endif -#if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) -#error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" -#endif - -#endif \ No newline at end of file From c8f0f78effd730281898e37813c041982fb67db6 Mon Sep 17 00:00:00 2001 From: Jonas Niesner Date: Fri, 3 Oct 2025 17:55:13 +0200 Subject: [PATCH 3/5] Delete src/epd.h --- src/epd.h | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 src/epd.h diff --git a/src/epd.h b/src/epd.h deleted file mode 100644 index a7b0630..0000000 --- a/src/epd.h +++ /dev/null @@ -1,38 +0,0 @@ - - -#define USER_SETUP_ID 506 - -#define SSD1677_DRIVER - -#define EPAPER_ENABLE - -#define TFT_WIDTH 800 -#define TFT_HEIGHT 480 - -#define EPD_WIDTH TFT_WIDTH -#define EPD_HEIGHT TFT_HEIGHT - -#define EPD_HORIZONTAL_MIRROR - -#define TFT_SCLK EPD_SCK -#define TFT_MOSI EPD_MOSI -#define TFT_MISO -1 -#define TFT_CS EPD_CS -#define TFT_DC EPD_DC -#define TFT_BUSY EPD_BUSY -#define TFT_RST EPD_RST - -#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH -#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters -#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters -#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm -#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. -#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. -// #define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT -#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts - -#define SMOOTH_FONT - -#define SPI_FREQUENCY 10000000 -#define SPI_READ_FREQUENCY 4000000 -#define ltoa itoa From ee5926c6b07a4ac3177ec668a7169d37f79f7573 Mon Sep 17 00:00:00 2001 From: Jonas Niesner Date: Fri, 3 Oct 2025 17:55:39 +0200 Subject: [PATCH 4/5] Add files via upload --- src/main.cpp | 330 +++++++++++++++++++++++---------------------------- 1 file changed, 149 insertions(+), 181 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 08ce40c..2ef5f32 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,11 +2,23 @@ #include #include "main.h" #include -#include -#include -#include -#include "GxEPD2_display_selection_new_style.h" #include +#include + +BBEPAPER epd(EP426_800x480); + +#define Led_RED 26 +#define Led_Green 30 +#define Led_Blue 06 +#define CS_PIN 44 +#define DC_PIN 31 +#define RESET_PIN 15 +#define BUSY_PIN 29 +#define CLK_PIN 45 +#define MOSI_PIN 47 +#define PowerPin 43 + +BLEDfu bledfu; BLEService imageService("1337"); BLECharacteristic imageCharacteristic("1337",BLEWrite | BLENotify, 512); @@ -18,43 +30,51 @@ uint8_t expectedPackets = 0; uint8_t receivedPackets = 0; static unsigned long lastLog = 0; -int serial_enabled = 0; -bool useserial = true; void setup() { - if (useserial) { - Serial.begin(115200); - bool usb_connected = bitRead(NRF_POWER->USBREGSTATUS, 0); - if (usb_connected) { - unsigned long startTime = millis(); - while (!Serial && (millis() - startTime) < 10000) delay(100); - if (Serial) { - serial_enabled = 1; - writeSerial("=== BLE OEPL Device Starting ==="); - writeSerial("USB detected, serial logging enabled and connected"); - } else { - serial_enabled = 0; - } - } - } - + pinMode(Led_RED, OUTPUT); + pinMode(Led_Green, OUTPUT); + pinMode(Led_Blue, OUTPUT); + digitalWrite(Led_RED, HIGH); + digitalWrite(Led_Green, HIGH); + digitalWrite(Led_Blue, HIGH); + delay(100); + digitalWrite(Led_RED, LOW); + delay(100); + digitalWrite(Led_RED, HIGH); + digitalWrite(Led_Green, LOW); + delay(100); + digitalWrite(Led_Green, HIGH); + digitalWrite(Led_Blue, LOW); + delay(100); + digitalWrite(Led_Blue, HIGH); + delay(100); + digitalWrite(Led_RED, LOW); + digitalWrite(Led_Green, LOW); + digitalWrite(Led_Blue, LOW); + delay(100); + digitalWrite(Led_RED, HIGH); + digitalWrite(Led_Green, HIGH); + digitalWrite(Led_Blue, HIGH); + + Serial.begin(115200); + bool usb_connected = bitRead(NRF_POWER->USBREGSTATUS, 0); + writeSerial("=== BLE OEPL Device Starting ==="); + writeSerial("Enabeling power management..."); pinMode(PowerPin, OUTPUT); digitalWrite(PowerPin, HIGH); - pwrmgm(true); - writeSerial("Initializing BLE..."); Bluefruit.configCentralBandwidth(BANDWIDTH_MAX); Bluefruit.configPrphBandwidth(BANDWIDTH_MAX); - - // Set maximum transmit power (+8 dBm) Bluefruit.setTxPower(8); - if (!Bluefruit.begin(1, 0)) { writeSerial("ERROR: Failed to initialize BLE!"); return; } + bledfu.begin(); + writeSerial("BLE DFU initialized successfully"); writeSerial("BLE initialized successfully"); writeSerial("Setting up BLE service 0x1337..."); imageService.begin(); @@ -83,24 +103,16 @@ void setup() { pinMode(VBAT_ENABLE, OUTPUT); digitalWrite(VBAT_ENABLE, LOW); writeSerial("Battery monitoring configured"); - - writeSerial("Initializing display..."); + writeSerial("Initializing display"); initDisplay(); writeSerial("Display initialized"); - pwrmgm(false); - writeSerial("=== Setup completed successfully ==="); - writeSerial("Configuring BLE advertising..."); // Disable automatic UUID advertising Bluefruit.Advertising.clearData(); - // Now add only the fields you want Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE); - - //save space here - //Bluefruit.Advertising.addTxPower(); Bluefruit.Advertising.addName(); @@ -127,38 +139,32 @@ Bluefruit.Advertising.addData(BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA, msd_pa Bluefruit.Advertising.restartOnDisconnect(true); Bluefruit.Advertising.setInterval(32, 1024); Bluefruit.Advertising.setFastTimeout(10); - writeSerial("Starting BLE advertising..."); - Bluefruit.Advertising.start(0); writeSerial("BLE advertising started - waiting for connections..."); - writeSerial("Advertising status: " + String(Bluefruit.Advertising.isRunning() ? "RUNNING" : "STOPPED")); } void pwrmgm(bool onoff){ - if(true){ if(onoff){ digitalWrite(PowerPin, HIGH); - pinMode(EPD_RST, OUTPUT); - pinMode(EPD_CS, OUTPUT); - pinMode(EPD_DC, OUTPUT); - pinMode(EPD_SCK, OUTPUT); - pinMode(EPD_MOSI, OUTPUT); + pinMode(RESET_PIN, OUTPUT); + pinMode(CS_PIN, OUTPUT); + pinMode(DC_PIN, OUTPUT); + pinMode(CLK_PIN, OUTPUT); + pinMode(MOSI_PIN, OUTPUT); delay(200); } else{ SPI.end(); - pinMode(EPD_RST, INPUT); - pinMode(EPD_CS, INPUT); - pinMode(EPD_DC, INPUT); - pinMode(EPD_SCK, INPUT); - pinMode(EPD_MOSI, INPUT); + pinMode(RESET_PIN, INPUT); + pinMode(CS_PIN, INPUT); + pinMode(DC_PIN, INPUT); + pinMode(CLK_PIN, INPUT); + pinMode(MOSI_PIN, INPUT); digitalWrite(PowerPin, LOW); } } -} - void loop() { if (currentImage.ready) { writeSerial("Processing received image..."); @@ -175,8 +181,6 @@ void loop() { } void writeSerial(String message, bool newLine) { - if (serial_enabled == 1) - { if (newLine == true) { Serial.println(message); @@ -185,36 +189,27 @@ void writeSerial(String message, bool newLine) { { Serial.print(message); } - } } void initDisplay() { writeSerial("=== Initializing Display ==="); - display.init(115200, true, 10, false); - - display.setFullWindow(); - display.setRotation(1); - display.epd2.setBusyCallback(busyCallback); - display.fillRect(0, 0, display.width(), display.height(), GxEPD_WHITE); - display.setTextColor(GxEPD_BLACK); - writeSerial("Display dimensions: " + String(display.width()) + "x" + String(display.height())); - writeSerial("Drawing initial display content..."); + pwrmgm(true); + epd.initIO(DC_PIN, RESET_PIN, BUSY_PIN, CS_PIN, MOSI_PIN, CLK_PIN); + epd.allocBuffer(); + epd.fillScreen(BBEP_WHITE); + epd.setTextColor(BBEP_BLACK, BBEP_WHITE); + epd.setFont(FONT_12x16); String chipId = getChipIdHex(); writeSerial("Chip ID for display: " + chipId); - display.firstPage(); - display.setTextSize(4); - - do { - display.setTextSize(4); - display.println("openepaperlink.org"); - display.println("ID:" + chipId); - display.println("Ready"); - } while (display.nextPage()); - - display.display(false); // Force full refresh - display.setRotation(0); - pwrmgm(false); // Power down display after initial setup - writeSerial("Initial display content drawn"); + epd.setCursor(100, 100); + epd.print("openepaperlink.org"); + epd.setCursor(100, 200); + epd.print("ID:" + chipId); + epd.setCursor(100, 300); + epd.print("Ready"); + epd.writePlane(); + epd.refresh(REFRESH_FULL, true); + pwrmgm(false); } void connect_callback(uint16_t conn_handle) { @@ -243,19 +238,6 @@ String getChipIdHex() { } void imageDataWritten(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len) { - //writeSerial("Connection handle: " + String(conn_hdl)); - //writeSerial("Data length: " + String(len) + " bytes"); - //String hexData = ""; - //for (int i = 0; i < min(len, 9999); i++) { - // if (data[i] < 16) hexData += "0"; - // hexData += String(data[i], HEX); - // hexData += " "; - //} - //writeSerial("Data (hex): " + hexData); - //if (len >= 2) { - // uint16_t command = (data[0] << 8) | data[1]; - // writeSerial("Detected command: 0x" + String(command, HEX)); - //} handleImageCommand(data, len); } @@ -353,8 +335,8 @@ void handleImageInfo(uint8_t* data, uint16_t len) { currentImage.dataType = dataType; currentImage.isCompressed = (dataType == 0x30); currentImage.ready = false; - currentImage.width = display.width(); - currentImage.height = display.height(); + currentImage.width = epd.width(); + currentImage.height = epd.height(); writeSerial("Image state initialized:"); writeSerial(" Size: " + String(currentImage.size) + " bytes"); writeSerial(" Type: 0x" + String(currentImage.dataType, HEX)); @@ -544,48 +526,16 @@ void displayReceivedImage() { writeSerial(" Compressed: " + String(currentImage.isCompressed ? "Yes" : "No")); writeSerial(" Dimensions: " + String(currentImage.width) + "x" + String(currentImage.height)); writeSerial(" Received: " + String(currentImage.received) + " bytes"); - - writeSerial("Powering on display..."); - digitalWrite(EPD_RST, HIGH); - delay(100); - display.init(115200, true, 2, false); - display.setFullWindow(); - delay(100); - writeSerial("Display powered on and initialized"); - writeSerial("Drawing image content..."); - display.firstPage(); - writeSerial("Image drawing - firstPage() called"); - int pageCount = 0; - unsigned long startTime = millis(); - do { - pageCount++; - writeSerial("Displaying page " + String(pageCount) + "..."); - drawImageData(); - if (millis() - startTime > 10000) { - writeSerial("WARNING: Display timeout after 10 seconds"); - break; - } - if (pageCount > 20) { - writeSerial("WARNING: Too many pages, stopping"); - break; - } - - } while (display.nextPage()); - writeSerial("Image display complete (" + String(pageCount) + " pages)"); - display.display(false); // Force full refresh - writeSerial("Hibernating display..."); + pwrmgm(true); + epd.initIO(DC_PIN, RESET_PIN, BUSY_PIN, CS_PIN, MOSI_PIN, CLK_PIN); + epd.allocBuffer(); + drawImageData(); + epd.writePlane(); + epd.refresh(REFRESH_FULL, true); pwrmgm(false); // Power down display after update is complete writeSerial("=== IMAGE DISPLAY COMPLETE ==="); } -void busyCallback(const void* userData) { - yield(); - if (millis() - lastLog > 1000) { - writeSerial("Display busy..."); - lastLog = millis(); - } -} - bool decompressImageData(uint8_t** output, uint32_t* outputSize) { writeSerial("Starting uzlib decompression..."); writeSerial("Input data size: " + String(currentImage.size) + " bytes"); @@ -675,20 +625,18 @@ bool decompressImageData(uint8_t** output, uint32_t* outputSize) { } void drawImageData() { - if (!currentImage.data) { - writeSerial("ERROR: No image data to draw"); - return; - } - pwrmgm(true); writeSerial("Drawing full image data..."); writeSerial("Displaying all " + String(currentImage.size) + " bytes of image data"); - uint16_t displayWidth = display.width(); - uint16_t displayHeight = display.height(); + + uint16_t displayWidth = epd.width(); + uint16_t displayHeight = epd.height(); uint32_t expectedBytes = (displayWidth * displayHeight) / 8; - writeSerial("Display dimensions: " + String(displayWidth) + "x" + String(displayHeight)); + writeSerial("Expected bytes for 1-bit: " + String(expectedBytes)); writeSerial("Actual received bytes: " + String(currentImage.size)); writeSerial("Image type: 0x" + String(currentImage.dataType, HEX)); + + //uncompressed image 1bpp if (currentImage.dataType == 0x20) { writeSerial("Processing 1-bit black/white image"); // Process uncompressed image data @@ -701,27 +649,71 @@ void drawImageData() { if (x >= displayHeight) break; bool pixelValue = (pixelByte >> bit) & 0x01; if (pixelValue) { - display.drawPixel(displayWidth - y, x, GxEPD_BLACK); + epd.drawPixel(displayWidth - y, x, BBEP_BLACK); } else { - display.drawPixel(displayWidth - y, x, GxEPD_WHITE); + epd.drawPixel(displayWidth - y, x, BBEP_WHITE); } x++; } - x--; // Adjust for the loop increment + x--; pixelIndex++; } } - } else if (currentImage.dataType == 0x30) { + } + + else if (currentImage.dataType == 0x30) { writeSerial("Processing compressed image data"); - // Check if we have complete data - if (currentImage.received < currentImage.size) { - writeSerial("ERROR: Incomplete data received: " + String(currentImage.received) + "/" + String(currentImage.size) + " bytes"); - writeSerial("Cannot decompress incomplete data"); - return; + // Dump compressed image buffer in hex + writeSerial("=== COMPRESSED IMAGE BUFFER HEX DUMP ==="); + writeSerial("Total size: " + String(currentImage.size) + " bytes"); + writeSerial("Received: " + String(currentImage.received) + " bytes"); + + // Dump first 64 bytes in detail + writeSerial("First 64 bytes:"); + String hexLine = ""; + for (uint32_t i = 0; i < min((uint32_t)64, currentImage.received); i++) { + if (currentImage.data[i] < 0x10) hexLine += "0"; + hexLine += String(currentImage.data[i], HEX) + " "; + if ((i + 1) % 16 == 0) { + writeSerial(hexLine); + hexLine = ""; + } + } + if (hexLine.length() > 0) { + writeSerial(hexLine); + } + + // Dump length header (first 4 bytes) + if (currentImage.received >= 4) { + uint32_t originalLength = *(uint32_t*)(currentImage.data); + writeSerial("Length header: " + String(originalLength) + " bytes (0x" + String(originalLength, HEX) + ")"); } + // Dump compressed data (after 4-byte header) in chunks + if (currentImage.received > 4) { + writeSerial("Compressed DEFLATE data (after header):"); + uint32_t compressedDataSize = currentImage.received - 4; + uint32_t bytesToDump = min(compressedDataSize, (uint32_t)256); // Limit to first 256 bytes + + for (uint32_t i = 0; i < bytesToDump; i++) { + if (i % 16 == 0) { + if (i > 0) writeSerial(hexLine); + hexLine = String(i + 4, HEX) + ": "; + } + if (currentImage.data[i + 4] < 0x10) hexLine += "0"; + hexLine += String(currentImage.data[i + 4], HEX) + " "; + } + if (hexLine.length() > 0) { + writeSerial(hexLine); + } + if (compressedDataSize > 256) { + writeSerial("... (truncated, showing first 256 bytes of " + String(compressedDataSize) + " total)"); + } + } + writeSerial("=== END HEX DUMP ==="); + // Decompress the data first uint8_t* decompressedData = nullptr; uint32_t decompressedSize = 0; @@ -751,9 +743,9 @@ void drawImageData() { if (x >= displayHeight) break; bool pixelValue = (pixelByte >> bit) & 0x01; if (pixelValue) { - display.drawPixel(displayWidth - y, x, GxEPD_BLACK); + epd.drawPixel(displayWidth - y, x, BBEP_BLACK); } else { - display.drawPixel(displayWidth - y, x, GxEPD_WHITE); + epd.drawPixel(displayWidth - y, x, BBEP_WHITE); } x++; @@ -818,9 +810,9 @@ void drawImageData() { if (x >= displayHeight) break; bool pixelValue = (pixelByte >> bit) & 0x01; if (pixelValue) { - display.drawPixel(displayWidth - y, x, GxEPD_BLACK); + epd.drawPixel(displayWidth - y, x, BBEP_BLACK); } else { - display.drawPixel(displayWidth - y, x, GxEPD_WHITE); + epd.drawPixel(displayWidth - y, x, BBEP_WHITE); } x++; @@ -863,62 +855,38 @@ void handleReadDynamicConfig() { void handleDisplayInfo() { writeSerial("Building Display Info response..."); - - // Allocate response buffer (31 bytes payload + 2 bytes command header) uint8_t response[33]; uint16_t offset = 0; - - // Command header (0x0005) response[offset++] = 0x00; response[offset++] = 0x05; - - // Payload starts here (31 bytes total) - // Fill with zeros initially for (int i = 0; i < 31; i++) { response[offset++] = 0x00; } - - // Reset offset to payload start offset = 2; - - // Offset 0-17: Reserved/unknown fields (set to 0) - // These are typically 0 in most implementations for (int i = 0; i < 18; i++) { response[offset++] = 0x00; } - - // Offset 18: W/H Inversion flag (1 byte) - // 0 = not inverted, 1 = inverted - response[offset++] = 0x00; // Not inverted for our display - - // Offset 19: Reserved + response[offset++] = 0x00; response[offset++] = 0x00; - - // Offset 20-21: Reserved response[offset++] = 0x00; response[offset++] = 0x00; - // Offset 22-23: Width (uint16, little-endian) - uint16_t width = display.width(); + uint16_t width = epd.width(); response[offset++] = width & 0xFF; response[offset++] = (width >> 8) & 0xFF; - // Offset 24-25: Height (uint16, little-endian) - uint16_t height = display.height(); + uint16_t height = epd.height(); response[offset++] = height & 0xFF; response[offset++] = (height >> 8) & 0xFF; - // Offset 26-29: Reserved for (int i = 0; i < 4; i++) { response[offset++] = 0x00; } - // Offset 30: Color count (1=BW, 2=BWR/BWY, 3=BWRY) // Our display is monochrome (black/white only) response[offset++] = 0x01; // Monochrome writeSerial("Display Info - Width: " + String(width) + ", Height: " + String(height) + ", Colors: 1 (mono)"); - // Send the response sendResponse(response, sizeof(response)); writeSerial("Display info response sent"); @@ -942,10 +910,10 @@ void buildDynamicConfigResponse(uint8_t* buffer, uint16_t* len) { // W/H Inversed (2 bytes) buffer[offset++] = 0x00; // Not inversed buffer[offset++] = 0x00; - uint16_t screenHeight = display.width(); + uint16_t screenHeight = epd.width(); buffer[offset++] = screenHeight & 0xFF; buffer[offset++] = (screenHeight >> 8) & 0xFF; - uint16_t screenWidth = display.height(); + uint16_t screenWidth = epd.height(); buffer[offset++] = screenWidth & 0xFF; buffer[offset++] = (screenWidth >> 8) & 0xFF; buffer[offset++] = 0x00; From 4225d5f04bab9a22aedae1cb6d56d909aacfeaa9 Mon Sep 17 00:00:00 2001 From: Jonas Niesner Date: Fri, 3 Oct 2025 17:56:01 +0200 Subject: [PATCH 5/5] Add files via upload --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index a8bf5ba..30b87b8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,6 +11,6 @@ board = xiaoblesense_adafruit #board = oeplnrf monitor_speed = 115200 lib_deps = - https://github.com/ZinggJM/GxEPD2.git - https://github.com/pfalcon/uzlib.git + https://github.com/bitbank2/bb_epaper.git + https://github.com/pfalcon/uzlib build_src_filter = +<*> - \ No newline at end of file