├── library.properties ├── src ├── GxEPD2_4G.h ├── epd │ ├── GxEPD2_290_T5D.h │ ├── GxEPD2_290_I6FD.h │ ├── GxEPD2_213_flex.h │ ├── GxEPD2_290_T5.h │ ├── GxEPD2_420.h │ ├── GxEPD2_750_T7.h │ ├── GxEPD2_371.h │ ├── GxEPD2_290_T94.h │ ├── GxEPD2_270.h │ └── GxEPD2_370_TC1.h ├── GxEPD2_4G_GFX.h ├── gdey │ ├── GxEPD2_213_GDEY0213B74.h │ ├── GxEPD2_154_GDEY0154D67.h │ ├── GxEPD2_420_GDEY042T81.h │ └── GxEPD2_750_GDEY075T7.h ├── gdeq │ └── GxEPD2_426_GDEQ0426T82.h ├── GxEPD2_4G_EPD.h ├── GxEPD2_4G_EPD.cpp └── bitmaps │ ├── WS_Bitmaps104x212.h │ └── Bitmaps2g104x104.h ├── examples ├── GxEPD2_4G_Example │ ├── GxEPD2_4G_wiring_examples.h │ ├── GxEPD2_4G_display_selection_new_style.h │ └── GxEPD2_4G_display_selection_added.h └── GxEPD2_4G_MixedExample │ └── GxEPD2_4G_MixedExample_display_selection.h └── README.md /library.properties: -------------------------------------------------------------------------------- 1 | name=GxEPD2_4G 2 | version=1.0.9 3 | author=Jean-Marc Zingg 4 | maintainer=Jean-Marc Zingg 5 | sentence=Arduino Display Library for SPI E-Paper displays from Dalian Good Display and Waveshare. 6 | paragraph=Requires HW SPI and Adafruit_GFX. Caution: the bare e-paper panels require 3.3V supply AND data lines! 7 | category=Display 8 | url=https://github.com/ZinggJM/GxEPD2_4G 9 | architectures=* 10 | depends=Adafruit GFX Library 11 | -------------------------------------------------------------------------------- /src/GxEPD2_4G.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2_4G 11 | 12 | #ifndef _GxEPD2_4G_H_ 13 | #define _GxEPD2_4G_H_ 14 | 15 | #include 16 | #include 17 | 18 | #define GxEPD_BLACK 0x0000 19 | #define GxEPD_DARKGREY 0x7BEF /* 128, 128, 128 */ 20 | #define GxEPD_LIGHTGREY 0xC618 /* 192, 192, 192 */ 21 | #define GxEPD_WHITE 0xFFFF 22 | #define GxEPD_RED 0xF800 /* 255, 0, 0 */ 23 | 24 | #define GxEPD_YELLOW GxEPD_RED 25 | #define GxEPD_COLORED GxEPD_RED 26 | 27 | class GxEPD2_4G 28 | { 29 | public: 30 | enum Panel 31 | { 32 | GDEW0102T4, Waveshare_1_02_bw = GDEW0102T4, 33 | GDEP015OC1, Waveshare_1_54_bw = GDEP015OC1, 34 | DEPG0150BN, 35 | GDEH0154D67, Waveshare_1_54_bw_D67 = GDEH0154D67, 36 | GDEW0154T8, 37 | GDEW0154M09, 38 | GDEW0154M10, 39 | GDEY0154D67, 40 | GDE0213B1, Waveshare_2_13_bw = GDE0213B1, 41 | GDEH0213B72, Waveshare_2_13_bw_B72 = GDEH0213B72, 42 | GDEH0213B73, Waveshare_2_13_bw_B73 = GDEH0213B73, 43 | GDEM0213B74, 44 | GDEW0213I5F, Waveshare_2_13_flex = GDEW0213I5F, 45 | GDEW0213M21, 46 | GDEW0213T5D, 47 | DEPG0213BN, 48 | GDEY0213B74, 49 | GDEW026T0, Waveshare_2_6_bw = GDEW026T0, 50 | GDEW026M01, 51 | DEPG0266BN, 52 | GDEY0266T90, 53 | GDEH029A1, Waveshare_2_9_bw = GDEH029A1, 54 | GDEW029T5, Waveshare_2_9_bw_T5 = GDEW029T5, 55 | GDEW029T5D, 56 | GDEW029I6FD, 57 | GDEW029M06, 58 | GDEM029T94, 59 | GDEY029T94, 60 | DEPG0290BS, 61 | GDEW027W3, Waveshare_2_7_bw = GDEW027W3, 62 | GDEY027T91, 63 | GDEQ031T10, 64 | ED037TC1, 65 | GDEW0371W7, Waveshare_3_7_bw = GDEW0371W7, 66 | GDEW042T2, Waveshare_4_2_bw = GDEW042T2, 67 | GDEW042M01, 68 | GDEY042T81, 69 | GDEQ0426T82, 70 | GDEW0583T7, Waveshare_5_83_bw = GDEW0583T7, 71 | GDEW0583T8, 72 | GDEQ0583T31, 73 | GDEW075T8, Waveshare_7_5_bw = GDEW075T8, 74 | GDEW075T7, Waveshare_7_5_bw_T7 = GDEW075T7, 75 | GDEY075T7, 76 | GDEH116T91, 77 | GDEW1248T3, Waveshare_12_24_bw = GDEW1248T3, 78 | ED060SCT, // on Waveshare IT8951 Driver HAT 79 | ED060KC1, // on Waveshare IT8951 Driver HAT 1448x1072 80 | ED078KC2, // on Waveshare IT8951 Driver HAT 1872x1404 81 | ES103TC1, // on Waveshare IT8951 Driver HAT 1872x1404 82 | // 3-color 83 | GDEW0154Z04, Waveshare_1_54_bwr = GDEW0154Z04, 84 | GDEH0154Z90, Waveshare_1_54_bwr_Z90 = GDEH0154Z90, 85 | GDEW0213Z16, Waveshare_2_13_bwr = GDEW0213Z16, 86 | GDEW0213Z19, 87 | GDEY0213Z98, 88 | GDEW029Z10, Waveshare_2_9_bwr = GDEW029Z10, 89 | GDEH029Z13, 90 | GDEM029C90, 91 | GDEY0266Z90, Waveshare_2_66_bwr = GDEY0266Z90, 92 | GDEW027C44, Waveshare_2_7_bwr = GDEW027C44, 93 | GDEW042Z15, Waveshare_4_2_bwr = GDEW042Z15, 94 | GDEQ042Z21, Waveshare_4_2_V2_bwr = GDEQ042Z21, 95 | GDEW0583Z21, Waveshare_5_83_bwr = GDEW0583Z21, 96 | GDEW0583Z83, 97 | GDEW075Z09, Waveshare_7_5_bwr = GDEW075Z09, 98 | GDEW075Z08, Waveshare_7_5_bwr_Z08 = GDEW075Z08, 99 | GDEH075Z90, Waveshare_7_5_bwr_Z90 = GDEH075Z90, 100 | GDEY1248Z51, 101 | // 4-color 102 | GDEY0266F51H, 103 | GDEY029F51H, 104 | Waveshare3inch4color, 105 | GDEY0420F51, 106 | Waveshare437inch4color, 107 | // 7-color 108 | ACeP565, Waveshare_5_65_7c = ACeP565, 109 | GDEY073D46, 110 | ACeP730, Waveshare_7_30_7c = ACeP730 111 | }; 112 | }; 113 | 114 | #endif 115 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_290_T5D.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // Panel: GDEW029T5D : https://www.good-display.com/product/210.html 6 | // Controller: UC8151D : https://v4.cecdn.yun300.cn/100001_1909185148/UC8151D.pdf 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_290_T5D_H_ 15 | #define _GxEPD2_290_T5D_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_290_T5D : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 128; 24 | static const uint16_t HEIGHT = 296; 25 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW029T5D; 26 | static const bool hasColor = false; 27 | static const bool hasPartialUpdate = true; 28 | static const bool hasFastPartialUpdate = true; 29 | static const uint16_t power_on_time = 100; // ms, e.g. 83822us 30 | static const uint16_t power_off_time = 50; // ms, e.g. 39688us 31 | static const uint16_t full_refresh_time = 3500; // ms, e.g. 3250135us 32 | static const uint16_t partial_refresh_time = 800; // ms, e.g. 704324us 33 | // constructor 34 | GxEPD2_290_T5D(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 35 | // methods (virtual) 36 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 37 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 38 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 39 | // write to controller memory, without screen refresh; x and w should be multiple of 8 40 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 41 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 42 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 43 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 45 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 48 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 49 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 50 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 51 | // write to controller memory, with screen refresh; x and w should be multiple of 8 52 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 54 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 55 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 56 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 57 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 60 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 62 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 64 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 65 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 66 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 67 | private: 68 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 69 | void _PowerOn(); 70 | void _PowerOff(); 71 | void _InitDisplay(); 72 | void _Force_Init_Full(); 73 | void _Init_Full(); 74 | void _Init_4G(); 75 | void _Init_Part(); 76 | void _Update_Full(); 77 | void _Update_4G(); 78 | void _Update_Part(); 79 | private: 80 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 81 | static const unsigned char lut_20_vcom0_4G[]; 82 | static const unsigned char lut_21_ww_4G[]; 83 | static const unsigned char lut_22_bw_4G[]; 84 | static const unsigned char lut_23_wb_4G[]; 85 | static const unsigned char lut_24_bb_4G[]; 86 | static const unsigned char lut_20_vcomDC_partial[]; 87 | static const unsigned char lut_21_ww_partial[]; 88 | static const unsigned char lut_22_bw_partial[]; 89 | static const unsigned char lut_23_wb_partial[]; 90 | static const unsigned char lut_24_bb_partial[]; 91 | }; 92 | 93 | #endif 94 | -------------------------------------------------------------------------------- /examples/GxEPD2_4G_Example/GxEPD2_4G_wiring_examples.h: -------------------------------------------------------------------------------- 1 | // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2 11 | 12 | // Supporting Arduino Forum Topics (closed, read only): 13 | // Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 14 | // Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 15 | // 16 | // Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues 17 | 18 | // connection suggestions concerning Waveshare e-paper HAT Rev 2.3: 19 | // DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. 20 | // RST is no longer used to disable power to the board, as with earlier revisions. 21 | // Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. 22 | // See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit 23 | 24 | // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini 25 | // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V 26 | // NOTE: connect 3.3k pull-down from D8 to GND if your board or shield has level converters 27 | // NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, use different pin in case, or 3.3k pull-down 28 | // NOTE: connect 1k pull-up from D4 (RST) to 3.3V if your board or shield has the "clever" reset circuit, or use a different pin 29 | 30 | // mapping suggestion from Waveshare SPI e-Paper to generic ESP8266 31 | // BUSY -> GPIO4, RST -> GPIO2, DC -> GPIO0, CS -> GPIO15, CLK -> GPIO14, DIN -> GPIO13, GND -> GND, 3.3V -> 3.3V 32 | // NOTE: connect 3.3k pull-down from GPIO15 to GND if your board or shield has level converters 33 | // NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, use different pin in case, or 3.3k pull-down 34 | // NOTE: connect 1k pull-up from GPIO2 (RST) to 3.3V if your board or shield has the "clever" reset circuit, or use a different pin 35 | 36 | // mapping of Waveshare e-Paper ESP8266 Driver Board, new version 37 | // BUSY -> GPIO5, RST -> GPIO2, DC -> GPIO4, CS -> GPIO15, CLK -> GPIO14, DIN -> GPIO13, GND -> GND, 3.3V -> 3.3V 38 | // NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, add a 3.3k pull-down in case 39 | // the e-Paper ESP8266 Driver Board should have no boot mode issue, as it doesn't use level converters 40 | 41 | // mapping of Waveshare e-Paper ESP8266 Driver Board, old version 42 | // BUSY -> GPIO16, RST -> GPIO5, DC -> GPIO4, CS -> GPIO15, CLK -> GPIO14, DIN -> GPIO13, GND -> GND, 3.3V -> 3.3V 43 | // NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, add a 3.3k pull-down in case 44 | // the e-Paper ESP8266 Driver Board should have no boot mode issue, as it doesn't use level converters 45 | 46 | // mapping suggestion for ESP32, e.g. LOLIN32, see .../variants/.../pins_arduino.h for your board 47 | // NOTE: there are variants with different pins for SPI ! CHECK SPI PINS OF YOUR BOARD 48 | // BUSY -> 4, RST -> 16, DC -> 17, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V 49 | 50 | // mapping of Waveshare ESP32 Driver Board 51 | // BUSY -> 25, RST -> 26, DC -> 27, CS-> 15, CLK -> 13, DIN -> 14 52 | // NOTE: this board uses "unusual" SPI pins and requires re-mapping of HW SPI to these pins in SPIClass 53 | // see example GxEPD2_WS_ESP32_Driver.ino, it shows how this can be done easily 54 | 55 | // mapping suggestion for ESP32, e.g. LOLIN32 D32 PRO 56 | // BUSY -> 15, RST -> 2, DC -> 0, CS -> 5, CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V 57 | // note: use explicit value for CS, as SS is re-defined to TF_CS(4) in pins_arduino.h for Board: "LOLIN D32 PRO" 58 | 59 | // mapping suggestion for ESP32, e.g. TTGO T8 ESP32-WROVER 60 | // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V 61 | // for use with Board: "ESP32 Dev Module": 62 | 63 | // mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 64 | // BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V 65 | // for use with Board: "LOLIN S2 MINI": 66 | 67 | // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" 68 | // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 69 | 70 | // mapping suggestion for AVR, UNO, NANO etc. 71 | // BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 13, DIN -> 11 72 | 73 | // mapping suggestion for AVR, Arduino Micro, Leonardo 74 | // note: on Leonardo board HW SPI pins are on 6-pin ICSP header 75 | // BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 15, DIN -> 16 76 | 77 | // mapping of Waveshare Universal e-Paper Raw Panel Driver Shield for Arduino / NUCLEO 78 | // BUSY -> 7, RST -> 8, DC -> 9, CS-> 10, CLK -> 13, DIN -> 11 79 | 80 | // mapping suggestion for Arduino MEGA 81 | // BUSY -> 7, RST -> 9, DC -> 8, CS-> 53, CLK -> 52, DIN -> 51 82 | 83 | // mapping suggestion for Arduino DUE, note: pin 77 is on board pin 10, SS is 10 84 | // BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 76, DIN -> 75 85 | // SPI pins are on 6 pin 2x3 SPI header, no SS on SPI header! 86 | 87 | // mapping suggestion for Arduino MKR1000 or MKRZERO 88 | // note: can't use SS on MKR1000: is defined as 24, should be 4 89 | // BUSY -> 5, RST -> 6, DC -> 7, CS-> 4, CLK -> 9, DIN -> 8 90 | 91 | // mapping suggestion for Arduino Nano RP2040 Connect (Arduino MBED OS Nano Boards) 92 | // BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 13, DIN -> 11 93 | 94 | // mapping suggestion for Raspberry Pi Pico RP2040 (Arduino MBED OS RP2040 Boards) 95 | // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 18, DIN -> 19 96 | 97 | // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) 98 | // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 99 | 100 | // mapping of my new proto board like Waveshare Pico-ePaper-2.9 101 | // needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards 102 | // BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 103 | 104 | // mapping of Waveshare Pico-ePaper-2.9 105 | // BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 106 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_290_I6FD.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // Panel: GDEW029I6FD : https://www.good-display.com/product/209.html 6 | // Controller: UC8151D : https://v4.cecdn.yun300.cn/100001_1909185148/UC8151D.pdf 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_290_I6FD_H_ 15 | #define _GxEPD2_290_I6FD_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_290_I6FD : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 128; 24 | static const uint16_t HEIGHT = 296; 25 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW029I6FD; 26 | static const bool hasColor = false; 27 | static const bool hasPartialUpdate = true; 28 | static const bool hasFastPartialUpdate = true; // set this false for test with OTP LUT (GDEW029I6F) 29 | static const uint16_t power_on_time = 400; // ms, e.g. 36553us 30 | static const uint16_t power_off_time = 250; // ms, e.g. 20759us 31 | static const uint16_t full_refresh_time = 2100; // ms, e.g. 2056899us 32 | static const uint16_t partial_refresh_time = 400; // ms, e.g. 353649us 33 | // constructor 34 | GxEPD2_290_I6FD(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 35 | // methods (virtual) 36 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 37 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 38 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 39 | // write to controller memory, without screen refresh; x and w should be multiple of 8 40 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 41 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 42 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 43 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 45 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 48 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 49 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 50 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 51 | // write to controller memory, with screen refresh; x and w should be multiple of 8 52 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 54 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 55 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 56 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 57 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 60 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 62 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 64 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 65 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 66 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 67 | private: 68 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 69 | void _PowerOn(); 70 | void _PowerOff(); 71 | void _InitDisplay(); 72 | void _Force_Init_Full(); 73 | void _Init_Full(); 74 | void _Init_4G(); 75 | void _Init_Part(); 76 | void _Update_Full(); 77 | void _Update_4G(); 78 | void _Update_Part(); 79 | private: 80 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 81 | static const unsigned char lut_20_vcom0_4G[]; 82 | static const unsigned char lut_21_ww_4G[]; 83 | static const unsigned char lut_22_bw_4G[]; 84 | static const unsigned char lut_23_wb_4G[]; 85 | static const unsigned char lut_24_bb_4G[]; 86 | static const unsigned char lut_20_vcomDC_partial[]; 87 | static const unsigned char lut_21_ww_partial[]; 88 | static const unsigned char lut_22_bw_partial[]; 89 | static const unsigned char lut_23_wb_partial[]; 90 | static const unsigned char lut_24_bb_partial[]; 91 | }; 92 | 93 | #endif 94 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_213_flex.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // Controller: IL0373 : http://www.e-paper-display.com/download_detail/downloadsId=535.html 6 | // 7 | // Author: Jean-Marc Zingg 8 | // 9 | // Version: see library.properties 10 | // 11 | // Library: https://github.com/ZinggJM/GxEPD2 12 | 13 | #ifndef _GxEPD2_213_flex_H_ 14 | #define _GxEPD2_213_flex_H_ 15 | 16 | #include "../GxEPD2_4G_EPD.h" 17 | 18 | class GxEPD2_213_flex : public GxEPD2_4G_EPD 19 | { 20 | public: 21 | // attributes 22 | static const uint16_t WIDTH = 104; 23 | static const uint16_t HEIGHT = 212; 24 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW0213I5F; 25 | static const bool hasColor = false; 26 | static const bool hasPartialUpdate = true; 27 | static const bool hasFastPartialUpdate = true; 28 | static const uint16_t power_on_time = 400; // ms, e.g. 36553us 29 | static const uint16_t power_off_time = 250; // ms, e.g. 20759us 30 | static const uint16_t full_refresh_time = 2100; // ms, e.g. 2056899us 31 | static const uint16_t partial_refresh_time = 300; // ms, e.g. 283622us 32 | // constructor 33 | GxEPD2_213_flex(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 34 | // methods (virtual) 35 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 36 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 37 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 38 | // write to controller memory, without screen refresh; x and w should be multiple of 8 39 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 40 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 41 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 42 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 43 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 44 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 45 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 47 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 49 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | // write to controller memory, with screen refresh; x and w should be multiple of 8 51 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 54 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 56 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 59 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 60 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 61 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 62 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 63 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 64 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 65 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 66 | private: 67 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 68 | void _PowerOn(); 69 | void _PowerOff(); 70 | void _InitDisplay(); 71 | void _Force_Init_Full(); 72 | void _Init_Full(); 73 | void _Init_4G(); 74 | void _Init_Part(); 75 | void _Update_Full(); 76 | void _Update_4G(); 77 | void _Update_Part(); 78 | private: 79 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 80 | static const unsigned char lut_20_vcomDC[]; 81 | static const unsigned char lut_21_ww[]; 82 | static const unsigned char lut_22_bw[]; 83 | static const unsigned char lut_23_wb[]; 84 | static const unsigned char lut_24_bb[]; 85 | static const unsigned char lut_20_vcom0_4G[]; 86 | static const unsigned char lut_21_ww_4G[]; 87 | static const unsigned char lut_22_bw_4G[]; 88 | static const unsigned char lut_23_wb_4G[]; 89 | static const unsigned char lut_24_bb_4G[]; 90 | static const unsigned char lut_20_vcomDC_partial[]; 91 | static const unsigned char lut_21_ww_partial[]; 92 | static const unsigned char lut_22_bw_partial[]; 93 | static const unsigned char lut_23_wb_partial[]; 94 | static const unsigned char lut_24_bb_partial[]; 95 | }; 96 | 97 | #endif 98 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_290_T5.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // Controller: IL0373 : http://www.e-paper-display.com/download_detail/downloadsId=535.html 6 | // 7 | // Author: Jean-Marc Zingg 8 | // 9 | // Version: see library.properties 10 | // 11 | // Library: https://github.com/ZinggJM/GxEPD2 12 | 13 | #ifndef _GxEPD2_290_T5_H_ 14 | #define _GxEPD2_290_T5_H_ 15 | 16 | #include "../GxEPD2_4G_EPD.h" 17 | 18 | class GxEPD2_290_T5 : public GxEPD2_4G_EPD 19 | { 20 | public: 21 | // attributes 22 | static const uint16_t WIDTH = 128; 23 | static const uint16_t HEIGHT = 296; 24 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW029T5; 25 | static const bool hasColor = false; 26 | static const bool hasPartialUpdate = true; 27 | static const bool hasFastPartialUpdate = true; // set this false for test with OTP LUT (GDEW029I6F) 28 | static const uint16_t power_on_time = 400; // ms, e.g. 36553us 29 | static const uint16_t power_off_time = 250; // ms, e.g. 20759us 30 | static const uint16_t full_refresh_time = 2100; // ms, e.g. 2056899us 31 | static const uint16_t partial_refresh_time = 400; // ms, e.g. 353649us 32 | // constructor 33 | GxEPD2_290_T5(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 34 | // methods (virtual) 35 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 36 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 37 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 38 | // write to controller memory, without screen refresh; x and w should be multiple of 8 39 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 40 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 41 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 42 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 43 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 44 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 45 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 47 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 49 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | // write to controller memory, with screen refresh; x and w should be multiple of 8 51 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 54 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 56 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 59 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 60 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 61 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 62 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 63 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 64 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 65 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 66 | private: 67 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 68 | void _PowerOn(); 69 | void _PowerOff(); 70 | void _InitDisplay(); 71 | void _Force_Init_Full(); 72 | void _Init_Full(); 73 | void _Init_4G(); 74 | void _Init_Part(); 75 | void _Update_Full(); 76 | void _Update_4G(); 77 | void _Update_Part(); 78 | private: 79 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 80 | static const unsigned char lut_20_vcomDC[]; 81 | static const unsigned char lut_21_ww[]; 82 | static const unsigned char lut_22_bw[]; 83 | static const unsigned char lut_23_wb[]; 84 | static const unsigned char lut_24_bb[]; 85 | static const unsigned char lut_20_vcom0_4G[]; 86 | static const unsigned char lut_21_ww_4G[]; 87 | static const unsigned char lut_22_bw_4G[]; 88 | static const unsigned char lut_23_wb_4G[]; 89 | static const unsigned char lut_24_bb_4G[]; 90 | static const unsigned char lut_20_vcomDC_partial[]; 91 | static const unsigned char lut_21_ww_partial[]; 92 | static const unsigned char lut_22_bw_partial[]; 93 | static const unsigned char lut_23_wb_partial[]; 94 | static const unsigned char lut_24_bb_partial[]; 95 | }; 96 | 97 | #endif 98 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_420.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // Controller: IL0398 : http://www.e-paper-display.com/download_detail/downloadsId=537.html 6 | // 7 | // Author: Jean-Marc Zingg 8 | // 9 | // Version: see library.properties 10 | // 11 | // Library: https://github.com/ZinggJM/GxEPD2 12 | 13 | #ifndef _GxEPD2_420_H_ 14 | #define _GxEPD2_420_H_ 15 | 16 | #include "../GxEPD2_4G_EPD.h" 17 | 18 | class GxEPD2_420 : public GxEPD2_4G_EPD 19 | { 20 | public: 21 | // attributes 22 | static const uint16_t WIDTH = 400; 23 | static const uint16_t HEIGHT = 300; 24 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW042T2; 25 | static const bool hasColor = false; 26 | static const bool hasPartialUpdate = true; 27 | static const bool usePartialUpdateWindow = false; // set false for better image 28 | static const bool hasFastPartialUpdate = true; 29 | static const uint16_t power_on_time = 40; // ms, e.g. 36996us 30 | static const uint16_t power_off_time = 20; // ms, e.g. 19285us 31 | static const uint16_t full_refresh_time = 1600; // ms, e.g. 1545659us 32 | static const uint16_t partial_refresh_time = 600; // ms, e.g. 563754us 33 | // constructor 34 | GxEPD2_420(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 35 | // methods (virtual) 36 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 37 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 38 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 39 | // write to controller memory, without screen refresh; x and w should be multiple of 8 40 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 41 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 42 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 43 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 45 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 48 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 49 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 50 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 51 | // write to controller memory, with screen refresh; x and w should be multiple of 8 52 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 54 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 55 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 56 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 57 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 60 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 62 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 64 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 65 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 66 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 67 | private: 68 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 69 | void _PowerOn(); 70 | void _PowerOff(); 71 | void _InitDisplay(); 72 | void _Force_Init_Full(); 73 | void _Init_Full(); 74 | void _Init_4G(); 75 | void _Init_Part(); 76 | void _Update_Full(); 77 | void _Update_4G(); 78 | void _Update_Part(); 79 | private: 80 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 81 | static const unsigned char lut_20_vcom0_full[]; 82 | static const unsigned char lut_21_ww_full[]; 83 | static const unsigned char lut_22_bw_full[]; 84 | static const unsigned char lut_23_wb_full[]; 85 | static const unsigned char lut_24_bb_full[]; 86 | static const unsigned char lut_20_vcom0_4G[]; 87 | static const unsigned char lut_21_ww_4G[]; 88 | static const unsigned char lut_22_bw_4G[]; 89 | static const unsigned char lut_23_wb_4G[]; 90 | static const unsigned char lut_24_bb_4G[]; 91 | static const unsigned char lut_20_vcom0_partial[]; 92 | static const unsigned char lut_21_ww_partial[]; 93 | static const unsigned char lut_22_bw_partial[]; 94 | static const unsigned char lut_23_wb_partial[]; 95 | static const unsigned char lut_24_bb_partial[]; 96 | }; 97 | 98 | #endif 99 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_750_T7.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: 5 | // Panel: GDEW075T7 : http://www.e-paper-display.com/products_detail/productId=456.html 6 | // Controller: GD7965 : http://www.e-paper-display.com/download_detail/downloadsId=821.html 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_750_T7_H_ 15 | #define _GxEPD2_750_T7_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_750_T7 : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 800; 24 | static const uint16_t HEIGHT = 480; 25 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW075T7; 26 | static const bool hasColor = false; 27 | static const bool hasPartialUpdate = true; 28 | static const bool usePartialUpdateWindow = false; // set false for better image 29 | static const bool hasFastPartialUpdate = true; // set this false to force full refresh always 30 | static const uint16_t power_on_time = 140; // ms, e.g. 134460us 31 | static const uint16_t power_off_time = 42; // ms, e.g. 40033us 32 | static const uint16_t full_refresh_time = 4200; // ms, e.g. 4108238us 33 | static const uint16_t partial_refresh_time = 1600; // ms, e.g. 1584124us 34 | // constructor 35 | GxEPD2_750_T7(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 36 | // methods (virtual) 37 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 38 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 39 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 40 | // write to controller memory, without screen refresh; x and w should be multiple of 8 41 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 42 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 43 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 45 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 47 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 49 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 51 | // done by controller (N2OCP); override with empty code 52 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) {}; 53 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 54 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) {}; 55 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 56 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | // write to controller memory, with screen refresh; x and w should be multiple of 8 58 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 60 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 61 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 62 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 63 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 64 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 65 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 66 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 67 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 68 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 69 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 70 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 71 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 72 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 73 | private: 74 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 75 | void _PowerOn(); 76 | void _PowerOff(); 77 | void _InitDisplay(); 78 | void _Force_Init_Full(); 79 | void _Init_Full(); 80 | void _Init_4G(); 81 | void _Init_Part(); 82 | void _Update_Full(); 83 | void _Update_4G(); 84 | void _Update_Part(); 85 | private: 86 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 87 | static const unsigned char lut_20_vcom0_4G[]; 88 | static const unsigned char lut_21_ww_4G[]; 89 | static const unsigned char lut_22_bw_4G[]; 90 | static const unsigned char lut_23_wb_4G[]; 91 | static const unsigned char lut_24_bb_4G[]; 92 | static const unsigned char lut_20_LUTC_partial[]; 93 | static const unsigned char lut_21_LUTWW_partial[]; 94 | static const unsigned char lut_22_LUTKW_partial[]; 95 | static const unsigned char lut_23_LUTWK_partial[]; 96 | static const unsigned char lut_24_LUTKK_partial[]; 97 | static const unsigned char lut_25_LUTBD_partial[]; 98 | }; 99 | 100 | #endif 101 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_371.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_detail/downloadsId=639.html 5 | // Panel: GDEW0371W7 : http://www.e-paper-display.com/products_detail/productId=401.html 6 | // Controller: IL0324 : http://www.e-paper-display.com/download_detail/downloadsId=763.html 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_371_H_ 15 | #define _GxEPD2_371_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_371 : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 240; 24 | static const uint16_t HEIGHT = 416; 25 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW0371W7; 26 | static const bool hasColor = false; 27 | static const bool hasPartialUpdate = true; 28 | static const bool usePartialUpdateWindow = false; // set false for better image 29 | static const bool hasFastPartialUpdate = true; // set this false to force full refresh always 30 | static const uint16_t power_on_time = 200; // ms, e.g. 126267us 31 | static const uint16_t power_off_time = 50; // ms, e.g. 39563us 32 | static const uint16_t full_refresh_time = 3000; // ms, e.g. 2953630us 33 | static const uint16_t partial_refresh_time = 1500; // ms, e.g. 1482735us 34 | // constructor 35 | GxEPD2_371(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 36 | // methods (virtual) 37 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 38 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 39 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 40 | // write to controller memory, without screen refresh; x and w should be multiple of 8 41 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 42 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 43 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 45 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 47 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 49 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 51 | // done by controller (N2OCP); override with empty code 52 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) {}; 53 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 54 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) {}; 55 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 56 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | // write to controller memory, with screen refresh; x and w should be multiple of 8 58 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 60 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 61 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 62 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 63 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 64 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 65 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 66 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 67 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 68 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 69 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 70 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 71 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 72 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 73 | private: 74 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 75 | void _PowerOn(); 76 | void _PowerOff(); 77 | void _InitDisplay(); 78 | void _Force_Init_Full(); 79 | void _Init_Full(); 80 | void _Init_4G(); 81 | void _Init_Part(); 82 | void _Update_Full(); 83 | void _Update_4G(); 84 | void _Update_Part(); 85 | private: 86 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 87 | static const unsigned char lut_20_vcom0_4G[]; 88 | static const unsigned char lut_21_ww_4G[]; 89 | static const unsigned char lut_22_bw_4G[]; 90 | static const unsigned char lut_23_wb_4G[]; 91 | static const unsigned char lut_24_bb_4G[]; 92 | static const unsigned char lut_20_LUTC_partial[]; 93 | static const unsigned char lut_21_LUTWW_partial[]; 94 | static const unsigned char lut_22_LUTKW_partial[]; 95 | static const unsigned char lut_23_LUTWK_partial[]; 96 | static const unsigned char lut_24_LUTKK_partial[]; 97 | static const unsigned char lut_25_LUTBD_partial[]; 98 | }; 99 | 100 | #endif 101 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_290_T94.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display, available here: http://www.e-paper-display.com/download_detail/downloadsId=806.html 5 | // Panel: GDEM029T94 : https://www.good-display.com/product/360.html 6 | // Controller : SSD1680 : https://www.good-display.com/companyfile/101.html 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_290_T94_H_ 15 | #define _GxEPD2_290_T94_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_290_T94 : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 128; 24 | static const uint16_t HEIGHT = 296; 25 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEM029T94; 26 | static const bool hasColor = false; 27 | static const bool hasPartialUpdate = false; // with grey refresh 28 | //static const bool hasFastPartialUpdate = false; // with grey refresh 29 | static const bool hasFastPartialUpdate = true; // with b/w refresh 30 | static const uint16_t power_on_time = 100; // ms, e.g. 95868us 31 | static const uint16_t power_off_time = 150; // ms, e.g. 140350us 32 | static const uint16_t full_refresh_time = 5500; // ms, e.g. 5406814us 33 | static const uint16_t partial_refresh_time = 500; // ms, e.g. 458231us 34 | // constructor 35 | GxEPD2_290_T94(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 36 | // methods (virtual) 37 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 38 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 39 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 40 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 41 | // write to controller memory, without screen refresh; x and w should be multiple of 8 42 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 43 | void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 45 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 46 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 48 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 49 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 51 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 53 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 54 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 55 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 56 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 57 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | // write to controller memory, with screen refresh; x and w should be multiple of 8 59 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 60 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 62 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 64 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 65 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 66 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 67 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 68 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 69 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 70 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 71 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 72 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 73 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 74 | void drawGreyLevels(); 75 | private: 76 | void _writeScreenBuffer(uint8_t command, uint8_t value); 77 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 78 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 79 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 80 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 81 | void _PowerOn(); 82 | void _PowerOff(); 83 | void _InitDisplay(); 84 | void _Force_Init_Full(); 85 | void _Init_Full(); 86 | void _Init_4G(); 87 | void _Init_Part(); 88 | void _Update_Full(); 89 | void _Update_4G(); 90 | void _Update_Part(); 91 | private: 92 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 93 | static const unsigned char lut_4G[]; 94 | }; 95 | 96 | #endif 97 | -------------------------------------------------------------------------------- /src/GxEPD2_4G_GFX.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2_4G 11 | 12 | #ifndef _GxEPD2_4G_GFX_H_ 13 | #define _GxEPD2_4G_GFX_H_ 14 | 15 | #include 16 | #include 17 | 18 | class GxEPD2_4G_GFX : public Adafruit_GFX 19 | { 20 | public: 21 | GxEPD2_4G_GFX(GxEPD2_EPD& _epd2, int16_t w, int16_t h) : Adafruit_GFX(w, h), epd2(_epd2) {}; 22 | virtual uint16_t pages() = 0; 23 | virtual uint16_t pageHeight() = 0; 24 | virtual bool mirror(bool m) = 0; 25 | virtual void init(uint32_t serial_diag_bitrate = 0) = 0; // serial_diag_bitrate = 0 : disabled 26 | // init method with additional parameters: 27 | // initial false for re-init after processor deep sleep wake up, if display power supply was kept 28 | // this can be used to avoid the repeated initial full refresh on displays with fast partial update 29 | // NOTE: garbage will result on fast partial update displays, if initial full update is omitted after power loss 30 | // pulldown_rst_mode true for alternate RST handling to avoid feeding 5V through RST pin 31 | virtual void init(uint32_t serial_diag_bitrate, bool initial, bool pulldown_rst_mode = false) = 0; 32 | virtual void fillScreen(uint16_t color) = 0; // 0x0 black, >0x0 white, to buffer 33 | // display buffer content to screen, useful for full screen buffer 34 | virtual void display(bool partial_update_mode = false) = 0; 35 | // display part of buffer content to screen, useful for full screen buffer 36 | // displayWindow, use parameters according to actual rotation. 37 | // x and w should be multiple of 8, for rotation 0 or 2, 38 | // y and h should be multiple of 8, for rotation 1 or 3, 39 | // else window is increased as needed, 40 | // this is an addressing limitation of the e-paper controllers 41 | virtual void displayWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) = 0; 42 | virtual void setFullWindow() = 0; 43 | // setPartialWindow, use parameters according to actual rotation. 44 | // x and w should be multiple of 8, for rotation 0 or 2, 45 | // y and h should be multiple of 8, for rotation 1 or 3, 46 | // else window is increased as needed, 47 | // this is an addressing limitation of the e-paper controllers 48 | virtual void setPartialWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) = 0; 49 | virtual void firstPage() = 0; 50 | virtual bool nextPage() = 0; 51 | virtual void drawPaged(void (*drawCallback)(const void*), const void* pv) = 0; 52 | virtual void drawInvertedBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color) = 0; 53 | virtual void drawGreyPixmap(const uint8_t pixmap[], int16_t depth, int16_t x, int16_t y, int16_t w, int16_t h) = 0; 54 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 55 | virtual void clearScreen(uint8_t value = 0xFF) = 0; // init controller memory and screen (default white) 56 | virtual void writeScreenBuffer(uint8_t value = 0xFF) = 0; // init controller memory (default white) 57 | // write to controller memory, without screen refresh; x and w should be multiple of 8 58 | virtual void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 59 | virtual void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 60 | virtual void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 61 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 62 | virtual void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 63 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 64 | virtual void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) = 0; 65 | virtual void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h) = 0; // default options false 66 | virtual void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 67 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) = 0; 68 | virtual void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 69 | int16_t x, int16_t y, int16_t w, int16_t h) = 0; // default options false 70 | // write to controller memory, with screen refresh; x and w should be multiple of 8 71 | virtual void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 72 | virtual void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 73 | virtual void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 74 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 75 | virtual void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 76 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 77 | virtual void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) = 0; 78 | virtual void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h) = 0; // default options false 79 | virtual void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 80 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) = 0; 81 | virtual void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 82 | int16_t x, int16_t y, int16_t w, int16_t h) = 0; // default options false 83 | virtual void refresh(bool partial_update_mode = false) = 0; // screen refresh from controller memory to full screen 84 | virtual void refresh(int16_t x, int16_t y, int16_t w, int16_t h) = 0; // screen refresh from controller memory, partial screen 85 | virtual void powerOff() = 0; // turns off generation of panel driving voltages, avoids screen fading over time 86 | virtual void hibernate() = 0; // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 87 | public: 88 | GxEPD2_EPD& epd2; 89 | }; 90 | 91 | #endif 92 | -------------------------------------------------------------------------------- /src/gdey/GxEPD2_213_GDEY0213B74.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display, available here: https://www.good-display.com/product/391.html 5 | // Panel: GDEY0213B74 : https://www.good-display.com/product/391.html 6 | // Controller : SSD1680 : https://v4.cecdn.yun300.cn/100001_1909185148/SSD1680.pdf 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_213_GDEY0213B74_H_ 15 | #define _GxEPD2_213_GDEY0213B74_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_213_GDEY0213B74 : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 128; 24 | static const uint16_t HEIGHT = 250; 25 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEY0213B74; 26 | static const bool hasColor = false; 27 | static const bool hasPartialUpdate = true; // with grey refresh 28 | static const bool hasFastPartialUpdate = true; // with b/w refresh 29 | static const uint16_t power_on_time = 100; // ms, e.g. 90999us 30 | static const uint16_t power_off_time = 150; // ms, e.g. 140001us 31 | static const uint16_t grey_refresh_time = 5500; // ms, e.g. 5392001us 32 | static const uint16_t full_refresh_time = 1700; // ms, e.g. 1617000us 33 | static const uint16_t partial_refresh_time = 500; // ms, e.g. 457000us 34 | // constructor 35 | GxEPD2_213_GDEY0213B74(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 36 | // methods (virtual) 37 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 38 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 39 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 40 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 41 | // write to controller memory, without screen refresh; x and w should be multiple of 8 42 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 43 | void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 45 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 46 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 48 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 49 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 51 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 53 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 54 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 55 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 56 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 57 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | // write to controller memory, with screen refresh; x and w should be multiple of 8 59 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 60 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 62 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 64 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 65 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 66 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 67 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 68 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 69 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 70 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 71 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 72 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 73 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 74 | void drawGreyLevels(); 75 | private: 76 | void _writeScreenBuffer(uint8_t command, uint8_t value); 77 | void _writeScreenBufferArea(uint8_t command, uint8_t value, uint16_t x, uint16_t y, uint16_t w, uint16_t h); 78 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 79 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 80 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 81 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 82 | void _PowerOn(); 83 | void _PowerOff(); 84 | void _InitDisplay(); 85 | void _Force_Init_Full(); 86 | void _Init_Full(); 87 | void _Init_4G(); 88 | void _Init_Part(); 89 | void _Update_Full(); 90 | void _Update_4G(); 91 | void _Update_Part(); 92 | private: 93 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 94 | static const unsigned char lut_4G[]; 95 | }; 96 | 97 | #endif 98 | -------------------------------------------------------------------------------- /src/gdey/GxEPD2_154_GDEY0154D67.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display, available here: https://www.good-display.com/product/388.html 5 | // Panel: GDEY0154D67 : https://www.good-display.com/product/388.html 6 | // Controller : SSD1681 : https://v4.cecdn.yun300.cn/100001_1909185148/SSD1681.pdf 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_154_GDEY0154D67_H_ 15 | #define _GxEPD2_154_GDEY0154D67_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_154_GDEY0154D67 : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 200; 24 | static const uint16_t HEIGHT = 200; 25 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEY0154D67; 26 | static const bool hasColor = false; 27 | static const bool hasPartialUpdate = true; // grey refresh uses full screen 28 | static const bool hasFastPartialUpdate = true; // with b/w refresh 29 | static const bool useFastFullUpdate = true; // set false for extended (low) temperature range 30 | static const uint16_t power_on_time = 100; // ms, e.g. 96000us 31 | static const uint16_t power_off_time = 150; // ms, e.g. 141000us 32 | static const uint16_t grey_refresh_time = 6000; // ms, e.g. 5517000us 33 | static const uint16_t full_refresh_time = 2000; // ms, e.g. 1907000us 34 | static const uint16_t partial_refresh_time = 500; // ms, e.g. 459000us 35 | // constructor 36 | GxEPD2_154_GDEY0154D67(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 37 | // methods (virtual) 38 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 39 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 40 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 41 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 42 | // write to controller memory, without screen refresh; x and w should be multiple of 8 43 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 45 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 47 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 49 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 51 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 52 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 54 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 56 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 58 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | // write to controller memory, with screen refresh; x and w should be multiple of 8 60 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 62 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 63 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 64 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 65 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 66 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 67 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 68 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 69 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 70 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 71 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 72 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 73 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 74 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 75 | void drawGreyLevels(); 76 | private: 77 | void _writeScreenBuffer(uint8_t command, uint8_t value); 78 | void _writeScreenBufferArea(uint8_t command, uint8_t value, uint16_t x, uint16_t y, uint16_t w, uint16_t h); 79 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 80 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 81 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 82 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 83 | void _PowerOn(); 84 | void _PowerOff(); 85 | void _InitDisplay(); 86 | void _Force_Init_Full(); 87 | void _Init_Full(); 88 | void _Init_4G(); 89 | void _Init_Part(); 90 | void _Update_Full(); 91 | void _Update_4G(); 92 | void _Update_Part(); 93 | private: 94 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 95 | static const unsigned char lut_4G[]; 96 | }; 97 | 98 | #endif 99 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_270.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // Controller: IL91874 : http://www.e-paper-display.com/download_detail/downloadsId=539.html 6 | // 7 | // Author: Jean-Marc Zingg 8 | // 9 | // Version: see library.properties 10 | // 11 | // Library: https://github.com/ZinggJM/GxEPD2 12 | 13 | #ifndef _GxEPD2_270_H_ 14 | #define _GxEPD2_270_H_ 15 | 16 | #include "../GxEPD2_4G_EPD.h" 17 | 18 | class GxEPD2_270 : public GxEPD2_4G_EPD 19 | { 20 | public: 21 | // attributes 22 | static const uint16_t WIDTH = 176; 23 | static const uint16_t HEIGHT = 264; 24 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEW027W3; 25 | static const bool hasColor = false; 26 | static const bool hasPartialUpdate = true; 27 | static const bool hasFastPartialUpdate = true; 28 | static const uint16_t power_on_time = 100; // ms, e.g. 98877us 29 | static const uint16_t power_off_time = 30; // ms, e.g. 28405us 30 | static const uint16_t full_refresh_time = 2000; // ms, e.g. 1979027us 31 | static const uint16_t partial_refresh_time = 400; // ms, e.g. 363637us 32 | // constructor 33 | GxEPD2_270(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 34 | // methods (virtual) 35 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 36 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 37 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 38 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 39 | // write to controller memory, without screen refresh; x and w should be multiple of 8 40 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 41 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 42 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 43 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 44 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 45 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 48 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 49 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 50 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 51 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 52 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 54 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | // write to controller memory, with screen refresh; x and w should be multiple of 8 56 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 58 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 59 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 60 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 61 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 62 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 64 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 65 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 66 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 67 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 68 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 69 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 70 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 71 | private: 72 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 73 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 74 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 75 | void _setPartialRamArea(uint8_t command, uint16_t x, uint16_t y, uint16_t w, uint16_t h); 76 | void _refreshWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 77 | void _PowerOn(); 78 | void _PowerOff(); 79 | void _InitDisplay(); 80 | void _Force_Init_Full(); 81 | void _Init_Full(); 82 | void _Init_4G(); 83 | void _Init_Part(); 84 | void _Update_Full(); 85 | void _Update_4G(); 86 | void _Update_Part(); 87 | private: 88 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 89 | static const unsigned char lut_20_vcomDC[]; 90 | static const unsigned char lut_21_ww[]; 91 | static const unsigned char lut_22_bw[]; 92 | static const unsigned char lut_23_wb[]; 93 | static const unsigned char lut_24_bb[]; 94 | static const unsigned char lut_20_vcom0_4G[]; 95 | static const unsigned char lut_21_ww_4G[]; 96 | static const unsigned char lut_22_bw_4G[]; 97 | static const unsigned char lut_23_wb_4G[]; 98 | static const unsigned char lut_24_bb_4G[]; 99 | static const unsigned char lut_20_vcomDC_partial[]; 100 | static const unsigned char lut_21_ww_partial[]; 101 | static const unsigned char lut_22_bw_partial[]; 102 | static const unsigned char lut_23_wb_partial[]; 103 | static const unsigned char lut_24_bb_partial[]; 104 | }; 105 | 106 | #endif 107 | -------------------------------------------------------------------------------- /src/gdey/GxEPD2_420_GDEY042T81.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display, available here: https://www.good-display.com/product/386.html 5 | // Panel: GDEY042T81 : https://www.good-display.com/product/386.html 6 | // Controller : SSD1683 : https://v4.cecdn.yun300.cn/100001_1909185148/SSD1683.PDF 7 | // code extracted for LUT and settings from https://github.com/waveshare/e-Paper 8 | // 9 | // Author: Jean-Marc Zingg 10 | // 11 | // Version: see library.properties 12 | // 13 | // Library: https://github.com/ZinggJM/GxEPD2 14 | 15 | #ifndef _GxEPD2_420_GDEY042T81_H_ 16 | #define _GxEPD2_420_GDEY042T81_H_ 17 | 18 | #include "../GxEPD2_4G_EPD.h" 19 | 20 | class GxEPD2_420_GDEY042T81 : public GxEPD2_4G_EPD 21 | { 22 | public: 23 | // attributes 24 | static const uint16_t WIDTH = 400; 25 | static const uint16_t HEIGHT = 300; 26 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEY042T81; 27 | static const bool hasColor = false; 28 | static const bool hasPartialUpdate = true; // grey refresh uses full screen 29 | //static const bool hasFastPartialUpdate = false; // with grey refresh 30 | static const bool hasFastPartialUpdate = true; // with b/w refresh 31 | static const bool useFastFullUpdate = true; // set false for extended (low) temperature range 32 | static const uint16_t power_on_time = 100; // ms, e.g. 94998us 33 | static const uint16_t power_off_time = 150; // ms, e.g. 140350us 34 | static const uint16_t grey_refresh_time = 5500; // ms, e.g. 5403000us 35 | static const uint16_t full_refresh_time = 1500; // ms, e.g. 1219000us 36 | static const uint16_t partial_refresh_time = 400; // ms, e.g. 357000us 37 | // constructor 38 | GxEPD2_420_GDEY042T81(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 39 | // methods (virtual) 40 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 41 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 42 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 43 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 44 | // write to controller memory, without screen refresh; x and w should be multiple of 8 45 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 49 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 51 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 54 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 56 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 58 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 60 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | // write to controller memory, with screen refresh; x and w should be multiple of 8 62 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 64 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 65 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 66 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 67 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 68 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 69 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 70 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 71 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 72 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 73 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 74 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 75 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 76 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 77 | void drawGreyLevels(); 78 | private: 79 | void _writeScreenBuffer(uint8_t command, uint8_t value); 80 | void _writeScreenBufferArea(uint8_t command, uint8_t value, uint16_t x, uint16_t y, uint16_t w, uint16_t h); 81 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 82 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 83 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 84 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 85 | void _PowerOn(); 86 | void _PowerOff(); 87 | void _InitDisplay(); 88 | void _Force_Init_Full(); 89 | void _Init_Full(); 90 | void _Init_4G(); 91 | void _Init_Part(); 92 | void _Update_Full(); 93 | void _Update_4G(); 94 | void _Update_Part(); 95 | private: 96 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 97 | static const unsigned char lut_4G[]; 98 | }; 99 | 100 | #endif 101 | -------------------------------------------------------------------------------- /src/epd/GxEPD2_370_TC1.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display, available here: https://www.good-display.com/comp/xcompanyFile/downloadNew.do?appId=24&fid=553&id=374 5 | // Panel: ED037TC1 : https://www.waveshare.com/product/displays/e-paper/3.7inch-e-paper.htm 6 | // Controller : SSD1677 : https://www.waveshare.com/w/upload/2/2a/SSD1677_1.0.pdf 7 | // code extracted for LUT and settings from https://github.com/waveshare/e-Paper 8 | // 9 | // Author: Jean-Marc Zingg 10 | // 11 | // Version: see library.properties 12 | // 13 | // Library: https://github.com/ZinggJM/GxEPD2 14 | 15 | #ifndef _GxEPD2_370_TC1_H_ 16 | #define _GxEPD2_370_TC1_H_ 17 | 18 | #include "../GxEPD2_4G_EPD.h" 19 | 20 | class GxEPD2_370_TC1 : public GxEPD2_4G_EPD 21 | { 22 | public: 23 | // attributes 24 | static const uint16_t WIDTH = 280; 25 | static const uint16_t WIDTH_VISIBLE = WIDTH; 26 | static const uint16_t HEIGHT = 480; 27 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::ED037TC1; 28 | static const bool hasColor = false; 29 | static const bool hasPartialUpdate = true; 30 | static const bool hasFastPartialUpdate = true; 31 | static const uint16_t power_on_time = 100; // ms, e.g. 81840us 32 | static const uint16_t power_off_time = 150; // ms, e.g. 139415us 33 | static const uint16_t grey_refresh_time = 2000; // ms, e.g. 1740000us 34 | static const uint16_t full_refresh_time = 1000; // ms, e.g. 981000us 35 | static const uint16_t partial_refresh_time = 800; // ms, e.g. 781000us 36 | // constructor 37 | GxEPD2_370_TC1(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 38 | // methods (virtual) 39 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 40 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 41 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 42 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 43 | void clearScreenArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); // to white 44 | // write to controller memory, without screen refresh; x and w should be multiple of 8 45 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 49 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 51 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 54 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 56 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 58 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 60 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | // write to controller memory, with screen refresh; x and w should be multiple of 8 62 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 64 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 65 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 66 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 67 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 68 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 69 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 70 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 71 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 72 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 73 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 74 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 75 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 76 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 77 | void drawGreyLevels(); 78 | private: 79 | void _writeScreenBuffer(uint8_t command, uint8_t value); 80 | void _writeScreenBufferArea(uint8_t command, uint8_t value, uint16_t x, uint16_t y, uint16_t w, uint16_t h); 81 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 82 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 83 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 84 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 85 | void _PowerOn(); 86 | void _PowerOff(); 87 | void _InitDisplay(); 88 | void _Force_Init_Full(); 89 | void _Init_Full(); 90 | void _Init_4G(); 91 | void _Init_Part(); 92 | void _Update_Full(); 93 | void _Update_4G(); 94 | void _Update_Part(); 95 | private: 96 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh, unset_refresh} _refresh_mode; 97 | static const unsigned char lut_4G[]; 98 | static const uint8_t lut_full[]; 99 | static const uint8_t lut_partial[]; 100 | }; 101 | 102 | #endif 103 | -------------------------------------------------------------------------------- /src/gdeq/GxEPD2_426_GDEQ0426T82.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display, available here: https://www.good-display.com/comp/xcompanyFile/downloadNew.do?appId=24&fid=1722&id=1158 5 | // Panel: GDEQ0426T82 : https://www.good-display.com/product/457.html 6 | // Controller : SSD1677 : https://v4.cecdn.yun300.cn/100001_1909185148/SSD1677.pdf 7 | // code extracted for LUT and settings from https://github.com/waveshare/e-Paper 8 | // 9 | // Author: Jean-Marc Zingg 10 | // 11 | // Version: see library.properties 12 | // 13 | // Library: https://github.com/ZinggJM/GxEPD2 14 | 15 | #ifndef _GxEPD2_426_GDEQ0426T82_H_ 16 | #define _GxEPD2_426_GDEQ0426T82_H_ 17 | 18 | #include "../GxEPD2_4G_EPD.h" 19 | 20 | class GxEPD2_426_GDEQ0426T82 : public GxEPD2_4G_EPD 21 | { 22 | public: 23 | // attributes 24 | static const uint16_t WIDTH = 800; 25 | static const uint16_t HEIGHT = 480; 26 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEQ0426T82; 27 | static const bool hasColor = false; 28 | static const bool hasPartialUpdate = true; // grey refresh uses full screen 29 | //static const bool hasFastPartialUpdate = false; // with grey refresh 30 | static const bool hasFastPartialUpdate = true; // with b/w refresh 31 | static const bool useFastFullUpdate = true; // set false for extended (low) temperature range 32 | static const uint16_t power_on_time = 100; // ms, e.g. 81000us 33 | static const uint16_t power_off_time = 150; // ms, e.g. 140350us 34 | static const uint16_t grey_refresh_time = 4000; // ms, e.g. 3943998us 35 | static const uint16_t full_refresh_time = 1800; // ms, e.g. 1706000us 36 | static const uint16_t partial_refresh_time = 510; // ms, e.g. 501000us 37 | // constructor 38 | GxEPD2_426_GDEQ0426T82(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 39 | // methods (virtual) 40 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 41 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 42 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 43 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 44 | // write to controller memory, without screen refresh; x and w should be multiple of 8 45 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 46 | void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 47 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 49 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 51 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 53 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 54 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 56 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 58 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 59 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 60 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 61 | // write to controller memory, with screen refresh; x and w should be multiple of 8 62 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 63 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 64 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 65 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 66 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 67 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 68 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 69 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 70 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 71 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 72 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 73 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 74 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 75 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 76 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 77 | void drawGreyLevels(); 78 | private: 79 | void _writeScreenBuffer(uint8_t command, uint8_t value); 80 | void _writeScreenBufferArea(uint8_t command, uint8_t value, uint16_t x, uint16_t y, uint16_t w, uint16_t h); 81 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 82 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 83 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 84 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 85 | void _PowerOn(); 86 | void _PowerOff(); 87 | void _InitDisplay(); 88 | void _Force_Init_Full(); 89 | void _Init_Full(); 90 | void _Init_4G(); 91 | void _Init_Part(); 92 | void _Update_Full(); 93 | void _Update_4G(); 94 | void _Update_Part(); 95 | private: 96 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 97 | static const unsigned char lut_4G[]; 98 | }; 99 | 100 | #endif 101 | -------------------------------------------------------------------------------- /src/GxEPD2_4G_EPD.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2_4G 11 | 12 | #ifndef _GxEPD2_4G_EPD_H_ 13 | #define _GxEPD2_4G_EPD_H_ 14 | 15 | #include 16 | #include 17 | 18 | #include 19 | 20 | #pragma GCC diagnostic ignored "-Wunused-parameter" 21 | //#pragma GCC diagnostic ignored "-Wsign-compare" 22 | 23 | class GxEPD2_4G_EPD 24 | { 25 | public: 26 | // attributes 27 | const uint16_t WIDTH; 28 | const uint16_t HEIGHT; 29 | const GxEPD2_4G::Panel panel; 30 | const bool hasColor; 31 | const bool hasPartialUpdate; 32 | const bool hasFastPartialUpdate; 33 | // constructor 34 | GxEPD2_4G_EPD(int16_t cs, int16_t dc, int16_t rst, int16_t busy, int16_t busy_level, uint32_t busy_timeout, 35 | uint16_t w, uint16_t h, GxEPD2_4G::Panel p, bool c, bool pu, bool fpu); 36 | virtual void init(uint32_t serial_diag_bitrate = 0); // serial_diag_bitrate = 0 : disabled 37 | virtual void init(uint32_t serial_diag_bitrate, bool initial, uint16_t reset_duration = 10, bool pulldown_rst_mode = false); 38 | virtual void end(); // release SPI and control pins 39 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 40 | virtual void clearScreen(uint8_t value) = 0; // init controller memory and screen (default white) 41 | virtual void writeScreenBuffer(uint8_t value) = 0; // init controller memory (default white) 42 | // write to controller memory, without screen refresh; x and w should be multiple of 8 43 | virtual void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 44 | virtual void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) 45 | { 46 | // writeImage is independent from refresh mode for most controllers, exception e.g. SSD1681 47 | writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm); 48 | } 49 | virtual void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 50 | virtual void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 51 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 52 | virtual void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 53 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 54 | virtual void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 55 | virtual void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 56 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 57 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 58 | virtual void writeScreenBufferAgain(uint8_t value = 0xFF) // init controller memory (default white) 59 | { 60 | // most controllers with differential update do switch buffers on refresh, can use: 61 | writeScreenBuffer(value); 62 | } 63 | virtual void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) 64 | { 65 | // most controllers with differential update do switch buffers on refresh, can use: 66 | writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm); 67 | } 68 | virtual void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 69 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) 70 | { 71 | // most controllers with differential update do switch buffers on refresh, can use: 72 | writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); 73 | } 74 | // write to controller memory, with screen refresh; x and w should be multiple of 8 75 | virtual void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 76 | virtual void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 77 | virtual void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 78 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 79 | virtual void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 80 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 81 | virtual void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 82 | virtual void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 83 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) = 0; 84 | virtual void refresh(bool partial_update_mode = false) = 0; // screen refresh from controller memory to full screen 85 | virtual void refresh(int16_t x, int16_t y, int16_t w, int16_t h) = 0; // screen refresh from controller memory, partial screen 86 | virtual void powerOff() = 0; // turns off generation of panel driving voltages, avoids screen fading over time 87 | virtual void hibernate() = 0; // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 88 | virtual void setPaged() {}; // for GxEPD2_154c paged workaround 89 | // register a callback function to be called during _waitWhileBusy continuously. 90 | void setBusyCallback(void (*busyCallback)(const void*), const void* busy_callback_parameter = 0); 91 | static inline uint16_t gx_uint16_min(uint16_t a, uint16_t b) 92 | { 93 | return (a < b ? a : b); 94 | }; 95 | static inline uint16_t gx_uint16_max(uint16_t a, uint16_t b) 96 | { 97 | return (a > b ? a : b); 98 | }; 99 | void selectSPI(SPIClass& spi, SPISettings spi_settings); 100 | protected: 101 | void _reset(); 102 | void _waitWhileBusy(const char* comment = 0, uint16_t busy_time = 5000); 103 | void _writeCommand(uint8_t c); 104 | void _writeData(uint8_t d); 105 | void _writeData(const uint8_t* data, uint16_t n); 106 | void _writeDataPGM(const uint8_t* data, uint16_t n, int16_t fill_with_zeroes = 0); 107 | void _writeDataPGM_sCS(const uint8_t* data, uint16_t n, int16_t fill_with_zeroes = 0); 108 | void _writeCommandData(const uint8_t* pCommandData, uint8_t datalen); 109 | void _writeCommandDataPGM(const uint8_t* pCommandData, uint8_t datalen); 110 | void _startTransfer(); 111 | void _transfer(uint8_t value); 112 | void _endTransfer(); 113 | protected: 114 | int16_t _cs, _dc, _rst, _busy, _busy_level; 115 | uint32_t _busy_timeout; 116 | bool _diag_enabled, _pulldown_rst_mode; 117 | SPIClass* _pSPIx; 118 | SPISettings _spi_settings; 119 | bool _initial_write, _initial_refresh; 120 | bool _power_is_on, _using_partial_mode, _hibernating; 121 | bool _init_display_done, _init_4G_done; 122 | uint16_t _reset_duration; 123 | void (*_busy_callback)(const void*); 124 | const void* _busy_callback_parameter; 125 | }; 126 | 127 | #endif 128 | -------------------------------------------------------------------------------- /src/gdey/GxEPD2_750_GDEY075T7.h: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: https://www.good-display.com/comp/xcompanyFile/downloadNew.do?appId=24&fid=1373&id=1125 5 | // Panel: GDEY075T7 : https://www.good-display.com/product/396.html 6 | // Controller: UC8179 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8179.pdf 7 | // 8 | // Author: Jean-Marc Zingg 9 | // 10 | // Version: see library.properties 11 | // 12 | // Library: https://github.com/ZinggJM/GxEPD2 13 | 14 | #ifndef _GxEPD2_750_GDEY075T7_H_ 15 | #define _GxEPD2_750_GDEY075T7_H_ 16 | 17 | #include "../GxEPD2_4G_EPD.h" 18 | 19 | class GxEPD2_750_GDEY075T7 : public GxEPD2_4G_EPD 20 | { 21 | public: 22 | // attributes 23 | static const uint16_t WIDTH = 800; 24 | static const uint16_t WIDTH_VISIBLE = WIDTH; 25 | static const uint16_t HEIGHT = 480; 26 | static const GxEPD2_4G::Panel panel = GxEPD2_4G::GDEY075T7; 27 | static const bool hasColor = false; 28 | static const bool hasPartialUpdate = true; 29 | static const bool usePartialUpdateWindow = false; // set false for better image 30 | static const bool usePartialUpdateWindow_4G = false; // set false for acceptable image 31 | static const bool hasFastPartialUpdate = true; // set this false to force full refresh always 32 | static const bool useFastFullUpdate = true; // set false for extended (low) temperature range 33 | static const bool useFastPartialUpdateFromOTP = true; // set this false for earlier batches, such as the panel I have (1580258us) 34 | static const uint16_t power_on_time = 140; // ms, e.g. 128000us 35 | static const uint16_t power_off_time = 42; // ms, e.g. 40000us 36 | static const uint16_t grey_refresh_time = 2500; // ms, e.g. 2324000us 37 | static const uint16_t full_refresh_time = 1200; // ms, e.g. 1168996us 38 | static const uint16_t partial_refresh_time = 450; // ms, e.g. 435000us 39 | // constructor 40 | GxEPD2_750_GDEY075T7(int16_t cs, int16_t dc, int16_t rst, int16_t busy); 41 | // methods (virtual) 42 | // Support for Bitmaps (Sprites) to Controller Buffer and to Screen 43 | void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) 44 | void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) 45 | void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) 46 | // write to controller memory, without screen refresh; x and w should be multiple of 8 47 | void writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 48 | void writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 49 | void writeImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 50 | void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 51 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 52 | void writeImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 53 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 54 | void writeImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 55 | void writeImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 56 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 57 | // for differential update: set current and previous buffers equal (for fast partial update to work correctly) 58 | // done by controller (N2OCP); override with empty code 59 | void writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) {}; 60 | void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 61 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false) {}; 62 | // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 63 | void writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 64 | // write to controller memory, with screen refresh; x and w should be multiple of 8 65 | void drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 66 | void drawImage_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 67 | void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 68 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 69 | void drawImagePart_4G(const uint8_t bitmap[], uint8_t bpp, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 70 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 71 | void drawImage(const uint8_t* black, const uint8_t* color, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 72 | void drawImagePart(const uint8_t* black, const uint8_t* color, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 73 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 74 | // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 75 | void drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 76 | void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen 77 | void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen 78 | void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time 79 | void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) 80 | private: 81 | void _writeScreenBuffer(uint8_t command, uint8_t value); 82 | void _writeScreenBufferArea(uint8_t command, uint8_t value, uint16_t x, uint16_t y, uint16_t w, uint16_t h); 83 | void _writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 84 | void _writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, 85 | int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); 86 | void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); 87 | void _PowerOn(); 88 | void _PowerOff(); 89 | void _InitDisplay(); 90 | void _Force_Init_Full(); 91 | void _Init_Full(); 92 | void _Init_4G(); 93 | void _Init_Part(); 94 | void _Update_Full(); 95 | void _Update_4G(); 96 | void _Update_Part(); 97 | private: 98 | enum {full_refresh, grey_refresh, fast_refresh, forced_full_refresh} _refresh_mode; 99 | static const unsigned char lut_20_vcom0_4G[]; 100 | static const unsigned char lut_21_ww_4G[]; 101 | static const unsigned char lut_22_bw_4G[]; 102 | static const unsigned char lut_23_wb_4G[]; 103 | static const unsigned char lut_24_bb_4G[]; 104 | static const unsigned char lut_20_LUTC_partial[]; 105 | static const unsigned char lut_21_LUTWW_partial[]; 106 | static const unsigned char lut_22_LUTKW_partial[]; 107 | static const unsigned char lut_23_LUTWK_partial[]; 108 | static const unsigned char lut_24_LUTKK_partial[]; 109 | static const unsigned char lut_25_LUTBD_partial[]; 110 | }; 111 | 112 | #endif 113 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GxEPD2_4G 2 | ## Arduino Display Library for SPI E-Paper Displays 3 | 4 | - GxEPD2 variant with support for 4 grey levels on supported e-papers 5 | 6 | - With full Graphics and Text support using Adafruit_GFX 7 | 8 | - For SPI e-paper displays from Dalian Good Display 9 | - and SPI e-paper boards from Waveshare 10 | 11 | ### note on grey level support 12 | - 4 grey levels are available on some e-papers that support differential refresh 13 | - 4 grey level support can be used instead of differential refresh 14 | - "old data" and "new data" controller buffers provides 2 bits per pixel 15 | - the 4 states per pixel can produce 4 grey levels using a special waveform 16 | - the 4 grey level waveform table is taken from demo from Good Display 17 | - the 4 grey levels may differ from display to display, and may be temperature dependent 18 | - ghosting can't be avoided; using clearScreen() helps 19 | 20 | ### important note : 21 | - the display panels are for 3.3V supply and 3.3V data lines 22 | - never connect data lines directly to 5V Arduino data pins, use e.g. 4k7/10k resistor divider 23 | - series resistor only is not enough for reliable operation (back-feed effect through protection diodes) 24 | - 4k7/10k resistor divider may not work with flat cable extensions or Waveshare 4.2 board, use level converter then 25 | - do not forget to connect GND 26 | - the actual Waveshare display boards now have level converters and series regulator, safe for 5V 27 | - use 3k3 pull-down on SS for ESP8266 for boards with level converters 28 | - note that 7.5" e-paper displays don't work reliable if fed from 3.3V Arduino pin 29 | - note that Waveshare boards with "clever" reset circuit may need shortened reset pulse 30 | - use `init(115200, true, 2, false)` for Waveshare boards with "clever" reset circuit 31 | - note that Waveshare boards with "clever" reset circuit need 1k pull-up on RST on ESP8266, or different pin 32 | - note that the new Waveshare Universal e-Paper Raw Panel Driver HAT Rev 2.3 needs PWR connected to VCC or driven HIGH 33 | - see https://www.waveshare.com/wiki/E-Paper_Driver_HAT 34 | 35 | ### Paged Drawing, Picture Loop 36 | - This library uses paged drawing to limit RAM use and cope with missing single pixel update support 37 | - buffer size can be selected in the application by template parameter page_height, see GxEPD2_Example 38 | - Paged drawing is implemented as picture loop, like in U8G2 (Oliver Kraus) 39 | - see https://github.com/olikraus/u8glib/wiki/tpictureloop 40 | - Paged drawing is also available using drawPaged() and drawCallback(), like in GxEPD 41 | - ` // GxEPD style paged drawing; drawCallback() is called as many times as needed ` 42 | - ` void drawPaged(void (*drawCallback)(const void*), const void* pv) ` 43 | - paged drawing is done using Adafruit_GFX methods inside picture loop or drawCallback 44 | 45 | ### Full Screen Buffer Support 46 | - full screen buffer is selected by setting template parameter page_height to display height 47 | - drawing to full screen buffer is done using Adafruit_GFX methods without picture loop or drawCallback 48 | - and then calling method display() 49 | 50 | ### Low Level Bitmap Drawing Support 51 | - bitmap drawing support to the controller memory and screen is available: 52 | - either through the template class instance methods that forward calls to the base display class 53 | - or directly using an instance of a base display class and calling its methods directly 54 | 55 | ### Supporting Arduino Forum Topics: 56 | 57 | - Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 58 | - Good Display ePaper for Arduino : https://forum.arduino.cc/index.php?topic=436411.0 59 | - Note that these topics are closed. Use only for reference. 60 | - create a new topic for each question or issue in https://forum.arduino.cc/c/using-arduino/displays/23 61 | - The Arduino Forum is no longer watched and answered by the Author. 62 | - New questions or issues should be posted on https://github.com/ZinggJM/GxEPD2/discussions 63 | 64 | ### Note on documentation 65 | - GxEPD2_4G uses Adafruit_GFX for Graphics and Text support, which is well documented there 66 | - GxEPD2_4G uses meaningful method names, and has some comments in the header files 67 | - consult the header files GxEPD2_4G_BW.h, GxEPD2_4G_4G.h and GxEPD2_4G_GFX.h 68 | - for the concept of paged drawing and picture loop see: 69 | - https://github.com/olikraus/u8glib/wiki/tpictureloop 70 | 71 | ### Note on issues and pull requests 72 | - issues should be reported in the Arduino Forum Displays. 73 | - issues on GitHub are disabled; there were too many false issues. 74 | - pull requests are not welcome, will not be merged. 75 | - pull requests can't be disabled, but will be closed. 76 | - please place information about interesting fork additions in the Arduino Forum Displays. 77 | 78 | ### Supported SPI e-paper panels from Good Display: 79 | - GDEY0154D67 1.54" b/w 200x200, SSD1681 80 | - GDEW0213I5F 2.13" b/w 104x212, UC8151 (IL0373), flexible 81 | - GDEY0213B74 2.13" b/w 122x250, SSD1680 82 | - GDEW027W3 2.7" b/w 176x264, EK79652 (IL91874) 83 | - GDEW029T5 2.9" b/w 128x296, UC8151 (IL0373) 84 | - GDEW029T5D 2.9" b/w 128x296, UC8151D 85 | - GDEW029I6FD 2.9" b/w 128x296, UC8151D, flexible 86 | - GDEM029T94 2.9" b/w 128x296, SSD1680 87 | - GDEW0371W7 3.7" b/w 240x416, UC8171 (IL0324) 88 | - ED037TC1 3.7" b/w 280x480, SSD1677 89 | - GDEW042T2 4.2" b/w 400x300, UC8176 (IL0398) 90 | - GDEY042T81 4.2" b/w 400x300, SSD1683 91 | - GDEQ0426T82 4.26" b/w 800x480, SSD1677 92 | - GDEW075T7 7.5" b/w 800x480, EK79655 (GD7965) 93 | - GDEY075T7 7.5" b/w 800x480, UC8179 94 | 95 | ### Version 1.0.9 96 | - added support for ED037TC1 280x480 97 | #### Version 1.0.8 98 | - added support for GDEY075T7 800x480 99 | - on GDEY075T7 grey level partial window update looks bad (greys out remainder) 100 | - on GDEY075T7 grey level partial window update is disabled by default 101 | #### Version 1.0.7 102 | - added support for GDEY0154D67 200x200 103 | - added support for GDEY0213B74 122x250 104 | - added support for GDEY042T81 400x300 105 | - added support for GDEQ0426T82 480x800 106 | #### Version 1.0.6 107 | - added support for mixed b/w and 4G content, fast b/w partial refresh on grey background 108 | - added classes GxEPD2_4G_BW_R and GxEPD2_4G_4G_R, for reference to common driver class 109 | - added example GxEPD2_4G_MixedExample to show use of fast b/w on grey 110 | - mixed content is experimental 111 | - mixed content with fast b/w refresh can't be used with GDEM029T94 112 | - added option to select an alternate HW SPI channel and/or SPI settings 113 | - by method selectSPI(SPIClass& spi, SPISettings spi_settings) of driver base class GxEPD2_4G_EPD 114 | - by calling selectSPI before calling init() of display class 115 | - or by calling extended init() method that has these parameters added 116 | - tested with RPi Pico RP2040 using Good Display DESPI-PICO connection shield 117 | - updated GxEPD2_4G_Example to show use with DESPI-PICO 118 | - DESPI-PICO: see https://www.good-display.com/product/393.html 119 | - added optional init parameter "reset_duration" in ms 120 | - reset_duration = 2 may help with "clever" reset circuit of newer boards from Waveshare 121 | - changed the default reset duration to 10ms instead of 20ms 122 | - changed the delay after reset to 10ms or reset duration, whichever is higher, instead of 200ms 123 | - added a busyCallback feature, to allow to service periodic actions during wait for BUSY termination 124 | - ` // register a callback function to be called during _waitWhileBusy continuously. ` 125 | - ` void setBusyCallback(void (*busyCallback)(const void*), const void* busy_callback_parameter = 0); ` 126 | - added some updates to solve compiler warnings (ALL for GCC for AVR) 127 | #### Version 1.0.5 128 | - fix for STM32 official package pin number range (int16_t) 129 | - fix for refresh(int16_t x, int16_t y, int16_t w, int16_t h) methods screen intersection 130 | #### Version 1.0.4 131 | - added support for GDEW029T5D 132 | - added support for GDEW029I6FD 133 | - added support for GDEM029T94 134 | - GDEM029T94 has no partial refresh with grey refresh mode 135 | - improved handling of switching between refresh modes 136 | #### Version 1.0.3 137 | - renamed top level files and classes to allow co-existence of installed GxEPD2_4G and GxEPD2 138 | - fixed drawGreyPixmap() issues 139 | - additional fixes 140 | #### Version 1.0.2 141 | - added method drawGreyPixmap() to buffered graphics 142 | - void drawGreyPixmap(const uint8_t pixmap[], int16_t depth, int16_t x, int16_t y, int16_t w, int16_t h); 143 | #### Version 1.0.1 144 | - added support for GDEW075T7 145 | - GDEW075T7 uses same wavetable as the other ones, no "official" (demo) yet 146 | - GDEW075T7 grey level behaviour is less good than e.g. on GDEW0371W7 147 | - some fixes and improvements 148 | #### Version 1.0.0 149 | - initial version for 4 grey level support, experimental 150 | - (slow) partial refresh doesn't work with 4G on some panels 151 | -------------------------------------------------------------------------------- /src/GxEPD2_4G_EPD.cpp: -------------------------------------------------------------------------------- 1 | // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! 3 | // 4 | // based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2_4G 11 | 12 | #include "GxEPD2_4G_EPD.h" 13 | 14 | #if defined(ESP8266) || defined(ESP32) 15 | #include 16 | #else 17 | #include 18 | #endif 19 | 20 | GxEPD2_4G_EPD::GxEPD2_4G_EPD(int16_t cs, int16_t dc, int16_t rst, int16_t busy, int16_t busy_level, uint32_t busy_timeout, 21 | uint16_t w, uint16_t h, GxEPD2_4G::Panel p, bool c, bool pu, bool fpu) : 22 | WIDTH(w), HEIGHT(h), panel(p), hasColor(c), hasPartialUpdate(pu), hasFastPartialUpdate(fpu), 23 | _cs(cs), _dc(dc), _rst(rst), _busy(busy), _busy_level(busy_level), _busy_timeout(busy_timeout), _diag_enabled(false), 24 | _pSPIx(&SPI), _spi_settings(4000000, MSBFIRST, SPI_MODE0) 25 | { 26 | _initial_write = true; 27 | _initial_refresh = true; 28 | _power_is_on = false; 29 | _using_partial_mode = false; 30 | _hibernating = false; 31 | _init_display_done = false; 32 | _init_4G_done = false; 33 | _reset_duration = 10; 34 | _busy_callback = 0; 35 | _busy_callback_parameter = 0; 36 | } 37 | 38 | void GxEPD2_4G_EPD::init(uint32_t serial_diag_bitrate) 39 | { 40 | init(serial_diag_bitrate, true, 10, false); 41 | } 42 | 43 | void GxEPD2_4G_EPD::init(uint32_t serial_diag_bitrate, bool initial, uint16_t reset_duration, bool pulldown_rst_mode) 44 | { 45 | _initial_write = initial; 46 | _initial_refresh = initial; 47 | _pulldown_rst_mode = pulldown_rst_mode; 48 | _power_is_on = false; 49 | _using_partial_mode = false; 50 | _hibernating = false; 51 | _init_display_done = false; 52 | _init_4G_done = false; 53 | _reset_duration = reset_duration; 54 | if (serial_diag_bitrate > 0) 55 | { 56 | Serial.begin(serial_diag_bitrate); 57 | _diag_enabled = true; 58 | } 59 | if (_cs >= 0) 60 | { 61 | digitalWrite(_cs, HIGH); // preset (less glitch for any analyzer) 62 | pinMode(_cs, OUTPUT); 63 | digitalWrite(_cs, HIGH); // set (needed e.g. for RP2040) 64 | } 65 | _reset(); 66 | _pSPIx->begin(); // may steal _rst pin (Waveshare Pico-ePaper-2.9) 67 | if (_rst >= 0) 68 | { 69 | digitalWrite(_rst, HIGH); // preset (less glitch for any analyzer) 70 | pinMode(_rst, OUTPUT); 71 | digitalWrite(_rst, HIGH); // set (needed e.g. for RP2040) 72 | } 73 | if (_cs >= 0) 74 | { 75 | digitalWrite(_cs, HIGH); // preset (less glitch for any analyzer) 76 | pinMode(_cs, OUTPUT); 77 | digitalWrite(_cs, HIGH); // set (needed e.g. for RP2040) 78 | } 79 | if (_dc >= 0) 80 | { 81 | digitalWrite(_dc, HIGH); // preset (less glitch for any analyzer) 82 | pinMode(_dc, OUTPUT); 83 | digitalWrite(_dc, HIGH); // set (needed e.g. for RP2040) 84 | } 85 | if (_busy >= 0) 86 | { 87 | pinMode(_busy, INPUT); 88 | } 89 | } 90 | 91 | void GxEPD2_4G_EPD::end() 92 | { 93 | _pSPIx->end(); 94 | if (_cs >= 0) pinMode(_cs, INPUT); 95 | if (_dc >= 0) pinMode(_dc, INPUT); 96 | if (_rst >= 0) pinMode(_rst, INPUT); 97 | } 98 | 99 | void GxEPD2_4G_EPD::setBusyCallback(void (*busyCallback)(const void*), const void* busy_callback_parameter) 100 | { 101 | _busy_callback = busyCallback; 102 | _busy_callback_parameter = busy_callback_parameter; 103 | } 104 | 105 | void GxEPD2_4G_EPD::selectSPI(SPIClass& spi, SPISettings spi_settings) 106 | { 107 | _pSPIx = &spi; 108 | _spi_settings = spi_settings; 109 | } 110 | 111 | void GxEPD2_4G_EPD::_reset() 112 | { 113 | if (_rst >= 0) 114 | { 115 | if (_pulldown_rst_mode) 116 | { 117 | digitalWrite(_rst, LOW); 118 | pinMode(_rst, OUTPUT); 119 | delay(_reset_duration); 120 | pinMode(_rst, INPUT_PULLUP); 121 | delay(_reset_duration > 10 ? _reset_duration : 10); 122 | } 123 | else 124 | { 125 | digitalWrite(_rst, HIGH); // NEEDED for Waveshare "clever" reset circuit, power controller before reset pulse 126 | pinMode(_rst, OUTPUT); 127 | delay(10); // NEEDED for Waveshare "clever" reset circuit, at least delay(2); 128 | digitalWrite(_rst, LOW); 129 | delay(_reset_duration); 130 | digitalWrite(_rst, HIGH); 131 | delay(_reset_duration > 10 ? _reset_duration : 10); 132 | } 133 | _hibernating = false; 134 | } 135 | } 136 | 137 | void GxEPD2_4G_EPD::_waitWhileBusy(const char* comment, uint16_t busy_time) 138 | { 139 | if (_busy >= 0) 140 | { 141 | delay(1); // add some margin to become active 142 | unsigned long start = micros(); 143 | while (1) 144 | { 145 | if (digitalRead(_busy) != _busy_level) break; 146 | if (_busy_callback) _busy_callback(_busy_callback_parameter); 147 | else delay(1); 148 | if (digitalRead(_busy) != _busy_level) break; 149 | if (micros() - start > _busy_timeout) 150 | { 151 | Serial.println("Busy Timeout!"); 152 | break; 153 | } 154 | #if defined(ESP8266) || defined(ESP32) 155 | yield(); // avoid wdt 156 | #endif 157 | } 158 | if (comment) 159 | { 160 | #if !defined(DISABLE_DIAGNOSTIC_OUTPUT) 161 | if (_diag_enabled) 162 | { 163 | unsigned long elapsed = micros() - start; 164 | Serial.print(comment); 165 | Serial.print(" : "); 166 | Serial.println(elapsed); 167 | } 168 | #endif 169 | } 170 | (void) start; 171 | } 172 | else delay(busy_time); 173 | } 174 | 175 | void GxEPD2_4G_EPD::_writeCommand(uint8_t c) 176 | { 177 | _pSPIx->beginTransaction(_spi_settings); 178 | if (_dc >= 0) digitalWrite(_dc, LOW); 179 | if (_cs >= 0) digitalWrite(_cs, LOW); 180 | _pSPIx->transfer(c); 181 | if (_cs >= 0) digitalWrite(_cs, HIGH); 182 | if (_dc >= 0) digitalWrite(_dc, HIGH); 183 | _pSPIx->endTransaction(); 184 | } 185 | 186 | void GxEPD2_4G_EPD::_writeData(uint8_t d) 187 | { 188 | _pSPIx->beginTransaction(_spi_settings); 189 | if (_cs >= 0) digitalWrite(_cs, LOW); 190 | _pSPIx->transfer(d); 191 | if (_cs >= 0) digitalWrite(_cs, HIGH); 192 | _pSPIx->endTransaction(); 193 | } 194 | 195 | void GxEPD2_4G_EPD::_writeData(const uint8_t* data, uint16_t n) 196 | { 197 | _pSPIx->beginTransaction(_spi_settings); 198 | if (_cs >= 0) digitalWrite(_cs, LOW); 199 | for (uint16_t i = 0; i < n; i++) 200 | { 201 | _pSPIx->transfer(*data++); 202 | } 203 | if (_cs >= 0) digitalWrite(_cs, HIGH); 204 | _pSPIx->endTransaction(); 205 | } 206 | 207 | void GxEPD2_4G_EPD::_writeDataPGM(const uint8_t* data, uint16_t n, int16_t fill_with_zeroes) 208 | { 209 | _pSPIx->beginTransaction(_spi_settings); 210 | if (_cs >= 0) digitalWrite(_cs, LOW); 211 | for (uint16_t i = 0; i < n; i++) 212 | { 213 | _pSPIx->transfer(pgm_read_byte(&*data++)); 214 | } 215 | while (fill_with_zeroes > 0) 216 | { 217 | _pSPIx->transfer(0x00); 218 | fill_with_zeroes--; 219 | } 220 | if (_cs >= 0) digitalWrite(_cs, HIGH); 221 | _pSPIx->endTransaction(); 222 | } 223 | 224 | void GxEPD2_4G_EPD::_writeDataPGM_sCS(const uint8_t* data, uint16_t n, int16_t fill_with_zeroes) 225 | { 226 | _pSPIx->beginTransaction(_spi_settings); 227 | for (uint8_t i = 0; i < n; i++) 228 | { 229 | if (_cs >= 0) digitalWrite(_cs, LOW); 230 | _pSPIx->transfer(pgm_read_byte(&*data++)); 231 | if (_cs >= 0) digitalWrite(_cs, HIGH); 232 | } 233 | while (fill_with_zeroes > 0) 234 | { 235 | if (_cs >= 0) digitalWrite(_cs, LOW); 236 | _pSPIx->transfer(0x00); 237 | fill_with_zeroes--; 238 | if (_cs >= 0) digitalWrite(_cs, HIGH); 239 | } 240 | _pSPIx->endTransaction(); 241 | } 242 | 243 | void GxEPD2_4G_EPD::_writeCommandData(const uint8_t* pCommandData, uint8_t datalen) 244 | { 245 | _pSPIx->beginTransaction(_spi_settings); 246 | if (_dc >= 0) digitalWrite(_dc, LOW); 247 | if (_cs >= 0) digitalWrite(_cs, LOW); 248 | _pSPIx->transfer(*pCommandData++); 249 | if (_dc >= 0) digitalWrite(_dc, HIGH); 250 | for (uint8_t i = 0; i < datalen - 1; i++) // sub the command 251 | { 252 | _pSPIx->transfer(*pCommandData++); 253 | } 254 | if (_cs >= 0) digitalWrite(_cs, HIGH); 255 | _pSPIx->endTransaction(); 256 | } 257 | 258 | void GxEPD2_4G_EPD::_writeCommandDataPGM(const uint8_t* pCommandData, uint8_t datalen) 259 | { 260 | _pSPIx->beginTransaction(_spi_settings); 261 | if (_dc >= 0) digitalWrite(_dc, LOW); 262 | if (_cs >= 0) digitalWrite(_cs, LOW); 263 | _pSPIx->transfer(pgm_read_byte(&*pCommandData++)); 264 | if (_dc >= 0) digitalWrite(_dc, HIGH); 265 | for (uint8_t i = 0; i < datalen - 1; i++) // sub the command 266 | { 267 | _pSPIx->transfer(pgm_read_byte(&*pCommandData++)); 268 | } 269 | if (_cs >= 0) digitalWrite(_cs, HIGH); 270 | _pSPIx->endTransaction(); 271 | } 272 | 273 | void GxEPD2_4G_EPD::_startTransfer() 274 | { 275 | _pSPIx->beginTransaction(_spi_settings); 276 | if (_cs >= 0) digitalWrite(_cs, LOW); 277 | } 278 | 279 | void GxEPD2_4G_EPD::_transfer(uint8_t value) 280 | { 281 | _pSPIx->transfer(value); 282 | } 283 | 284 | void GxEPD2_4G_EPD::_endTransfer() 285 | { 286 | if (_cs >= 0) digitalWrite(_cs, HIGH); 287 | _pSPIx->endTransaction(); 288 | } 289 | -------------------------------------------------------------------------------- /examples/GxEPD2_4G_MixedExample/GxEPD2_4G_MixedExample_display_selection.h: -------------------------------------------------------------------------------- 1 | // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2_4G 11 | 12 | // Supporting Arduino Forum Topics (closed, read only): 13 | // Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 14 | // Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 15 | // 16 | // Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues 17 | 18 | // select the display driver class (only one) for your panel 19 | //#define GxEPD2_DRIVER_CLASS GxEPD2_154_GDEY0154D67 // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 20 | //#define GxEPD2_DRIVER_CLASS GxEPD2_213_flex // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 21 | //#define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 22 | //#define GxEPD2_DRIVER_CLASS GxEPD2_270 // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 23 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5 // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 24 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5D // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 25 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_I6FD // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 26 | //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 27 | //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" 28 | //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 29 | //#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T81 // GDEY042T81 400x300, SSD1683 (no inking) 30 | //#define GxEPD2_DRIVER_CLASS GxEPD2_426_GDEQ0426T82 // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 31 | //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 32 | 33 | // these panels don't support mixed content because of missing partial window update support 34 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_T94 // GDEM029T94 128x296, SSD1680 35 | 36 | // these panels don't support mixed content because clearing the background before changing refresh mode 37 | //#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) 38 | 39 | // SS is usually used for CS. define here for easy change 40 | #ifndef EPD_CS 41 | #define EPD_CS SS 42 | #endif 43 | 44 | #if defined(GxEPD2_DRIVER_CLASS) 45 | 46 | #if defined (ESP8266) 47 | #define MAX_DISPLAY_BUFFER_SIZE (81920ul-34000ul-5000ul) // ~34000 base use, change 5000 to your application use 48 | #define MAX_HEIGHT_BW(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) 49 | #define MAX_HEIGHT_4G(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4)) 50 | // adapt the constructor parameters to your wiring 51 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=D8*/ EPD_CS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); 52 | // mapping of Waveshare e-Paper ESP8266 Driver Board, new version 53 | //GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); 54 | // mapping of Waveshare e-Paper ESP8266 Driver Board, old version 55 | //GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); 56 | GxEPD2_4G_BW_R display_bw(display.epd2); 57 | #undef MAX_DISPLAY_BUFFER_SIZE 58 | #undef MAX_HEIGHT_BW 59 | #undef MAX_HEIGHT_4G 60 | #endif 61 | 62 | #if defined(ESP32) 63 | #define MAX_DISPLAY_BUFFER_SIZE 65536ul // e.g. 64 | #define MAX_HEIGHT_BW(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) 65 | #define MAX_HEIGHT_4G(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4)) 66 | // adapt the constructor parameters to your wiring 67 | #if defined(ARDUINO_LOLIN_D32_PRO) 68 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); 69 | #elif defined(ARDUINO_ESP32_DEV) // e.g. TTGO T8 ESP32-WROVER 70 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); 71 | #else 72 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); 73 | #endif 74 | GxEPD2_4G_BW_R display_bw(display.epd2); 75 | #undef MAX_DISPLAY_BUFFER_SIZE 76 | #undef MAX_HEIGHT_BW 77 | #undef MAX_HEIGHT_4G 78 | #endif 79 | 80 | // can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics) 81 | #if defined(ARDUINO_ARCH_STM32) 82 | #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise 83 | #define MAX_HEIGHT_BW(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) 84 | #define MAX_HEIGHT_4G(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4)) 85 | // adapt the constructor parameters to your wiring 86 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=PA4*/ EPD_CS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); 87 | GxEPD2_4G_BW_R display_bw(display.epd2); 88 | #undef MAX_DISPLAY_BUFFER_SIZE 89 | #undef MAX_HEIGHT_BW 90 | #undef MAX_HEIGHT_4G 91 | #endif 92 | 93 | #if defined(__AVR) 94 | #if defined (ARDUINO_AVR_MEGA2560) // Note: SS is on 53 on MEGA 95 | #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200 96 | #else // Note: SS is on 10 on UNO, NANO 97 | #define MAX_DISPLAY_BUFFER_SIZE 800 // 98 | #endif 99 | #define MAX_HEIGHT_BW(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) 100 | #define MAX_HEIGHT_4G(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4)) 101 | // adapt the constructor parameters to your wiring 102 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 103 | GxEPD2_4G_BW_R display_bw(display.epd2); 104 | #undef MAX_HEIGHT_BW 105 | #undef MAX_HEIGHT_4G 106 | #endif 107 | 108 | #if defined(ARDUINO_ARCH_SAM) 109 | #define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k 110 | #define MAX_HEIGHT_BW(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) 111 | #define MAX_HEIGHT_4G(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4)) 112 | // adapt the constructor parameters to your wiring 113 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=10*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 114 | GxEPD2_4G_BW_R display_bw(display.epd2); 115 | #undef MAX_DISPLAY_BUFFER_SIZE 116 | #undef MAX_HEIGHT_BW 117 | #undef MAX_HEIGHT_4G 118 | #endif 119 | 120 | #if defined(ARDUINO_ARCH_SAMD) 121 | #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise 122 | #define MAX_HEIGHT_BW(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) 123 | #define MAX_HEIGHT_4G(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4)) 124 | // adapt the constructor parameters to your wiring 125 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); 126 | //GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // my Seed XIOA0 127 | //GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // my other Seed XIOA0 128 | GxEPD2_4G_BW_R display_bw(display.epd2); 129 | #undef MAX_DISPLAY_BUFFER_SIZE 130 | #undef MAX_HEIGHT_BW 131 | #undef MAX_HEIGHT_4G 132 | #endif 133 | 134 | #if defined(ARDUINO_ARCH_RP2040) 135 | #define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram 136 | #define MAX_HEIGHT_BW(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) 137 | #define MAX_HEIGHT_4G(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 4)) 138 | #if defined(ARDUINO_NANO_RP2040_CONNECT) 139 | // adapt the constructor parameters to your wiring 140 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 141 | #endif 142 | #if defined(ARDUINO_RASPBERRY_PI_PICO) 143 | // adapt the constructor parameters to your wiring 144 | //GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board 145 | // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! 146 | GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO 147 | //GxEPD2_4G_4G display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified 148 | #endif 149 | GxEPD2_4G_BW_R display_bw(display.epd2); 150 | #undef MAX_DISPLAY_BUFFER_SIZE 151 | #undef MAX_HEIGHT_BW 152 | #undef MAX_HEIGHT_4G 153 | #endif 154 | 155 | #endif 156 | -------------------------------------------------------------------------------- /examples/GxEPD2_4G_Example/GxEPD2_4G_display_selection_new_style.h: -------------------------------------------------------------------------------- 1 | // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2 11 | 12 | // Supporting Arduino Forum Topics (closed, read only): 13 | // Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 14 | // Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 15 | // 16 | // Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues 17 | 18 | // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below 19 | 20 | // select the display class (only one) 21 | #define GxEPD2_DISPLAY_CLASS GxEPD2_4G_4G 22 | //#define GxEPD2_DISPLAY_CLASS GxEPD2_4G_BW 23 | 24 | // select the display driver class (only one) for your panel 25 | //#define GxEPD2_DRIVER_CLASS GxEPD2_154_GDEY0154D67 // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 26 | //#define GxEPD2_DRIVER_CLASS GxEPD2_213_flex // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 27 | //#define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 28 | //#define GxEPD2_DRIVER_CLASS GxEPD2_270 // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 29 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5 // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 30 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5D // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 31 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_I6FD // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 32 | //#define GxEPD2_DRIVER_CLASS GxEPD2_290_T94 // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) 33 | //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 34 | //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" 35 | //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 36 | //#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T81 // GDEY042T81 400x300, SSD1683 (no inking) 37 | //#define GxEPD2_DRIVER_CLASS GxEPD2_426_GDEQ0426T82 // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 38 | //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 39 | //#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) 40 | 41 | // SS is usually used for CS. define here for easy change 42 | #ifndef EPD_CS 43 | #define EPD_CS SS 44 | #endif 45 | 46 | #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) 47 | 48 | // somehow there should be an easier way to do this 49 | #define GxEPD2_4G_BW_IS_GxEPD2_4G_BW true 50 | #define GxEPD2_4G_4G_IS_GxEPD2_4G_4G true 51 | #define IS_GxEPD(c, x) (c##x) 52 | #define IS_GxEPD2_4G_BW(x) IS_GxEPD(GxEPD2_4G_BW_IS_, x) 53 | #define IS_GxEPD2_4G_4G(x) IS_GxEPD(GxEPD2_4G_4G_IS_, x) 54 | 55 | #if defined (ESP8266) 56 | #define MAX_DISPLAY_BUFFER_SIZE (81920ul-34000ul-5000ul) // ~34000 base use, change 5000 to your application use 57 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 58 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 59 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 60 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 61 | #endif 62 | // adapt the constructor parameters to your wiring 63 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=D8*/ EPD_CS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); 64 | // mapping of Waveshare e-Paper ESP8266 Driver Board, new version 65 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); 66 | // mapping of Waveshare e-Paper ESP8266 Driver Board, old version 67 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); 68 | #undef MAX_DISPLAY_BUFFER_SIZE 69 | #undef MAX_HEIGHT 70 | #endif 71 | 72 | #if defined(ESP32) 73 | #define MAX_DISPLAY_BUFFER_SIZE 65536ul // e.g. 74 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 75 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 76 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 77 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 78 | #endif 79 | // adapt the constructor parameters to your wiring 80 | #if defined(ARDUINO_LOLIN_D32_PRO) 81 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board 82 | #elif defined(ARDUINO_LOLIN_S2_MINI) 83 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection 84 | #elif defined(ARDUINO_ESP32S3_DEV) 85 | // ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025) 86 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board 87 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board 88 | #else 89 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board 90 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 91 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 19, /*RST=*/ 4, /*BUSY=*/ 34)); // LILYGO® TTGO T5 2.66 92 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // e.g. TTGO T8 ESP32-WROVER 93 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare ESP32 Driver Board 94 | #endif 95 | #undef MAX_DISPLAY_BUFFER_SIZE 96 | #undef MAX_HEIGHT 97 | #endif 98 | 99 | // can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics) 100 | #if defined(ARDUINO_ARCH_STM32) 101 | #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise 102 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 103 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 104 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 105 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 106 | #endif 107 | // adapt the constructor parameters to your wiring 108 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=PA4*/ EPD_CS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); 109 | #undef MAX_DISPLAY_BUFFER_SIZE 110 | #undef MAX_HEIGHT 111 | #endif 112 | 113 | #if defined(__AVR) 114 | #if defined (ARDUINO_AVR_MEGA2560) // Note: SS is on 53 on MEGA 115 | #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200 116 | #else // Note: SS is on 10 on UNO, NANO 117 | #define MAX_DISPLAY_BUFFER_SIZE 800 // 118 | #endif 119 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 120 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 121 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 122 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 123 | #endif 124 | // adapt the constructor parameters to your wiring 125 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 126 | // for Arduino Micro or Arduino Leonardo with CS on 10 on my proto boards (SS would be 17) uncomment instead: 127 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 10, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 128 | #endif 129 | 130 | #if defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI) 131 | #define MAX_DISPLAY_BUFFER_SIZE 16384ul // e.g. half of available RAM 132 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 133 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 134 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 135 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 136 | #endif 137 | // adapt the constructor parameters to your wiring 138 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 139 | #endif 140 | 141 | #if defined(ARDUINO_ARCH_SAM) 142 | #define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k 143 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 144 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 145 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 146 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 147 | #endif 148 | // adapt the constructor parameters to your wiring 149 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=10*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 150 | #undef MAX_DISPLAY_BUFFER_SIZE 151 | #undef MAX_HEIGHT 152 | #endif 153 | 154 | #if defined(ARDUINO_ARCH_SAMD) 155 | #define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise 156 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 157 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 158 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 159 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 160 | #endif 161 | // adapt the constructor parameters to your wiring 162 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); 163 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // my Seed XIOA0 164 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // my other Seed XIOA0 165 | #undef MAX_DISPLAY_BUFFER_SIZE 166 | #undef MAX_HEIGHT 167 | #endif 168 | 169 | #if defined(ARDUINO_ARCH_RP2040) 170 | #define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram 171 | #if IS_GxEPD2_4G_BW(GxEPD2_DISPLAY_CLASS) 172 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 173 | #elif IS_GxEPD2_4G_4G(GxEPD2_DISPLAY_CLASS) 174 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 4)) 175 | #endif 176 | #if defined(ARDUINO_NANO_RP2040_CONNECT) 177 | // adapt the constructor parameters to your wiring 178 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); 179 | #endif 180 | #if defined(ARDUINO_RASPBERRY_PI_PICO) 181 | // adapt the constructor parameters to your wiring 182 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board 183 | // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! 184 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO 185 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified 186 | //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 187 | #endif 188 | #if defined(ARDUINO_RASPBERRY_PI_PICO_W) 189 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 190 | #endif 191 | #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) 192 | // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico 193 | GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ PIN_EPD_CS, /*DC=*/ PIN_EPD_DC, /*RST=*/ PIN_EPD_RESET, /*BUSY=*/ PIN_EPD_BUSY)); 194 | #endif 195 | #undef MAX_DISPLAY_BUFFER_SIZE 196 | #undef MAX_HEIGHT 197 | #endif 198 | 199 | #endif 200 | -------------------------------------------------------------------------------- /examples/GxEPD2_4G_Example/GxEPD2_4G_display_selection_added.h: -------------------------------------------------------------------------------- 1 | // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. 2 | // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! 3 | // 4 | // Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ 5 | // 6 | // Author: Jean-Marc Zingg 7 | // 8 | // Version: see library.properties 9 | // 10 | // Library: https://github.com/ZinggJM/GxEPD2 11 | 12 | #ifndef _GxEPD2_boards_added_H_ 13 | #define _GxEPD2_boards_added_H_ 14 | 15 | #if defined(ARDUINO_ARCH_SAM) 16 | #define MAX_DISPAY_BUFFER_SIZE 15000ul // ~15k is a good compromise 17 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 18 | // select one and adapt to your mapping 19 | //GxEPD2_4G_4G display(GxEPD2_154_GDEY0154D67(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 20 | //GxEPD2_4G_4G display(GxEPD2_213_flex(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 21 | //GxEPD2_4G_4G display(GxEPD2_213_GDEY0213B74(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 22 | //GxEPD2_4G_4G display(GxEPD2_270(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 23 | //GxEPD2_4G_4G display(GxEPD2_290_T5(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 24 | //GxEPD2_4G_4G display(GxEPD2_290_T5D(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 25 | //GxEPD2_4G_4G display(GxEPD2_290_I6FD(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 26 | //GxEPD2_4G_4G display(GxEPD2_290_T94(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) 27 | //GxEPD2_4G_4G display(GxEPD2_371(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 28 | //GxEPD2_4G_4G display(GxEPD2_420(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 29 | //GxEPD2_4G_4G display(GxEPD2_420_GDEY042T81(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY042T81, 400x300, SSD1683 (no inking) 30 | //GxEPD2_4G_4G < GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT / 2 > display(GxEPD2_426_GDEQ0426T82(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 31 | //GxEPD2_4G_4G display(GxEPD2_750_T7(/*CS=77*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 32 | #endif 33 | 34 | #if defined(ARDUINO_ARCH_SAMD) 35 | #define MAX_DISPAY_BUFFER_SIZE 15000ul // ~15k is a good compromise 36 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 37 | // select one and adapt to your mapping 38 | //GxEPD2_4G_4G display(GxEPD2_154_GDEY0154D67(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 39 | //GxEPD2_4G_4G display(GxEPD2_213_flex(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 40 | //GxEPD2_4G_4G display(GxEPD2_213_GDEY0213B74(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 41 | //GxEPD2_4G_4G display(GxEPD2_270(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 42 | //GxEPD2_4G_4G display(GxEPD2_290_T5(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 43 | //GxEPD2_4G_4G display(GxEPD2_290_T5D(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 44 | //GxEPD2_4G_4G display(GxEPD2_290_I6FD(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 45 | //GxEPD2_4G_4G display(GxEPD2_290_T94(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) 46 | //GxEPD2_4G_4G display(GxEPD2_371(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 47 | //GxEPD2_4G_4G display(GxEPD2_420(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 48 | //GxEPD2_4G_4G display(GxEPD2_420_GDEY042T81(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY042T81, 400x300, SSD1683 (no inking) 49 | //GxEPD2_4G_4G < GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT / 2 > display(GxEPD2_426_GDEQ0426T82(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 50 | //GxEPD2_4G_4G display(GxEPD2_750_T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 51 | #endif 52 | 53 | #if defined(ESP32) && defined(ARDUINO_LOLIN_D32_PRO) 54 | // select one and adapt to your mapping, can use full buffer size (full HEIGHT) 55 | //GxEPD2_4G_4G display(GxEPD2_154_GDEY0154D67(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 56 | //GxEPD2_4G_4G display(GxEPD2_213_flex(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 57 | //GxEPD2_4G_4G display(GxEPD2_213_GDEY0213B74(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 58 | //GxEPD2_4G_4G display(GxEPD2_270(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 59 | //GxEPD2_4G_4G display(GxEPD2_290_T5(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 60 | //GxEPD2_4G_4G display(GxEPD2_290_T5D(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 61 | //GxEPD2_4G_4G display(GxEPD2_290_I6FD(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 62 | //GxEPD2_4G_4G display(GxEPD2_290_T94(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) 63 | //GxEPD2_4G_4G display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 64 | //GxEPD2_4G_4G display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 65 | //GxEPD2_4G_4G < GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT / 2 > display(GxEPD2_426_GDEQ0426T82(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 66 | // note: need to use half height buffer, to stay < 96000 bytes of RAM, would hang on setup else 67 | //GxEPD2_4G_4G display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 68 | #endif 69 | 70 | #if defined(ESP32) && defined(ARDUINO_ESP32_DEV) 71 | // select one and adapt to your mapping, can use full buffer size (full HEIGHT) 72 | //GxEPD2_4G_4G display(GxEPD2_154_GDEY0154D67(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 73 | //GxEPD2_4G_4G display(GxEPD2_213_flex(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 74 | //GxEPD2_4G_4G display(GxEPD2_213_GDEY0213B74(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 75 | //GxEPD2_4G_4G display(GxEPD2_270(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 76 | //GxEPD2_4G_4G display(GxEPD2_290_T5(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 77 | //GxEPD2_4G_4G display(GxEPD2_290_T5D(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 78 | //GxEPD2_4G_4G display(GxEPD2_290_I6FD(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 79 | //GxEPD2_4G_4G display(GxEPD2_290_T94(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) 80 | //GxEPD2_4G_4G display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 81 | //GxEPD2_4G_4G display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 82 | //GxEPD2_4G_4G display(GxEPD2_420_GDEY042T81(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY042T81, 400x300, SSD1683 (no inking) 83 | //GxEPD2_4G_4G < GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT / 2 > display(GxEPD2_426_GDEQ0426T82(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 84 | // note: need to use half height buffer, to stay < 96000 bytes of RAM, would hang on setup else 85 | //GxEPD2_4G_4G display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 86 | #endif 87 | 88 | #if defined(ARDUINO_ARCH_RP2040) 89 | #define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram 90 | #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) 91 | // select one and adapt to your mapping, can use full buffer size (full HEIGHT) 92 | // mapping of my proto board 93 | //GxEPD2_4G_4G display(GxEPD2_154_GDEY0154D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 94 | //GxEPD2_4G_4G display(GxEPD2_213_flex(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 95 | //GxEPD2_4G_4G display(GxEPD2_213_GDEY0213B74(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 96 | //GxEPD2_4G_4G display(GxEPD2_270(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 97 | //GxEPD2_4G_4G display(GxEPD2_290_T5(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 98 | //GxEPD2_4G_4G display(GxEPD2_290_T5D(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 99 | //GxEPD2_4G_4G display(GxEPD2_290_I6FD(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 100 | //GxEPD2_4G_4G display(GxEPD2_290_T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) 101 | //GxEPD2_4G_4G display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 102 | //GxEPD2_4G_4G display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 103 | //GxEPD2_4G_4G display(GxEPD2_420_GDEY042T81(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY042T81, 400x300, SSD1683 (no inking) 104 | //GxEPD2_4G_4G < GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT / 2 > display(GxEPD2_426_GDEQ0426T82(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 105 | //GxEPD2_4G_4G display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 106 | // mapping of DESPI-PICO 107 | //GxEPD2_4G_4G display(GxEPD2_154_GDEY0154D67(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) 108 | //GxEPD2_4G_4G display(GxEPD2_213_flex(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) 109 | //GxEPD2_4G_4G display(GxEPD2_213_GDEY0213B74(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) 110 | //GxEPD2_4G_4G display(GxEPD2_270(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) 111 | //GxEPD2_4G_4G display(GxEPD2_290_T5(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10) 112 | //GxEPD2_4G_4G display(GxEPD2_290_T5D(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10) 113 | //GxEPD2_4G_4G display(GxEPD2_290_I6FD(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10) 114 | //GxEPD2_4G_4G display(GxEPD2_290_T94(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b) 115 | //GxEPD2_4G_4G display(GxEPD2_371(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW0371W7 240x416, UC8171 (IL0324), (missing) 116 | //GxEPD2_4G_4G display(GxEPD2_420(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) 117 | //GxEPD2_4G_4G display(GxEPD2_420_GDEY042T81(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEY042T81, 400x300, SSD1683 (no inking) 118 | //GxEPD2_4G_4G < GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT / 2 > display(GxEPD2_426_GDEQ0426T82(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) 119 | //GxEPD2_4G_4G display(GxEPD2_750_T7(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) 120 | #endif 121 | 122 | #endif 123 | -------------------------------------------------------------------------------- /src/bitmaps/WS_Bitmaps104x212.h: -------------------------------------------------------------------------------- 1 | /** 2 | * @filename : imagedata.cpp 3 | * @brief : data file for epd demo 4 | * 5 | * Copyright (C) Waveshare August 22 2017 6 | * 7 | * Permission is hereby granted, free of charge, to any person obtaining a copy 8 | * of this software and associated documnetation files (the "Software"), to deal 9 | * in the Software without restriction, including without limitation the rights 10 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | * copies of the Software, and to permit persons to whom the Software is 12 | * furished to do so, subject to the following conditions: 13 | * 14 | * The above copyright notice and this permission notice shall be included in 15 | * all copies or substantial portions of the Software. 16 | * 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | * THE SOFTWARE. 24 | */ 25 | #ifndef _WS_Bitmaps104x212_H_ 26 | #define _WS_Bitmaps104x212_H_ 27 | 28 | #if defined(ESP8266) || defined(ESP32) 29 | #include 30 | #else 31 | #include 32 | #endif 33 | 34 | const unsigned char WS_Bitmap104x212[2762] PROGMEM = { /* 0X00,0X01,0X68,0X00,0XD4,0X00, */ 35 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 36 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 37 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 38 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 39 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 40 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 41 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 42 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 43 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 44 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 45 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03, 46 | 0XFC,0X0C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0X1C,0X00, 47 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0X9C,0X00,0X00,0X00,0X00, 48 | 0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X07,0XDC,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 49 | 0X00,0X00,0X00,0X38,0X07,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 50 | 0X74,0X06,0X7C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X66,0X06,0X7C, 51 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X66,0X02,0X7C,0X00,0X00,0X00, 52 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE4,0X00,0X3C,0X00,0X00,0X01,0X80,0X00,0X00, 53 | 0X00,0X00,0X00,0X01,0XC0,0X00,0X3C,0X00,0X0E,0X01,0X80,0X00,0X00,0X00,0X00,0X00, 54 | 0X7F,0XC0,0X00,0X3C,0X00,0X0E,0X01,0X80,0X00,0X00,0X00,0X00,0X1F,0XC0,0X00,0X00, 55 | 0X7C,0X00,0X0E,0XE1,0X80,0X00,0X00,0X00,0X00,0X3F,0X00,0X00,0X00,0X7C,0X00,0X0E, 56 | 0XE1,0X80,0X00,0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0XFC,0X00,0X0E,0XE1,0X80,0X00, 57 | 0X00,0X00,0X00,0X70,0X00,0X00,0X00,0XFC,0X00,0X0E,0XE1,0X80,0X00,0X04,0X00,0X00, 58 | 0XC0,0X00,0X00,0X00,0XFC,0X00,0X0E,0XE1,0X80,0X00,0X04,0X00,0X01,0XC0,0X00,0X00, 59 | 0X01,0XFC,0X00,0X0E,0XE1,0X80,0X00,0X0C,0X00,0X07,0X80,0X00,0X00,0X01,0XFC,0X00, 60 | 0X0E,0XE1,0X80,0X00,0X1E,0X00,0X0F,0X00,0X00,0X00,0X03,0XDC,0X00,0X0E,0XE1,0X80, 61 | 0X00,0X1E,0X00,0X3C,0X00,0X00,0X00,0X3F,0X1C,0X00,0X0E,0XE1,0X80,0X00,0X3B,0X00, 62 | 0X78,0X00,0X00,0X00,0XFE,0X1C,0X00,0X0F,0XE1,0X80,0X00,0X3B,0X00,0X70,0X00,0X00, 63 | 0X01,0XFE,0X1E,0X00,0X0F,0XFF,0X80,0X00,0X33,0X00,0X70,0X00,0X00,0X07,0XF8,0X1E, 64 | 0X00,0X0F,0XFF,0X80,0X00,0X33,0X00,0X7C,0X00,0X00,0X07,0XC0,0X0E,0X00,0X0F,0XFF, 65 | 0X80,0X00,0X73,0X00,0X3F,0XFF,0XC0,0X07,0XFF,0XCE,0X00,0X00,0X00,0X00,0X00,0X63, 66 | 0X00,0X1F,0XFF,0XC0,0X01,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X63,0X00,0X1F,0XFF, 67 | 0XC0,0X00,0XFF,0XFF,0X00,0X07,0XF0,0X80,0X00,0X63,0X00,0XFF,0X80,0X00,0X00,0X00, 68 | 0XF7,0X80,0X07,0XF0,0X80,0X00,0X63,0X00,0XFE,0X00,0X00,0X00,0X00,0X7F,0X80,0X07, 69 | 0XF9,0X80,0X00,0X63,0X01,0XF8,0X00,0X00,0X00,0X00,0X3F,0X80,0X0E,0X3B,0X80,0X00, 70 | 0X63,0X03,0XE0,0X00,0X00,0X00,0X00,0X3F,0X80,0X0E,0X3F,0X80,0X00,0X63,0X07,0X80, 71 | 0X00,0X00,0X00,0X00,0X1F,0X80,0X0E,0X3F,0X00,0X00,0X63,0X0F,0X00,0X00,0X00,0X00, 72 | 0X00,0X1F,0X80,0X0E,0X3F,0X00,0X00,0X63,0X1E,0X00,0X00,0X00,0X00,0X00,0X0F,0X80, 73 | 0X0E,0X3E,0X00,0X00,0X63,0XFC,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X0E,0X3C,0X00, 74 | 0X00,0X67,0XF8,0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X0E,0X3C,0X00,0X00,0X67,0XF0, 75 | 0X00,0X00,0X00,0X00,0X00,0X0F,0X80,0X0E,0X3C,0X00,0X00,0X67,0XE0,0X00,0X00,0X00, 76 | 0X00,0X00,0X0F,0X80,0X0E,0X38,0X00,0X00,0X7F,0XC0,0X00,0X00,0X00,0X00,0X00,0X1F, 77 | 0X80,0X0E,0X38,0X00,0X00,0X7F,0XC0,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X0E,0X78, 78 | 0X00,0X00,0X7F,0X80,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X0F,0XFF,0X80,0X00,0X7F, 79 | 0X00,0X00,0X00,0X00,0X07,0XFF,0XF8,0X00,0X0F,0XFF,0X80,0X00,0X3F,0X00,0X00,0X00, 80 | 0X00,0X3F,0X01,0XF0,0X00,0X0F,0XFF,0X00,0X00,0X3F,0X00,0X00,0X00,0X00,0XF8,0X01, 81 | 0XE0,0X00,0X00,0X00,0X00,0X00,0X3E,0X00,0X00,0X00,0X07,0XE0,0X00,0XF0,0X00,0X00, 82 | 0X00,0X00,0X00,0X1E,0X00,0X00,0X00,0X0F,0X80,0X00,0X78,0X00,0X07,0XFF,0X80,0X00, 83 | 0X1E,0X00,0X00,0X00,0X1F,0X00,0X00,0X3C,0X00,0X07,0XFF,0X80,0X00,0X1E,0X00,0X00, 84 | 0X00,0X1E,0X00,0X00,0X1E,0X00,0X07,0XFF,0X80,0X00,0X0E,0X00,0X00,0X00,0X18,0X00, 85 | 0X00,0X07,0X00,0X0F,0X18,0X00,0X00,0X06,0X00,0X00,0X00,0X18,0X00,0X00,0X07,0X80, 86 | 0X0E,0X18,0X00,0X00,0X07,0X00,0X00,0X00,0X70,0X00,0X00,0X07,0X80,0X0E,0X18,0X00, 87 | 0X00,0X07,0X00,0X00,0X01,0XE0,0X00,0X00,0X03,0X80,0X0E,0X18,0X00,0X00,0X07,0X00, 88 | 0X00,0X0F,0XE0,0X00,0X00,0X03,0X80,0X0E,0X18,0X00,0X00,0X03,0X80,0X00,0X3F,0XF0, 89 | 0X00,0X00,0X03,0X80,0X0E,0X18,0X00,0X00,0X03,0X80,0X00,0X00,0X3F,0X00,0X00,0X03, 90 | 0X80,0X0E,0X18,0X00,0X00,0X03,0XC0,0X00,0X00,0X3F,0X00,0X00,0X03,0X80,0X0E,0X18, 91 | 0X00,0X00,0X03,0XC0,0X00,0X00,0X3E,0X00,0X00,0X07,0X80,0X0F,0X18,0X00,0X00,0X01, 92 | 0XE0,0X00,0X00,0X3C,0X04,0X00,0X07,0X80,0X07,0XFF,0X80,0X00,0X01,0XE0,0X00,0X00, 93 | 0X3C,0X04,0X00,0X07,0X80,0X07,0XFF,0X80,0X00,0X00,0XF0,0X00,0X00,0X1C,0X1C,0X60, 94 | 0X07,0X80,0X03,0XFF,0X80,0X00,0X00,0XF0,0X00,0X00,0X1E,0X3F,0XF0,0X07,0X80,0X00, 95 | 0X00,0X00,0X00,0X00,0X7F,0XF8,0X00,0X1F,0X7F,0XF0,0X07,0X80,0X00,0X00,0X00,0X00, 96 | 0X00,0X7F,0XFF,0X80,0X1F,0XFF,0XF0,0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X3F,0XFF, 97 | 0XC0,0X0F,0XFF,0XE0,0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X0F,0XFF,0XF0,0X00,0X7C, 98 | 0XC0,0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X03,0XFF,0XF8,0X00,0X18,0XE0,0X07,0X80, 99 | 0X00,0XE0,0X00,0X00,0X00,0X01,0XFF,0XFE,0X00,0X00,0XF0,0X07,0X80,0X00,0XE0,0X00, 100 | 0X00,0X00,0X00,0XFF,0XFF,0X00,0X00,0XF0,0X0F,0X00,0X00,0XE0,0X00,0X00,0X00,0X00, 101 | 0XFF,0XFF,0X80,0X00,0XF0,0X0E,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X7F,0XFF,0XE0, 102 | 0X00,0XF0,0X0E,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X1F,0XFF,0XE0,0X00,0XF0,0X0E, 103 | 0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0XFF,0XE0,0X00,0XF0,0X0E,0X00,0X00,0XE0, 104 | 0X00,0X00,0X00,0X00,0X00,0X7F,0XF0,0X00,0XF0,0X06,0X00,0X00,0XE0,0X00,0X00,0X00, 105 | 0X00,0X00,0X07,0XF0,0X00,0XF0,0X07,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0X01, 106 | 0XF0,0X00,0XF0,0X07,0X80,0X00,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X98,0X00,0XF0, 107 | 0X07,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1C,0X01,0XF0,0X07,0X80,0X0F, 108 | 0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X1E,0X01,0XF0,0X07,0X00,0X0F,0XFF,0X80,0X00, 109 | 0X00,0X00,0X00,0X00,0X0F,0X81,0XF0,0X0E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 110 | 0X00,0X07,0X81,0XF0,0X0E,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X81, 111 | 0XF0,0X0E,0X00,0X0C,0X7F,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XC1,0XF0,0X0E,0X00, 112 | 0X0E,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X01,0XC0,0XE0,0X0F,0X00,0X0E,0XE3,0X80, 113 | 0X00,0X00,0X00,0X00,0X00,0X00,0XC0,0X00,0X07,0X00,0X0E,0XE3,0X80,0X00,0X00,0X00, 114 | 0X00,0X00,0X00,0XE0,0X00,0X07,0X80,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00, 115 | 0X60,0X00,0X07,0X80,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,0X07, 116 | 0X80,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X60,0X00,0X07,0X80,0X0E,0XE3, 117 | 0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X70,0X00,0X0F,0X00,0X0E,0XE3,0X80,0X00,0X00, 118 | 0X00,0X00,0X00,0X00,0XF0,0X00,0X0E,0X00,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X01, 119 | 0XFF,0XFF,0XC0,0X0E,0X00,0X0E,0XE3,0X80,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XF8, 120 | 0X0E,0X00,0X0F,0XE3,0X80,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XFC,0X0F,0X00,0X07, 121 | 0XE3,0X80,0X00,0X00,0X00,0X0F,0XFC,0X00,0X03,0XFF,0XFF,0X00,0X07,0XE3,0X80,0X00, 122 | 0X00,0X00,0X3F,0XE0,0X7F,0XFC,0X7F,0XFF,0X80,0X07,0XC3,0X80,0X00,0X00,0X00,0XFF, 123 | 0XCF,0XFF,0XFF,0XE7,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X01,0XF8,0X3F,0XFF,0XFF, 124 | 0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X07,0XE0,0XFF,0XFF,0XFF,0XFE,0XFF,0X80, 125 | 0X0E,0X01,0X80,0X00,0X00,0X0F,0X81,0XFF,0XFF,0XFF,0XFE,0X7F,0X00,0X0E,0X01,0X80, 126 | 0X00,0X00,0X1F,0X00,0XFF,0XFF,0XFF,0XFE,0X3E,0X00,0X0E,0XE1,0X80,0X00,0X00,0X7E, 127 | 0X00,0XFF,0XFF,0XFF,0XFF,0XBE,0X00,0X0E,0XE1,0X80,0X00,0X00,0XFC,0X01,0XFF,0X7F, 128 | 0XFF,0XFF,0XC7,0X80,0X0E,0XE1,0X80,0X00,0X01,0XF8,0X00,0XFE,0X3F,0XFF,0XFF,0XC3, 129 | 0X80,0X0E,0XE1,0X80,0X00,0X03,0XF0,0X00,0X7F,0XFF,0XFF,0XFF,0XE3,0X80,0X0E,0XE1, 130 | 0X80,0X00,0X03,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XF1,0X80,0X0E,0XE1,0X80,0X00,0X03, 131 | 0XC0,0X01,0XFF,0XFF,0XFF,0XFF,0XF1,0XC0,0X0E,0XE1,0X80,0X00,0X03,0X80,0X03,0XFF, 132 | 0XFF,0XFF,0XFF,0XF8,0XE0,0X0E,0XE1,0X80,0X00,0X07,0X00,0X01,0XFF,0XFF,0XFF,0XFF, 133 | 0XFC,0XE0,0X0E,0XE1,0X80,0X00,0X0E,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFE,0X70,0X0F, 134 | 0XE1,0X80,0X00,0X1C,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFE,0X70,0X0F,0XE1,0X80,0X00, 135 | 0X1C,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XF0,0X0F,0XFF,0X80,0X00,0X3C,0X00,0X00, 136 | 0X20,0X7F,0XFF,0XFF,0XFF,0XF0,0X0F,0XFF,0X80,0X00,0X3C,0X00,0X00,0X30,0X1F,0XFF, 137 | 0XFF,0XFF,0XF0,0X0F,0XFF,0X80,0X00,0X3C,0X00,0X00,0X38,0X0F,0XFF,0XFF,0XFF,0XF0, 138 | 0X00,0X00,0X00,0X00,0X38,0X00,0X00,0X1E,0X03,0XFF,0XFF,0XFF,0XF0,0X0C,0X00,0X00, 139 | 0X00,0X78,0X00,0X00,0X0F,0XE0,0X7F,0XFF,0XFE,0XF0,0X0E,0X00,0X00,0X00,0X70,0X00, 140 | 0X00,0X01,0XFC,0X00,0X0F,0XF9,0X80,0X07,0X80,0X00,0X00,0XF0,0X00,0X00,0X00,0X7F, 141 | 0XC0,0X01,0XE7,0X80,0X07,0XC0,0X00,0X00,0XE0,0X00,0X00,0X00,0X0F,0XFF,0XFE,0X3F, 142 | 0X00,0X01,0XE0,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFE,0X00,0X00,0XF8, 143 | 0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFE,0X00,0X00,0X7C,0X00,0X00,0XF0, 144 | 0X00,0X00,0X00,0X00,0X01,0XFF,0XFC,0X00,0X00,0X1F,0X00,0X00,0XF0,0X00,0X00,0X00, 145 | 0X00,0X00,0X00,0X1C,0X00,0X00,0X0F,0X80,0X00,0XF0,0X00,0X00,0X00,0X00,0X00,0X00, 146 | 0X1C,0X00,0X00,0X07,0X80,0X00,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X00, 147 | 0X1F,0X00,0X00,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0X3E,0X00,0X00, 148 | 0X78,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00,0X00,0XF8,0X00,0X00,0X78,0X00,0X00, 149 | 0X00,0X00,0X00,0X00,0X1C,0X00,0X01,0XF0,0X00,0X00,0X7C,0X00,0X00,0X00,0X00,0X00, 150 | 0X00,0X1C,0X00,0X07,0XE0,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X00,0X00,0X1C,0X00, 151 | 0X0F,0X80,0X00,0X00,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X0E,0X00,0X00, 152 | 0X00,0X1C,0X00,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X0C,0X00,0X00,0X00,0X0E,0X00, 153 | 0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X00,0X07,0X00,0X00,0X00,0X00, 154 | 0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X00,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X0C, 155 | 0X00,0X03,0XFF,0X00,0X00,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X0C,0X00,0X07,0XFF, 156 | 0X80,0X00,0X03,0XC0,0X00,0X07,0X00,0X00,0X00,0X0C,0X00,0X07,0XFF,0X80,0X00,0X01, 157 | 0XF0,0X00,0X0F,0X00,0X00,0X00,0X0C,0X00,0X07,0X3B,0X00,0X00,0X00,0X78,0X00,0X3F, 158 | 0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X3C,0X00,0X3E,0X00,0X00,0X00, 159 | 0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X0F,0X00,0X7C,0X00,0X00,0X00,0X0E,0X00,0X0E, 160 | 0X18,0X00,0X00,0X00,0X07,0X00,0XF8,0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00, 161 | 0X00,0X07,0X01,0XF0,0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X03,0X01, 162 | 0XC0,0X00,0X00,0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X01,0X80,0X00,0X00,0X00, 163 | 0X00,0X0E,0X00,0X0E,0X18,0X00,0X00,0X00,0X00,0X80,0X00,0X00,0X00,0X00,0X0E,0X00, 164 | 0X0E,0X18,0X00,0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,0X0E,0X00,0X0F,0X18,0X00, 165 | 0X00,0X00,0X00,0XC0,0X00,0X00,0X00,0X00,0X0E,0X00,0X07,0XFF,0X80,0X00,0X00,0X00, 166 | 0XC0,0X00,0X00,0X00,0X00,0X0E,0X00,0X07,0XFF,0X80,0X00,0X00,0X00,0XE0,0X00,0X00, 167 | 0X00,0X00,0X0E,0X00,0X03,0XFF,0X80,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X0E, 168 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X0E,0X00,0X00,0X00, 169 | 0X00,0X00,0X00,0X00,0XE0,0X00,0X00,0X00,0X00,0X0F,0X00,0X0F,0XFF,0X00,0X00,0X00, 170 | 0X00,0XE0,0X00,0X00,0X00,0X00,0X0F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0XF0,0X00, 171 | 0X00,0X00,0X00,0X0F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,0X00, 172 | 0X0F,0X80,0X00,0X07,0X80,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,0X00,0X0F,0X80,0X00, 173 | 0X03,0X80,0X00,0X00,0X00,0XF0,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X03,0X80,0X00, 174 | 0X00,0X00,0X70,0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X78, 175 | 0X00,0X00,0X00,0X00,0X0F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X38,0X00,0X00,0X00, 176 | 0X00,0X0F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X0F,0X80, 177 | 0X00,0X03,0X80,0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X0F,0X80,0X0F,0XFF,0X80, 178 | 0X00,0X00,0X00,0X3C,0X00,0X00,0X00,0X00,0X1F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00, 179 | 0X3C,0X00,0X00,0X00,0X00,0X1F,0X80,0X0F,0XFF,0X80,0X00,0X00,0X00,0X1E,0X00,0X00, 180 | 0X00,0X00,0X1F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X1F,0X00,0X00,0X00,0X00,0X1F, 181 | 0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X0F,0X00,0X00,0X00,0X00,0X3F,0X80,0X00,0X03, 182 | 0X80,0X00,0X00,0X00,0X07,0X80,0X00,0X00,0X00,0X3F,0X80,0X00,0X03,0X80,0X00,0X00, 183 | 0X00,0X07,0X80,0X00,0X00,0X00,0X3F,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X07,0XC0, 184 | 0X00,0X00,0X00,0X3B,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X03,0XC0,0X00,0X00,0X00, 185 | 0X79,0X80,0X00,0X03,0X80,0X00,0X00,0X00,0X01,0XC0,0X00,0X00,0X00,0X7B,0X80,0X00, 186 | 0X07,0X80,0X00,0X00,0X00,0X01,0XC0,0X00,0X00,0X00,0XF3,0X80,0X0F,0XFF,0X80,0X00, 187 | 0X00,0X00,0X00,0XF0,0X00,0X00,0X01,0XF3,0X80,0X0F,0XFF,0X00,0X00,0X00,0X00,0X00, 188 | 0X38,0X00,0X00,0X01,0XE3,0X80,0X0F,0XFE,0X00,0X00,0X00,0X00,0X00,0X3C,0X00,0X00, 189 | 0X01,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3E,0X00,0X00,0X01,0XC3,0X80, 190 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0X80,0X00,0X01,0X83,0X80,0X00,0X00,0X00, 191 | 0X00,0X00,0X00,0X00,0X0F,0XC0,0X00,0X03,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00, 192 | 0X00,0X07,0XE0,0X00,0X07,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XF0, 193 | 0X00,0X1E,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XC3, 194 | 0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XE3,0X80,0X00,0X00, 195 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XDF,0XE3,0X80,0X00,0X00,0X00,0X00,0X00, 196 | 0X00,0X00,0X00,0X00,0X03,0X8F,0XF3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 197 | 0X00,0X03,0X0F,0XF3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X87, 198 | 0XF3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XC7,0XF3,0X80,0X00, 199 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XF3,0XE3,0X80,0X00,0X00,0X00,0X00, 200 | 0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XE3,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 201 | 0X00,0X00,0X00,0X7F,0X83,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 202 | 0X3F,0X03,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 203 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 204 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 205 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 206 | 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 207 | 0X00,0X00,0X00,0X00, 208 | }; 209 | 210 | #endif 211 | -------------------------------------------------------------------------------- /src/bitmaps/Bitmaps2g104x104.h: -------------------------------------------------------------------------------- 1 | #ifndef _GxBitmaps2g104x104_H_ 2 | #define _GxBitmaps2g104x104_H_ 3 | 4 | #if defined(ESP8266) || defined(ESP32) 5 | #include 6 | #else 7 | #include 8 | #endif 9 | 10 | //Horizontal 2 bit 104x104. 11 | 12 | unsigned char Bitmap2g104x104 [] PROGMEM = 13 | { 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xa9, 0x55, 0x55, 0x55, 0x5b, 0xff, 15 | 0xf0, 0x00, 0x00, 0x15, 0x55, 0x44, 0x40, 0x02, 0x55, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 16 | 0x00, 0x00, 0x00, 0x6a, 0xaa, 0xaa, 0xa9, 0x55, 0x5a, 0xaa, 0xd0, 0x00, 0x00, 0x15, 0x45, 0x00, 17 | 0x00, 0x02, 0x55, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x6a, 0xaa, 0xaa, 18 | 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x00, 0x00, 0x11, 0x40, 0x00, 0x00, 0x02, 0x55, 0x5e, 0x00, 0x00, 19 | 0x00, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x00, 0x25, 0xaa, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xc0, 0x00, 20 | 0x00, 0x15, 0x01, 0x94, 0x00, 0x02, 0x55, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 21 | 0x00, 0x25, 0xa9, 0x55, 0x55, 0x55, 0xaa, 0xa6, 0xc0, 0x00, 0x00, 0x15, 0x0e, 0xe4, 0x00, 0x06, 22 | 0x56, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x16, 0xa9, 0x55, 0x55, 0x55, 23 | 0x6a, 0xa6, 0x80, 0x00, 0x00, 0x05, 0x5a, 0xf9, 0x00, 0x02, 0x96, 0xae, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x6a, 0x55, 0x55, 0x55, 0x5a, 0x96, 0x40, 0x10, 0x00, 0x11, 25 | 0x1b, 0xe8, 0x00, 0x06, 0x95, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 26 | 0x6a, 0x55, 0x55, 0x55, 0x6a, 0xa7, 0x00, 0x10, 0x00, 0x05, 0x1b, 0xa4, 0x00, 0x06, 0x95, 0xb8, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x6a, 0xa9, 0x55, 0x56, 0xaa, 0xa6, 28 | 0x00, 0x10, 0x00, 0x05, 0x5b, 0xe4, 0x00, 0x02, 0x95, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x05, 0xaa, 0xaa, 0x55, 0x6a, 0xaa, 0xa9, 0x00, 0x10, 0x00, 0x01, 0xd7, 0xe4, 30 | 0x00, 0x02, 0x96, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xaa, 0xaa, 31 | 0xaa, 0xaa, 0xaa, 0x99, 0x40, 0x10, 0x00, 0x05, 0x97, 0xd4, 0x00, 0x02, 0x96, 0x80, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa9, 0x54, 0x10, 33 | 0x00, 0x05, 0x00, 0x00, 0x10, 0x02, 0xab, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x06, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xa5, 0x54, 0x10, 0x00, 0x00, 0x00, 0x15, 0x50, 0x02, 35 | 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x5a, 0xaa, 0xaa, 0xaa, 36 | 0xa5, 0x95, 0x54, 0x10, 0x00, 0x56, 0xaa, 0x95, 0x54, 0x02, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x65, 0x55, 0x55, 0x54, 0x00, 0x5a, 38 | 0xa9, 0x55, 0x54, 0x02, 0xb4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x00, 0x16, 0x95, 0x50, 0x55, 0x55, 0x14, 0x15, 0x55, 0x00, 0x10, 0x02, 0xa0, 0x0a, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x5a, 0x55, 0x40, 41 | 0x05, 0x55, 0x55, 0x50, 0x00, 0x00, 0x10, 0x02, 0xd0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 | 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 0x54, 0x00, 0x45, 0x55, 0x55, 0x55, 0x40, 0x00, 43 | 0x10, 0x02, 0x84, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x15, 0x55, 0x44, 0x50, 0x11, 0x55, 0x44, 0x15, 0x54, 0x15, 0x54, 0x01, 0x00, 0xa4, 0x00, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x55, 0x40, 0x05, 0x55, 0x44, 46 | 0x54, 0x41, 0x54, 0x04, 0x18, 0x04, 0x11, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x45, 0x55, 0x55, 0x55, 0x56, 0x56, 0x54, 0x28, 0x04, 48 | 0x42, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa5, 0x55, 49 | 0x65, 0x55, 0x55, 0x55, 0x55, 0x55, 0x54, 0x50, 0x29, 0x05, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x95, 0x69, 0xaa, 0x5a, 0x5a, 0xa9, 0x55, 0x55, 51 | 0x55, 0x00, 0x39, 0x05, 0x19, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x13, 0xa5, 0xab, 0xfe, 0xff, 0xfa, 0xa9, 0x55, 0x55, 0x55, 0x00, 0x3d, 0x04, 0x58, 0x2a, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0x9b, 0xff, 0xff, 0xff, 54 | 0xff, 0xea, 0xa5, 0x65, 0x96, 0x40, 0x3d, 0x06, 0x94, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x00, 0x00, 0x01, 0xae, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa9, 0xa5, 0xa9, 0x40, 56 | 0x3d, 0x0a, 0x64, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 57 | 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xea, 0x51, 0x3c, 0x0e, 0xa4, 0x6a, 0x00, 0x00, 58 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 59 | 0xea, 0xaa, 0xaa, 0x50, 0x3d, 0x09, 0xa8, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xba, 0x50, 0x3c, 0x0e, 61 | 0xb8, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 62 | 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xad, 0x54, 0x3d, 0x0a, 0xb9, 0x6e, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 64 | 0xae, 0x54, 0x3d, 0x0a, 0xe9, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 65 | 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xae, 0x54, 0x3d, 0x0b, 0xe9, 0x6e, 66 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 67 | 0xff, 0xff, 0xfa, 0xa6, 0xaa, 0x55, 0x3e, 0x0b, 0xa9, 0x7e, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0xaa, 0x99, 69 | 0x3f, 0x0b, 0xb9, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 70 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x95, 0xaa, 0x55, 0x3f, 0x07, 0xbd, 0xbf, 0x00, 0x06, 71 | 0xff, 0xff, 0xff, 0x87, 0xe5, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 72 | 0xff, 0x95, 0x5a, 0x55, 0x3f, 0x47, 0x7d, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x55, 73 | 0x55, 0x41, 0x5f, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x66, 0x3f, 0x43, 74 | 0xbd, 0xbf, 0x00, 0x02, 0xeb, 0xe5, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xbf, 0xff, 0xff, 75 | 0xff, 0xff, 0xff, 0xaa, 0xae, 0xa5, 0x55, 0x55, 0x7f, 0x43, 0xee, 0xbf, 0x00, 0x01, 0x5a, 0x95, 76 | 0x5e, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xad, 0x95, 0x6f, 0xff, 0xff, 0x95, 0x55, 0x55, 0xa5, 77 | 0x55, 0x56, 0x7f, 0x42, 0xae, 0xbf, 0x00, 0x01, 0x55, 0x95, 0x59, 0x01, 0x55, 0x54, 0x00, 0x03, 78 | 0xfe, 0x55, 0x40, 0x56, 0xff, 0xfe, 0x50, 0x11, 0x05, 0x55, 0x55, 0x55, 0x7f, 0x43, 0x5d, 0xbf, 79 | 0x00, 0x01, 0x55, 0x45, 0x15, 0x05, 0xab, 0xff, 0xff, 0xc1, 0xa6, 0x55, 0x55, 0x55, 0xbf, 0xfe, 80 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x7f, 0x03, 0x5d, 0x7b, 0x00, 0x00, 0x05, 0x40, 0x15, 0x01, 81 | 0x6a, 0xaa, 0xaa, 0x81, 0xa7, 0x56, 0xa9, 0x55, 0xbf, 0xfa, 0x55, 0x6a, 0xa5, 0x55, 0x55, 0x55, 82 | 0x7f, 0x43, 0x59, 0xab, 0x00, 0x00, 0x45, 0x40, 0x11, 0x00, 0x55, 0x59, 0x95, 0x41, 0x52, 0x5a, 83 | 0xff, 0xa9, 0xbf, 0xf9, 0x5a, 0xbf, 0xea, 0x55, 0x55, 0x55, 0x7f, 0x43, 0x59, 0xab, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x41, 0x52, 0x9a, 0x95, 0x55, 0xaf, 0xf9, 0x65, 0x56, 85 | 0x9a, 0x55, 0x55, 0x55, 0x7e, 0x46, 0x6d, 0x56, 0x00, 0x01, 0xaa, 0xaa, 0xa8, 0x00, 0x55, 0xaa, 86 | 0xaa, 0x01, 0x56, 0xa9, 0x14, 0x56, 0x6f, 0xf5, 0x55, 0x45, 0x55, 0x55, 0x55, 0x55, 0x7d, 0x41, 87 | 0xb9, 0x57, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xef, 0x55, 0x00, 0x07, 0xe4, 0x65, 0x69, 88 | 0xef, 0xf5, 0xa6, 0xd5, 0x51, 0x55, 0x55, 0x55, 0x7d, 0x02, 0xe9, 0x56, 0x50, 0x10, 0xbf, 0xa5, 89 | 0x54, 0x07, 0xef, 0xee, 0xaf, 0x81, 0xff, 0xea, 0xaa, 0xab, 0xff, 0xf9, 0xaa, 0xae, 0x94, 0x65, 90 | 0x95, 0x6a, 0x6d, 0x42, 0xa9, 0x55, 0x40, 0x11, 0xff, 0xff, 0xff, 0x01, 0x55, 0x9f, 0xee, 0x41, 91 | 0xab, 0xaa, 0xff, 0xab, 0xff, 0xfa, 0xae, 0xbe, 0xa9, 0x55, 0x55, 0xa5, 0x6d, 0x52, 0xa9, 0x50, 92 | 0x50, 0x11, 0xff, 0xff, 0xff, 0x01, 0x45, 0x5a, 0x55, 0x01, 0x56, 0xae, 0xaa, 0xbf, 0xff, 0xfa, 93 | 0xaf, 0xae, 0xa5, 0xaa, 0x95, 0xa5, 0x69, 0x41, 0xa8, 0x00, 0x50, 0x01, 0xab, 0xff, 0xfe, 0x00, 94 | 0x45, 0x5a, 0x45, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xfe, 0x6a, 0xea, 0x55, 0xa5, 95 | 0xa9, 0x01, 0x65, 0x50, 0x10, 0x01, 0x55, 0x59, 0x99, 0x00, 0x00, 0x15, 0x55, 0x00, 0x02, 0xff, 96 | 0xff, 0xff, 0xff, 0xea, 0xaf, 0xff, 0xff, 0xea, 0x55, 0x95, 0xa9, 0x01, 0x6f, 0x95, 0x00, 0x01, 97 | 0x55, 0x55, 0x99, 0x01, 0x45, 0x45, 0x45, 0x00, 0x52, 0xff, 0xff, 0xff, 0xff, 0xea, 0xab, 0xff, 98 | 0xff, 0xea, 0x95, 0x56, 0x96, 0x41, 0xbf, 0xa5, 0x00, 0x05, 0x55, 0x55, 0x55, 0x00, 0x00, 0x55, 99 | 0x4b, 0x40, 0x56, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xea, 0x95, 0x56, 0x96, 0x01, 100 | 0xaa, 0xba, 0x00, 0x00, 0x00, 0x15, 0xb8, 0x0b, 0xf9, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 101 | 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xea, 0x95, 0x55, 0x9a, 0x01, 0xa9, 0xba, 0x00, 0x00, 0x00, 0x00, 102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xab, 0xff, 0xff, 0xea, 103 | 0x95, 0x56, 0x55, 0x01, 0x55, 0xba, 0x00, 0x01, 0x56, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 104 | 0x02, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xaa, 0xff, 0xff, 0xea, 0x55, 0x56, 0x5a, 0x05, 0x59, 0xb6, 105 | 0x00, 0x46, 0xaf, 0xff, 0xd8, 0x06, 0xff, 0xff, 0xff, 0x45, 0x56, 0xff, 0xfe, 0xbf, 0xff, 0xfe, 106 | 0xaa, 0xbf, 0xff, 0xe9, 0x55, 0x5a, 0x55, 0x15, 0x55, 0xbb, 0x00, 0x43, 0x6a, 0xfa, 0x58, 0x05, 107 | 0x5b, 0xea, 0xef, 0x46, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xfe, 0xa6, 0xaf, 0xff, 0xea, 0x55, 0x59, 108 | 0x50, 0x55, 0x55, 0xfe, 0x40, 0x00, 0x57, 0xfd, 0x64, 0xa9, 0x5b, 0x7f, 0x97, 0x47, 0xfe, 0xff, 109 | 0xe6, 0xbf, 0xff, 0xfe, 0xa6, 0xaa, 0xff, 0xe9, 0x55, 0x59, 0x46, 0x05, 0x6b, 0xe5, 0x00, 0x01, 110 | 0xab, 0xfd, 0xf9, 0xfe, 0x6d, 0xff, 0x56, 0x46, 0xea, 0xff, 0x96, 0xaa, 0xff, 0xfa, 0x55, 0xaa, 111 | 0xff, 0xa9, 0x55, 0x69, 0x44, 0x01, 0x69, 0x56, 0x00, 0x05, 0xab, 0xff, 0xa5, 0xfd, 0x5d, 0x5f, 112 | 0x7a, 0x01, 0x56, 0xfe, 0x56, 0xaa, 0x7f, 0xf9, 0x15, 0x96, 0xbf, 0xa5, 0x56, 0x55, 0x55, 0x00, 113 | 0x55, 0x66, 0x90, 0x00, 0x17, 0xf8, 0x67, 0xfd, 0x45, 0x6f, 0x5f, 0x01, 0x55, 0xbe, 0xa6, 0xaa, 114 | 0x5a, 0xa5, 0x56, 0x66, 0xff, 0xa5, 0x55, 0x54, 0x55, 0x01, 0x51, 0x55, 0x54, 0x00, 0x0b, 0xf8, 115 | 0x17, 0xfd, 0x50, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xea, 0x6a, 0x55, 0x41, 0x55, 0x66, 0xaf, 0xa5, 116 | 0x55, 0x00, 0x51, 0x05, 0x15, 0x55, 0x50, 0x05, 0x0b, 0xf4, 0x07, 0xfc, 0x40, 0x00, 0x04, 0x01, 117 | 0x50, 0xbf, 0xe9, 0x56, 0xa5, 0x55, 0x55, 0x56, 0xaf, 0x95, 0x55, 0x01, 0x55, 0x15, 0x55, 0x55, 118 | 0x00, 0x05, 0x7f, 0xaa, 0x55, 0x14, 0x40, 0x04, 0x40, 0x00, 0x00, 0x7f, 0xe5, 0x56, 0x65, 0x55, 119 | 0x55, 0x55, 0xaf, 0x95, 0x54, 0x01, 0x40, 0x15, 0x40, 0x55, 0x00, 0x05, 0x2f, 0x7f, 0xf5, 0x3f, 120 | 0x7a, 0xf4, 0x6f, 0x06, 0xaf, 0xfb, 0xea, 0x96, 0xa5, 0x95, 0x55, 0x45, 0xaf, 0x95, 0x55, 0x00, 121 | 0x01, 0x00, 0x01, 0x5b, 0x00, 0x04, 0x15, 0x26, 0x96, 0x95, 0xaa, 0xbf, 0x9a, 0x0f, 0xab, 0xef, 122 | 0xda, 0xeb, 0xfe, 0xaa, 0xe9, 0x59, 0xbf, 0x96, 0x55, 0x14, 0x04, 0x10, 0x15, 0x7b, 0x00, 0x08, 123 | 0x2a, 0x41, 0x91, 0x65, 0x69, 0x6f, 0x55, 0x0f, 0x5e, 0xbf, 0xe6, 0xff, 0xff, 0xff, 0xf9, 0xaa, 124 | 0xff, 0x96, 0x54, 0x00, 0x04, 0x55, 0x55, 0x6a, 0x00, 0x05, 0x3a, 0x41, 0x90, 0x29, 0x15, 0xaf, 125 | 0x56, 0x0b, 0x5f, 0xff, 0xfa, 0xff, 0xff, 0xfe, 0xba, 0xa9, 0x6e, 0x96, 0x90, 0x04, 0x01, 0x14, 126 | 0x51, 0x6a, 0x40, 0x05, 0x12, 0x55, 0x51, 0x15, 0x15, 0x6b, 0x54, 0x0a, 0xaf, 0xfe, 0xbe, 0xaf, 127 | 0xff, 0xff, 0xea, 0xa5, 0x7a, 0x99, 0x50, 0x00, 0x44, 0x01, 0x51, 0x79, 0x50, 0x04, 0x01, 0x55, 128 | 0x51, 0x15, 0x40, 0x55, 0x94, 0x05, 0x9b, 0xea, 0xae, 0xab, 0xff, 0xff, 0xea, 0xa9, 0xba, 0x69, 129 | 0x50, 0x00, 0x00, 0x05, 0x55, 0x75, 0x00, 0x04, 0x00, 0x15, 0x50, 0x04, 0x00, 0x01, 0x54, 0x04, 130 | 0x06, 0xe5, 0xbe, 0xaa, 0xbf, 0xff, 0xea, 0x56, 0xf5, 0xd5, 0x50, 0x00, 0x00, 0x00, 0x05, 0x75, 131 | 0x00, 0x14, 0x10, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xaf, 0xf9, 0xaa, 0xaf, 132 | 0x96, 0xaf, 0xf5, 0x55, 0x54, 0x00, 0x00, 0x00, 0x01, 0x65, 0x01, 0x94, 0x29, 0xa1, 0x40, 0x00, 133 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1b, 0xfe, 0xbf, 0xef, 0x96, 0xff, 0xf9, 0x55, 0x54, 0x00, 134 | 0x00, 0x00, 0x00, 0x16, 0x01, 0x94, 0x29, 0xa5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135 | 0x6f, 0xfa, 0xbf, 0xff, 0xab, 0xff, 0xfa, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x74, 136 | 0x29, 0xa5, 0x90, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x00, 0x1b, 0xff, 0xab, 0xff, 0xaa, 0xff, 137 | 0xe5, 0x15, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xa6, 0x65, 0x9a, 0xd5, 0x00, 0x00, 0x15, 138 | 0x00, 0x00, 0x00, 0x00, 0x0b, 0xff, 0xff, 0xff, 0xfa, 0xf9, 0xb4, 0x55, 0x55, 0x00, 0x00, 0x00, 139 | 0x00, 0x00, 0xaa, 0xab, 0x96, 0xae, 0xaa, 0x40, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 140 | 0xbf, 0xff, 0xfb, 0xff, 0x54, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x05, 0x55, 141 | 0x95, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xef, 0xff, 0xff, 0xfb, 0x40, 0x55, 142 | 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 143 | 0x00, 0x00, 0x01, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0x01, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 144 | 0x00, 0x00, 0x15, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbf, 0xff, 145 | 0xef, 0xf5, 0x15, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x15, 0x55, 0x00, 146 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xbf, 0xfb, 0xef, 0xd4, 0x15, 0x55, 0x54, 0x00, 147 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x01, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 148 | 0x00, 0x2b, 0xaa, 0xeb, 0xff, 0x64, 0x55, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 149 | 0x01, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x9a, 0x5a, 0xab, 0x55, 150 | 0x55, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x55, 0x01, 0x55, 0x51, 0x00, 0x00, 0x00, 151 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x55, 0x95, 0x55, 0x55, 0x55, 0x50, 0x00, 0x00, 0x00, 152 | 0x00, 0x00, 0x10, 0x51, 0x01, 0x54, 0x51, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 153 | 0xaa, 0xa9, 0x55, 0x55, 0x55, 0x55, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x40, 0x01, 0x55, 154 | 0x55, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xba, 0xaa, 0x95, 0x55, 0x55, 0x55, 155 | 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x05, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 156 | 0x00, 0x00, 0x00, 0x02, 0xae, 0xaa, 0xa5, 0x55, 0x6a, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 157 | 0x05, 0x54, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xef, 0xaa, 158 | 0x95, 0x56, 0xaa, 0x95, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x55, 0x55, 0x00, 159 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xea, 0x5a, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 160 | 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x15, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161 | 0x00, 0x00, 0x7b, 0xfe, 0xaa, 0xaa, 0xea, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 162 | 0x15, 0x55, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xaa, 0xbf, 163 | 0xea, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x05, 0x55, 0x00, 0x00, 0x00, 0x00, 164 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xeb, 0xff, 0xea, 0xf8, 0x00, 0x00, 0x00, 0x00, 165 | 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 166 | 0x0b, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x54, 167 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf0, 168 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 169 | 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 170 | 0x45, 0x55, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 171 | 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x00, 0x00, 172 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 173 | 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 174 | 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 175 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 176 | 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 177 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 178 | 0x00, 0x00, 0x65, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 179 | 0x00, 0x79, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x04, 0x00, 180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x7f, 0xff, 0x80, 0x00, 181 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 183 | }; 184 | #endif 185 | --------------------------------------------------------------------------------