diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index af9b9a74..022fe9ae 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,15 +7,13 @@ - Keep It Simple: I will try to add enhancements to separate classes or subclasses. ### issues: +- issues should be reported in the Arduino Forum Displays. +- issues on GitHub are disabled; there were too many false issues. - please post only issues that are real issues with this library! -- please add all information according to the issue template -- issues are disabled because above rules were not obeyed ### pull requests: -- I will not merge pull request. There may be exceptions to this. I may add (modified) fixes. -- pull requests are useful to inform users and me about interesting additions in forked repositories. -- I will close or remove pull request at will. -- enhancements as separate classes are preferred. -- contributors of the "Trittbrettfahrer" kind will be disappointed. +- pull requests are not welcome, will not be merged. +- pull requests can't be disabled, but will be closed. +- please place information about interesting fork additions in the Arduino Forum Displays. ## Thank you for all the inspiration I get for this library. diff --git a/README.md b/README.md index cbb485a9..de64a85a 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,13 @@ - for the concept of paged drawing and picture loop see: - https://github.com/olikraus/u8glib/wiki/tpictureloop +### Note on issues and pull requests +- issues should be reported in the Arduino Forum Displays. +- issues on GitHub are disabled; there were too many false issues. +- pull requests are not welcome, will not be merged. +- pull requests can't be disabled, but will be closed. +- please place information about interesting fork additions in the Arduino Forum Displays. + ### Supported SPI e-paper panels from Good Display: - GDEW0102T4 1.02" b/w 80x128, UC8175 - DEPG0150BN 1.50" b/w 200x200, SSD1681, e.g. LILYGO® TTGO T5 V2.4.1 1.50 inch @@ -99,6 +106,7 @@ - GDEY029T94 2.9" b/w 128x296, SSD1680 - GDEY029F51H 2.9" 4-color 168x384, JD79667 - Waveshare3inch4color 3.0" 4-color 168x400 +- GDEQ031T10 3.1" b/w 240x320, UC8253 - ED037TC1 3.7" b/w 280x480, SSD1677, Waveshare 3.7" - GDEW0371W7 3.7" b/w 240x416, UC8171 (IL0324) - GDEW042T2 4.2" b/w 400x300, UC8176 (IL0398) @@ -115,6 +123,7 @@ - GDEW0583Z83 5.83" b/w/r 648x480, EK79655 (GD7965) - GDEQ0583T31 5.83" b/w 648x480, UC8179 - GDEY073D46 7.3" 800x480 7-color +- ACeP730 7.3" Waveshare 7-color e-paper display 800x480, PhotoPainter - GDEW075T8 7.5" b/w 640x384, UC8159c (IL0371) - GDEW075T7 7.5" b/w 800x480, EK79655 (GD7965) - GDEY075T7 7.5" b/w 800x480, UC8179 (GD7965) @@ -135,7 +144,16 @@ - promotion panels from suppliers are welcome, to add support to GxEPD2 - donation panels from users are welcome, to add support to GxEPD2 -### Version 1.5.3 +### Version 1.5.4 +- added support for GDEQ031T10 3.1" b/w 240x320 +- updated support for GDEY075T7 7.5" b/w 800x480 +- renamed driver class GxEPD2_750_YT7 to GxEPD2_750_GDEY075T7 +- the actual GDEY075T7 panels have fast full refresh capability +- added support for Waveshare 7.3" 7-color, driver class GxEPD2_730c_ACeP_730 +- added support for Waveshare 7.3" 7-color PhotoPainter with RPi Pico RP2040 +- updated b/w driver classes for SSD controllers +- updated 7-color driver classes (design cleanup) +#### Version 1.5.3 - added support for GDEQ0426T82 4.26" b/w 800x480 - added support for GDEY0266F51H 2.66" 4-color 184x460 - added support for GDEY029F51H 2.9" 4-color 168x384 diff --git a/examples/GxEPD2_Example/GxEPD2_Example.ino b/examples/GxEPD2_Example/GxEPD2_Example.ino index db014667..9f3813ca 100644 --- a/examples/GxEPD2_Example/GxEPD2_Example.ino +++ b/examples/GxEPD2_Example/GxEPD2_Example.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -63,6 +65,7 @@ #include "bitmaps/Bitmaps128x296.h" // 2.9" b/w #include "bitmaps/Bitmaps152x296.h" // 2.6" b/w #include "bitmaps/Bitmaps176x264.h" // 2.7" b/w +#include "bitmaps/Bitmaps240x360.h" // 3.1" b/w #include "bitmaps/Bitmaps240x416.h" // 3.71" b/w #include "bitmaps/Bitmaps400x300.h" // 4.2" b/w #include "bitmaps/Bitmaps648x480.h" // 5.38" b/w @@ -89,9 +92,9 @@ #include "bitmaps/Bitmaps4c400x300.h" // 4.2"" 4-color // 7-color #include "bitmaps/WS_Bitmaps7c192x143.h" // 5.65" 7-color -//#include "bitmaps/WS_Bitmaps7c300x180.h" // 7.3" 7-color +#include "bitmaps/WS_Bitmaps7c300x180.h" // 7.3" 7-color #endif -#if defined(ESP32) +#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040) #include "bitmaps/Bitmaps1304x984.h" // 12.48" b/w #include "bitmaps/Bitmaps3c1304x984.h" // 12.48" b/w/r #include "bitmaps/Bitmaps7c800x480.h" // 7.3" 7-color @@ -108,6 +111,7 @@ //#include "bitmaps/Bitmaps176x264.h" // 2.7" b/w ////#include "bitmaps/Bitmaps400x300.h" // 4.2" b/w // not enough code space ////#include "bitmaps/Bitmaps640x384.h" // 7.5" b/w // not enough code space +////#include "bitmaps/Bitmaps800x480.h" // 7.5" b/w // not enough code space // 3-color //#include "bitmaps/Bitmaps3c200x200.h" // 1.54" b/w/r //#include "bitmaps/Bitmaps3c104x212.h" // 2.13" b/w/r @@ -118,10 +122,22 @@ #endif -#if defined(ARDUINO_ARCH_RP2040) && defined(ARDUINO_RASPBERRY_PI_PICO) +#if defined(ARDUINO_ARCH_RP2040) && (defined(ARDUINO_RASPBERRY_PI_PICO) || defined(ARDUINO_RASPBERRY_PI_PICO_W)) +#if defined(__MBED__) // SPI pins used by GoodDisplay DESPI-PICO. note: steals standard I2C pins PIN_WIRE_SDA (6), PIN_WIRE_SCL (7) // uncomment next line for use with GoodDisplay DESPI-PICO. // MbedSPI(int miso, int mosi, int sck); -arduino::MbedSPI SPI0(4, 7, 6); // need be valid pins for same SPI channel, else fails blinking 4 long 4 short +arduino::MbedSPI SPIn(4, 7, 6); // need be valid pins for same SPI channel, else fails blinking 4 long 4 short +// uncomment next line for use with my proto board. // MbedSPI(int miso, int mosi, int sck); +//arduino::MbedSPI SPIn(4, 3, 2); // need be valid pins for same SPI channel, else fails blinking 4 long 4 short +// uncomment next line for use with Waveshare Pico-ePaper-2.9 or PhotoPainter. // MbedSPI(int miso, int mosi, int sck); +//arduino::MbedSPI SPIn(12, 11, 10); // need be valid pins for same SPI channel, else fails blinking 4 long 4 short +#else // package https://github.com/earlephilhower/arduino-pico +// SPIClassRP2040(spi_inst_t *spi, pin_size_t rx, pin_size_t cs, pin_size_t sck, pin_size_t tx); +// uncomment next line for use with my proto board. +//SPIClassRP2040 SPIn(spi0, 4, 5, 2, 3); // need be valid pins for same SPI channel, else fails blinking 4 long 4 short +// uncomment next line for use with Waveshare Pico-ePaper-2.9 or Waveshare PhotoPainter module +SPIClassRP2040 SPIn(spi1, 12, 13, 10, 11); // need be valid pins for same SPI channel, else fails blinking 4 long 4 short +#endif #endif #if defined(ESP32) && defined(USE_HSPI_FOR_EPD) @@ -134,20 +150,26 @@ void setup() Serial.println(); Serial.println("setup"); delay(100); -#if defined(ARDUINO_ARCH_RP2040) && defined(ARDUINO_RASPBERRY_PI_PICO) - // uncomment next line for use with GoodDisplay DESPI-PICO, or use the extended init method - //display.epd2.selectSPI(SPI0, SPISettings(4000000, MSBFIRST, SPI_MODE0)); +#if defined(ARDUINO_ARCH_RP2040) && (defined(ARDUINO_RASPBERRY_PI_PICO) || defined(ARDUINO_RASPBERRY_PI_PICO_W)) + // uncomment next line for use with GoodDisplay DESPI-PICO or my proto board, or Waveshare RPi boards + display.epd2.selectSPI(SPIn, SPISettings(4000000, MSBFIRST, SPI_MODE0)); // uncomment next 2 lines to allow recovery from configuration failures pinMode(15, INPUT_PULLUP); // safety pin while (!digitalRead(15)) delay(100); // check safety pin for fail recovery + // recovery can be done also by holding BOOTSEL during power-up. + // uncomment next line for Waveshare PhotoPainter module + pinMode(16, OUTPUT); digitalWrite(16, HIGH); // power to the paper #endif #if defined(ESP32) && defined(USE_HSPI_FOR_EPD) hspi.begin(13, 12, 14, 15); // remap hspi for EPD (swap pins) display.epd2.selectSPI(hspi, SPISettings(4000000, MSBFIRST, SPI_MODE0)); +#elif (defined(ARDUINO_ARCH_ESP32) && defined(ARDUINO_LOLIN_S2_MINI)) + // SPI.begin(sck, miso, mosi, ss); // preset for remapped pins + SPI.begin(18, -1, 16, 33); // my LOLIN ESP32 S2 mini connection #endif //display.init(115200); // default 10ms reset pulse, e.g. for bare panels with DESPI-C02 display.init(115200, true, 2, false); // USE THIS for Waveshare boards with "clever" reset circuit, 2ms reset pulse - //display.init(115200, true, 10, false, SPI0, SPISettings(4000000, MSBFIRST, SPI_MODE0)); // extended init method with SPI channel and/or settings selection + //display.init(115200, true, 10, false, SPIn, SPISettings(4000000, MSBFIRST, SPI_MODE0)); // extended init method with SPI channel and/or settings selection if (display.pages() > 1) { delay(100); @@ -180,12 +202,13 @@ void setup() drawGraphics(); //return; #if !defined(__AVR) // takes too long! - if ((display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46)) + if ((display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46) || (display.epd2.panel == GxEPD2::ACeP730)) { //draw7colorlines(); //delay(2000); draw7colors(); delay(4000); + //return; } #endif if (display.epd2.hasPartialUpdate) @@ -755,6 +778,7 @@ void drawGrid() void drawBitmaps() { + display.setRotation(0); display.setFullWindow(); #ifdef _GxBitmaps80x128_H_ drawBitmaps80x128(); @@ -774,6 +798,9 @@ void drawBitmaps() #ifdef _GxBitmaps152x296_H_ drawBitmaps152x296(); #endif +#ifdef _GxBitmaps240x320_H_ + drawBitmaps240x320(); +#endif #ifdef _GxBitmaps176x264_H_ drawBitmaps176x264(); #endif @@ -1154,6 +1181,37 @@ void drawBitmaps152x296() } #endif +#ifdef _GxBitmaps240x320_H_ +void drawBitmaps240x320() +{ +#if !defined(__AVR) + const unsigned char* bitmaps[] = + { + Bitmap240x320_1, Bitmap240x320_2, Bitmap240x320_3, Bitmap240x320_4, Bitmap240x320_5 + }; +#else + const unsigned char* bitmaps[] = + { + Bitmap240x320_1, Bitmap240x320_2 + }; +#endif + if ((display.epd2.WIDTH == 240) && (display.epd2.HEIGHT == 320) && !display.epd2.hasColor) + { + for (uint16_t i = 0; i < sizeof(bitmaps) / sizeof(char*); i++) + { + display.firstPage(); + do + { + display.fillScreen(GxEPD_WHITE); + display.drawInvertedBitmap(0, 0, bitmaps[i], 240, 320, GxEPD_BLACK); + } + while (display.nextPage()); + delay(2000); + } + } +} +#endif + #ifdef _GxBitmaps176x264_H_ void drawBitmaps176x264() { @@ -1303,7 +1361,12 @@ void drawBitmaps648x480() #ifdef _GxBitmaps800x480_H_ void drawBitmaps800x480() { -#if !defined(__AVR) +#if defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI) + const unsigned char* bitmaps[] = + { + Bitmap800x480_3, Bitmap800x480_4 + }; +#elif !defined(__AVR) const unsigned char* bitmaps[] = { Bitmap800x480_1, Bitmap800x480_2, Bitmap800x480_3, Bitmap800x480_4 @@ -1822,7 +1885,7 @@ void drawBitmaps7c192x143() #if defined(_GxBitmaps7c800x480_H_) void drawBitmaps7c800x480() { - if (display.epd2.panel == GxEPD2::GDEY073D46) + if ((display.epd2.panel == GxEPD2::GDEY073D46) || (display.epd2.panel == GxEPD2::ACeP730)) { display.epd2.drawDemoBitmap(Bitmap7c800x480, 0, 0, 0, 800, 480, 0, false, true); // special format delay(5000); @@ -1833,7 +1896,7 @@ void drawBitmaps7c800x480() #if defined(_WS_Bitmaps7c300x180_H_) void drawBitmaps7c300x180() { - if (display.epd2.panel == GxEPD2::GDEY073D46) + if ((display.epd2.panel == GxEPD2::GDEY073D46) || (display.epd2.panel == GxEPD2::ACeP730)) { display.drawNative(WS_Bitmap7c300x180, 0, (display.epd2.WIDTH - 300) / 2, (display.epd2.HEIGHT - 180) / 2, 300, 180, false, false, true); delay(5000); diff --git a/examples/GxEPD2_Example/GxEPD2_display_selection.h b/examples/GxEPD2_Example/GxEPD2_display_selection.h index 2f471c8a..4bbb7d1b 100644 --- a/examples/GxEPD2_Example/GxEPD2_display_selection.h +++ b/examples/GxEPD2_Example/GxEPD2_display_selection.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #if defined (ESP8266) // select one and adapt to your mapping, can use full buffer size (full HEIGHT) @@ -46,6 +48,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -58,7 +61,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -85,7 +88,7 @@ //GxEPD2_4C display(GxEPD2_290c_GDEY029F51H(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) //GxEPD2_4C display(GxEPD2_300c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 3.00" 4-color //GxEPD2_4C display(GxEPD2_420c_GDEY0420F51(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0420F51 400x300, HX8717 (no inking) -//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 4.37" 4-color +//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 2 > display(GxEPD2_437c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 4.37" 4-color // 7-color e-paper //GxEPD2_3C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color (3C graphics) //GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color @@ -130,6 +133,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -142,7 +146,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -208,6 +212,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -219,7 +224,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -305,6 +310,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -316,7 +322,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -350,7 +356,8 @@ // can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics) #if defined(ARDUINO_ARCH_STM32) -#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise +#define Serial Serial1 // for my proto board +#define MAX_DISPLAY_BUFFER_SIZE 16384ul // ~16k is a good compromise #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) // select one and adapt to your mapping //GxEPD2_BW display(GxEPD2_102(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0102T4 80x128, UC8175 @@ -384,6 +391,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -395,7 +403,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -471,6 +479,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -482,7 +491,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -550,6 +559,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -561,7 +571,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0154Z04 200x200, IL0376F, no longer available diff --git a/examples/GxEPD2_Example/GxEPD2_display_selection_added.h b/examples/GxEPD2_Example/GxEPD2_display_selection_added.h index d3a14598..d8cb9d5c 100644 --- a/examples/GxEPD2_Example/GxEPD2_display_selection_added.h +++ b/examples/GxEPD2_Example/GxEPD2_display_selection_added.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -53,6 +53,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -64,7 +65,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -148,6 +149,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -159,7 +161,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -239,6 +241,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -250,7 +253,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -324,6 +327,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -335,7 +339,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -409,6 +413,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -421,7 +426,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075T7 800x480, EK79655 (GD7965) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -489,6 +494,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -500,7 +506,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) diff --git a/examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_Example/GxEPD2_selection_check.h b/examples/GxEPD2_Example/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_Example/GxEPD2_selection_check.h +++ b/examples/GxEPD2_Example/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_Example/GxEPD2_wiring_examples.h index 95c88305..ef5dc8e5 100644 --- a/examples/GxEPD2_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // connection suggestions concerning Waveshare e-paper HAT Rev 2.3: // DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. @@ -58,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -91,5 +97,9 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + // mapping of Waveshare Pico-ePaper-2.9 // BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_GFX_Example/BitmapDisplay.cpp b/examples/GxEPD2_GFX_Example/BitmapDisplay.cpp index 97507178..0640fcec 100644 --- a/examples/GxEPD2_GFX_Example/BitmapDisplay.cpp +++ b/examples/GxEPD2_GFX_Example/BitmapDisplay.cpp @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/examples/GxEPD2_GFX_Example/BitmapDisplay.h b/examples/GxEPD2_GFX_Example/BitmapDisplay.h index 904d69bb..43419324 100644 --- a/examples/GxEPD2_GFX_Example/BitmapDisplay.h +++ b/examples/GxEPD2_GFX_Example/BitmapDisplay.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/examples/GxEPD2_GFX_Example/GxEPD2_GFX_Example.ino b/examples/GxEPD2_GFX_Example/GxEPD2_GFX_Example.ino index 6f14e0df..13644b01 100644 --- a/examples/GxEPD2_GFX_Example/GxEPD2_GFX_Example.ino +++ b/examples/GxEPD2_GFX_Example/GxEPD2_GFX_Example.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -11,9 +11,11 @@ // // Purpose: show uses of GxEPD2_GFX base class for references to a display instance -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -29,6 +31,7 @@ #include #include +#include #include #include @@ -43,6 +46,8 @@ // or select the display class and display driver class in the following file (new style): #include "GxEPD2_display_selection_new_style.h" +// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino + BitmapDisplay bitmaps(display); void setup() diff --git a/examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h b/examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h index 2f471c8a..4bbb7d1b 100644 --- a/examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h +++ b/examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #if defined (ESP8266) // select one and adapt to your mapping, can use full buffer size (full HEIGHT) @@ -46,6 +48,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -58,7 +61,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -85,7 +88,7 @@ //GxEPD2_4C display(GxEPD2_290c_GDEY029F51H(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) //GxEPD2_4C display(GxEPD2_300c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 3.00" 4-color //GxEPD2_4C display(GxEPD2_420c_GDEY0420F51(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0420F51 400x300, HX8717 (no inking) -//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 4.37" 4-color +//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 2 > display(GxEPD2_437c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 4.37" 4-color // 7-color e-paper //GxEPD2_3C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color (3C graphics) //GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color @@ -130,6 +133,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -142,7 +146,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -208,6 +212,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -219,7 +224,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -305,6 +310,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -316,7 +322,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -350,7 +356,8 @@ // can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics) #if defined(ARDUINO_ARCH_STM32) -#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise +#define Serial Serial1 // for my proto board +#define MAX_DISPLAY_BUFFER_SIZE 16384ul // ~16k is a good compromise #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) // select one and adapt to your mapping //GxEPD2_BW display(GxEPD2_102(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0102T4 80x128, UC8175 @@ -384,6 +391,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -395,7 +403,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -471,6 +479,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -482,7 +491,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -550,6 +559,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -561,7 +571,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0154Z04 200x200, IL0376F, no longer available diff --git a/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_added.h b/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_added.h index d3a14598..d8cb9d5c 100644 --- a/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_added.h +++ b/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_added.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -53,6 +53,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -64,7 +65,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -148,6 +149,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -159,7 +161,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -239,6 +241,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -250,7 +253,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -324,6 +327,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -335,7 +339,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -409,6 +413,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -421,7 +426,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075T7 800x480, EK79655 (GD7965) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -489,6 +494,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -500,7 +506,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) diff --git a/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h b/examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h +++ b/examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_GFX_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_GFX_Example/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_GFX_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_GFX_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_GFX_Example/TextDisplay.cpp b/examples/GxEPD2_GFX_Example/TextDisplay.cpp index cadfac10..e8ae0dc4 100644 --- a/examples/GxEPD2_GFX_Example/TextDisplay.cpp +++ b/examples/GxEPD2_GFX_Example/TextDisplay.cpp @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/examples/GxEPD2_GFX_Example/TextDisplay.h b/examples/GxEPD2_GFX_Example/TextDisplay.h index 3dc57bfa..669a719a 100644 --- a/examples/GxEPD2_GFX_Example/TextDisplay.h +++ b/examples/GxEPD2_GFX_Example/TextDisplay.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/examples/GxEPD2_HelloWorld/GxEPD2_HelloWorld.ino b/examples/GxEPD2_HelloWorld/GxEPD2_HelloWorld.ino index 7a6ab05c..a97cacf2 100644 --- a/examples/GxEPD2_HelloWorld/GxEPD2_HelloWorld.ino +++ b/examples/GxEPD2_HelloWorld/GxEPD2_HelloWorld.ino @@ -1,4 +1,21 @@ // GxEPD2_HelloWorld.ino by Jean-Marc Zingg +// +// Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! +// +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ +// +// Author: Jean-Marc Zingg +// +// Version: see library.properties +// +// Library: https://github.com/ZinggJM/GxEPD2 + +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples // if you use a different wiring, you need to adapt the constructor parameters! @@ -8,6 +25,7 @@ #include #include +#include #include #include @@ -22,6 +40,8 @@ // e.g. for Wemos D1 mini: //GxEPD2_BW display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67 +// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino + void setup() { //display.init(115200); // default 10ms reset pulse, e.g. for bare panels with DESPI-C02 diff --git a/examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h b/examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h index 2f471c8a..4bbb7d1b 100644 --- a/examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h +++ b/examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #if defined (ESP8266) // select one and adapt to your mapping, can use full buffer size (full HEIGHT) @@ -46,6 +48,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -58,7 +61,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -85,7 +88,7 @@ //GxEPD2_4C display(GxEPD2_290c_GDEY029F51H(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) //GxEPD2_4C display(GxEPD2_300c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 3.00" 4-color //GxEPD2_4C display(GxEPD2_420c_GDEY0420F51(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0420F51 400x300, HX8717 (no inking) -//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 4.37" 4-color +//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 2 > display(GxEPD2_437c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 4.37" 4-color // 7-color e-paper //GxEPD2_3C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color (3C graphics) //GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 5.65" 7-color @@ -130,6 +133,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -142,7 +146,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -208,6 +212,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -219,7 +224,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -305,6 +310,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -316,7 +322,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -350,7 +356,8 @@ // can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics) #if defined(ARDUINO_ARCH_STM32) -#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise +#define Serial Serial1 // for my proto board +#define MAX_DISPLAY_BUFFER_SIZE 16384ul // ~16k is a good compromise #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) // select one and adapt to your mapping //GxEPD2_BW display(GxEPD2_102(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0102T4 80x128, UC8175 @@ -384,6 +391,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -395,7 +403,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -471,6 +479,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -482,7 +491,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -550,6 +559,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -561,7 +571,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0154Z04 200x200, IL0376F, no longer available diff --git a/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_added.h b/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_added.h index d3a14598..d8cb9d5c 100644 --- a/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_added.h +++ b/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_added.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -53,6 +53,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -64,7 +65,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -148,6 +149,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -159,7 +161,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) @@ -239,6 +241,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -250,7 +253,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -324,6 +327,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -335,7 +339,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2> display(GxEPD2_1160_T91(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -409,6 +413,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -421,7 +426,7 @@ //GxEPD2_BW < GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT / 2 > display(GxEPD2_583_GDEQ0583T31(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075T7 800x480, EK79655 (GD7965) //GxEPD2_BW < GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT / 2 > display(GxEPD2_750_T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075T7 800x480, EK79655 (GD7965) -//GxEPD2_BW < GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT / 2 > display(GxEPD2_750_YT7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW < GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT / 2 > display(GxEPD2_750_GDEY075T7(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, GxEPD2_1160_T91::HEIGHT / 2 > display(GxEPD2_1160_T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers //GxEPD2_3C display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0154Z04 200x200, IL0376F, no longer available @@ -489,6 +494,7 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398) @@ -500,7 +506,7 @@ //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //GxEPD2_BW display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) -//GxEPD2_BW display(GxEPD2_750_YT7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) +//GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965) //GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) diff --git a/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h b/examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h +++ b/examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_HelloWorld/GxEPD2_wiring_examples.h b/examples/GxEPD2_HelloWorld/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_HelloWorld/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_HelloWorld/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_MultiDisplayExample/GxEPD2_MultiDisplayExample.ino b/examples/GxEPD2_MultiDisplayExample/GxEPD2_MultiDisplayExample.ino index 41359097..7ff49536 100644 --- a/examples/GxEPD2_MultiDisplayExample/GxEPD2_MultiDisplayExample.ino +++ b/examples/GxEPD2_MultiDisplayExample/GxEPD2_MultiDisplayExample.ino @@ -1,7 +1,7 @@ -// GxEPD2_MultiDisplayExample : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. +// Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,39 +9,13 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 - -// mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini -// BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V -// NOTE: connect 3.3k pull-down from D8 to GND if your board or shield has level converters -// NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, use different pin in case, or 4k7 pull-down - -// mapping suggestion from Waveshare SPI e-Paper to generic ESP8266 -// BUSY -> GPIO4, RST -> GPIO2, DC -> GPIO0, CS -> GPIO15, CLK -> GPIO14, DIN -> GPIO13, GND -> GND, 3.3V -> 3.3V -// NOTE: connect 3.3k pull-down from GPIO15 to GND if your board or shield has level converters -// NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, use different pin in case, or 3.3k pull-down - -// mapping of Waveshare e-Paper ESP8266 Driver Board, new version (see GxEPD2_boards_added.h for old version) -// BUSY -> GPIO5, RST -> GPIO2, DC -> GPIO4, CS -> GPIO15, CLK -> GPIO14, DIN -> GPIO13, GND -> GND, 3.3V -> 3.3V -// NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, add a 3.3k pull-down in case -// the e-Paper ESP8266 Driver Board should have no boot mode issue, as it doesn't use level converters - -// mapping suggestion for ESP32, e.g. LOLIN32, see .../variants/.../pins_arduino.h for your board -// NOTE: there are variants with different pins for SPI ! CHECK SPI PINS OF YOUR BOARD -// BUSY -> 4, RST -> 16, DC -> 17, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V - -// mapping of Waveshare ESP32 Driver Board -// BUSY -> 25, RST -> 26, DC -> 27, CS-> 15, CLK -> 13, DIN -> 14 -// NOTE: this board uses "unusual" SPI pins and requires re-mapping of HW SPI to these pins in SPIClass -// see example GxEPD2_WS_ESP32_Driver.ino, it shows how this can be done easily - -// new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" -// BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues -// mapping suggestion for AVR, UNO, NANO etc. -// BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 13, DIN -> 11 +// see GxEPD2_wiring_examples.h for wiring suggestions and examples // base class GxEPD2_GFX can be used to pass references or pointers to the display instance as parameter // enable GxEPD2_GFX base class diff --git a/examples/GxEPD2_NotPagedExample/GxEPD2_NotPagedExample.ino b/examples/GxEPD2_NotPagedExample/GxEPD2_NotPagedExample.ino index 4575506d..23a1adcc 100644 --- a/examples/GxEPD2_NotPagedExample/GxEPD2_NotPagedExample.ino +++ b/examples/GxEPD2_NotPagedExample/GxEPD2_NotPagedExample.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -26,6 +28,7 @@ #include #include +#include #include #include @@ -69,11 +72,13 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) //GxEPD2_BW display(GxEPD2_420_M01(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042M01 400x300, UC8176 (IL0398) -//GxEPD2_BW display(GxEPD2_420_GDEY042T91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); GDEY042T91, 400x300, SSD1683 (no inking) +//GxEPD2_BW display(GxEPD2_420_GDEY042T81(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); GDEY042T81, 400x300, SSD1683 (no inking) +//GxEPD2_BW display(GxEPD2_426_GDEQ0426T82(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY042T81, 400x300, SSD1683 (no inking) // can use only half buffer size ////GxEPD2_BW < GxEPD2_583, GxEPD2_583::HEIGHT / 2 > display(GxEPD2_583(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); ////GxEPD2_BW < GxEPD2_583_T8, GxEPD2_583_T8::HEIGHT / 2 > display(GxEPD2_583_T8(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); @@ -91,6 +96,12 @@ ////GxEPD2_3C < GxEPD2_583c, GxEPD2_583c::HEIGHT / 4 > display(GxEPD2_583c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); ////GxEPD2_3C display(GxEPD2_750c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); ////GxEPD2_3C < GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4 > display(GxEPD2_750c_Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z08 800x480 +// 4-color e-paper +//GxEPD2_4C display(GxEPD2_266c_GDEY0266F51H(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//GxEPD2_4C display(GxEPD2_290c_GDEY029F51H(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//GxEPD2_4C display(GxEPD2_300c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 3.00" 4-color +//GxEPD2_4C display(GxEPD2_420c_GDEY0420F51(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//GxEPD2_4C display(GxEPD2_437c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 4.37" 4-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT // HRDY -> 4, RST -> 2, CS -> SS(15), SCK -> SCK(14), MOSI -> MOSI(D7(13)), MISO -> MISO(D6(12)), GND -> GND, 5V -> 5V // note: 5V supply needs to be exact and strong; 5V pin of USB powered Wemos D1 mini doesn't work! @@ -129,11 +140,13 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398) //GxEPD2_BW display(GxEPD2_420_M01(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042M01 400x300, UC8176 (IL0398) -//GxEPD2_BW display(GxEPD2_420_GDEY042T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); GDEY042T91, 400x300, SSD1683 (no inking) +//GxEPD2_BW display(GxEPD2_420_GDEY042T81(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); GDEY042T81, 400x300, SSD1683 (no inking) +//GxEPD2_BW display(GxEPD2_426_GDEQ0426T82(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) // can use only half buffer size ////GxEPD2_BW < GxEPD2_583, GxEPD2_583::HEIGHT / 2 > display(GxEPD2_583(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); ////GxEPD2_BW < GxEPD2_583_T8, GxEPD2_583_T8::HEIGHT / 2 > display(GxEPD2_583_T8(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); @@ -147,6 +160,12 @@ //GxEPD2_3C display(GxEPD2_270c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // can use only half buffer size ////GxEPD2_3C display(GxEPD2_420c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); +// 4-color e-paper +//GxEPD2_4C display(GxEPD2_266c_GDEY0266F51H(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02) +//GxEPD2_4C display(GxEPD2_290c_GDEY029F51H(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//GxEPD2_4C display(GxEPD2_300c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // Waveshare 3.00" 4-color +//GxEPD2_4C display(GxEPD2_420c_GDEY0420F51(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY0420F51 400x300, HX8717 (no inking) +//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // Waveshare 4.37" 4-color // can use only quarter buffer size ////GxEPD2_3C display(GxEPD2_583c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); ////GxEPD2_3C display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); @@ -189,11 +208,13 @@ //GxEPD2_BW display(GxEPD2_290_BS(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680 //GxEPD2_BW display(GxEPD2_290_M06(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029M06 128x296, UC8151D //GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //GxEPD2_BW display(GxEPD2_371(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324) //GxEPD2_BW display(GxEPD2_370_TC1(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" //GxEPD2_BW display(GxEPD2_420(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398) //GxEPD2_BW display(GxEPD2_420_M01(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042M01 400x300, UC8176 (IL0398) -//GxEPD2_BW display(GxEPD2_420_GDEY042T91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); GDEY042T91, 400x300, SSD1683 (no inking) +//GxEPD2_BW display(GxEPD2_420_GDEY042T81(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); GDEY042T81, 400x300, SSD1683 (no inking) +//GxEPD2_BW display(GxEPD2_426_GDEQ0426T82(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) //GxEPD2_BW display(GxEPD2_583(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0583T7 600x448, UC8159c (IL0371) //GxEPD2_BW display(GxEPD2_583_T8(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0583T8 648x480, EK79655 (GD7965) //GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) @@ -219,6 +240,12 @@ //GxEPD2_3C display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371) //GxEPD2_3C display(GxEPD2_750c_Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, GD7965 ////GxEPD2_3C display(GxEPD2_750c_Z90(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH075Z90 880x528, SSD1677 +// 4-color e-paper +//GxEPD2_4C display(GxEPD2_266c_GDEY0266F51H(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02) +//GxEPD2_4C display(GxEPD2_290c_GDEY029F51H(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//GxEPD2_4C display(GxEPD2_300c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 3.00" 4-color +//GxEPD2_4C display(GxEPD2_420c_GDEY0420F51(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0420F51 400x300, HX8717 (no inking) +//GxEPD2_4C display(GxEPD2_437c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 4.37" 4-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT // HRDY -> 4, RST -> 16, CS -> SS(5), SCK -> SCK(18), MOSI -> MOSI(23), MISO -> MISO(19), GND -> GND, 5V -> 5V @@ -229,45 +256,91 @@ // can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics) #if defined(ARDUINO_ARCH_STM32) -#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise +#define Serial Serial1 // for my proto board +#define MAX_DISPLAY_BUFFER_SIZE (16384ul + 184) // ~16k is a good compromise, (16384ul + 184) for GDEY0266F51H #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) // select one and adapt to your mapping -//GxEPD2_BW display(GxEPD2_154(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEP015OC1 no longer available -//GxEPD2_BW display(GxEPD2_154_D67(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0154D67 -//GxEPD2_BW display(GxEPD2_154_T8(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0154T8 152x152 -//GxEPD2_BW display(GxEPD2_154_M09(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0154M09 200x200 -//GxEPD2_BW display(GxEPD2_154_M10(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0154M10 152x152 -//GxEPD2_BW display(GxEPD2_213(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDE0213B1, phased out -//GxEPD2_BW display(GxEPD2_213_B72(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0213B72 -//GxEPD2_BW display(GxEPD2_213_B73(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0213B73 -//GxEPD2_BW display(GxEPD2_213_flex(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0213I5F -//GxEPD2_BW display(GxEPD2_213_M21(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0213M21 -//GxEPD2_BW display(GxEPD2_290(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -//GxEPD2_BW display(GxEPD2_290_T5(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW029T5 -//GxEPD2_BW display(GxEPD2_290_M06(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW029M06 -//GxEPD2_BW display(GxEPD2_260(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -//GxEPD2_BW display(GxEPD2_270(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -//GxEPD2_BW display(GxEPD2_371(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -//GxEPD2_BW display(GxEPD2_420(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -//GxEPD2_BW display(GxEPD2_420_M01(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW042M01 -////GxEPD2_BW display(GxEPD2_583(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -////GxEPD2_BW display(GxEPD2_583_T8(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -////GxEPD2_BW display(GxEPD2_750(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -////GxEPD2_BW display(GxEPD2_750_T7(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW075T7 800x480 +//GxEPD2_BW display(GxEPD2_102(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0102T4 80x128, UC8175 +//GxEPD2_BW display(GxEPD2_150_BN(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1 +//GxEPD2_BW display(GxEPD2_154(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEP015OC1 200x200, IL3829, no longer available +//GxEPD2_BW display(GxEPD2_154_D67(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0154D67 200x200, SSD1681 +//GxEPD2_BW display(GxEPD2_154_T8(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154T8 152x152, UC8151 (IL0373) +//GxEPD2_BW display(GxEPD2_154_M09(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154M09 200x200, JD79653A +//GxEPD2_BW display(GxEPD2_154_M10(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154M10 152x152, UC8151D +//GxEPD2_BW display(GxEPD2_154_GDEY0154D67(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) +//GxEPD2_BW display(GxEPD2_213(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDE0213B1 122x250, IL3895, phased out +//GxEPD2_BW display(GxEPD2_213_B72(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0213B72 122x250, SSD1675A (IL3897) +//GxEPD2_BW display(GxEPD2_213_B73(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0213B73 122x250, SSD1675B +//GxEPD2_BW display(GxEPD2_213_B74(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM0213B74 122x250, SSD1680 +//GxEPD2_BW display(GxEPD2_213_flex(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213I5F 104x212, UC8151 (IL0373) +//GxEPD2_BW display(GxEPD2_213_M21(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213M21 104x212, UC8151 (IL0373) +//GxEPD2_BW display(GxEPD2_213_T5D(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213T5D 104x212, UC8151D +//GxEPD2_BW display(GxEPD2_213_BN(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1 +//GxEPD2_BW display(GxEPD2_213_GDEY0213B74(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) +//GxEPD2_BW display(GxEPD2_260(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW026T0 152x296, UC8151 (IL0373) +//GxEPD2_BW display(GxEPD2_260_M01(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW026M01 152x296, UC8151 (IL0373) +//GxEPD2_BW display(GxEPD2_266_BN(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0 +//GxEPD2_BW display(GxEPD2_270(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW027W3 176x264, EK79652 (IL91874) +//GxEPD2_BW display(GxEPD2_270_GDEY027T91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY027T91 176x264, SSD1680 +//GxEPD2_BW display(GxEPD2_290(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH029A1 128x296, SSD1608 (IL3820) +//GxEPD2_BW display(GxEPD2_290_T5(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029T5 128x296, UC8151 (IL0373) +//GxEPD2_BW display(GxEPD2_290_T5D(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029T5D 128x296, UC8151D +//GxEPD2_BW display(GxEPD2_290_I6FD(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029I6FD 128x296, UC8151D +//GxEPD2_BW display(GxEPD2_290_T94(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM029T94 128x296, SSD1680 +//GxEPD2_BW display(GxEPD2_290_T94_V2(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant +//GxEPD2_BW display(GxEPD2_290_BS(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0290BS 128x296, SSD1680 +//GxEPD2_BW display(GxEPD2_290_M06(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029M06 128x296, UC8151D +//GxEPD2_BW display(GxEPD2_290_GDEY029T94(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//GxEPD2_BW display(GxEPD2_310_GDEQ031T10(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) +//GxEPD2_BW display(GxEPD2_371(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0371W7 240x416, UC8171 (IL0324) +//GxEPD2_BW display(GxEPD2_370_TC1(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // ED037TC1 280x480, SSD1677, Waveshare 3.7" +//GxEPD2_BW display(GxEPD2_420(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042T2 400x300, UC8176 (IL0398) +//GxEPD2_BW display(GxEPD2_420_M01(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042M01 400x300, UC8176 (IL0398) +//GxEPD2_BW display(GxEPD2_420_GDEY042T81(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); GDEY042T81, 400x300, SSD1683 (no inking) +//GxEPD2_BW display(GxEPD2_426_GDEQ0426T82(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) +////GxEPD2_BW display(GxEPD2_583(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583T7 600x448, UC8159c (IL0371) +////GxEPD2_BW display(GxEPD2_583_T8(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583T8 648x480, EK79655 (GD7965) +////GxEPD2_BW display(GxEPD2_583_GDEQ0583T31(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) +////GxEPD2_BW display(GxEPD2_750(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T8 640x384, UC8159c (IL0371) +////GxEPD2_BW display(GxEPD2_750_T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T7 800x480, EK79655 (GD7965) +////GxEPD2_BW display(GxEPD2_750_GDEY075T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075T7 800x480, UC8179 (GD7965) +////GxEPD2_BW < GxEPD2_1160_T91, MAX_HEIGHT(GxEPD2_1160_T91)> display(GxEPD2_1160_T91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH116T91 960x640, SSD1677 // 3-color e-papers #define MAX_HEIGHT_3C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) -//GxEPD2_3C display(GxEPD2_154c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW0154Z04 no longer available -//GxEPD2_3C display(GxEPD2_154_Z90c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEH0154Z90 -//GxEPD2_3C display(GxEPD2_213c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -//GxEPD2_3C display(GxEPD2_290c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -//GxEPD2_3C display(GxEPD2_270c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -////GxEPD2_3C display(GxEPD2_420c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -////GxEPD2_3C display(GxEPD2_583c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -////GxEPD2_3C display(GxEPD2_750c(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); -////GxEPD2_3C display(GxEPD2_750c_Z08(/*CS=4*/ SS, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // GDEW075Z08 800x480 +//GxEPD2_3C display(GxEPD2_154c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154Z04 200x200, IL0376F, no longer available +//GxEPD2_3C display(GxEPD2_154_Z90c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0154Z90 200x200, SSD1681 +//GxEPD2_3C display(GxEPD2_213c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213Z16 104x212, UC8151 (IL0373) +//GxEPD2_3C display(GxEPD2_213_Z19c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0213Z19 104x212, UC8151D +//GxEPD2_3C display(GxEPD2_213_Z98c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0213Z98 122x250, SSD1680 +//GxEPD2_3C display(GxEPD2_266c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0266Z90 152x296, SSD1680 +//GxEPD2_3C display(GxEPD2_270c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW027C44 176x264, IL91874 +//GxEPD2_3C display(GxEPD2_290c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029Z10 128x296, UC8151 (IL0373) +//GxEPD2_3C display(GxEPD2_290_Z13c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH029Z13 128x296, UC8151D +//GxEPD2_3C display(GxEPD2_290_C90c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM029C90 128x296, SSD1680 +////GxEPD2_3C display(GxEPD2_420c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042Z15 400x300, UC8176 (IL0398) +////GxEPD2_3C display(GxEPD2_420c_Z21(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ042Z21 400x300, UC8276 +////GxEPD2_3C display(GxEPD2_583c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583Z21 600x448, UC8179 (IL0371) +////GxEPD2_3C display(GxEPD2_583c_Z83(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583Z83 648x480, GD7965 +////GxEPD2_3C display(GxEPD2_750c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z09 640x384, UC8179 (IL0371) +////GxEPD2_3C display(GxEPD2_750c_Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, GD7965 +////GxEPD2_3C display(GxEPD2_750c_Z90(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH075Z90 880x528, SSD1677 +// 4-color e-paper +//GxEPD2_4C display(GxEPD2_266c_GDEY0266F51H(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02) +//GxEPD2_4C display(GxEPD2_290c_GDEY029F51H(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//GxEPD2_4C display(GxEPD2_300c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // Waveshare 3.00" 4-color +////GxEPD2_4C display(GxEPD2_420c_GDEY0420F51(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0420F51 400x300, HX8717 (no inking) +////GxEPD2_4C display(GxEPD2_437c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // Waveshare 4.37" 4-color +// 7-color e-paper +////#define MAX_HEIGHT_7C(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) // 2 pixel per byte +////GxEPD2_7C display(GxEPD2_565c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // Waveshare 5.65" 7-color +////GxEPD2_7C display(GxEPD2_730c_GDEY073D46(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +#undef MAX_DISPLAY_BUFFER_SIZE +#undef MAX_HEIGHT +#undef MAX_HEIGHT_3C +#undef MAX_HEIGHT_7C #endif -#if !defined(__AVR) && !defined(_BOARD_GENERIC_STM32F103C_H_) +#if !defined(__AVR) && !defined(STM32F1xx) // comment out unused bitmaps to reduce code space used #include "bitmaps/Bitmaps200x200.h" // 1.54" b/w @@ -306,6 +379,8 @@ #endif +// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino + void setup() { Serial.begin(115200); @@ -314,6 +389,15 @@ void setup() delay(100); //display.init(115200); // default 10ms reset pulse, e.g. for bare panels with DESPI-C02 display.init(115200, true, 2, false); // USE THIS for Waveshare boards with "clever" reset circuit, 2ms reset pulse + if (display.pages() > 1) + { + delay(100); + Serial.print("pages = "); Serial.print(display.pages()); Serial.print(" page height = "); Serial.println(display.pageHeight()); + delay(1000); + showPages(); + display.hibernate(); + return; + } // first update should be full refresh helloWorld(); delay(1000); @@ -347,6 +431,28 @@ void loop() { } +void showPages() +{ + display.setRotation(0); + display.setFont(&FreeMonoBold9pt7b); + display.setTextColor(GxEPD_BLACK); + display.clearScreen(0); // black + display.setFullWindow(); + display.fillScreen(GxEPD_WHITE); + display.setCursor(0, 10); + if (display.width() >= 300) + { + display.print("would need "); display.print(display.pages()); display.println(" pages of height "); display.print(display.pageHeight()); + } + else + { + display.println("would need"); + display.print(display.pages()); display.println(" pages of"); + display.print("height "); display.print(display.pageHeight()); + } + display.display(false); // full update +} + // note for partial update window and setPartialWindow() method: // partial update window size and position is on byte boundary in physical x direction // the size is increased in setPartialWindow() if x or w are not multiple of 8 for even rotation, y or h for odd rotation diff --git a/examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h b/examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h +++ b/examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_NotPagedExample/GxEPD2_wiring_examples.h b/examples/GxEPD2_NotPagedExample/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_NotPagedExample/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_NotPagedExample/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_PagedDisplayUsingCallback.ino b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_PagedDisplayUsingCallback.ino index 67bcdc7f..97de20a9 100644 --- a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_PagedDisplayUsingCallback.ino +++ b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_PagedDisplayUsingCallback.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -84,6 +86,8 @@ #endif +// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino + void setup() { Serial.begin(115200); @@ -121,106 +125,163 @@ void loop() { } -void helloWorldCallback(const void*) +const char HelloWorld[] = "Hello World!"; +const char HelloArduino[] = "Hello Arduino!"; +const char HelloEpaper[] = "Hello E-Paper!"; + +struct coordinates { - uint16_t x = (display.width() - 160) / 2; - uint16_t y = display.height() / 2; - display.fillScreen(GxEPD_WHITE); - display.setCursor(x, y); - display.println("Hello World!"); + uint16_t x; + uint16_t y; +}; + +void helloWorldCallback(const void* p) +{ + const coordinates& where(*reinterpret_cast(p)); + display.setCursor(where.x, where.y); + display.print(HelloWorld); } void helloWorld() { //Serial.println("helloWorld"); + coordinates cursor; display.setRotation(1); display.setFont(&FreeMonoBold9pt7b); + if (display.epd2.WIDTH < 104) display.setFont(0); display.setTextColor(GxEPD_BLACK); + int16_t tbx, tby; uint16_t tbw, tbh; + display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh); + // center bounding box by transposition of origin: + cursor.x = ((display.width() - tbw) / 2) - tbx; + cursor.y = ((display.height() - tbh) / 2) - tby; display.setFullWindow(); - display.drawPaged(helloWorldCallback, 0); + display.drawPaged(helloWorldCallback, &cursor); //Serial.println("helloWorld done"); } -void helloFullScreenPartialModeCallback(const void*) +struct text_at { - uint16_t x = (display.width() - 160) / 2; - uint16_t y = display.height() / 2; + const char* text; + coordinates where; +}; + +void helloFullScreenPartialModeCallback(const void* p) +{ + const text_at* what(reinterpret_cast(p)); display.fillScreen(GxEPD_WHITE); - display.setCursor(x, y); - display.println("Hello World!"); - y = display.height() / 4; - display.setCursor(x, y); - display.println("full screen"); - y = display.height() * 3 / 4; - if (display.width() <= 200) x = 0; - display.setCursor(x, y); - if (display.epd2.hasFastPartialUpdate) - { - display.println("fast partial mode"); - } - else if (display.epd2.hasPartialUpdate) - { - display.println("slow partial mode"); - } - else - { - display.println("no partial mode"); - } + display.setCursor(what[0].where.x, what[0].where.y); + display.print(what[0].text); + display.setCursor(what[1].where.x, what[1].where.y); + display.print(what[1].text); + display.setCursor(what[2].where.x, what[2].where.y); + display.print(what[2].text); } void helloFullScreenPartialMode() { //Serial.println("helloFullScreenPartialMode"); + const char fullscreen[] = "full screen update"; + const char fpm[] = "fast partial mode"; + const char spm[] = "slow partial mode"; + const char npm[] = "no partial mode"; + text_at what[3]; display.setPartialWindow(0, 0, display.width(), display.height()); display.setRotation(1); display.setFont(&FreeMonoBold9pt7b); + if (display.epd2.WIDTH < 104) display.setFont(0); display.setTextColor(GxEPD_BLACK); - display.drawPaged(helloFullScreenPartialModeCallback, 0); + const char* updatemode; + if (display.epd2.hasFastPartialUpdate) + { + updatemode = fpm; + } + else if (display.epd2.hasPartialUpdate) + { + updatemode = spm; + } + else + { + updatemode = npm; + } + int16_t tbx, tby; uint16_t tbw, tbh; + // center update text + display.getTextBounds(fullscreen, 0, 0, &tbx, &tby, &tbw, &tbh); + what[0].text = fullscreen; + what[0].where.x = ((display.width() - tbw) / 2) - tbx; + what[0].where.y = ((display.height() / 4) - tbh / 2) - tby; + // center update mode + display.getTextBounds(updatemode, 0, 0, &tbx, &tby, &tbw, &tbh); + what[1].text = updatemode; + what[1].where.x = ((display.width() - tbw) / 2) - tbx; + what[1].where.y = ((display.height() * 3 / 4) - tbh / 2) - tby; + // center HelloWorld + display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh); + what[2].text = HelloWorld; + what[2].where.x = ((display.width() - tbw) / 2) - tbx; + what[2].where.y = ((display.height() - tbh) / 2) - tby; + display.drawPaged(helloFullScreenPartialModeCallback, &what); //Serial.println("helloFullScreenPartialMode done"); } -void helloArduinoCallback(const void*) +void helloArduinoCallback(const void* p) { - uint16_t x = (display.width() - 160) / 2; - uint16_t y = display.height() / 4; - display.fillScreen(GxEPD_WHITE); - display.setCursor(x, y); - display.println("Hello Arduino!"); + const coordinates& where(*reinterpret_cast(p)); + display.setCursor(where.x, where.y); + display.print(HelloArduino); } void helloArduino() { //Serial.println("helloArduino"); - //uint16_t x = (display.width() - 160) / 2; - uint16_t y = display.height() / 4; + coordinates cursor; display.setRotation(1); display.setFont(&FreeMonoBold9pt7b); + if (display.epd2.WIDTH < 104) display.setFont(0); display.setTextColor(display.epd2.hasColor ? GxEPD_RED : GxEPD_BLACK); - display.setPartialWindow(0, y - 14, display.width(), 20); - display.drawPaged(helloArduinoCallback, 0); + int16_t tbx, tby; uint16_t tbw, tbh; + // align with centered HelloWorld + display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh); + cursor.x = ((display.width() - tbw) / 2) - tbx; + // height might be different + display.getTextBounds(HelloArduino, 0, 0, &tbx, &tby, &tbw, &tbh); + cursor.y = ((display.height() / 4) - tbh / 2) - tby; // y is base line! + // make the window big enough to cover (overwrite) descenders of previous text + uint16_t wh = FreeMonoBold9pt7b.yAdvance; + uint16_t wy = (display.height() / 4) - wh / 2; + display.setPartialWindow(0, wy, display.width(), wh); + display.drawPaged(helloArduinoCallback, &cursor); delay(1000); //Serial.println("helloArduino done"); } -void helloEpaperCallback(const void*) +void helloEpaperCallback(const void* p) { - uint16_t x = (display.width() - 160) / 2; - uint16_t y = display.height() * 3 / 4; - display.fillScreen(GxEPD_WHITE); - display.setCursor(x, y); - display.println("Hello E-Paper!"); + const coordinates& where(*reinterpret_cast(p)); + display.setCursor(where.x, where.y); + display.print(HelloEpaper); } void helloEpaper() { //Serial.println("helloEpaper"); - //uint16_t x = (display.width() - 160) / 2; - uint16_t y = display.height() * 3 / 4; + coordinates cursor; display.setRotation(1); display.setFont(&FreeMonoBold9pt7b); + if (display.epd2.WIDTH < 104) display.setFont(0); display.setTextColor(display.epd2.hasColor ? GxEPD_RED : GxEPD_BLACK); - display.setPartialWindow(0, y - 14, display.width(), 20); - display.drawPaged(helloEpaperCallback, 0); + int16_t tbx, tby; uint16_t tbw, tbh; + // align with centered HelloWorld + display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh); + cursor.x = ((display.width() - tbw) / 2) - tbx; + // height might be different + display.getTextBounds(HelloEpaper, 0, 0, &tbx, &tby, &tbw, &tbh); + cursor.y = ((display.height() * 3 / 4) - tbh / 2) - tby; // y is base line! + // make the window big enough to cover (overwrite) descenders of previous text + uint16_t wh = FreeMonoBold9pt7b.yAdvance; + uint16_t wy = (display.height() * 3 / 4) - wh / 2; + display.setPartialWindow(0, wy, display.width(), wh); + display.drawPaged(helloEpaperCallback, &cursor); //Serial.println("helloEpaper done"); } diff --git a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h +++ b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_wiring_examples.h b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_RotaryUsingBusyCallback.ino b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_RotaryUsingBusyCallback.ino index 94cefd97..931e4e9a 100644 --- a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_RotaryUsingBusyCallback.ino +++ b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_RotaryUsingBusyCallback.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -15,9 +15,11 @@ // busyCallback can be used to overcome this restriction caused by busy wait. // note: this feature is only available if the BUSY line is used, not if the default delay is used instead. -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -55,6 +57,8 @@ void busyCallback(const void* p) encoder.service(); } +// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino + void setup() { Serial.begin(115200); diff --git a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_selection_check.h b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_selection_check.h +++ b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_wiring_examples.h b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_SD_AVR_Example/GxEPD2_SD_AVR_Example.ino b/examples/GxEPD2_SD_AVR_Example/GxEPD2_SD_AVR_Example.ino index 3c1a5308..1a92e3a3 100644 --- a/examples/GxEPD2_SD_AVR_Example/GxEPD2_SD_AVR_Example.ino +++ b/examples/GxEPD2_SD_AVR_Example/GxEPD2_SD_AVR_Example.ino @@ -1,7 +1,7 @@ // GxEPD2_SD_AVR_Example : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // BMP handling code extracts taken from: https://github.com/prenticedavid/MCUFRIEND_kbv/tree/master/examples/showBMP_kbv_Uno // @@ -10,10 +10,14 @@ // Version: see library.properties // // Library: https://github.com/ZinggJM/GxEPD2 +// +// note that BMP bitmaps are drawn at physical position in physical orientation of the screen -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -28,9 +32,12 @@ // Note: if you use this with ENABLE_GxEPD2_GFX 1: // uncomment it in GxEPD2_GFX.h too, or add #include before any #include +// includes needed to include driver classes #include #include -#include +#include +#include +//#include #if defined(ESP32) @@ -50,47 +57,82 @@ SdFat SD; #endif // select the display driver class (only one) for your panel -//#define GxEPD2_DRIVER_CLASS GxEPD2_154 // GDEP015OC1 200x200, no longer available -//#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200 -//#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8 // GDEW0154T8 152x152 -//#define GxEPD2_DRIVER_CLASS GxEPD2_154_M09 // GDEW0154M09 200x200 -//#define GxEPD2_DRIVER_CLASS GxEPD2_154_M10 // GDEW0154M10 152x152 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213 // GDE0213B1 128x250, phased out -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 128x250 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 128x250 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_flex // GDEW0213I5F 104x212 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_M21 // GDEW0213M21 104x212 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_T5D // GDEW0213T5D 104x212 -//#define GxEPD2_DRIVER_CLASS GxEPD2_290 // GDEH029A1 128x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5 // GDEW029T5 128x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5D // GDEW029T5D 128x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T94 // GDEM029T94 128x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_260 // GDEW026T0 152x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_270 // GDEW027W3 176x264 -//#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416 -//#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300 -//#define GxEPD2_DRIVER_CLASS GxEPD2_420_M01 // GDEW042M01 400x300 -//#define GxEPD2_DRIVER_CLASS GxEPD2_583 // GDEW0583T7 600x448 -//#define GxEPD2_DRIVER_CLASS GxEPD2_583_T8 // GDEW0583T8 648x480 -//#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384 -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480 -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, GD7965 +//#define GxEPD2_DRIVER_CLASS GxEPD2_102 // GDEW0102T4 80x128, UC8175, (WFT0102CZA2) +//#define GxEPD2_DRIVER_CLASS GxEPD2_150_BN // DEPG0150BN 200x200, SSD1681, (FPC8101), TTGO T5 V2.4.1 . +//#define GxEPD2_DRIVER_CLASS GxEPD2_154 // GDEP015OC1 200x200, IL3829, (WFC0000CZ07), no longer available. +//#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681, (HINK-E154A07-A1). +//#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8 // GDEW0154T8 152x152, UC8151 (IL0373), (WFT0154CZ17). +//#define GxEPD2_DRIVER_CLASS GxEPD2_154_M09 // GDEW0154M09 200x200, JD79653A, (WFT0154CZB3). +//#define GxEPD2_DRIVER_CLASS GxEPD2_154_M10 // GDEW0154M10 152x152, UC8151D, (WFT0154CZ17). +//#define GxEPD2_DRIVER_CLASS GxEPD2_154_GDEY0154D67 // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21). +//#define GxEPD2_DRIVER_CLASS GxEPD2_213 // GDE0213B1 122x250, IL3895, (HINK-E0213-G01), phased out +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 122x250, SSD1675A (IL3897), (HINK-E0213A22-A0 SLH1852). +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 122x250, SSD1675B, (HINK-E0213A22-A0 SLH1914). +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B74 // GDEM0213B74 122x250, SSD1680, FPC-7528B). +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_flex // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16). +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_M21 // GDEW0213M21 104x212, UC8151 (IL0373), (WFT0213CZ16). +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_T5D // GDEW0213T5D 104x212, UC8151D, (WFT0213CZ16). +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_BN // DEPG0213BN 122x250, SSD1680, (FPC-7528B), TTGO T5 V2.4.1, V2.3.1 . +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08). +//#define GxEPD2_DRIVER_CLASS GxEPD2_260 // GDEW026T0 152x296, UC8151 (IL0373), (WFT0154CZ17). +//#define GxEPD2_DRIVER_CLASS GxEPD2_260_M01 // GDEW026M01 152x296, UC8151 (IL0373), (WFT0260CZB2). +//#define GxEPD2_DRIVER_CLASS GxEPD2_266_BN // DEPG0266BN 152x296, SSD1680, (FPC7510), TTGO T5 V2.66, TTGO T5 V2.4.1 . +//#define GxEPD2_DRIVER_CLASS GxEPD2_266_GDEY0266T90 // GDEY0266T90 152x296, SSD1680, (FPC-A003 HB). +//#define GxEPD2_DRIVER_CLASS GxEPD2_270 // GDEW027W3 176x264, EK79652 (IL91874), (WFI0190CZ22) ? +//#define GxEPD2_DRIVER_CLASS GxEPD2_270_GDEY027T91 // GDEY027T91 176x264, SSD1680, (FB). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290 // GDEH029A1 128x296, SSD1608 (IL3820), (E029A01-FPC-A1 SYX1553). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5 // GDEW029T5 128x296, UC8151 (IL0373), (WFT0290CZ10). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T5D // GDEW029T5D 128x296, UC8151D, (WFT0290CZ10). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_I6FD // GDEW029I6FD 128x296, UC8151D, (WFT0290CZ10). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T94 // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_T94_V2 // GDEM029T94 128x296, SSD1680, (FPC-7519 rev.b), Waveshare 2.9" V2 variant . +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10). +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15). +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) +//#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) +//#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7". +//#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15). +//#define GxEPD2_DRIVER_CLASS GxEPD2_420_M01 // GDEW042M01 400x300, UC8176 (IL0398), (WFT042CZ15). +//#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T81 // GDEY042T81 400x300, SSD1683 (no inking). +//#define GxEPD2_DRIVER_CLASS GxEPD2_426_GDEQ0426T82 // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A). +//#define GxEPD2_DRIVER_CLASS GxEPD2_583 // GDEW0583T7 600x448, UC8159c (IL0371), (missing) +//#define GxEPD2_DRIVER_CLASS GxEPD2_583_T8 // GDEW0583T8 648x480, EK79655 (GD7965), (WFT0583CZ61). +//#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B). +//#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20). +//#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden). +//#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers -//#define GxEPD2_DRIVER_CLASS GxEPD2_154c // GDEW0154Z04 200x200, no longer available -//#define GxEPD2_DRIVER_CLASS GxEPD2_154_Z90c // GDEH0154Z90 200x200 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213c // GDEW0213Z16 104x212 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_Z19c // GDEW0213Z19 104x212 -//#define GxEPD2_DRIVER_CLASS GxEPD2_290c // GDEW029Z10 128x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_290_Z13c // GDEH029Z13 128x296 -//#define GxEPD2_DRIVER_CLASS GxEPD2_270c // GDEW027C44 176x264 -//#define GxEPD2_DRIVER_CLASS GxEPD2_420c // GDEW042Z15 400x300 -//#define GxEPD2_DRIVER_CLASS GxEPD2_583c // GDEW0583Z21 600x448 -//#define GxEPD2_DRIVER_CLASS GxEPD2_750c // GDEW075Z09 600x384 -//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z08 // GDEW075Z08 800x480 -//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90 880x528 +//#define GxEPD2_DRIVER_CLASS GxEPD2_154c // GDEW0154Z04 200x200, IL0376F, (WFT0000CZ04), no longer available +//#define GxEPD2_DRIVER_CLASS GxEPD2_154_Z90c // GDEH0154Z90 200x200, SSD1681, (HINK-E154A07-A1) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213c // GDEW0213Z16 104x212, UC8151 (IL0373), (WFT0213CZ16) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_Z19c // GDEH0213Z19 104x212, UC8151D, (HINK-E0213A20-A2 2020-11-19) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_Z98c // GDEY0213Z98 122x250, SSD1680, (FPC-A002 20.04.08) +//#define GxEPD2_DRIVER_CLASS GxEPD2_266c // GDEY0266Z90 152x296, SSD1680, (FPC-7510) +//#define GxEPD2_DRIVER_CLASS GxEPD2_270c // GDEW027C44 176x264, IL91874, (WFI0190CZ22) +//#define GxEPD2_DRIVER_CLASS GxEPD2_290c // GDEW029Z10 128x296, UC8151 (IL0373), (WFT0290CZ10) +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_Z13c // GDEH029Z13 128x296, UC8151D, (HINK-E029A10-A3 20160809) +//#define GxEPD2_DRIVER_CLASS GxEPD2_290_C90c // GDEM029C90 128x296, SSD1680, (FPC-7519 rev.b) +//#define GxEPD2_DRIVER_CLASS GxEPD2_420c // GDEW042Z15 400x300, UC8176 (IL0398), (WFT0420CZ15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_420c_Z21 // GDEQ042Z21 400x300, UC8276, (hidden) +//#define GxEPD2_DRIVER_CLASS GxEPD2_583c // GDEW0583Z21 600x448, UC8159c (IL0371), (missing) +//#define GxEPD2_DRIVER_CLASS GxEPD2_583c_Z83 // GDEW0583Z83 648x480, EK79655 (GD7965), (WFT0583CZ61) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750c // GDEW075Z09 640x384, UC8159c (IL0371), (WF0583CZ09) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z08 // GDEW075Z08 800x480, EK79655 (GD7965), (WFT0583CZ61) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90 880x528, SSD1677, (HINK-E075A07-A0) +//#define GxEPD2_DRIVER_CLASS GxEPD2_1248c // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) +// 4-color e-paper +//#define GxEPD2_DRIVER_CLASS GxEPD2_266c_GDEY0266F51H // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02) +//#define GxEPD2_DRIVER_CLASS GxEPD2_290c_GDEY029F51H // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//#define GxEPD2_DRIVER_CLASS GxEPD2_300c // Waveshare 3.00" 4-color +//#define GxEPD2_DRIVER_CLASS GxEPD2_420c_GDEY0420F51 // GDEY0420F51 400x300, HX8717 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_437c // Waveshare 4.37" 4-color // 7-color e-paper -//#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color (3C graphics) +//#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color #if defined(__AVR) #define SD_CS 6 // adapt to your wiring @@ -103,6 +145,8 @@ GxEPD2_DRIVER_CLASS display(/*CS=10*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7 #include "GxEPD2_SD_AVR_boards_added.h" +// note that BMP bitmaps are drawn at physical position in physical orientation of the screen + // function declaration with default parameter void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_color = true); @@ -110,7 +154,7 @@ void setup() { Serial.begin(115200); Serial.println(); - Serial.println(F("setup")); + Serial.println(F("GxEPD2_SD_AVR_Example")); display.init(115200); @@ -126,6 +170,10 @@ void setup() drawBitmaps_other(); //drawBitmaps_test(); + + display.hibernate(); + + Serial.println(F("GxEPD2_SD_AVR_Example done")); } void loop(void) @@ -259,6 +307,7 @@ void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_colo Serial.println(height); // BMP rows are padded (if needed) to 4-byte boundary uint32_t rowSize = (width * depth / 8 + 3) & ~3; + if (depth < 8) rowSize = ((width * depth + 8 - depth) / 8 + 3) & ~3; if (height < 0) { height = -height; @@ -296,7 +345,8 @@ void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_colo color_palette_buffer[pn / 8] |= colored << pn % 8; } } - display.clearScreen(); + //display.clearScreen(); + display.writeScreenBuffer(); uint32_t rowPosition = flip ? imageOffset + (height - h) * rowSize : imageOffset; for (uint16_t row = 0; row < h; row++, rowPosition += rowSize) // for each line { @@ -320,6 +370,14 @@ void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_colo } switch (depth) { + case 32: + blue = input_buffer[in_idx++]; + green = input_buffer[in_idx++]; + red = input_buffer[in_idx++]; + in_idx++; // skip alpha + whitish = with_color ? ((red > 0x80) && (green > 0x80) && (blue > 0x80)) : ((red + green + blue) > 3 * 0x80); // whitish + colored = (red > 0xF0) || ((green > 0xF0) && (blue > 0xF0)); // reddish or yellowish? + break; case 24: blue = input_buffer[in_idx++]; green = input_buffer[in_idx++]; @@ -348,6 +406,7 @@ void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_colo } break; case 1: + case 2: case 4: case 8: { @@ -366,18 +425,14 @@ void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_colo } if (whitish) { - //out_byte |= 0x80 >> col % 8; // not black - //out_color_byte |= 0x80 >> col % 8; // not colored // keep white } else if (colored && with_color) { - //out_byte |= 0x80 >> col % 8; // not black out_color_byte &= ~(0x80 >> col % 8); // colored } else { - //out_color_byte |= 0x80 >> col % 8; // not colored out_byte &= ~(0x80 >> col % 8); // black } if ((7 == col % 8) || (col == w - 1)) // write that last byte! (for w%8!=0 border) @@ -396,7 +451,6 @@ void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_colo } } } - //Serial.print(F("end curPosition ")); Serial.println(file.curPosition()); file.close(); if (!valid) { diff --git a/examples/GxEPD2_SD_AVR_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_SD_AVR_Example/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_SD_AVR_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_SD_AVR_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_SD_Example/GxEPD2_SD_Example.ino b/examples/GxEPD2_SD_Example/GxEPD2_SD_Example.ino index 43c4cd91..817b35e0 100644 --- a/examples/GxEPD2_SD_Example/GxEPD2_SD_Example.ino +++ b/examples/GxEPD2_SD_Example/GxEPD2_SD_Example.ino @@ -1,7 +1,7 @@ // GxEPD2_SD_Example : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // BMP handling code extracts taken from: https://github.com/prenticedavid/MCUFRIEND_kbv/tree/master/examples/showBMP_kbv_Uno // @@ -13,9 +13,11 @@ // // note that BMP bitmaps are drawn at physical position in physical orientation of the screen -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -84,6 +86,31 @@ SPIClass hspi(HSPI); #endif #endif +#if defined(ARDUINO_ARCH_RP2040) && defined(ARDUINO_RASPBERRY_PI_PICO) +// Waveshare PhotoPainter +#define EPD_RST_PIN 12 +#define EPD_DC_PIN 8 +#define EPD_CS_PIN 9 +#define EPD_BUSY_PIN 13 +#define EPD_CLK_PIN 10 +#define EPD_MOSI_PIN 11 +#define SD_CS_PIN 5 +#define SD_CLK_PIN 2 +#define SD_MOSI_PIN 3 +#define SD_MISO_PIN 4 +#define EPD_CS EPD_CS_PIN +#define SD_CS SD_CS_PIN +#if defined(__MBED__) +// MbedSPI(int miso, int mosi, int sck); +arduino::MbedSPI EPD_SPI(12, EPD_MOSI_PIN, EPD_CLK_PIN); +arduino::MbedSPI SD_SPI(SD_MISO_PIN, SD_MOSI_PIN, SD_CS_PIN); +#else // package https://github.com/earlephilhower/arduino-pico +// SPIClassRP2040(spi_inst_t *spi, pin_size_t rx, pin_size_t cs, pin_size_t sck, pin_size_t tx); +SPIClassRP2040 EPD_SPI(spi1, 12, 13, 10, 11); +SPIClassRP2040 SD_SPI(spi0, SD_MISO_PIN, SD_CS_PIN, SD_CLK_PIN, SD_MOSI_PIN); +#endif +#endif + #if defined(__AVR) #define SD_CS 6 // adapt to your wiring #define EPD_CS SS // adapt to your wiring @@ -96,8 +123,9 @@ SPIClass hspi(HSPI); // don't forget to modify or override EPD_CS if needed #include "GxEPD2_display_selection_new_style.h" -// function declaration with default parameter // note that BMP bitmaps are drawn at physical position in physical orientation of the screen + +// function declaration with default parameter void drawBitmapFromSD(const char *filename, int16_t x, int16_t y, bool with_color = true); // bitmap drawing using buffered graphics, e.g. for small bitmaps or for GxEPD2_154c @@ -108,6 +136,7 @@ void drawBitmapFromSD_Buffered(const char *filename, int16_t x, int16_t y, bool void setup() { + delay(5000); Serial.begin(115200); Serial.println(); Serial.println("GxEPD2_SD_Example"); @@ -120,6 +149,12 @@ void setup() hspi.begin(SCK, MISO, MOSI, SS); // remap hspi for SD #endif +#if defined(ARDUINO_ARCH_RP2040) && defined(ARDUINO_RASPBERRY_PI_PICO) + display.epd2.selectSPI(EPD_SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0)); + // uncomment next line for Waveshare PhotoPainter module + pinMode(16, OUTPUT); digitalWrite(16, HIGH); // power to the paper +#endif + //display.init(115200); // default 10ms reset pulse, e.g. for bare panels with DESPI-C02 display.init(115200, true, 2, false); // USE THIS for Waveshare boards with "clever" reset circuit, 2ms reset pulse @@ -130,6 +165,12 @@ void setup() Serial.println("SD failed!"); return; } +#elif defined(ARDUINO_ARCH_RP2040) && defined(ARDUINO_RASPBERRY_PI_PICO) + if (!SD.begin(SD_CS, SD_SPI)) + { + Serial.println("SD failed!"); + return; + } #else if (!SD.begin(SD_CS)) { @@ -141,11 +182,12 @@ void setup() listFiles(); - if ((display.epd2.panel == GxEPD2::GDEW0154Z04) || (display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46) || false) + if ((display.epd2.panel == GxEPD2::GDEW0154Z04) || (display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46) || (display.epd2.panel == GxEPD2::ACeP730) || false) { //drawBitmapsBuffered_200x200(); //drawBitmapsBuffered_other(); drawBitmapsBuffered_test(); + //drawBitmapsBuffered_7c(); } else { @@ -342,18 +384,44 @@ void drawBitmapsBuffered_test() { int16_t w2 = display.width() / 2; int16_t h2 = display.height() / 2; - drawBitmapFromSD_Buffered("betty_4.bmp", w2 - 102, h2 - 126); - delay(2000); - drawBitmapFromSD_Buffered("bb4.bmp", 0, 0, false, true, true); + //drawBitmapFromSD_Buffered("betty_4.bmp", w2 - 102, h2 - 126); + //delay(2000); + drawBitmapFromSD_Buffered("bb4.bmp", w2 - 17, h2 - 9, false, true, true); delay(2000); - drawBitmapFromSD_Buffered("rgb32.bmp", 0, 0); + drawBitmapFromSD_Buffered("rgb32.bmp", w2 - 64, h2 - 32); delay(2000); - drawBitmapFromSD_Buffered("parrot.bmp", 0, 0); + drawBitmapFromSD_Buffered("parrot.bmp", w2- 64, h2 - 80); delay(2000); - drawBitmapFromSD_Buffered("5in65f3.bmp", 0, 0); + drawBitmapFromSD_Buffered("5in65f3.bmp", w2 - 300, h2 - 224); delay(2000); } +void drawBitmapsBuffered_7c() +{ + drawBitmapFromSD_Buffered("pic/building-7362300_1920_scale_output.bmp", 0, 0); + delay(3000); + drawBitmapFromSD_Buffered("pic/girl-3480900_1920_scale_output.bmp", 0, 0); + delay(3000); + drawBitmapFromSD_Buffered("pic/miniature-3589682_1920_scale_output.bmp", 0, 0); + delay(3000); + display.setRotation(1); + drawBitmapFromSD_Buffered("pic/pexels-boys-in-bristol-photography-13318095_scale_output.bmp", 0, 0); + delay(3000); + drawBitmapFromSD_Buffered("pic/pexels-efe-ersoy-15686039_scale_output.bmp", 0, 0); + delay(3000); + drawBitmapFromSD_Buffered("pic/pexels-jill-burrow-6069730_scale_output.bmp", 0, 0); + delay(3000); + drawBitmapFromSD_Buffered("pic/pexels-yelena-odintsova-15792199_scale_output.bmp", 0, 0); + delay(3000); + drawBitmapFromSD_Buffered("pic/pexels-ольга-солодилова-15912787_scale_output.bmp", 0, 0); + delay(3000); + display.setRotation(0); + drawBitmapFromSD_Buffered("pic/venice-2896591_1920_scale_output", 0, 0); + delay(3000); + drawBitmapFromSD_Buffered("pic/venice-2937352_1920_scale_output.bmp", 0, 0); + delay(3000); +} + //static const uint16_t input_buffer_pixels = 20; // may affect performance static const uint16_t input_buffer_pixels = 800; // may affect performance diff --git a/examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_SD_Example/GxEPD2_selection_check.h b/examples/GxEPD2_SD_Example/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_SD_Example/GxEPD2_selection_check.h +++ b/examples/GxEPD2_SD_Example/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_SD_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_SD_Example/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_SD_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_SD_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_SD_WriteBitmap/GxEPD2_SD_WriteBitmap.ino b/examples/GxEPD2_SD_WriteBitmap/GxEPD2_SD_WriteBitmap.ino index b6d703ea..b2b981bb 100644 --- a/examples/GxEPD2_SD_WriteBitmap/GxEPD2_SD_WriteBitmap.ino +++ b/examples/GxEPD2_SD_WriteBitmap/GxEPD2_SD_WriteBitmap.ino @@ -1,6 +1,6 @@ // GxEPD2_SD_WriteBitmap: utility for Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/examples/GxEPD2_SerialFlash_Example/GxEPD2_SerialFlash_Example.ino b/examples/GxEPD2_SerialFlash_Example/GxEPD2_SerialFlash_Example.ino index 06e9e61e..52cd281c 100644 --- a/examples/GxEPD2_SerialFlash_Example/GxEPD2_SerialFlash_Example.ino +++ b/examples/GxEPD2_SerialFlash_Example/GxEPD2_SerialFlash_Example.ino @@ -1,7 +1,7 @@ // GxEPD2_SerialFlash_Example : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // BMP handling code extracts taken from: https://github.com/prenticedavid/MCUFRIEND_kbv/tree/master/examples/showBMP_kbv_Uno // @@ -17,9 +17,11 @@ // // note that BMP bitmaps are drawn at physical position in physical orientation of the screen -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -46,6 +48,7 @@ #include #include +#include #include #include diff --git a/examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h b/examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h +++ b/examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_SerialFlash_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_SerialFlash_Example/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_SerialFlash_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_SerialFlash_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_SerialFlash_Loader/GxEPD2_SerialFlash_Loader.ino b/examples/GxEPD2_SerialFlash_Loader/GxEPD2_SerialFlash_Loader.ino index 84e8d5ab..31bf24c8 100644 --- a/examples/GxEPD2_SerialFlash_Loader/GxEPD2_SerialFlash_Loader.ino +++ b/examples/GxEPD2_SerialFlash_Loader/GxEPD2_SerialFlash_Loader.ino @@ -1,6 +1,6 @@ // GxEPD2_SerialFlash_Loader : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // -// Display Library based on Demo Example from Good Display: http://www.good-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -14,9 +14,11 @@ // // this example can run on ESP6266 or ESP32 using WiFi connection -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino : https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #include diff --git a/examples/GxEPD2_Spiffs_Example/GxEPD2_Spiffs_Example.ino b/examples/GxEPD2_Spiffs_Example/GxEPD2_Spiffs_Example.ino index edf54338..cb53aff1 100644 --- a/examples/GxEPD2_Spiffs_Example/GxEPD2_Spiffs_Example.ino +++ b/examples/GxEPD2_Spiffs_Example/GxEPD2_Spiffs_Example.ino @@ -1,7 +1,7 @@ // GxEPD2_Spiffs_Example : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // BMP handling code extracts taken from: https://github.com/prenticedavid/MCUFRIEND_kbv/tree/master/examples/showBMP_kbv_Uno // @@ -13,9 +13,11 @@ // // note that BMP bitmaps are drawn at physical position in physical orientation of the screen -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -30,6 +32,7 @@ #include #include +#include #include #include diff --git a/examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h b/examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h +++ b/examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_Spiffs_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_Spiffs_Example/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_Spiffs_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_Spiffs_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_Spiffs_Loader/GxEPD2_Spiffs_Loader.ino b/examples/GxEPD2_Spiffs_Loader/GxEPD2_Spiffs_Loader.ino index 3a9a2c3d..c4c6020c 100644 --- a/examples/GxEPD2_Spiffs_Loader/GxEPD2_Spiffs_Loader.ino +++ b/examples/GxEPD2_Spiffs_Loader/GxEPD2_Spiffs_Loader.ino @@ -1,7 +1,7 @@ // GxEPD2_Spiffs_Loader : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino : https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #if defined(ESP32) #include "SPIFFS.h" diff --git a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_U8G2_Fonts_Example.ino b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_U8G2_Fonts_Example.ino index 6c9a79ae..5a64a842 100644 --- a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_U8G2_Fonts_Example.ino +++ b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_U8G2_Fonts_Example.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -17,9 +17,11 @@ // NOTE: you need to SAVE the modified example to a saveable location for UTF-8 characters to work // e.g. for Umlauts -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -29,6 +31,7 @@ #include #include +#include #include #include #include @@ -38,6 +41,8 @@ U8G2_FOR_ADAFRUIT_GFX u8g2Fonts; +// for handling alternative SPI pins (ESP32, RP2040) see example GxEPD2_Example.ino + void setup() { Serial.begin(115200); diff --git a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h +++ b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_WS_ESP32_Driver/GxEPD2_WS_ESP32_Driver.ino b/examples/GxEPD2_WS_ESP32_Driver/GxEPD2_WS_ESP32_Driver.ino index 9103ed4c..fd70dde0 100644 --- a/examples/GxEPD2_WS_ESP32_Driver/GxEPD2_WS_ESP32_Driver.ino +++ b/examples/GxEPD2_WS_ESP32_Driver/GxEPD2_WS_ESP32_Driver.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -12,9 +12,11 @@ // GxEPD2_WS_ESP32_Driver : GxEPD2_Example variant for Universal e-Paper Raw Panel Driver Board, ESP32 WiFi / Bluetooth Wireless // https://www.waveshare.com/product/e-paper-esp32-driver-board.htm -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // mapping of Waveshare ESP32 Driver Board // BUSY -> 25, RST -> 26, DC -> 27, CS-> 15, CLK -> 13, DIN -> 14 @@ -42,11 +44,14 @@ #include #include +#include +#include #include // select the display class (only one), matching the kind of display panel #define GxEPD2_DISPLAY_CLASS GxEPD2_BW //#define GxEPD2_DISPLAY_CLASS GxEPD2_3C +//#define GxEPD2_DISPLAY_CLASS GxEPD2_4C //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C // select the display driver class (only one) for your panel @@ -58,15 +63,15 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_154_M09 // GDEW0154M09 200x200, JD79653A, (WFT0154CZB3) //#define GxEPD2_DRIVER_CLASS GxEPD2_154_M10 // GDEW0154M10 152x152, UC8151D, (WFT0154CZ17) //#define GxEPD2_DRIVER_CLASS GxEPD2_154_GDEY0154D67 // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213 // GDE0213B1 128x250, IL3895, (HINK-E0213-G01), phased out -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 128x250, SSD1675A (IL3897), (HINK-E0213A22-A0 SLH1852) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 128x250, SSD1675B, (HINK-E0213A22-A0 SLH1914) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B74 // GDEM0213B74 128x250, SSD1680, FPC-7528B) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213 // GDE0213B1 122x250, IL3895, (HINK-E0213-G01), phased out +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 122x250, SSD1675A (IL3897), (HINK-E0213A22-A0 SLH1852) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 122x250, SSD1675B, (HINK-E0213A22-A0 SLH1914) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B74 // GDEM0213B74 122x250, SSD1680, FPC-7528B) //#define GxEPD2_DRIVER_CLASS GxEPD2_213_flex // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) //#define GxEPD2_DRIVER_CLASS GxEPD2_213_M21 // GDEW0213M21 104x212, UC8151 (IL0373), (WFT0213CZ16) //#define GxEPD2_DRIVER_CLASS GxEPD2_213_T5D // GDEW0213T5D 104x212, UC8151D, (WFT0213CZ16) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_BN // DEPG0213BN 128x250, SSD1680, (FPC-7528B), TTGO T5 V2.4.1, V2.3.1 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 128x250, SSD1680, (FPC-A002 20.04.08) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_BN // DEPG0213BN 122x250, SSD1680, (FPC-7528B), TTGO T5 V2.4.1, V2.3.1 +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) //#define GxEPD2_DRIVER_CLASS GxEPD2_260 // GDEW026T0 152x296, UC8151 (IL0373), (WFT0154CZ17) //#define GxEPD2_DRIVER_CLASS GxEPD2_260_M01 // GDEW026M01 152x296, UC8151 (IL0373), (WFT0260CZB2) //#define GxEPD2_DRIVER_CLASS GxEPD2_266_BN // DEPG0266BN 152x296, SSD1680, (FPC7510), TTGO T5 V2.66, TTGO T5 V2.4.1 @@ -82,17 +87,19 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) //#define GxEPD2_DRIVER_CLASS GxEPD2_420_M01 // GDEW042M01 400x300, UC8176 (IL0398), (WFT042CZ15) -//#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T91 // GDEY042T91 400x300, SSD1683 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T81 // GDEY042T81 400x300, SSD1683 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_426_GDEQ0426T82 // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) //#define GxEPD2_DRIVER_CLASS GxEPD2_583 // GDEW0583T7 600x448, UC8159c (IL0371), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_583_T8 // GDEW0583T8 648x480, EK79655 (GD7965), (WFT0583CZ61) //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -114,9 +121,16 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z08 // GDEW075Z08 800x480, EK79655 (GD7965), (WFT0583CZ61) //#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90 880x528, SSD1677, (HINK-E075A07-A0) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) +// 4-color e-paper +//#define GxEPD2_DRIVER_CLASS GxEPD2_266c_GDEY0266F51H // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02) +//#define GxEPD2_DRIVER_CLASS GxEPD2_290c_GDEY029F51H // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//#define GxEPD2_DRIVER_CLASS GxEPD2_300c // Waveshare 3.00" 4-color +//#define GxEPD2_DRIVER_CLASS GxEPD2_420c_GDEY0420F51 // GDEY0420F51 400x300, HX8717 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_437c // Waveshare 4.37" 4-color // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // somehow there should be an easier way to do this #define GxEPD2_BW_IS_GxEPD2_BW true diff --git a/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_WiFi_CertStore_Example.ino b/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_WiFi_CertStore_Example.ino index 35810a82..4c1d8874 100644 --- a/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_WiFi_CertStore_Example.ino +++ b/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_WiFi_CertStore_Example.ino @@ -1,7 +1,7 @@ // GxEPD2_WiFi_CertStore_Example : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // BMP handling code extracts taken from: https://github.com/prenticedavid/MCUFRIEND_kbv/tree/master/examples/showBMP_kbv_Uno // @@ -18,9 +18,11 @@ // // note that BMP bitmaps are drawn at physical position in physical orientation of the screen -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -35,6 +37,7 @@ #include #include +#include #include // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -77,17 +80,19 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) //#define GxEPD2_DRIVER_CLASS GxEPD2_420_M01 // GDEW042M01 400x300, UC8176 (IL0398), (WFT042CZ15) -//#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T91 // GDEY042T91 400x300, SSD1683 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T81 // GDEY042T81 400x300, SSD1683 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_426_GDEQ0426T82 // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) //#define GxEPD2_DRIVER_CLASS GxEPD2_583 // GDEW0583T7 600x448, UC8159c (IL0371), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_583_T8 // GDEW0583T8 648x480, EK79655 (GD7965), (WFT0583CZ61) //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -109,9 +114,16 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z08 // GDEW075Z08 800x480, EK79655 (GD7965), (WFT0583CZ61) //#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90 880x528, SSD1677, (HINK-E075A07-A0) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) +// 4-color e-paper +//#define GxEPD2_DRIVER_CLASS GxEPD2_266c_GDEY0266F51H // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02) +//#define GxEPD2_DRIVER_CLASS GxEPD2_290c_GDEY029F51H // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//#define GxEPD2_DRIVER_CLASS GxEPD2_300c // Waveshare 3.00" 4-color +//#define GxEPD2_DRIVER_CLASS GxEPD2_420c_GDEY0420F51 // GDEY0420F51 400x300, HX8717 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_437c // Waveshare 4.37" 4-color // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 diff --git a/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_wiring_examples.h index 97ab8963..ef5dc8e5 100644 --- a/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_WiFi_CertStore_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,14 +9,22 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V // NOTE: connect 3.3k pull-down from D8 to GND if your board or shield has level converters -// NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, use different pin in case, or 4k7 pull-down +// NOTE for ESP8266: using SS (GPIO15) for CS may cause boot mode problems, use different pin in case, or 3.3k pull-down // 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 // mapping suggestion from Waveshare SPI e-Paper to generic ESP8266 @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -76,8 +88,18 @@ // note: can't use SS on MKR1000: is defined as 24, should be 4 // BUSY -> 5, RST -> 6, DC -> 7, CS-> 4, CLK -> 9, DIN -> 8 -// mapping suggestion for Arduino Nano RP2040 Connect +// mapping suggestion for Arduino Nano RP2040 Connect (Arduino MBED OS Nano Boards) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 13, DIN -> 11 -// mapping suggestion for Raspberry Pi Pico RP2040 +// mapping suggestion for Raspberry Pi Pico RP2040 (Arduino MBED OS RP2040 Boards) +// BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 18, DIN -> 19 + +// mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2_WiFi_CertStore_Loader/GxEPD2_WiFi_CertStore_Loader.ino b/examples/GxEPD2_WiFi_CertStore_Loader/GxEPD2_WiFi_CertStore_Loader.ino index eb8ed2f0..968b274d 100644 --- a/examples/GxEPD2_WiFi_CertStore_Loader/GxEPD2_WiFi_CertStore_Loader.ino +++ b/examples/GxEPD2_WiFi_CertStore_Loader/GxEPD2_WiFi_CertStore_Loader.ino @@ -1,7 +1,7 @@ // GxEPD2_WiFi_CertStore_Loader : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino : https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // // This example is used to download the https certificate archive to LittleFS for ESP8266 WiFiClientSecure cert store // diff --git a/examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_Example.ino b/examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_Example.ino index 9966b427..dcad95be 100644 --- a/examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_Example.ino +++ b/examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_Example.ino @@ -1,7 +1,7 @@ // GxEPD2_WiFi_Example : Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // BMP handling code extracts taken from: https://github.com/prenticedavid/MCUFRIEND_kbv/tree/master/examples/showBMP_kbv_Uno // @@ -13,9 +13,11 @@ // // note that BMP bitmaps are drawn at physical position in physical orientation of the screen -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // see GxEPD2_wiring_examples.h for wiring suggestions and examples @@ -37,6 +39,7 @@ // select the display class (only one), matching the kind of display panel #define GxEPD2_DISPLAY_CLASS GxEPD2_BW //#define GxEPD2_DISPLAY_CLASS GxEPD2_3C +//#define GxEPD2_DISPLAY_CLASS GxEPD2_4C //#define GxEPD2_DISPLAY_CLASS GxEPD2_7C // select the display driver class (only one) for your panel @@ -48,15 +51,15 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_154_M09 // GDEW0154M09 200x200, JD79653A, (WFT0154CZB3) //#define GxEPD2_DRIVER_CLASS GxEPD2_154_M10 // GDEW0154M10 152x152, UC8151D, (WFT0154CZ17) //#define GxEPD2_DRIVER_CLASS GxEPD2_154_GDEY0154D67 // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213 // GDE0213B1 128x250, IL3895, (HINK-E0213-G01), phased out -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 128x250, SSD1675A (IL3897), (HINK-E0213A22-A0 SLH1852) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 128x250, SSD1675B, (HINK-E0213A22-A0 SLH1914) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B74 // GDEM0213B74 128x250, SSD1680, FPC-7528B) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213 // GDE0213B1 122x250, IL3895, (HINK-E0213-G01), phased out +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 122x250, SSD1675A (IL3897), (HINK-E0213A22-A0 SLH1852) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 122x250, SSD1675B, (HINK-E0213A22-A0 SLH1914) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B74 // GDEM0213B74 122x250, SSD1680, FPC-7528B) //#define GxEPD2_DRIVER_CLASS GxEPD2_213_flex // GDEW0213I5F 104x212, UC8151 (IL0373), (WFT0213CZ16) //#define GxEPD2_DRIVER_CLASS GxEPD2_213_M21 // GDEW0213M21 104x212, UC8151 (IL0373), (WFT0213CZ16) //#define GxEPD2_DRIVER_CLASS GxEPD2_213_T5D // GDEW0213T5D 104x212, UC8151D, (WFT0213CZ16) -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_BN // DEPG0213BN 128x250, SSD1680, (FPC-7528B), TTGO T5 V2.4.1, V2.3.1 -//#define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 128x250, SSD1680, (FPC-A002 20.04.08) +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_BN // DEPG0213BN 122x250, SSD1680, (FPC-7528B), TTGO T5 V2.4.1, V2.3.1 +//#define GxEPD2_DRIVER_CLASS GxEPD2_213_GDEY0213B74 // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08) //#define GxEPD2_DRIVER_CLASS GxEPD2_260 // GDEW026T0 152x296, UC8151 (IL0373), (WFT0154CZ17) //#define GxEPD2_DRIVER_CLASS GxEPD2_260_M01 // GDEW026M01 152x296, UC8151 (IL0373), (WFT0260CZB2) //#define GxEPD2_DRIVER_CLASS GxEPD2_266_BN // DEPG0266BN 152x296, SSD1680, (FPC7510), TTGO T5 V2.66, TTGO T5 V2.4.1 @@ -72,11 +75,13 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) //#define GxEPD2_DRIVER_CLASS GxEPD2_420_M01 // GDEW042M01 400x300, UC8176 (IL0398), (WFT042CZ15) -//#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T91 // GDEY042T91 400x300, SSD1683 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_420_GDEY042T81 // GDEY042T81 400x300, SSD1683 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_426_GDEQ0426T82 // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A) //#define GxEPD2_DRIVER_CLASS GxEPD2_583 // GDEW0583T7 600x448, UC8159c (IL0371), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_583_T8 // GDEW0583T8 648x480, EK79655 (GD7965), (WFT0583CZ61) //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) @@ -104,6 +109,12 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z08 // GDEW075Z08 800x480, EK79655 (GD7965), (WFT0583CZ61) //#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90 880x528, SSD1677, (HINK-E075A07-A0) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) +// 4-color e-paper +//#define GxEPD2_DRIVER_CLASS GxEPD2_266c_GDEY0266F51H // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02) +//#define GxEPD2_DRIVER_CLASS GxEPD2_290c_GDEY029F51H // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24) +//#define GxEPD2_DRIVER_CLASS GxEPD2_300c // Waveshare 3.00" 4-color +//#define GxEPD2_DRIVER_CLASS GxEPD2_420c_GDEY0420F51 // GDEY0420F51 400x300, HX8717 (no inking) +//#define GxEPD2_DRIVER_CLASS GxEPD2_437c // Waveshare 4.37" 4-color // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) @@ -121,12 +132,14 @@ // somehow there should be an easier way to do this #define GxEPD2_BW_IS_GxEPD2_BW true #define GxEPD2_3C_IS_GxEPD2_3C true +#define GxEPD2_4C_IS_GxEPD2_4C true #define GxEPD2_7C_IS_GxEPD2_7C true #define GxEPD2_1248_IS_GxEPD2_1248 true #define GxEPD2_1248c_IS_GxEPD2_1248c true #define IS_GxEPD(c, x) (c##x) #define IS_GxEPD2_BW(x) IS_GxEPD(GxEPD2_BW_IS_, x) #define IS_GxEPD2_3C(x) IS_GxEPD(GxEPD2_3C_IS_, x) +#define IS_GxEPD2_4C(x) IS_GxEPD(GxEPD2_4C_IS_, x) #define IS_GxEPD2_7C(x) IS_GxEPD(GxEPD2_7C_IS_, x) #define IS_GxEPD2_1248(x) IS_GxEPD(GxEPD2_1248_IS_, x) #define IS_GxEPD2_1248c(x) IS_GxEPD(GxEPD2_1248c_IS_, x) @@ -135,7 +148,7 @@ #define MAX_DISPLAY_BUFFER_SIZE (81920ul-34000ul-36000ul) // ~34000 base use, WiFiClientSecure seems to need about 36k more to work (with certificates) #if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) +#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) #elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) @@ -146,13 +159,15 @@ GxEPD2_DISPLAY_CLASS displ //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // mapping of Waveshare e-Paper ESP8266 Driver Board, old version //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=15*/ EPD_CS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); +#undef MAX_DISPLAY_BUFFER_SIZE +#undef MAX_HEIGHT #endif #if defined(ESP32) #define MAX_DISPLAY_BUFFER_SIZE 65536ul // e.g. #if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) -#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) +#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) #elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) @@ -166,6 +181,7 @@ GxEPD2_DISPLAY_CLASS displ //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 19, /*RST=*/ 4, /*BUSY=*/ 34)); // LILYGO® TTGO T5 2.66 //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // e.g. TTGO T8 ESP32-WROVER +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare ESP32 Driver Board #endif #else // GxEPD2_1248 or GxEPD2_1248c // Waveshare 12.48 b/w or b/w/r SPI display board and frame or Good Display 12.48 b/w panel GDEW1248T3 or b/w/r panel GDEY1248Z51 @@ -175,6 +191,41 @@ GxEPD2_DISPLAY_CLASS < GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS) > di /*dc1=*/ 25, /*dc2=*/ 17, /*rst1=*/ 33, /*rst2=*/ 5, /*busy_m1=*/ 32, /*busy_s1=*/ 26, /*busy_m2=*/ 18, /*busy_s2=*/ 4)); #endif +#undef MAX_DISPLAY_BUFFER_SIZE +#undef MAX_HEIGHT +#endif + +#if defined(ARDUINO_UNOR4_WIFI) +#define MAX_DISPLAY_BUFFER_SIZE 16384ul // e.g. half of available RAM +#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) +#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) +#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) +#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) +#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) +#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) +#endif +// adapt the constructor parameters to your wiring +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); +#endif + +#if defined(ARDUINO_ARCH_RP2040) +#define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram +#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) +#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8)) +#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) +#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8)) +#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) +#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2)) +#endif +#if defined(ARDUINO_NANO_RP2040_CONNECT) +// adapt the constructor parameters to your wiring +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#undef MAX_DISPLAY_BUFFER_SIZE +#undef MAX_HEIGHT #endif #if defined (ESP8266) @@ -215,8 +266,32 @@ void showBitmapFrom_HTTP_Buffered(const char* host, const char* path, const char void showBitmapFrom_HTTPS_Buffered(const char* host, const char* path, const char* filename, const char* fingerprint, int16_t x, int16_t y, bool with_color = true, const char* certificate = certificate_rawcontent); +#if defined(ESP32) +// uncomment next line to use HSPI for EPD (and VSPI for SD), e.g. with Waveshare ESP32 Driver Board +//#define USE_HSPI_FOR_EPD +#endif + +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +// SPIClassRP2040(spi_inst_t *spi, pin_size_t rx, pin_size_t cs, pin_size_t sck, pin_size_t tx); +// uncomment next line for use with Waveshare Pico-ePaper-2.9. +SPIClassRP2040 SPIn(spi1, 12, 13, 10, 11); // need be valid pins for same SPI channel, else fails blinking 4 long 4 short +#endif + +#if defined(ESP32) && defined(USE_HSPI_FOR_EPD) +SPIClass hspi(HSPI); +#endif + void setup() { +#if defined(ESP32) && defined(USE_HSPI_FOR_EPD) + hspi.begin(13, 12, 14, 15); // remap hspi for EPD (swap pins) + display.epd2.selectSPI(hspi, SPISettings(4000000, MSBFIRST, SPI_MODE0)); +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) + delay(2000); // USB serial available + display.epd2.selectSPI(SPIn, SPISettings(4000000, MSBFIRST, SPI_MODE0)); +#endif + Serial.begin(115200); Serial.println(); Serial.println("GxEPD2_WiFi_Example"); @@ -224,12 +299,7 @@ void setup() //display.init(115200); // default 10ms reset pulse, e.g. for bare panels with DESPI-C02 display.init(115200, true, 2, false); // USE THIS for Waveshare boards with "clever" reset circuit, 2ms reset pulse -#ifdef REMAP_SPI_FOR_WAVESHARE_ESP32_DRIVER_BOARD - SPI.end(); // release standard SPI pins, e.g. SCK(18), MISO(19), MOSI(23), SS(5) - //SPI: void begin(int8_t sck=-1, int8_t miso=-1, int8_t mosi=-1, int8_t ss=-1); - SPI.begin(13, 12, 14, 15); // map and init SPI pins SCK(13), MISO(12), MOSI(14), SS(15) -#endif - +#if defined (ESP8266) || defined (ESP32) #ifdef RE_INIT_NEEDED WiFi.persistent(true); WiFi.mode(WIFI_STA); // switch off AP @@ -250,7 +320,12 @@ void setup() Serial.println(ssid); WiFi.begin(ssid, password); } - int ConnectTimeout = 30; // 15 seconds +#else + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); +#endif + int ConnectTimeout = 60; // 30 seconds while (WiFi.status() != WL_CONNECTED) { delay(500); @@ -321,8 +396,8 @@ void drawBitmaps_other() { int16_t w2 = display.width() / 2; int16_t h2 = display.height() / 2; - showBitmapFrom_HTTP("www.packescape.com", "/img/assets/", "IniciMenusTV2.bmp", w2 - 200, h2 - 150, false); - delay(2000); + //showBitmapFrom_HTTP("www.packescape.com", "/img/assets/", "IniciMenusTV2.bmp", w2 - 200, h2 - 150, false); + //delay(2000); showBitmapFrom_HTTP("www.squix.org", "/blog/wunderground/", "chanceflurries.bmp", w2 - 50, h2 - 50, false); delay(2000); showBitmapFrom_HTTPS(host_rawcontent, path_prenticedavid, "betty_1.bmp", fp_rawcontent, w2 - 100, h2 - 160); @@ -445,6 +520,11 @@ void drawBitmapsBuffered_7C() delay(2000); showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_py, "N-Color1.bmp", fp_rawcontent, 0, 0); delay(2000); + + showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_small_but_padded.bmp", fp_rawcontent, 0, 0); + delay(2000); + showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_large.bmp", fp_rawcontent, 0, 0); + delay(2000); } } @@ -959,7 +1039,7 @@ void showBitmapFrom_HTTP_Buffered(const char* host, const char* path, const char void showBitmapFrom_HTTPS(const char* host, const char* path, const char* filename, const char* fingerprint, int16_t x, int16_t y, bool with_color, const char* certificate) { // Use WiFiClientSecure class to create TLS connection -#if defined (ESP8266) +#if defined (ESP8266) || defined(ARDUINO_RASPBERRY_PI_PICO_W) BearSSL::WiFiClientSecure client; BearSSL::X509List cert(certificate ? certificate : certificate_rawcontent); #else @@ -972,7 +1052,7 @@ void showBitmapFrom_HTTPS(const char* host, const char* path, const char* filena if ((x >= display.epd2.WIDTH) || (y >= display.epd2.HEIGHT)) return; Serial.println(); Serial.print("downloading file \""); Serial.print(filename); Serial.println("\""); Serial.print("connecting to "); Serial.println(host); -#if defined (ESP8266) +#if defined (ESP8266) || defined(ARDUINO_RASPBERRY_PI_PICO_W) client.setBufferSizes(4096, 4096); // required //client.setBufferSizes(8192, 4096); // may help for some sites if (certificate) client.setTrustAnchors(&cert); diff --git a/examples/GxEPD2_WiFi_Example/GxEPD2_display_selection_new_style.h b/examples/GxEPD2_WiFi_Example/GxEPD2_display_selection_new_style.h index 764ef7a7..e5c81548 100644 --- a/examples/GxEPD2_WiFi_Example/GxEPD2_display_selection_new_style.h +++ b/examples/GxEPD2_WiFi_Example/GxEPD2_display_selection_new_style.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues // NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below @@ -54,6 +56,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_290_BS // DEPG0290BS 128x296, SSD1680, (FPC-7519 rev.b) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_M06 // GDEW029M06 128x296, UC8151D, (WFT0290CZ10) //#define GxEPD2_DRIVER_CLASS GxEPD2_290_GDEY029T94 // GDEY029T94 128x296, SSD1680, (FPC-A005 20.06.15) +//#define GxEPD2_DRIVER_CLASS GxEPD2_310_GDEQ031T10 // GDEQ031T10 240x320, UC8253, (no inking, backside mark KEGMO 3100) //#define GxEPD2_DRIVER_CLASS GxEPD2_371 // GDEW0371W7 240x416, UC8171 (IL0324), (missing) //#define GxEPD2_DRIVER_CLASS GxEPD2_370_TC1 // ED037TC1 280x480, SSD1677, (ICA-FU-20 ichia 2029), Waveshare 3.7" //#define GxEPD2_DRIVER_CLASS GxEPD2_420 // GDEW042T2 400x300, UC8176 (IL0398), (WFT042CZ15) @@ -65,7 +68,7 @@ //#define GxEPD2_DRIVER_CLASS GxEPD2_583_GDEQ0583T31 // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B) //#define GxEPD2_DRIVER_CLASS GxEPD2_750 // GDEW075T8 640x384, UC8159c (IL0371), (WF0583CZ09) //#define GxEPD2_DRIVER_CLASS GxEPD2_750_T7 // GDEW075T7 800x480, EK79655 (GD7965), (WFT0583CZ61) -//#define GxEPD2_DRIVER_CLASS GxEPD2_750_YT7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.8.20) +//#define GxEPD2_DRIVER_CLASS GxEPD2_750_GDEY075T7 // GDEY075T7 800x480, UC8179 (GD7965), (FPC-C001 20.08.20) //#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden) //#define GxEPD2_DRIVER_CLASS GxEPD2_1248 // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24) // 3-color e-papers @@ -96,6 +99,7 @@ // 7-color e-paper //#define GxEPD2_DRIVER_CLASS GxEPD2_565c // Waveshare 5.65" 7-color //#define GxEPD2_DRIVER_CLASS GxEPD2_730c_GDEY073D46 // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26) +//#define GxEPD2_DRIVER_CLASS GxEPD2_730c_ACeP_730 // Waveshare 7.3" 7-color // grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT //#define GxEPD2_DRIVER_CLASS GxEPD2_it60 // ED060SCT 800x600 //#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072 @@ -158,6 +162,8 @@ GxEPD2_DISPLAY_CLASS displ #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS) #if defined(ARDUINO_LOLIN_D32_PRO) GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // my LOLIN_D32_PRO proto board +#elif defined(ARDUINO_LOLIN_S2_MINI) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection #else GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1 @@ -272,10 +278,14 @@ GxEPD2_DISPLAY_CLASS displ #endif #if defined(ARDUINO_RASPBERRY_PI_PICO) // adapt the constructor parameters to your wiring -//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 5, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board // mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins! GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO //GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified +//GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 +#endif +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) +GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 9, /*DC=*/ 8, /*RST=*/ 12, /*BUSY=*/ 13)); // Waveshare Pico-ePaper-2.9 #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK) // Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico diff --git a/examples/GxEPD2_WiFi_Example/GxEPD2_selection_check.h b/examples/GxEPD2_WiFi_Example/GxEPD2_selection_check.h index dba0e51c..28f966ce 100644 --- a/examples/GxEPD2_WiFi_Example/GxEPD2_selection_check.h +++ b/examples/GxEPD2_WiFi_Example/GxEPD2_selection_check.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,11 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues #define GxEPD2_102_IS_BW true #define GxEPD2_150_BN_IS_BW true @@ -45,6 +47,7 @@ #define GxEPD2_290_BS_IS_BW true #define GxEPD2_290_M06_IS_BW true #define GxEPD2_290_GDEY029T94_IS_BW true +#define GxEPD2_310_GDEQ031T10_IS_BW true #define GxEPD2_371_IS_BW true #define GxEPD2_370_TC1_IS_BW true #define GxEPD2_420_IS_BW true @@ -56,7 +59,7 @@ #define GxEPD2_583_GDEQ0583T31_IS_BW true #define GxEPD2_750_IS_BW true #define GxEPD2_750_T7_IS_BW true -#define GxEPD2_750_YT7_IS_BW true +#define GxEPD2_750_GDEY075T7_IS_BW true #define GxEPD2_1160_T91_IS_BW true #define GxEPD2_1248_IS_BW true #define GxEPD2_it60_IS_BW true @@ -91,6 +94,7 @@ // 7-color e-paper #define GxEPD2_565c_IS_7C true #define GxEPD2_730c_GDEY073D46_IS_7C true +#define GxEPD2_730c_ACeP_730_IS_7C true #if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS) #define IS_GxEPD2_DRIVER(c, x) (c##x) @@ -104,6 +108,15 @@ #if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) #error "GxEPD2_3C used with b/w driver class" #endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with b/w driver class" +#endif +#if IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_4C used with 3-color driver class" +#endif +#if IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) +#error "GxEPD2_7C used with less colors driver class" +#endif #if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS) #error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)" #endif diff --git a/examples/GxEPD2_WiFi_Example/GxEPD2_wiring_examples.h b/examples/GxEPD2_WiFi_Example/GxEPD2_wiring_examples.h index e91ce735..ef5dc8e5 100644 --- a/examples/GxEPD2_WiFi_Example/GxEPD2_wiring_examples.h +++ b/examples/GxEPD2_WiFi_Example/GxEPD2_wiring_examples.h @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -9,9 +9,17 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -// Supporting Arduino Forum Topics: -// Waveshare e-paper displays with SPI: http://forum.arduino.cc/index.php?topic=487007.0 -// Good Display ePaper for Arduino: https://forum.arduino.cc/index.php?topic=436411.0 +// Supporting Arduino Forum Topics (closed, read only): +// Good Display ePaper for Arduino: https://forum.arduino.cc/t/good-display-epaper-for-arduino/419657 +// Waveshare e-paper displays with SPI: https://forum.arduino.cc/t/waveshare-e-paper-displays-with-spi/467865 +// +// Add new topics in https://forum.arduino.cc/c/using-arduino/displays/23 for new questions and issues + +// connection suggestions concerning Waveshare e-paper HAT Rev 2.3: +// DON'T FORGET to connect the PWR pin to VCC, to enable power to the board. +// RST is no longer used to disable power to the board, as with earlier revisions. +// Note, for 3.3V processors, no level converters are needed. Use DESPI-C02 instead. Uses less power. +// See https://www.buyepaper.com/products/development-kit-connection-adapter-board-for-eaper-display-demo-kit // mapping suggestion from Waveshare SPI e-Paper to Wemos D1 mini // BUSY -> D2, RST -> D4, DC -> D3, CS -> D8, CLK -> D5, DIN -> D7, GND -> GND, 3.3V -> 3.3V @@ -52,6 +60,10 @@ // BUSY -> 4, RST -> 0, DC -> 2, CS -> SS(5), CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V // for use with Board: "ESP32 Dev Module": +// mapping suggestion for ESP32S2, e.g. LOLIN ESP32 S2 mini, direct connection of DESPI-C02 +// BUSY -> 39, RST -> 37, DC -> 35, CS -> 33, CLK -> 18, DIN -> 16, GND -> GND, 3.3V -> 3.3V +// for use with Board: "LOLIN S2 MINI": + // new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill" // BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7 @@ -84,3 +96,10 @@ // mapping of my proto board for Raspberry Pi Pico RP2040 (previous default SPI pins) // BUSY -> 7, RST -> 9, DC -> 8, CS-> 5, CLK -> 2, DIN -> 3 + +// mapping of my new proto board like Waveshare Pico-ePaper-2.9 +// needs 10k pull-up on RST when used with Arduino MBED OS RP2040 Boards +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 + +// mapping of Waveshare Pico-ePaper-2.9 +// BUSY -> 13, RST -> 12, DC -> 8, CS-> 9, CLK -> 10, DIN -> 11 diff --git a/examples/GxEPD2x_FastBlackWhiteOnColor/GxEPD2x_FastBlackWhiteOnColor.ino b/examples/GxEPD2x_FastBlackWhiteOnColor/GxEPD2x_FastBlackWhiteOnColor.ino index a7c9aa4d..3e923e0c 100644 --- a/examples/GxEPD2x_FastBlackWhiteOnColor/GxEPD2x_FastBlackWhiteOnColor.ino +++ b/examples/GxEPD2x_FastBlackWhiteOnColor/GxEPD2x_FastBlackWhiteOnColor.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/examples/GxEPD2x_MixedTest/GxEPD2x_MixedTest.ino b/examples/GxEPD2x_MixedTest/GxEPD2x_MixedTest.ino index 4aac6df1..880af897 100644 --- a/examples/GxEPD2x_MixedTest/GxEPD2x_MixedTest.ino +++ b/examples/GxEPD2x_MixedTest/GxEPD2x_MixedTest.ino @@ -1,7 +1,7 @@ // Display Library example for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/library.properties b/library.properties index 0d5d0e49..ccab73f8 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=GxEPD2 -version=1.5.3 +version=1.5.4 author=Jean-Marc Zingg maintainer=Jean-Marc Zingg sentence=Arduino Display Library for SPI E-Paper displays from Dalian Good Display and Waveshare. diff --git a/src/GxEPD2.h b/src/GxEPD2.h index 695fb986..1f231b86 100644 --- a/src/GxEPD2.h +++ b/src/GxEPD2.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -66,6 +66,7 @@ class GxEPD2 DEPG0290BS, GDEW027W3, Waveshare_2_7_bw = GDEW027W3, GDEY027T91, + GDEQ031T10, ED037TC1, GDEW0371W7, Waveshare_3_7_bw = GDEW0371W7, GDEW042T2, Waveshare_4_2_bw = GDEW042T2, @@ -111,7 +112,8 @@ class GxEPD2 Waveshare437inch4color, // 7-color ACeP565, Waveshare_5_65_7c = ACeP565, - GDEY073D46 + GDEY073D46, + ACeP730, Waveshare_7_30_7c = ACeP730 }; }; diff --git a/src/GxEPD2_3C.h b/src/GxEPD2_3C.h index 5d7c0da9..0c98487f 100644 --- a/src/GxEPD2_3C.h +++ b/src/GxEPD2_3C.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/src/GxEPD2_4C.h b/src/GxEPD2_4C.h index 8ba2f0d7..29b08282 100644 --- a/src/GxEPD2_4C.h +++ b/src/GxEPD2_4C.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/src/GxEPD2_7C.h b/src/GxEPD2_7C.h index a355d2ca..97994696 100644 --- a/src/GxEPD2_7C.h +++ b/src/GxEPD2_7C.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -54,6 +54,9 @@ #if __has_include("epd7c/GxEPD2_730c_GDEY073D46.h") #include "epd7c/GxEPD2_730c_GDEY073D46.h" #endif +#if __has_include("epd7c/GxEPD2_730c_ACeP_730.h") +#include "epd7c/GxEPD2_730c_ACeP_730.h" +#endif template class GxEPD2_7C : public GxEPD2_GFX_BASE_CLASS diff --git a/src/GxEPD2_BW.h b/src/GxEPD2_BW.h index 22998ed7..d2e4b984 100644 --- a/src/GxEPD2_BW.h +++ b/src/GxEPD2_BW.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -145,6 +145,9 @@ #if __has_include("gdey/GxEPD2_270_GDEY027T91.h") #include "gdey/GxEPD2_270_GDEY027T91.h" #endif +#if __has_include("gdeq/GxEPD2_310_GDEQ031T10.h") +#include "gdeq/GxEPD2_310_GDEQ031T10.h" +#endif #if __has_include("epd/GxEPD2_371.h") #include "epd/GxEPD2_371.h" #endif @@ -178,8 +181,8 @@ #if __has_include("epd/GxEPD2_750_T7.h") #include "epd/GxEPD2_750_T7.h" #endif -#if __has_include("epd/GxEPD2_750_YT7.h") -#include "epd/GxEPD2_750_YT7.h" +#if __has_include("gdey/GxEPD2_750_GDEY075T7.h") +#include "gdey/GxEPD2_750_GDEY075T7.h" #endif #if __has_include("epd/GxEPD2_1160_T91.h") #include "epd/GxEPD2_1160_T91.h" diff --git a/src/GxEPD2_EPD.cpp b/src/GxEPD2_EPD.cpp index 8df8bef0..40b1b13f 100644 --- a/src/GxEPD2_EPD.cpp +++ b/src/GxEPD2_EPD.cpp @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // @@ -60,29 +60,29 @@ void GxEPD2_EPD::init(uint32_t serial_diag_bitrate, bool initial, uint16_t reset pinMode(_cs, OUTPUT); digitalWrite(_cs, HIGH); // set (needed e.g. for RP2040) } - if (_dc >= 0) - { - digitalWrite(_dc, HIGH); // preset (less glitch for any analyzer) - pinMode(_dc, OUTPUT); - digitalWrite(_dc, HIGH); // set (needed e.g. for RP2040) - } _reset(); - if (_busy >= 0) + _pSPIx->begin(); // may steal _rst pin (Waveshare Pico-ePaper-2.9) + if (_rst >= 0) { - pinMode(_busy, INPUT); + digitalWrite(_rst, HIGH); // preset (less glitch for any analyzer) + pinMode(_rst, OUTPUT); + digitalWrite(_rst, HIGH); // set (needed e.g. for RP2040) } - _pSPIx->begin(); - if (_busy == MISO) // may be overridden + if (_cs >= 0) { - pinMode(_busy, INPUT); + digitalWrite(_cs, HIGH); // preset (less glitch for any analyzer) + pinMode(_cs, OUTPUT); + digitalWrite(_cs, HIGH); // set (needed e.g. for RP2040) } - if (_dc == MISO) // may be overridden, TTGO T5 V2.66 + if (_dc >= 0) { + digitalWrite(_dc, HIGH); // preset (less glitch for any analyzer) pinMode(_dc, OUTPUT); + digitalWrite(_dc, HIGH); // set (needed e.g. for RP2040) } - if (_cs == MISO) // may be overridden + if (_busy >= 0) { - pinMode(_cs, INPUT); + pinMode(_busy, INPUT); } } diff --git a/src/GxEPD2_EPD.h b/src/GxEPD2_EPD.h index 34c11452..3daf37e8 100644 --- a/src/GxEPD2_EPD.h +++ b/src/GxEPD2_EPD.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/src/GxEPD2_GFX.h b/src/GxEPD2_GFX.h index 9b4ae195..39022025 100644 --- a/src/GxEPD2_GFX.h +++ b/src/GxEPD2_GFX.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. -// Requires HW SPI and Adafruit_GFX. Caution: these e-papers require 3.3V supply AND data lines! +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html +// Display Library based on Demo Example from Good Display: https://www.good-display.com/companyfile/32/ // // Author: Jean-Marc Zingg // diff --git a/src/bitmaps/Bitmaps240x360.h b/src/bitmaps/Bitmaps240x360.h new file mode 100644 index 00000000..c4955585 --- /dev/null +++ b/src/bitmaps/Bitmaps240x360.h @@ -0,0 +1,3031 @@ +#ifndef _GxBitmaps240x320_H_ +#define _GxBitmaps240x320_H_ + +#if defined(ESP8266) || defined(ESP32) +#include +#else +#include +#endif + +const unsigned char Bitmap240x320_1[] PROGMEM = +{ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0X9C, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, + 0XE7, 0XFF, 0XFF, 0X8F, 0XFE, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XCF, 0XFF, + 0XFF, 0XCF, 0XFF, 0XFF, 0X80, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X07, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XE7, + 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X00, 0X01, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, + 0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, + 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0X00, 0XFF, 0XF8, 0X0F, 0XFF, + 0X80, 0XFF, 0X80, 0X0F, 0XF8, 0XFF, 0X01, 0XFE, 0X00, 0X7F, 0X1F, 0XFF, 0XE1, 0XFE, 0X1F, 0XC3, + 0XC7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFC, 0X00, 0X3F, 0XE0, 0X03, 0XFE, 0X00, 0X3F, + 0X80, 0X07, 0XF8, 0XFC, 0X00, 0XFE, 0X00, 0X1F, 0X1F, 0XFF, 0XE1, 0XFE, 0X1F, 0XC3, 0XCF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XF8, 0X00, 0X1F, 0XC0, 0X01, 0XFC, 0X00, 0X1F, 0X80, 0X03, + 0XF8, 0XFC, 0X00, 0X7E, 0X00, 0X1F, 0X1F, 0XFF, 0XC0, 0XFF, 0X0F, 0X87, 0X9F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE7, 0XF0, 0X3C, 0X1F, 0X83, 0XE0, 0XF8, 0X3E, 0X0F, 0X8F, 0XC1, 0XF8, 0XF8, + 0X78, 0X3E, 0X3F, 0X0F, 0X1F, 0XFF, 0XC0, 0XFF, 0X87, 0X0F, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF3, 0XF0, 0XFF, 0X0F, 0X87, 0XF0, 0XF8, 0X7F, 0X0F, 0X8F, 0XE1, 0XF8, 0XF8, 0XFE, 0X3E, + 0X3F, 0X8F, 0X1F, 0XFF, 0X80, 0X7F, 0X87, 0X0E, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XE1, 0XFF, 0X8F, 0X0F, 0XF8, 0X70, 0XFF, 0X87, 0X8F, 0XF0, 0XF8, 0XF8, 0XFE, 0X3E, 0X3F, 0X8F, + 0X1F, 0XFF, 0X80, 0X7F, 0XC2, 0X1E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XE1, 0XFF, + 0XFF, 0X1F, 0XF8, 0X71, 0XFF, 0X87, 0X8F, 0XF8, 0XF8, 0XF8, 0X3F, 0XFE, 0X3F, 0X8F, 0X1F, 0XFF, + 0X8C, 0X7F, 0XC2, 0X1C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XE3, 0XFF, 0XFF, 0X1F, + 0XFC, 0X71, 0XFF, 0XC7, 0X8F, 0XF8, 0XF8, 0XFC, 0X03, 0XFE, 0X3F, 0X0F, 0X1F, 0XFF, 0X0C, 0X3F, + 0XE0, 0X38, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X63, 0XF0, 0X0F, 0X1F, 0XFC, 0X71, + 0XFF, 0XC7, 0X8F, 0XF8, 0XF8, 0XFC, 0X00, 0XFE, 0X00, 0X1F, 0X1F, 0XFF, 0X1E, 0X3F, 0XF0, 0X79, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X63, 0XF0, 0X0F, 0X1F, 0XFC, 0X71, 0XFF, 0XC7, + 0X8F, 0XF8, 0XF8, 0XFF, 0X00, 0X7E, 0X00, 0X1F, 0X1F, 0XFF, 0X1E, 0X3F, 0XF0, 0X73, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X63, 0XF0, 0X0F, 0X1F, 0XFC, 0X71, 0XFF, 0XC7, 0X8F, 0XF8, + 0XF8, 0XFF, 0XF0, 0X3E, 0X00, 0X7F, 0X1F, 0XFE, 0X00, 0X1F, 0XF8, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0XE1, 0XFF, 0X8F, 0X1F, 0XF8, 0X71, 0XFF, 0X87, 0X8F, 0XF8, 0XF8, 0XF1, + 0XFE, 0X3E, 0X3F, 0XFF, 0X1F, 0XFE, 0X00, 0X1F, 0XF8, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0XE1, 0XFF, 0X8F, 0X0F, 0XF8, 0X70, 0XFF, 0X87, 0X8F, 0XF0, 0XF8, 0XF1, 0XFE, 0X3E, + 0X3F, 0XFF, 0X1F, 0XFC, 0X00, 0X0F, 0XF8, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XF0, 0XFF, 0X8F, 0X87, 0XF0, 0XF8, 0X7F, 0X0F, 0X8F, 0XF1, 0XF8, 0XF0, 0XFE, 0X3E, 0X3F, 0XFF, + 0X1F, 0XFC, 0X3F, 0X0F, 0XF8, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XF0, 0X3E, + 0X0F, 0X83, 0XE0, 0XF8, 0X3E, 0X0F, 0X8F, 0XC1, 0XF8, 0XF8, 0X78, 0X3E, 0X3F, 0XFF, 0X1F, 0XFC, + 0X7F, 0X8F, 0XF8, 0XFE, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XF8, 0X00, 0X0F, 0XC0, + 0X01, 0XFC, 0X00, 0X1F, 0X80, 0X03, 0XF8, 0XF8, 0X00, 0X7E, 0X3F, 0XFF, 0X00, 0X18, 0X7F, 0X87, + 0XF8, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFC, 0X00, 0X3F, 0XE0, 0X03, 0XFE, + 0X00, 0X3F, 0X80, 0X07, 0XF8, 0XFC, 0X00, 0XFE, 0X3F, 0XFF, 0X00, 0X18, 0XFF, 0XC7, 0XF8, 0XFF, + 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0X80, 0XFF, 0XF8, 0X0F, 0XFF, 0X80, 0XFF, + 0X80, 0X0F, 0XF8, 0XFF, 0X01, 0XFE, 0X3F, 0XFF, 0X00, 0X18, 0XFF, 0XC7, 0XF8, 0XFF, 0XCF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X07, 0XFF, 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, + 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0X80, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X07, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0X8F, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, + 0X01, 0XFF, 0XCF, 0XFF, 0XFF, 0X98, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, + 0X67, 0XFF, 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X03, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X00, + 0X07, 0XFF, 0X80, 0X00, 0X1F, 0XFE, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X1F, + 0XFE, 0X00, 0X00, 0X7F, 0XF8, 0X00, 0X00, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XE0, 0X00, 0X07, 0XFF, + 0X80, 0X00, 0X1F, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X0F, 0XFE, 0X00, + 0X00, 0X7F, 0XF8, 0X00, 0X00, 0XFF, 0XFC, 0X7F, 0XF8, 0XFF, 0XE3, 0XFF, 0XE3, 0XFF, 0X1F, 0XFF, + 0X1F, 0XFC, 0X7F, 0XFC, 0X7F, 0XF1, 0XFF, 0XE1, 0XFF, 0X8F, 0XFF, 0X8F, 0XFE, 0X3F, 0XFE, 0X3F, + 0XF1, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFC, 0X7F, 0XC7, 0XFF, 0XF3, 0XFF, 0X1F, 0XFF, 0X8F, 0XF8, + 0XFF, 0XFE, 0X3F, 0XE3, 0XFF, 0XF1, 0XFF, 0X9F, 0XFF, 0XC7, 0XFC, 0X7F, 0XFE, 0X3F, 0XF1, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFE, 0X3F, 0X8F, 0XFF, 0XF1, 0XFE, 0X3F, 0XFF, 0XC7, 0XF0, 0XFF, 0XFE, + 0X1F, 0XC7, 0XFF, 0XF8, 0XFF, 0X1F, 0XFF, 0XE3, 0XF8, 0XFF, 0XFF, 0X1F, 0XE3, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFE, 0X04, 0X0F, 0XFF, 0XF8, 0X10, 0X7F, 0XFF, 0XE0, 0X81, 0XFF, 0XFF, 0X02, 0X0F, + 0XFF, 0XFC, 0X10, 0X3F, 0XFF, 0XE0, 0X40, 0XFF, 0XFF, 0X81, 0X07, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0X80, 0X3F, 0XFF, 0XFE, 0X00, 0XFF, 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XC0, 0X1F, 0XFF, 0XFE, + 0X00, 0XFF, 0XFF, 0XF8, 0X03, 0XFF, 0XFF, 0XC0, 0X0F, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF9, + 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, + 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XE3, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, + 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X1F, 0XFF, 0XFE, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC0, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X3F, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XFF, + 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFC, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF8, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, + 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X1F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XFF, 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, + 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XE3, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X1F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, + 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFB, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0X7F, 0XFF, 0XFF, + 0XFD, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XBF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0X80, 0X3F, 0XFF, 0XFE, 0X01, 0XFF, 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XC0, 0X1F, + 0XFF, 0XFF, 0X00, 0XFF, 0XFF, 0XF8, 0X03, 0XFF, 0XFF, 0XE0, 0X1F, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFE, 0X04, 0X0F, 0XFF, 0XF8, 0X00, 0X7F, 0XFF, 0XE0, 0X81, 0XFF, 0XFF, 0X02, 0X0F, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XE0, 0X40, 0XFF, 0XFF, 0X80, 0X07, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFE, 0X3F, + 0X8F, 0XFF, 0XF0, 0XFE, 0X3F, 0XFF, 0XC7, 0XF0, 0XFF, 0XFE, 0X1F, 0XC7, 0XFF, 0XF8, 0XFE, 0X1F, + 0XFF, 0XE3, 0XF8, 0XFF, 0XFF, 0X0F, 0XC3, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFC, 0X7F, 0XC7, 0XFF, + 0XF3, 0XFF, 0X1F, 0XFF, 0X8F, 0XFC, 0XFF, 0XFE, 0X7F, 0XE3, 0XFF, 0XF1, 0XFF, 0X1F, 0XFF, 0XC7, + 0XFC, 0X7F, 0XFE, 0X3F, 0XF1, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XF8, 0XFF, 0XE3, 0XFF, 0XE3, 0XFF, + 0X1F, 0XFF, 0X1F, 0XFC, 0X7F, 0XFC, 0X7F, 0XE1, 0XFF, 0XF1, 0XFF, 0X8F, 0XFF, 0X8F, 0XFE, 0X3F, + 0XFE, 0X3F, 0XF1, 0XFF, 0XF8, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XE0, 0X00, 0X07, 0XFF, 0X80, 0X00, + 0X1F, 0XFE, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X0F, 0XFE, 0X00, 0X00, 0X7F, + 0XF8, 0X00, 0X00, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X07, 0XFF, 0X80, 0X00, 0X1F, 0XFE, + 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X1F, 0XFE, 0X00, 0X00, 0X7F, 0XF8, 0X00, + 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + + +const unsigned char Bitmap240x320_2[] PROGMEM = +{ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0X9C, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, + 0XE7, 0XFF, 0XFF, 0X8F, 0XFE, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XCF, 0XFF, + 0XFF, 0XCF, 0XFF, 0XFF, 0X80, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X07, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XE7, + 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X01, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X00, 0X01, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, + 0X00, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, + 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0X00, 0XFF, 0XF8, 0X0F, 0XFF, + 0X80, 0XFF, 0X80, 0X0F, 0XF8, 0XFF, 0X01, 0XFE, 0X00, 0X7F, 0X1F, 0XFF, 0XE1, 0XFE, 0X1F, 0XC3, + 0XC7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFC, 0X00, 0X3F, 0XE0, 0X03, 0XFE, 0X00, 0X3F, + 0X80, 0X07, 0XF8, 0XFC, 0X00, 0XFE, 0X00, 0X1F, 0X1F, 0XFF, 0XE1, 0XFE, 0X1F, 0XC3, 0XCF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XF8, 0X00, 0X1F, 0XC0, 0X01, 0XFC, 0X00, 0X1F, 0X80, 0X03, + 0XF8, 0XFC, 0X00, 0X7E, 0X00, 0X1F, 0X1F, 0XFF, 0XC0, 0XFF, 0X0F, 0X87, 0X9F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE7, 0XF0, 0X3C, 0X1F, 0X83, 0XE0, 0XF8, 0X3E, 0X0F, 0X8F, 0XC1, 0XF8, 0XF8, + 0X78, 0X3E, 0X3F, 0X0F, 0X1F, 0XFF, 0XC0, 0XFF, 0X87, 0X0F, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF3, 0XF0, 0XFF, 0X0F, 0X87, 0XF0, 0XF8, 0X7F, 0X0F, 0X8F, 0XE1, 0XF8, 0XF8, 0XFE, 0X3E, + 0X3F, 0X8F, 0X1F, 0XFF, 0X80, 0X7F, 0X87, 0X0E, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XE1, 0XFF, 0X8F, 0X0F, 0XF8, 0X70, 0XFF, 0X87, 0X8F, 0XF0, 0XF8, 0XF8, 0XFE, 0X3E, 0X3F, 0X8F, + 0X1F, 0XFF, 0X80, 0X7F, 0XC2, 0X1E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XE1, 0XFF, + 0XFF, 0X1F, 0XF8, 0X71, 0XFF, 0X87, 0X8F, 0XF8, 0XF8, 0XF8, 0X3F, 0XFE, 0X3F, 0X8F, 0X1F, 0XFF, + 0X8C, 0X7F, 0XC2, 0X1C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XE3, 0XFF, 0XFF, 0X1F, + 0XFC, 0X71, 0XFF, 0XC7, 0X8F, 0XF8, 0XF8, 0XFC, 0X03, 0XFE, 0X3F, 0X0F, 0X1F, 0XFF, 0X0C, 0X3F, + 0XE0, 0X38, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X63, 0XF0, 0X0F, 0X1F, 0XFC, 0X71, + 0XFF, 0XC7, 0X8F, 0XF8, 0XF8, 0XFC, 0X00, 0XFE, 0X00, 0X1F, 0X1F, 0XFF, 0X1E, 0X3F, 0XF0, 0X79, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X63, 0XF0, 0X0F, 0X1F, 0XFC, 0X71, 0XFF, 0XC7, + 0X8F, 0XF8, 0XF8, 0XFF, 0X00, 0X7E, 0X00, 0X1F, 0X1F, 0XFF, 0X1E, 0X3F, 0XF0, 0X73, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X63, 0XF0, 0X0F, 0X1F, 0XFC, 0X71, 0XFF, 0XC7, 0X8F, 0XF8, + 0XF8, 0XFF, 0XF0, 0X3E, 0X00, 0X7F, 0X1F, 0XFE, 0X00, 0X1F, 0XF8, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0XE1, 0XFF, 0X8F, 0X1F, 0XF8, 0X71, 0XFF, 0X87, 0X8F, 0XF8, 0XF8, 0XF1, + 0XFE, 0X3E, 0X3F, 0XFF, 0X1F, 0XFE, 0X00, 0X1F, 0XF8, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0XE1, 0XFF, 0X8F, 0X0F, 0XF8, 0X70, 0XFF, 0X87, 0X8F, 0XF0, 0XF8, 0XF1, 0XFE, 0X3E, + 0X3F, 0XFF, 0X1F, 0XFC, 0X00, 0X0F, 0XF8, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XF0, 0XFF, 0X8F, 0X87, 0XF0, 0XF8, 0X7F, 0X0F, 0X8F, 0XF1, 0XF8, 0XF0, 0XFE, 0X3E, 0X3F, 0XFF, + 0X1F, 0XFC, 0X3F, 0X0F, 0XF8, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XF0, 0X3E, + 0X0F, 0X83, 0XE0, 0XF8, 0X3E, 0X0F, 0X8F, 0XC1, 0XF8, 0XF8, 0X78, 0X3E, 0X3F, 0XFF, 0X1F, 0XFC, + 0X7F, 0X8F, 0XF8, 0XFE, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XF8, 0X00, 0X0F, 0XC0, + 0X01, 0XFC, 0X00, 0X1F, 0X80, 0X03, 0XF8, 0XF8, 0X00, 0X7E, 0X3F, 0XFF, 0X00, 0X18, 0X7F, 0X87, + 0XF8, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFC, 0X00, 0X3F, 0XE0, 0X03, 0XFE, + 0X00, 0X3F, 0X80, 0X07, 0XF8, 0XFC, 0X00, 0XFE, 0X3F, 0XFF, 0X00, 0X18, 0XFF, 0XC7, 0XF8, 0XFF, + 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0X80, 0XFF, 0XF8, 0X0F, 0XFF, 0X80, 0XFF, + 0X80, 0X0F, 0XF8, 0XFF, 0X01, 0XFE, 0X3F, 0XFF, 0X00, 0X18, 0XFF, 0XC7, 0XF8, 0XFF, 0XCF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X07, 0XFF, 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, + 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, + 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0X9F, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0X80, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0X00, 0X07, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0X8F, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, + 0X01, 0XFF, 0XCF, 0XFF, 0XFF, 0X98, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, + 0X67, 0XFF, 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X03, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X00, + 0X07, 0XFF, 0X80, 0X00, 0X1F, 0XFE, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X1F, + 0XFE, 0X00, 0X00, 0X7F, 0XF8, 0X00, 0X00, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XE0, 0X00, 0X07, 0XFF, + 0X80, 0X00, 0X1F, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X0F, 0XFE, 0X00, + 0X00, 0X7F, 0XF8, 0X00, 0X00, 0XFF, 0XFC, 0X7F, 0XF8, 0XFF, 0XE3, 0XFF, 0XE3, 0XFF, 0X1F, 0XFF, + 0X1F, 0XFC, 0X7F, 0XFC, 0X7F, 0XF1, 0XFF, 0XE1, 0XFF, 0X8F, 0XFF, 0X8F, 0XFE, 0X3F, 0XFE, 0X3F, + 0XF1, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFC, 0X7F, 0XC7, 0XFF, 0XF3, 0XFF, 0X1F, 0XFF, 0X8F, 0XF8, + 0XFF, 0XFE, 0X3F, 0XE3, 0XFF, 0XF1, 0XFF, 0X9F, 0XFF, 0XC7, 0XFC, 0X7F, 0XFE, 0X3F, 0XF1, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFE, 0X3F, 0X8F, 0XFF, 0XF1, 0XFE, 0X3F, 0XFF, 0XC7, 0XF0, 0XFF, 0XFE, + 0X1F, 0XC7, 0XFF, 0XF8, 0XFF, 0X1F, 0XFF, 0XE3, 0XF8, 0XFF, 0XFF, 0X1F, 0XE3, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFE, 0X04, 0X0F, 0XFF, 0XF8, 0X10, 0X7F, 0XFF, 0XE0, 0X81, 0XFF, 0XFF, 0X02, 0X0F, + 0XFF, 0XFC, 0X10, 0X3F, 0XFF, 0XE0, 0X40, 0XFF, 0XFF, 0X81, 0X07, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0X80, 0X3F, 0XFF, 0XFE, 0X00, 0XFF, 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XC0, 0X1F, 0XFF, 0XFE, + 0X00, 0XFF, 0XFF, 0XF8, 0X03, 0XFF, 0XFF, 0XC0, 0X0F, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF9, + 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, + 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X0F, 0XFF, 0XFE, 0X0F, 0XFF, + 0XE3, 0XFF, 0X18, 0XFF, 0X1F, 0X80, 0XF8, 0XFF, 0X1F, 0XE0, 0X00, 0XFF, 0X00, 0X3F, 0XE1, 0XF8, + 0X01, 0XE0, 0X00, 0X80, 0X07, 0XFF, 0XC0, 0XFF, 0XFC, 0X3F, 0XFF, 0XF8, 0X03, 0XFF, 0XE3, 0XFF, + 0X18, 0X7F, 0X1E, 0X00, 0X38, 0XFF, 0X1F, 0XE0, 0X00, 0XFF, 0X00, 0X0F, 0XE1, 0XF8, 0X00, 0X60, + 0X00, 0X80, 0X03, 0XFF, 0XF0, 0XFF, 0XFC, 0X7F, 0XFF, 0XF8, 0X01, 0XFF, 0XC3, 0XFF, 0X18, 0X3F, + 0X1C, 0X00, 0X18, 0XFF, 0X1F, 0XE0, 0X00, 0XFF, 0X00, 0X0F, 0XC0, 0XF8, 0X00, 0X60, 0X00, 0X80, + 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF0, 0XE1, 0XFF, 0X03, 0XFF, 0X18, 0X3F, 0X18, 0X3E, + 0X18, 0XFF, 0X1F, 0XE3, 0XFF, 0XFF, 0X1F, 0X87, 0XC0, 0XF8, 0XFC, 0X23, 0XFF, 0X8F, 0XE1, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF1, 0XF1, 0XFE, 0X03, 0XFF, 0X18, 0X1F, 0X18, 0X7F, 0X08, 0XFF, + 0X1F, 0XE3, 0XFF, 0XFF, 0X1F, 0XC7, 0X80, 0X78, 0XFE, 0X23, 0XFF, 0X8F, 0XF1, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XF1, 0XFE, 0X03, 0XFF, 0X18, 0X0F, 0X10, 0XFF, 0X88, 0XFF, 0X1F, 0XE3, + 0XFF, 0XFF, 0X1F, 0XC7, 0X80, 0X78, 0XFE, 0X23, 0XFF, 0X8F, 0XF1, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XE1, 0XFE, 0X23, 0XFF, 0X18, 0X8F, 0X11, 0XFF, 0XF8, 0XFF, 0X1F, 0XE3, 0XFF, 0XFF, + 0X1F, 0XC7, 0X8C, 0X78, 0XFE, 0X23, 0XFF, 0X8F, 0XE1, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0X03, 0XFF, 0XE3, 0XFF, 0X18, 0X87, 0X11, 0XFF, 0XF8, 0X00, 0X1F, 0XE0, 0X01, 0XFF, 0X1F, 0X87, + 0X0C, 0X38, 0XFC, 0X20, 0X01, 0X80, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0X03, 0XFF, + 0XE3, 0XFF, 0X18, 0XC3, 0X11, 0XFF, 0XF8, 0X00, 0X1F, 0XE0, 0X01, 0XFF, 0X00, 0X0F, 0X1E, 0X38, + 0X00, 0X60, 0X01, 0X80, 0X03, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0X01, 0XFF, 0XE3, 0XFF, + 0X18, 0XC3, 0X11, 0XFF, 0XF8, 0X00, 0X1F, 0XE0, 0X01, 0XFF, 0X00, 0X0F, 0X1E, 0X38, 0X00, 0X60, + 0X01, 0X80, 0X0F, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF0, 0XFF, 0XE3, 0XFF, 0X18, 0XE1, + 0X11, 0XFF, 0XF8, 0XFF, 0X1F, 0XE3, 0XFE, 0X01, 0X00, 0X3E, 0X00, 0X18, 0X01, 0XE3, 0XFF, 0X8E, + 0X0F, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XE3, 0XFF, 0X18, 0XF1, 0X11, 0XFF, + 0X88, 0XFF, 0X1F, 0XE3, 0XFE, 0X01, 0X1F, 0XFE, 0X00, 0X18, 0XFF, 0XE3, 0XFF, 0X8F, 0X07, 0XFF, + 0XF8, 0XFF, 0XFC, 0X0F, 0XFF, 0XF1, 0XF8, 0XFF, 0XE3, 0XFF, 0X18, 0XF0, 0X10, 0XFF, 0X88, 0XFF, + 0X1F, 0XE3, 0XFE, 0X01, 0X1F, 0XFC, 0X00, 0X08, 0XFF, 0XE3, 0XFF, 0X8F, 0X87, 0XFF, 0XC0, 0XFF, + 0XFF, 0X03, 0XFF, 0XF0, 0XF8, 0XFF, 0XE3, 0XFF, 0X18, 0XF8, 0X18, 0X7F, 0X08, 0XFF, 0X1F, 0XE3, + 0XFF, 0XFF, 0X1F, 0XFC, 0X3F, 0X08, 0XFF, 0XE3, 0XFF, 0X8F, 0X83, 0XFF, 0X03, 0XFF, 0XFF, 0XE3, + 0XFF, 0XF0, 0XF0, 0XFF, 0XE3, 0XFF, 0X18, 0XFC, 0X18, 0X3E, 0X18, 0XFF, 0X1F, 0XE3, 0XFF, 0XFF, + 0X1F, 0XFC, 0X7F, 0X88, 0XFF, 0XE3, 0XFF, 0X8F, 0XC3, 0XFF, 0X1F, 0XFF, 0XFF, 0XF1, 0XFF, 0XF8, + 0X01, 0X8F, 0XE3, 0XFF, 0X18, 0XFC, 0X1C, 0X00, 0X18, 0XFF, 0X1F, 0XE0, 0X00, 0XFF, 0X1F, 0XF8, + 0X7F, 0X80, 0XFF, 0XE0, 0X00, 0X8F, 0XE1, 0XFE, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFC, 0X03, 0X8F, + 0XE3, 0XFF, 0X18, 0XFE, 0X1E, 0X00, 0X38, 0XFF, 0X1F, 0XE0, 0X00, 0XFF, 0X1F, 0XF8, 0XFF, 0XC0, + 0XFF, 0XE0, 0X00, 0X8F, 0XE0, 0XFE, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFE, 0X07, 0X8F, 0XE3, 0XFF, + 0X18, 0XFF, 0X1F, 0X80, 0XF8, 0XFF, 0X1F, 0XE0, 0X00, 0XFF, 0X1F, 0XF8, 0XFF, 0XC0, 0XFF, 0XE0, + 0X00, 0X8F, 0XF0, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, + 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X1F, 0XFF, 0XFE, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC0, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XF0, 0X0E, 0X00, 0X70, 0X3E, + 0X0F, 0X3F, 0X9F, 0X90, 0X02, 0X7C, 0X1E, 0X7E, 0X7F, 0XFF, 0XC1, 0XF9, 0XE1, 0XFF, 0XFF, 0XF0, + 0XF8, 0X3C, 0X3F, 0XFC, 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XF0, 0X06, 0X00, 0X60, 0X1C, 0X07, 0X3F, + 0X9F, 0X90, 0X02, 0X78, 0X0E, 0X3E, 0X7F, 0XFF, 0X81, 0XF1, 0XC0, 0XFF, 0XFF, 0XE0, 0X70, 0X38, + 0X1F, 0XFC, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XF3, 0XE2, 0X7F, 0XC7, 0X88, 0XE3, 0X3F, 0X9F, 0X9F, + 0X3E, 0X71, 0XC6, 0X1E, 0X7F, 0XFF, 0X18, 0XE1, 0X8C, 0X7F, 0XFF, 0XC6, 0X63, 0X11, 0X8F, 0XFE, + 0X3F, 0XFF, 0XFF, 0XC3, 0XFF, 0XF3, 0XF2, 0X7F, 0XCF, 0XC1, 0XF1, 0X3F, 0X9F, 0X9F, 0X3E, 0X63, + 0XE2, 0X1E, 0X7E, 0X7F, 0X3C, 0XE1, 0X9E, 0X7C, 0XF3, 0XCE, 0X67, 0X93, 0XCF, 0XFF, 0X0F, 0XFF, + 0XFC, 0X07, 0XFF, 0XF3, 0XF2, 0X7F, 0XC7, 0XF3, 0XF9, 0X3F, 0X9F, 0X9F, 0X3E, 0X67, 0XF2, 0X0E, + 0X7E, 0X7F, 0XFC, 0XC1, 0X9E, 0X7C, 0X63, 0XFC, 0X7F, 0X93, 0XCF, 0XFF, 0X80, 0XFF, 0XFC, 0X3F, + 0XFF, 0XF3, 0XE2, 0X00, 0XE0, 0XF3, 0XF9, 0X3F, 0X9F, 0X9F, 0X3E, 0X67, 0XF2, 0X46, 0X7F, 0XFF, + 0XF8, 0XC9, 0X9E, 0X7E, 0X07, 0XF0, 0XFF, 0X13, 0XCF, 0XFF, 0XC0, 0XFF, 0XFC, 0X7F, 0XFF, 0XF0, + 0X06, 0X00, 0XF0, 0X13, 0XF9, 0X3F, 0X9F, 0X9F, 0X3E, 0X67, 0XF2, 0X66, 0X7F, 0XFF, 0XF9, 0X89, + 0X9E, 0X7F, 0X0F, 0XF0, 0X7F, 0X33, 0XCF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF0, 0X0E, 0X7F, + 0XFE, 0X03, 0XF9, 0X3F, 0X9F, 0X9F, 0X3E, 0X67, 0XF2, 0X62, 0X7F, 0XFF, 0XF1, 0X19, 0X9E, 0X7F, + 0X0F, 0XFE, 0X3E, 0X33, 0XCF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF3, 0X8E, 0X7F, 0XCF, 0XC3, + 0XF9, 0X3F, 0X9F, 0X9F, 0X3E, 0X67, 0XF2, 0X70, 0X7F, 0XFF, 0XE3, 0X00, 0X1E, 0X7F, 0X0F, 0XFF, + 0X3C, 0X73, 0XCF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF3, 0XCE, 0X7F, 0XCF, 0XC1, 0XF1, 0X3F, + 0X9F, 0X9F, 0X3E, 0X63, 0XE2, 0X78, 0X7F, 0XFF, 0XC7, 0X00, 0X1E, 0X7F, 0X0F, 0XCF, 0X38, 0XF3, + 0XCF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF3, 0XC6, 0X7F, 0XC7, 0X88, 0XE3, 0X3F, 0X8F, 0X1F, + 0X3E, 0X71, 0XC6, 0X78, 0X7F, 0XFF, 0X8F, 0XF9, 0X8C, 0X7E, 0X07, 0XC6, 0X31, 0XF1, 0X8F, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF3, 0XE2, 0X00, 0X60, 0X1C, 0X07, 0X00, 0XC0, 0X3F, 0X3E, 0X78, + 0X0E, 0X7C, 0X7E, 0X7F, 0X00, 0XF9, 0XC0, 0XFC, 0X63, 0XC0, 0X60, 0X18, 0X1F, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XF3, 0XF2, 0X00, 0X70, 0X3E, 0X0F, 0X00, 0XE0, 0X7F, 0X3E, 0X7C, 0X1E, 0X7E, + 0X7E, 0X7F, 0X00, 0XF9, 0XE1, 0XFC, 0XF3, 0XF0, 0XE0, 0X1C, 0X3F, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF8, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0X03, 0XF0, 0X79, 0XFF, 0X83, 0XC0, 0X3F, 0XFF, 0XC0, 0X39, + 0XFF, 0X9F, 0XE0, 0X73, 0XF3, 0XFE, 0X7E, 0X7E, 0X4F, 0XCC, 0X80, 0X10, 0X03, 0XFF, 0XC0, 0XFF, + 0XFC, 0X3F, 0XFF, 0XFE, 0X01, 0XE0, 0X39, 0XFF, 0X01, 0XC0, 0X1F, 0XFF, 0XC0, 0X19, 0XFF, 0X0F, + 0XC0, 0X33, 0XE3, 0XFE, 0X3C, 0X3C, 0X4F, 0XCC, 0X80, 0X10, 0X03, 0XFF, 0XF0, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFC, 0X78, 0XC7, 0X19, 0XFE, 0X38, 0XCF, 0X8F, 0XFF, 0XCF, 0X89, 0XFF, 0X0F, 0X8F, 0X13, + 0XC7, 0XFF, 0X3C, 0X3C, 0XCF, 0XCC, 0XF9, 0XF3, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF8, + 0XFC, 0X8F, 0X89, 0XFC, 0X7C, 0X4F, 0XCF, 0X9F, 0XCF, 0XC9, 0XFE, 0X07, 0X1F, 0X93, 0X8F, 0XFF, + 0X3C, 0X3C, 0XCF, 0XCC, 0XF9, 0XF3, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF9, 0XFF, 0X9F, + 0XC9, 0XFC, 0XFE, 0X4F, 0XCF, 0X9F, 0XCF, 0X89, 0XFE, 0X67, 0X3F, 0XF3, 0X1F, 0XFF, 0X18, 0X18, + 0XCF, 0XCC, 0XF9, 0XF3, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF9, 0XFF, 0X9F, 0XC9, 0XFC, + 0XFE, 0X4F, 0X8F, 0XFF, 0XC0, 0X19, 0XFE, 0X67, 0X3F, 0XF2, 0X3F, 0XFF, 0X99, 0X99, 0XC0, 0X0C, + 0XF9, 0XF0, 0X07, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF9, 0XFF, 0X9F, 0XC9, 0XFC, 0XFE, 0X40, + 0X1F, 0XFF, 0XC0, 0X19, 0XFC, 0X63, 0X3F, 0XF0, 0X1F, 0XFF, 0X99, 0X99, 0XC0, 0X0C, 0XF9, 0XF0, + 0X07, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF9, 0XFF, 0X9F, 0XC9, 0XFC, 0XFE, 0X40, 0X3F, 0XFF, + 0XCF, 0X89, 0XFC, 0X03, 0X3F, 0XF0, 0X8F, 0XFF, 0X81, 0X81, 0XCF, 0XCC, 0XF9, 0XF3, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XF9, 0XFF, 0X9F, 0XC9, 0XFC, 0XFE, 0X4E, 0X3F, 0XFF, 0XCF, 0XC9, + 0XF8, 0X01, 0X3F, 0XF1, 0XCF, 0XFF, 0XC3, 0XC3, 0XCF, 0XCC, 0XF9, 0XF3, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XF8, 0XFC, 0X8F, 0X89, 0XFC, 0X7C, 0X4F, 0X3F, 0XFF, 0XCF, 0XC9, 0XF9, 0XF9, + 0X1F, 0X93, 0XC7, 0XFF, 0XC3, 0XC3, 0XCF, 0XCC, 0XF9, 0XF3, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFC, 0X78, 0XC7, 0X19, 0XFE, 0X38, 0XCF, 0X1F, 0XFF, 0XCF, 0X89, 0XF1, 0XF8, 0X8F, 0X13, + 0XE7, 0XFF, 0XC3, 0XC3, 0XCF, 0XCC, 0XF9, 0XF3, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFE, + 0X01, 0XE0, 0X38, 0X07, 0X01, 0XCF, 0X8F, 0X9F, 0XC0, 0X18, 0X03, 0XFC, 0XC0, 0X33, 0XE3, 0X3F, + 0XE7, 0XE7, 0XCF, 0XCC, 0XF9, 0XF0, 0X03, 0XFF, 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0X03, 0XF0, + 0X78, 0X07, 0X83, 0XCF, 0XCF, 0X9F, 0XC0, 0X38, 0X03, 0XFC, 0XE0, 0X73, 0XF3, 0X3F, 0XE7, 0XE7, + 0XCF, 0XCC, 0XF9, 0XF0, 0X03, 0XFF, 0XE0, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X1F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X3F, + 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFC, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XFF, 0XFF, 0X83, 0XFF, 0XF8, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XF1, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XF8, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, + 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X3F, 0XFF, 0XFF, 0XF8, 0XFF, 0XF8, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XF8, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XF8, 0XFF, 0XF8, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X8F, 0XF0, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFC, 0X7F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFC, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X9F, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFC, + 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X9F, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XFF, 0XFF, 0XC3, 0XFF, 0XFC, 0X7F, 0X80, + 0X00, 0X00, 0X00, 0X00, 0XFF, 0X1F, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X0F, 0XFF, 0XFC, 0X07, 0XFF, 0XFC, 0X7F, 0X80, 0X00, 0X00, + 0X00, 0X00, 0XFF, 0X1F, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X01, 0XFF, 0X80, 0XFF, 0XFC, 0X1F, 0XFF, 0XFC, 0X7F, 0X80, 0X00, 0X00, 0X00, 0X00, + 0XFF, 0X1F, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X01, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFC, 0X7F, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X1F, + 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFE, 0X7F, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0X1F, 0XF0, 0X00, + 0X06, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFE, 0X7F, 0XC0, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X3F, 0XF0, 0X00, 0X1F, 0X80, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFE, 0X3F, 0XC0, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XF0, 0X00, 0X7F, 0XE0, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFE, + 0X3F, 0XC0, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XF0, 0X00, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFE, 0X1F, 0XC0, + 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XF0, 0X00, 0XF6, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0X1F, 0XC0, 0X00, 0X00, + 0X00, 0X01, 0XFC, 0X7F, 0XF0, 0X00, 0XE6, 0X70, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0X0F, 0XE0, 0X00, 0X00, 0X00, 0X03, + 0XFC, 0X7F, 0XF0, 0X00, 0XE6, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0X8F, 0XE0, 0X00, 0X00, 0X00, 0X03, 0XFC, 0XFF, + 0XF0, 0X00, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0X8F, 0XE0, 0X00, 0X00, 0X00, 0X03, 0XF8, 0XFF, 0XF0, 0X00, + 0X7F, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, + 0XFC, 0X3F, 0XFF, 0XFF, 0XC7, 0XE0, 0X00, 0X00, 0X00, 0X03, 0XF9, 0XFF, 0XF0, 0X00, 0X7F, 0XC0, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XE0, 0XFF, 0XFC, 0X07, + 0XFF, 0XFF, 0XC7, 0XF0, 0X00, 0X00, 0X00, 0X07, 0XF1, 0XFF, 0XF0, 0X00, 0X1F, 0XE0, 0X00, 0X7F, + 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, 0XFF, 0XFF, + 0XE3, 0XF0, 0X00, 0X00, 0X00, 0X07, 0XE3, 0XFF, 0XF0, 0X00, 0X07, 0XF0, 0X01, 0XFF, 0XE0, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XE3, 0XF0, + 0X00, 0X00, 0X00, 0X07, 0XE3, 0XFF, 0XF0, 0X00, 0X06, 0XF0, 0X07, 0XFF, 0XF8, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XF1, 0XF8, 0X00, 0X00, + 0X00, 0X0F, 0XC7, 0XFF, 0XF0, 0X00, 0XE6, 0X70, 0X0F, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X01, 0XFC, 0X3F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XF0, 0X78, 0X00, 0X00, 0X00, 0X0F, + 0X07, 0XFF, 0XF0, 0X00, 0XF6, 0X70, 0X1F, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X01, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XF8, 0X18, 0X00, 0X00, 0X00, 0X0C, 0X0F, 0XFF, + 0XF0, 0X00, 0XF6, 0XF0, 0X3F, 0XC0, 0X7F, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFC, + 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XF0, 0X00, + 0X7F, 0XE0, 0X3F, 0X80, 0X1F, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFC, 0X7F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XF0, 0X00, 0X7F, 0XE0, + 0X7E, 0X00, 0X0F, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFC, 0X3F, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0X80, 0X7E, 0X00, + 0X07, 0X80, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X03, 0XFF, 0XFF, 0XF0, 0X00, 0X06, 0X00, 0XFC, 0X00, 0X07, 0XC0, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X07, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XF0, + 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XF0, 0X00, 0X06, 0X00, 0XFC, 0X00, 0X03, 0XC0, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X80, 0XFF, 0XFC, 0X3F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, + 0X00, 0X07, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0XF8, 0X00, 0X03, 0XC0, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X01, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X80, 0X00, 0X00, 0X87, + 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0XF8, 0X00, 0X03, 0XC0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XE1, 0XC0, 0X00, 0X01, 0XC3, 0XFF, 0XFF, + 0XF0, 0X00, 0X00, 0X00, 0XF8, 0X00, 0X03, 0XE0, 0X00, 0X03, 0XF0, 0X00, 0X7E, 0X00, 0X01, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XF3, 0XE0, 0X00, 0X03, 0XE7, 0XFF, 0XFF, 0XF0, 0X00, + 0X00, 0X00, 0XF8, 0X00, 0X03, 0XE0, 0X00, 0X0F, 0XFC, 0X01, 0XFF, 0X80, 0X01, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, + 0XF8, 0X00, 0X03, 0XE0, 0X00, 0X1F, 0XFE, 0X03, 0XFF, 0XC0, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0XF8, 0X00, + 0X03, 0XE0, 0X00, 0X3F, 0XFF, 0X07, 0XFF, 0XE0, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0XFC, 0X00, 0X07, 0XE0, + 0X00, 0X7E, 0X1F, 0X0F, 0XC3, 0XE0, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X7C, 0X00, 0X07, 0XE0, 0X00, 0X7C, + 0X0F, 0X8F, 0X81, 0XF0, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X7E, 0X00, 0X0F, 0XE0, 0X00, 0X78, 0X07, 0X8F, + 0X00, 0XF0, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X7F, 0X00, 0X1F, 0XE0, 0X00, 0X78, 0X07, 0X8F, 0X00, 0XF0, + 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, + 0XF0, 0X00, 0X00, 0X00, 0X3F, 0XC0, 0X7F, 0XE0, 0X00, 0X78, 0X07, 0X8F, 0X00, 0XF0, 0X01, 0XFF, + 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, + 0X00, 0X00, 0X1F, 0XFF, 0XFB, 0XE0, 0X00, 0X7C, 0X07, 0X8F, 0X80, 0XF0, 0X01, 0XFF, 0XE0, 0XFF, + 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, + 0X0F, 0XFF, 0XF3, 0XE0, 0X00, 0X3E, 0X0F, 0X07, 0XC1, 0XE0, 0X01, 0XFF, 0X80, 0XFF, 0XFF, 0XC3, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X07, 0XFF, + 0XE3, 0XE0, 0X00, 0X1F, 0XFE, 0X03, 0XFF, 0XC0, 0X01, 0XFE, 0X0F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X03, 0XFF, 0XC3, 0XE0, + 0X00, 0X07, 0XF8, 0X00, 0XFF, 0X00, 0X01, 0XFE, 0X3F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X7E, 0X03, 0XE0, 0X00, 0X0F, + 0XFC, 0X01, 0XFF, 0X80, 0X01, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XE0, 0X00, 0X3F, 0XFF, 0X07, + 0XFF, 0XE0, 0X01, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XC0, 0X00, 0X7C, 0X0F, 0X0F, 0X81, 0XE0, + 0X01, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XC0, 0X00, 0X78, 0X07, 0X8F, 0X00, 0XF0, 0X01, 0XFE, + 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XC0, 0X00, 0XF0, 0X07, 0XDE, 0X00, 0XF8, 0X01, 0XFE, 0X3F, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, + 0X7C, 0X00, 0X0F, 0XC0, 0X00, 0XF0, 0X03, 0XDE, 0X00, 0X78, 0X01, 0XFF, 0X3F, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X7C, 0X00, + 0X0F, 0X80, 0X00, 0XF0, 0X03, 0XDE, 0X00, 0X78, 0X01, 0XFF, 0X03, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X7E, 0X00, 0X0F, 0X80, + 0X00, 0XF0, 0X03, 0XDE, 0X00, 0X78, 0X01, 0XFF, 0XC0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X80, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X3E, 0X00, 0X1F, 0X00, 0X00, 0XF0, + 0X03, 0XDE, 0X00, 0X78, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X3F, 0X00, 0X3F, 0X00, 0X00, 0XF0, 0X03, 0XDE, + 0X00, 0X78, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X1F, 0XC0, 0XFE, 0X00, 0X00, 0X78, 0X07, 0X8F, 0X00, 0XF0, + 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X7F, 0XFF, 0XFF, 0XFF, + 0XF0, 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFC, 0X01, 0XF0, 0X7E, 0X0F, 0X8F, 0XC1, 0XF0, 0X01, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, + 0X00, 0X00, 0X0F, 0XFF, 0XFC, 0X01, 0XF0, 0X3F, 0XFF, 0X07, 0XFF, 0XE0, 0X01, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XF0, 0X01, 0XF0, 0X1F, 0XFF, 0X03, 0XFF, 0XE0, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X03, 0XFF, + 0XE0, 0X01, 0XF0, 0X0F, 0XFC, 0X01, 0XFF, 0X80, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X7F, 0X00, 0X01, + 0XF0, 0X03, 0XF0, 0X00, 0X7E, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, + 0X0F, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X03, 0XFF, + 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X01, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0XFF, 0XFF, 0XFF, + 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, + 0XF8, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XE0, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0X03, 0XFF, 0XFF, 0XE3, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X1F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0XFE, 0X3F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XFC, + 0X00, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF8, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XF9, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X7F, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0XFF, + 0XFF, 0XE3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0XFB, 0XFF, 0XFF, 0XFF, 0XCF, 0XFF, 0XFF, 0XFF, 0X7F, 0XFF, 0XFF, + 0XFD, 0XFF, 0XFF, 0XFF, 0XE7, 0XFF, 0XFF, 0XFF, 0XBF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFF, 0XF8, 0XFF, + 0XFC, 0X7F, 0XFF, 0X80, 0X3F, 0XFF, 0XFE, 0X01, 0XFF, 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XC0, 0X1F, + 0XFF, 0XFF, 0X00, 0XFF, 0XFF, 0XF8, 0X03, 0XFF, 0XFF, 0XE0, 0X1F, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, + 0XFE, 0X04, 0X0F, 0XFF, 0XF8, 0X00, 0X7F, 0XFF, 0XE0, 0X81, 0XFF, 0XFF, 0X02, 0X0F, 0XFF, 0XFC, + 0X00, 0X3F, 0XFF, 0XE0, 0X40, 0XFF, 0XFF, 0X80, 0X07, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFE, 0X3F, + 0X8F, 0XFF, 0XF0, 0XFE, 0X3F, 0XFF, 0XC7, 0XF0, 0XFF, 0XFE, 0X1F, 0XC7, 0XFF, 0XF8, 0XFE, 0X1F, + 0XFF, 0XE3, 0XF8, 0XFF, 0XFF, 0X0F, 0XC3, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XFC, 0X7F, 0XC7, 0XFF, + 0XF3, 0XFF, 0X1F, 0XFF, 0X8F, 0XFC, 0XFF, 0XFE, 0X7F, 0XE3, 0XFF, 0XF1, 0XFF, 0X1F, 0XFF, 0XC7, + 0XFC, 0X7F, 0XFE, 0X3F, 0XF1, 0XFF, 0XF8, 0XFF, 0XFC, 0X7F, 0XF8, 0XFF, 0XE3, 0XFF, 0XE3, 0XFF, + 0X1F, 0XFF, 0X1F, 0XFC, 0X7F, 0XFC, 0X7F, 0XE1, 0XFF, 0XF1, 0XFF, 0X8F, 0XFF, 0X8F, 0XFE, 0X3F, + 0XFE, 0X3F, 0XF1, 0XFF, 0XF8, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XE0, 0X00, 0X07, 0XFF, 0X80, 0X00, + 0X1F, 0XFE, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X0F, 0XFE, 0X00, 0X00, 0X7F, + 0XF8, 0X00, 0X00, 0XFF, 0XFC, 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X07, 0XFF, 0X80, 0X00, 0X1F, 0XFE, + 0X00, 0X00, 0XFF, 0XF0, 0X00, 0X03, 0XFF, 0XC0, 0X00, 0X1F, 0XFE, 0X00, 0X00, 0X7F, 0XF8, 0X00, + 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char Bitmap240x320_3[] PROGMEM = +{ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEA, 0X3F, 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9B, 0XCF, 0XFC, 0X7F, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XBA, 0X37, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X7B, 0XDB, 0XFD, 0XDF, 0XF7, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0XFB, 0X6B, 0XFD, 0XE7, 0XCF, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFB, 0XB9, + 0XFD, 0XF3, 0X9F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XFB, 0XD5, 0XFD, 0XED, + 0X6F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XF9, 0XFD, 0XFD, 0XDE, 0XF7, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XFB, 0XD5, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFB, 0XB9, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0XFB, 0X6B, 0XFD, 0X7F, 0XFD, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X7B, 0XDB, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBA, 0X37, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9B, 0XCF, + 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCA, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X1F, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X3F, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFC, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFE, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, + 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X0F, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0X1F, + 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0X1F, 0XFF, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X07, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X07, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X83, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, + 0XFF, 0XFF, 0XFF, 0XF8, 0X1E, 0X7E, 0X67, 0XE6, 0X7E, 0X67, 0XE7, 0XFF, 0XFF, 0XFF, 0XC1, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, + 0XFF, 0XF0, 0X0E, 0X7E, 0X63, 0XE6, 0X3E, 0X63, 0XC7, 0XFF, 0XFF, 0XFF, 0XE0, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XE3, + 0XC6, 0X7E, 0X61, 0XE6, 0X1E, 0X73, 0XCF, 0XFF, 0XFF, 0XFF, 0XF0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XE7, 0XE6, 0X7E, + 0X61, 0XE6, 0X1E, 0X71, 0X8F, 0XFF, 0XFF, 0XFF, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XE3, 0XFE, 0X7E, 0X60, 0XE6, + 0X0E, 0X78, 0X1F, 0XFF, 0XFF, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7E, 0X7E, 0X64, 0X66, 0X46, 0X7C, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X0E, 0X7E, 0X66, 0X66, 0X66, 0X7C, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X06, 0X7E, 0X66, 0X26, 0X62, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE7, 0XE6, 0X7E, 0X67, 0X06, 0X70, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE7, 0XE6, 0X7E, 0X67, 0X86, 0X78, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, + 0XC6, 0X3C, 0X67, 0X86, 0X78, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X0F, 0X00, + 0XE7, 0XC6, 0X7C, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0X81, 0XE7, 0XE6, + 0X7E, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X30, 0X0F, 0X9C, 0X03, 0XFE, 0X7E, 0X7E, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0X30, 0X07, 0X9C, 0X01, 0XFC, 0X3E, 0X3C, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X9F, 0XF3, 0XE3, 0X9C, 0XF8, 0XFC, 0X3F, 0X3C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, + 0XF3, 0XF3, 0X9C, 0XFC, 0X78, 0X1F, 0X18, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XF3, + 0X9C, 0XFE, 0X79, 0X9F, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X73, 0XE3, 0X9C, 0XFE, + 0X79, 0X9F, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X70, 0X07, 0X9C, 0XFE, 0X71, 0X8F, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF0, 0X0F, 0X9C, 0XFE, 0X70, 0X0F, 0XE7, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0X8F, 0X9C, 0XFE, 0X60, 0X07, 0XE7, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XCF, 0X9C, 0XFC, 0X67, 0XE7, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X9F, 0XF3, 0XC7, 0X9C, 0XF8, 0XC7, 0XE3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, + 0XF3, 0XE3, 0X9C, 0X01, 0XCF, 0XF3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XF3, + 0X9C, 0X03, 0XCF, 0XF3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, + 0X7F, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, + 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XE0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XC0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X07, 0XFF, + 0X80, 0XFF, 0XFF, 0X80, 0X03, 0XC2, 0X1E, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X01, 0XFF, 0X00, 0X3F, + 0XFF, 0X80, 0X03, 0XC7, 0X1C, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0XFC, 0X00, 0X1F, 0XFF, 0X80, + 0X03, 0XC7, 0X18, 0X0F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0XFC, 0X00, 0X1F, 0XFF, 0X00, 0X03, 0XC2, + 0X10, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XE0, 0X78, 0X1C, 0X0F, 0XFF, 0X0F, 0XFF, 0XE0, 0X20, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC3, 0XF0, 0X78, 0X3E, 0X0F, 0XFF, 0X0F, 0XFF, 0XE0, 0X20, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC3, 0XF8, 0X78, 0X7F, 0X0F, 0XFF, 0X0F, 0XFF, 0XF0, 0X61, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X70, 0X7F, 0XFF, 0XFF, 0X00, 0X1F, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X70, + 0XC0, 0XFF, 0XFE, 0X00, 0X0F, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X70, 0X00, 0X3F, + 0XFE, 0X00, 0X07, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XF0, 0X00, 0X1F, 0XFE, 0X00, + 0X03, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XF0, 0X00, 0X1F, 0XFE, 0X0F, 0X81, 0XFF, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XF0, 0X3C, 0X0F, 0XFF, 0XFF, 0XC1, 0XFF, 0XC3, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XF0, 0X7E, 0X0F, 0XFF, 0XFF, 0XE1, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X07, 0XF0, 0XFF, 0X0F, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X0F, 0XF0, 0XFF, 0X0F, 0XFF, 0XFF, 0XE1, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XF0, + 0XFF, 0X0F, 0XFE, 0X1F, 0XE1, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XF8, 0X7E, 0X0F, + 0XFE, 0X0F, 0XC1, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XF8, 0X3C, 0X0F, 0XFE, 0X07, + 0X83, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X78, 0X00, 0X1F, 0X0F, 0X00, 0X03, 0XFF, + 0XF0, 0X1F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X7C, 0X00, 0X3F, 0X0F, 0X00, 0X07, 0XFF, 0XF8, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X7E, 0X00, 0X7F, 0X0F, 0X80, 0X0F, 0XFF, 0XFE, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC0, 0X00, 0X7F, 0X80, 0XFF, 0X0F, 0XE0, 0X3F, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0XF8, + 0X0F, 0XFE, 0X07, 0XF8, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X1F, 0XE0, 0X03, 0XFC, + 0X03, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X0F, 0XC0, 0X01, 0XF8, 0X01, 0XF0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X0F, 0X80, 0X01, 0XF0, 0X60, 0XE0, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1E, 0X07, 0X03, 0XC0, 0XF0, 0XF0, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X3F, 0X87, 0X07, 0XF0, 0XF0, 0XF0, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X7F, 0X87, 0X0F, 0XF0, 0XF0, 0XF0, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0XFF, 0XE0, 0XF0, 0XF0, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X07, 0XFF, + 0XC0, 0XF0, 0XF0, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XFC, 0X01, 0XF0, + 0XF0, 0X87, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0XFC, 0X03, 0XF0, 0X60, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XFC, 0X01, 0XF8, 0X01, 0X08, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X07, 0XFC, 0X00, 0XFC, 0X02, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XE0, 0X7E, 0X06, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFF, 0XF0, 0X7F, 0XFC, 0X01, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC3, 0XFF, 0XF8, 0X7F, 0XFC, 0X03, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC3, 0XFF, + 0XF8, 0X7F, 0XF8, 0X03, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X7F, 0XC3, 0X0F, 0XF8, 0X7F, + 0XF8, 0X43, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X7F, 0XC3, 0X0F, 0XF8, 0X7F, 0XF0, 0X43, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X83, 0X07, 0XF0, 0X7F, 0XF0, 0XC3, 0XC3, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X07, 0X83, 0XE0, 0XFF, 0XE0, 0XC3, 0XC3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X07, 0X80, 0X00, 0XFF, 0XE1, 0XC1, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X00, 0X0F, 0XC0, 0X01, 0XFF, 0XC1, 0XE0, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, + 0X1F, 0XE0, 0X03, 0XFF, 0XC3, 0XF0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0XF8, + 0X0F, 0XFF, 0XC3, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XF0, 0X03, 0XFF, 0XFF, 0XC0, 0X0F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFC, + 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0XFF, 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF8, 0X00, 0X03, + 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X3F, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X01, 0XFF, 0XFF, 0XFE, 0X03, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, + 0XFF, 0X00, 0X00, 0X1F, 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X01, 0X00, 0XFF, 0XFF, 0XFC, 0X03, 0XFF, 0XE0, 0X00, 0X00, 0XFF, 0XFF, 0XFE, 0X00, + 0X00, 0X0F, 0XF8, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X3E, 0XF8, 0X3F, 0XFF, 0XF8, 0X03, 0XFF, 0XC0, 0X1E, 0X00, 0XFF, 0XFF, 0XFC, 0X01, 0XE0, 0X0F, + 0XF0, 0X07, 0X80, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFC, 0X7E, + 0X1F, 0XFF, 0XE0, 0X03, 0XFF, 0XC0, 0X3F, 0X80, 0X7F, 0XFF, 0XFC, 0X03, 0XF8, 0X07, 0XF0, 0X1F, + 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFC, 0X7F, 0X0F, 0XFF, + 0XC0, 0X03, 0XFF, 0X80, 0XFF, 0XC0, 0X7F, 0XFF, 0XF8, 0X0F, 0XFC, 0X07, 0XE0, 0X3F, 0XF0, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFC, 0X7F, 0XC7, 0XFF, 0X00, 0X03, + 0XFF, 0X80, 0XFF, 0XE0, 0X7F, 0XFF, 0XF8, 0X0F, 0XFE, 0X07, 0XE0, 0X3F, 0XF0, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0XFC, 0X7F, 0XE3, 0XFE, 0X00, 0X03, 0XFF, 0X81, + 0XFF, 0XE0, 0X7F, 0XFF, 0XF8, 0X1F, 0XFE, 0X07, 0XE0, 0X7F, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0XFC, 0X7F, 0XE3, 0XFE, 0X00, 0X03, 0XFF, 0XE1, 0XFF, 0XE0, + 0X7F, 0X03, 0XFE, 0X1F, 0XFE, 0X07, 0XE0, 0X7F, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X1F, 0XFC, 0X7F, 0XF1, 0XFE, 0X01, 0X03, 0XFF, 0XFF, 0XFF, 0XE0, 0X7F, 0X03, + 0XFF, 0XFF, 0XFE, 0X07, 0XC0, 0X7F, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X3F, 0XFC, 0X7F, 0XF8, 0XFE, 0X07, 0X03, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0X03, 0XFF, 0XFF, + 0XFC, 0X07, 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, + 0XFC, 0X7F, 0XF8, 0XFE, 0X1F, 0X03, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0X03, 0XFF, 0XFF, 0XF8, 0X0F, + 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, + 0XFC, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFE, 0X00, 0XFF, 0X03, 0XFF, 0XFF, 0XE0, 0X0F, 0XC0, 0XFF, + 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, 0XFC, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X01, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X1F, 0XC0, 0XFF, 0XFC, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, 0XFC, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XC0, 0X03, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFC, 0X7F, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, + 0XC0, 0X01, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X1F, 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFC, 0X7F, 0XFE, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X00, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X0F, 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0XFF, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X00, 0X7F, 0XFF, + 0XFF, 0XFC, 0X00, 0X07, 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X7F, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XC0, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFC, 0X03, 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, + 0XF1, 0XFF, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFE, 0X03, + 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XE3, 0XFF, + 0XFC, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XC0, 0XFF, + 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XC7, 0XFF, 0XFC, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XC0, 0XFF, 0XFC, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0X8F, 0XFF, 0XF8, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XC0, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0X1F, 0XFF, 0XF8, 0XFF, 0XFF, 0X03, 0XFF, 0XE1, + 0XFF, 0XF8, 0X1F, 0XFF, 0XFE, 0X1F, 0XFF, 0X81, 0XC0, 0X7F, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XBF, 0XFF, 0XF1, 0XFF, 0XFF, 0X03, 0XFF, 0X81, 0XFF, 0XF8, + 0X1F, 0XFF, 0XF8, 0X1F, 0XFF, 0X81, 0XE0, 0X7F, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X8F, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0X03, 0XFF, 0X80, 0XFF, 0XF8, 0X1F, 0XFF, + 0XF8, 0X0F, 0XFF, 0X81, 0XE0, 0X7F, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X8F, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0X03, 0XFF, 0X80, 0XFF, 0XF0, 0X1F, 0XFF, 0XF8, 0X0F, + 0XFF, 0X01, 0XE0, 0X3F, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, + 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0X03, 0XFF, 0XC0, 0X7F, 0XE0, 0X3F, 0XFF, 0XFC, 0X07, 0XFE, 0X03, + 0XE0, 0X3F, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFF, 0XFF, + 0X8F, 0XFF, 0XFF, 0X03, 0XFF, 0XC0, 0X3F, 0XC0, 0X3F, 0XFF, 0XFC, 0X03, 0XFC, 0X03, 0XF0, 0X1F, + 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFF, 0XFE, 0X1F, 0XFF, + 0XFF, 0X03, 0XFF, 0XC0, 0X0F, 0X00, 0X7F, 0XFF, 0XFC, 0X00, 0XF0, 0X07, 0XF0, 0X07, 0X80, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XF8, 0X3F, 0XFF, 0XFF, 0X03, + 0XFF, 0XE0, 0X00, 0X00, 0X7F, 0X03, 0XFE, 0X00, 0X00, 0X07, 0XF8, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X03, 0X80, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF0, + 0X00, 0X00, 0XFF, 0X03, 0XFF, 0X00, 0X00, 0X0F, 0XF8, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF8, 0X00, 0X01, + 0XFF, 0X03, 0XFF, 0X80, 0X00, 0X1F, 0XFC, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X00, 0X07, 0XFF, 0X03, + 0XFF, 0XC0, 0X00, 0X7F, 0XFF, 0X00, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0X03, 0XFF, 0XF8, + 0X01, 0XFF, 0XFF, 0XC0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char Bitmap240x320_4[] PROGMEM = +{ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEA, 0X3F, 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9B, 0XCF, 0XFC, 0X7F, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XBA, 0X37, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X7B, 0XDB, 0XFD, 0XDF, 0XF7, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0XFB, 0X6B, 0XFD, 0XE7, 0XCF, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFB, 0XB9, + 0XFD, 0XF3, 0X9F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XFB, 0XD5, 0XFD, 0XED, + 0X6F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XF9, 0XFD, 0XFD, 0XDE, 0XF7, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XFB, 0XD5, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFB, 0XB9, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0XFB, 0X6B, 0XFD, 0X7F, 0XFD, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X7B, 0XDB, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBA, 0X37, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9B, 0XCF, + 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCA, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X1F, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X3F, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFC, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFE, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, + 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X0F, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0X1F, + 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0X1F, 0XFF, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X07, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X07, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X83, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, + 0XFF, 0XFF, 0XFF, 0XF8, 0X1E, 0X7E, 0X67, 0XE6, 0X7E, 0X67, 0XE7, 0XFF, 0XFF, 0XFF, 0XC1, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, + 0XFF, 0XF0, 0X0E, 0X7E, 0X63, 0XE6, 0X3E, 0X63, 0XC7, 0XFF, 0XFF, 0XFF, 0XE0, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XE3, + 0XC6, 0X7E, 0X61, 0XE6, 0X1E, 0X73, 0XCF, 0XFF, 0XFF, 0XFF, 0XF0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XE7, 0XE6, 0X7E, + 0X61, 0XE6, 0X1E, 0X71, 0X8F, 0XFF, 0XFF, 0XFF, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XE3, 0XFE, 0X7E, 0X60, 0XE6, + 0X0E, 0X78, 0X1F, 0XFF, 0XFF, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7E, 0X7E, 0X64, 0X66, 0X46, 0X7C, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X0E, 0X7E, 0X66, 0X66, 0X66, 0X7C, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X06, 0X7E, 0X66, 0X26, 0X62, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE7, 0XE6, 0X7E, 0X67, 0X06, 0X70, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE7, 0XE6, 0X7E, 0X67, 0X86, 0X78, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, + 0XC6, 0X3C, 0X67, 0X86, 0X78, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X0F, 0X00, + 0XE7, 0XC6, 0X7C, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0X81, 0XE7, 0XE6, + 0X7E, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X30, 0X0F, 0X9C, 0X03, 0XFE, 0X7E, 0X7E, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0X30, 0X07, 0X9C, 0X01, 0XFC, 0X3E, 0X3C, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X9F, 0XF3, 0XE3, 0X9C, 0XF8, 0XFC, 0X3F, 0X3C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, + 0XF3, 0XF3, 0X9C, 0XFC, 0X78, 0X1F, 0X18, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XF3, + 0X9C, 0XFE, 0X79, 0X9F, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X73, 0XE3, 0X9C, 0XFE, + 0X79, 0X9F, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X70, 0X07, 0X9C, 0XFE, 0X71, 0X8F, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF0, 0X0F, 0X9C, 0XFE, 0X70, 0X0F, 0XE7, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0X8F, 0X9C, 0XFE, 0X60, 0X07, 0XE7, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XCF, 0X9C, 0XFC, 0X67, 0XE7, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X9F, 0XF3, 0XC7, 0X9C, 0XF8, 0XC7, 0XE3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, + 0XF3, 0XE3, 0X9C, 0X01, 0XCF, 0XF3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XF3, + 0X9C, 0X03, 0XCF, 0XF3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, + 0X7F, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, + 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XE0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XC0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X07, 0XFF, + 0X80, 0XFF, 0XFF, 0XC0, 0X7F, 0XC2, 0X1E, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X01, 0XFF, 0X00, 0X3F, + 0XFF, 0X00, 0X1F, 0XC7, 0X1C, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0XFC, 0X00, 0X1F, 0XFE, 0X00, + 0X0F, 0XC7, 0X18, 0X0F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0XFC, 0X00, 0X1F, 0XFC, 0X00, 0X0F, 0XC2, + 0X10, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XE0, 0X78, 0X1C, 0X0F, 0XF8, 0X1E, 0X07, 0XE0, 0X20, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC3, 0XF0, 0X78, 0X3E, 0X0F, 0XF8, 0X3F, 0X87, 0XE0, 0X20, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC3, 0XF8, 0X78, 0X7F, 0X0F, 0XF8, 0X7F, 0X87, 0XF0, 0X61, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X70, 0X7F, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X70, + 0XC0, 0XFF, 0XFF, 0XFE, 0X07, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X70, 0X00, 0X3F, + 0XFF, 0XE0, 0X0F, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XF0, 0X00, 0X1F, 0XFF, 0XE0, + 0X1F, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XF0, 0X00, 0X1F, 0XFF, 0XE0, 0X0F, 0XFF, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XF0, 0X3C, 0X0F, 0XFF, 0XE0, 0X07, 0XFF, 0XC3, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XF0, 0X7E, 0X0F, 0XFF, 0XFF, 0X03, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X07, 0XF0, 0XFF, 0X0F, 0XFF, 0XFF, 0X83, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X0F, 0XF0, 0XFF, 0X0F, 0XFF, 0XFF, 0XC3, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XF0, + 0XFF, 0X0F, 0XFF, 0XFF, 0XC3, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XF8, 0X7E, 0X0F, + 0XF8, 0X7F, 0XC3, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XF8, 0X3C, 0X0F, 0XF8, 0X7F, + 0XC3, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X78, 0X00, 0X1F, 0X18, 0X3F, 0X83, 0XFF, + 0XF0, 0X1F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X7C, 0X00, 0X3F, 0X1C, 0X1F, 0X07, 0XFF, 0XF8, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X7E, 0X00, 0X7F, 0X1C, 0X00, 0X07, 0XFF, 0XFE, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC0, 0X00, 0X7F, 0X80, 0XFF, 0X1E, 0X00, 0X0F, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0XFC, + 0X07, 0XFE, 0X07, 0XF8, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X1F, 0XF0, 0X01, 0XFC, + 0X03, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X0F, 0XE0, 0X00, 0XF8, 0X01, 0XF0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X0F, 0XE0, 0X00, 0XF0, 0X60, 0XE0, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1E, 0X07, 0XC0, 0XE0, 0X70, 0XF0, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X3F, 0X87, 0XC3, 0XF0, 0X70, 0XF0, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X7F, 0X87, 0XC3, 0XF8, 0X70, 0XF0, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0XFF, 0XF8, 0X70, 0XF0, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X07, 0XFF, + 0XF8, 0X70, 0XF0, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XFF, 0XF0, 0X70, + 0XF0, 0X87, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0XFF, 0XE0, 0XF0, 0X60, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XFF, 0XC1, 0XF8, 0X01, 0X08, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X07, 0XFF, 0X81, 0XFC, 0X02, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0X03, 0XFE, 0X06, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFE, 0X07, 0XFF, 0XFC, 0X01, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC3, 0XFC, 0X0F, 0XFF, 0XFC, 0X03, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC3, 0XF8, + 0X3F, 0XFF, 0XF8, 0X03, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X7F, 0XC3, 0XF0, 0X7F, 0XFF, + 0XF8, 0X43, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X7F, 0XC3, 0XE0, 0XFF, 0XFF, 0XF0, 0X43, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X83, 0XE0, 0X00, 0X7F, 0XF0, 0XC3, 0XC3, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X07, 0XC0, 0X00, 0X7F, 0XE0, 0XC3, 0XC3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X07, 0XC0, 0X00, 0X7F, 0XE1, 0XC1, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X00, 0X0F, 0XC0, 0X00, 0X7F, 0XC1, 0XE0, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XC3, 0XF0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0XFF, + 0XFF, 0XFF, 0XC3, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XF0, 0X03, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFC, + 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF8, 0X00, 0X03, + 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X3F, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X01, 0XFF, 0XFF, 0XFE, 0X03, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, + 0XFF, 0X00, 0X00, 0X1F, 0XFF, 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X01, 0X00, 0XFF, 0XFF, 0XFC, 0X03, 0XFF, 0XE0, 0X00, 0X00, 0XFF, 0XFF, 0XFE, 0X00, + 0X00, 0X0F, 0XFF, 0XF8, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X3E, 0XF8, 0X3F, 0XFF, 0XF8, 0X03, 0XFF, 0XC0, 0X1E, 0X00, 0XFF, 0XFF, 0XFC, 0X01, 0XE0, 0X0F, + 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFC, 0X7E, + 0X1F, 0XFF, 0XE0, 0X03, 0XFF, 0XC0, 0X3F, 0X80, 0X7F, 0XFF, 0XFC, 0X03, 0XF8, 0X07, 0XFF, 0XC0, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFC, 0X7F, 0X0F, 0XFF, + 0XC0, 0X03, 0XFF, 0X80, 0XFF, 0XC0, 0X7F, 0XFF, 0XF8, 0X0F, 0XFC, 0X07, 0XFF, 0X80, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFC, 0X7F, 0XC7, 0XFF, 0X00, 0X03, + 0XFF, 0X80, 0XFF, 0XE0, 0X7F, 0XFF, 0XF8, 0X0F, 0XFE, 0X07, 0XFE, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0XFC, 0X7F, 0XE3, 0XFE, 0X00, 0X03, 0XFF, 0X81, + 0XFF, 0XE0, 0X7F, 0XFF, 0XF8, 0X1F, 0XFE, 0X07, 0XFC, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0XFC, 0X7F, 0XE3, 0XFE, 0X00, 0X03, 0XFF, 0XE1, 0XFF, 0XE0, + 0X7F, 0X03, 0XFE, 0X1F, 0XFE, 0X07, 0XFC, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X1F, 0XFC, 0X7F, 0XF1, 0XFE, 0X01, 0X03, 0XFF, 0XFF, 0XFF, 0XE0, 0X7F, 0X03, + 0XFF, 0XFF, 0XFE, 0X07, 0XFC, 0X02, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X3F, 0XFC, 0X7F, 0XF8, 0XFE, 0X07, 0X03, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0X03, 0XFF, 0XFF, + 0XFC, 0X07, 0XFC, 0X0E, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, + 0XFC, 0X7F, 0XF8, 0XFE, 0X1F, 0X03, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0X03, 0XFF, 0XFF, 0XF8, 0X0F, + 0XFC, 0X3E, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, + 0XFC, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFE, 0X00, 0XFF, 0X03, 0XFF, 0XFF, 0XE0, 0X0F, 0XFF, 0XFE, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, 0XFC, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X01, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X1F, 0XFF, 0XFE, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, 0XFC, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XC0, 0X03, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFC, 0X7F, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, + 0XC0, 0X01, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X1F, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFC, 0X7F, 0XFE, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X00, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X0F, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0XFF, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X00, 0X7F, 0XFF, + 0XFF, 0XFC, 0X00, 0X07, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X7F, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XC0, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFC, 0X03, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, + 0XF1, 0XFF, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFE, 0X03, + 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XE3, 0XFF, + 0XFC, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFE, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XC7, 0XFF, 0XFC, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFE, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0X8F, 0XFF, 0XF8, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0X1F, 0XFF, 0XF8, 0XFF, 0XFF, 0X03, 0XFF, 0XE1, + 0XFF, 0XF8, 0X1F, 0XFF, 0XFE, 0X1F, 0XFF, 0X81, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XBF, 0XFF, 0XF1, 0XFF, 0XFF, 0X03, 0XFF, 0X81, 0XFF, 0XF8, + 0X1F, 0XFF, 0XF8, 0X1F, 0XFF, 0X81, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X8F, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0X03, 0XFF, 0X80, 0XFF, 0XF8, 0X1F, 0XFF, + 0XF8, 0X0F, 0XFF, 0X81, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X8F, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0X03, 0XFF, 0X80, 0XFF, 0XF0, 0X1F, 0XFF, 0XF8, 0X0F, + 0XFF, 0X01, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, + 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0X03, 0XFF, 0XC0, 0X7F, 0XE0, 0X3F, 0XFF, 0XFC, 0X07, 0XFE, 0X03, + 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFF, 0XFF, + 0X8F, 0XFF, 0XFF, 0X03, 0XFF, 0XC0, 0X3F, 0XC0, 0X3F, 0XFF, 0XFC, 0X03, 0XFC, 0X03, 0XFF, 0XFE, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFF, 0XFE, 0X1F, 0XFF, + 0XFF, 0X03, 0XFF, 0XC0, 0X0F, 0X00, 0X7F, 0XFF, 0XFC, 0X00, 0XF0, 0X07, 0XFF, 0XFE, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XF8, 0X3F, 0XFF, 0XFF, 0X03, + 0XFF, 0XE0, 0X00, 0X00, 0X7F, 0X03, 0XFE, 0X00, 0X00, 0X07, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X03, 0X80, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF0, + 0X00, 0X00, 0XFF, 0X03, 0XFF, 0X00, 0X00, 0X0F, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF8, 0X00, 0X01, + 0XFF, 0X03, 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X00, 0X07, 0XFF, 0X03, + 0XFF, 0XC0, 0X00, 0X7F, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0X03, 0XFF, 0XF8, + 0X01, 0XFF, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +const unsigned char Bitmap240x320_5[] PROGMEM = +{ + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XEA, 0X3F, 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9B, 0XCF, 0XFC, 0X7F, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XBA, 0X37, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X7B, 0XDB, 0XFD, 0XDF, 0XF7, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0XFB, 0X6B, 0XFD, 0XE7, 0XCF, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFB, 0XB9, + 0XFD, 0XF3, 0X9F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XFB, 0XD5, 0XFD, 0XED, + 0X6F, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XF9, 0XFD, 0XFD, 0XDE, 0XF7, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XB7, 0XFB, 0XD5, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0XFB, 0XB9, 0XFD, 0XBF, 0XFB, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0XFB, 0X6B, 0XFD, 0X7F, 0XFD, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X7B, 0XDB, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XBA, 0X37, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9B, 0XCF, + 0XFC, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XCA, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF8, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X1F, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X3F, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFC, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFE, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, + 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, + 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X3F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, + 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X0F, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0X1F, + 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0X1F, 0XFF, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X07, 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X07, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X83, 0X8F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, + 0XFF, 0XFF, 0XFF, 0XF8, 0X1E, 0X7E, 0X67, 0XE6, 0X7E, 0X67, 0XE7, 0XFF, 0XFF, 0XFF, 0XC1, 0X8F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, + 0XFF, 0XF0, 0X0E, 0X7E, 0X63, 0XE6, 0X3E, 0X63, 0XC7, 0XFF, 0XFF, 0XFF, 0XE0, 0X8F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XE3, + 0XC6, 0X7E, 0X61, 0XE6, 0X1E, 0X73, 0XCF, 0XFF, 0XFF, 0XFF, 0XF0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XE7, 0XE6, 0X7E, + 0X61, 0XE6, 0X1E, 0X71, 0X8F, 0XFF, 0XFF, 0XFF, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XE3, 0XFE, 0X7E, 0X60, 0XE6, + 0X0E, 0X78, 0X1F, 0XFF, 0XFF, 0XFF, 0XFC, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7E, 0X7E, 0X64, 0X66, 0X46, 0X7C, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X0E, 0X7E, 0X66, 0X66, 0X66, 0X7C, 0X3F, 0XFF, + 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X06, 0X7E, 0X66, 0X26, 0X62, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE7, 0XE6, 0X7E, 0X67, 0X06, 0X70, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE7, 0XE6, 0X7E, 0X67, 0X86, 0X78, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE3, + 0XC6, 0X3C, 0X67, 0X86, 0X78, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X0F, 0X00, + 0XE7, 0XC6, 0X7C, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0X81, 0XE7, 0XE6, + 0X7E, 0X7E, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X30, 0X0F, 0X9C, 0X03, 0XFE, 0X7E, 0X7E, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X80, 0X30, 0X07, 0X9C, 0X01, 0XFC, 0X3E, 0X3C, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X9F, 0XF3, 0XE3, 0X9C, 0XF8, 0XFC, 0X3F, 0X3C, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, + 0XF3, 0XF3, 0X9C, 0XFC, 0X78, 0X1F, 0X18, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XF3, + 0X9C, 0XFE, 0X79, 0X9F, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X73, 0XE3, 0X9C, 0XFE, + 0X79, 0X9F, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X70, 0X07, 0X9C, 0XFE, 0X71, 0X8F, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF0, 0X0F, 0X9C, 0XFE, 0X70, 0X0F, 0XE7, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0X8F, 0X9C, 0XFE, 0X60, 0X07, 0XE7, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XCF, 0X9C, 0XFC, 0X67, 0XE7, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X9F, 0XF3, 0XC7, 0X9C, 0XF8, 0XC7, 0XE3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, + 0XF3, 0XE3, 0X9C, 0X01, 0XCF, 0XF3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X9F, 0XF3, 0XF3, + 0X9C, 0X03, 0XCF, 0XF3, 0XE7, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, + 0X7F, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, + 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0XFF, 0XFF, 0XE0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X0F, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X07, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFF, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0XFF, 0XFE, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XC0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X07, 0XFF, + 0X80, 0XFF, 0XFF, 0X80, 0XFF, 0XC2, 0X1E, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X01, 0XFF, 0X00, 0X3F, + 0XFF, 0X00, 0X3F, 0XC7, 0X1C, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0XFC, 0X00, 0X1F, 0XFC, 0X00, + 0X1F, 0XC7, 0X18, 0X0F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0XFC, 0X00, 0X1F, 0XFC, 0X00, 0X1F, 0XC2, + 0X10, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0XE0, 0X78, 0X1C, 0X0F, 0XF8, 0X1C, 0X0F, 0XE0, 0X20, 0X7F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC3, 0XF0, 0X78, 0X3E, 0X0F, 0XF8, 0X3E, 0X0F, 0XE0, 0X20, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC3, 0XF8, 0X78, 0X7F, 0X0F, 0XF8, 0X7F, 0X0F, 0XF0, 0X61, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X70, 0X7F, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X70, + 0XC0, 0XFF, 0XF0, 0XC0, 0XFF, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X70, 0X00, 0X3F, + 0XF0, 0X00, 0X3F, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XF0, 0X00, 0X1F, 0XF0, 0X00, + 0X1F, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC1, 0XF0, 0X00, 0X1F, 0XF0, 0X00, 0X1F, 0XFF, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XF0, 0X3C, 0X0F, 0XF0, 0X3C, 0X0F, 0XFF, 0XC3, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XF0, 0X7E, 0X0F, 0XF0, 0X7E, 0X0F, 0XFF, 0XC3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X07, 0XF0, 0XFF, 0X0F, 0XF0, 0XFF, 0X0F, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X0F, 0XF0, 0XFF, 0X0F, 0XF0, 0XFF, 0X0F, 0XFF, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XF0, + 0XFF, 0X0F, 0XF0, 0XFF, 0X0F, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0X7F, 0XF8, 0X7E, 0X0F, + 0XF8, 0X7E, 0X0F, 0XFF, 0XE0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0XFF, 0XF8, 0X3C, 0X0F, 0XF8, 0X3C, + 0X0F, 0XFF, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X00, 0X78, 0X00, 0X1F, 0X18, 0X00, 0X1F, 0XFF, + 0XF0, 0X1F, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X7C, 0X00, 0X3F, 0X1C, 0X00, 0X3F, 0XFF, 0XF8, 0X00, + 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0X7E, 0X00, 0X7F, 0X1E, 0X00, 0X7F, 0XFF, 0XFE, 0X00, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XC0, 0X00, 0X7F, 0X80, 0XFF, 0X1F, 0X80, 0XFF, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0XFF, + 0XFF, 0XFE, 0X07, 0XF8, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X1F, 0XF8, 0X0F, 0XFC, + 0X03, 0XF0, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X00, 0X0F, 0XF0, 0X03, 0XF8, 0X01, 0XF0, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X0F, 0XC0, 0X01, 0XF0, 0X60, 0XE0, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X1E, 0X07, 0XC0, 0X01, 0XF0, 0XF0, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XF8, 0X3F, 0X87, 0X81, 0XC0, 0XF0, 0XF0, 0XE1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XF8, 0X7F, 0X87, 0X83, 0XE0, 0XF0, 0XF0, 0XC1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X07, 0X87, 0XF0, 0XF0, 0XF0, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X07, 0X07, + 0XFF, 0XF0, 0XF0, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0X0C, 0X0F, 0XF0, + 0XF0, 0X87, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X1F, 0X00, 0X03, 0XF0, 0X60, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X0F, 0X00, 0X01, 0XF8, 0X01, 0X08, 0X1F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE0, 0X07, 0X00, 0X01, 0XFC, 0X02, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0X03, 0XC0, 0XFE, 0X06, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0X83, 0X07, 0XE0, 0XFF, 0XFC, 0X01, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XC3, 0X0F, 0XF0, 0XFF, 0XFC, 0X03, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC3, 0X0F, + 0XF0, 0XFF, 0XF8, 0X03, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X7F, 0XC3, 0X0F, 0XF0, 0XFF, + 0XF8, 0X43, 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X7F, 0XC3, 0X87, 0XE0, 0XFF, 0XF0, 0X43, + 0XC3, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0X83, 0X83, 0XC0, 0XFF, 0XF0, 0XC3, 0XC3, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X1F, 0X07, 0X80, 0X01, 0XFF, 0XE0, 0XC3, 0XC3, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X07, 0XC0, 0X03, 0XFF, 0XE1, 0XC1, 0X83, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X00, 0X0F, 0XE0, 0X07, 0XFF, 0XC1, 0XE0, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, + 0X1F, 0XF8, 0X0F, 0XFF, 0XC3, 0XF0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0XFF, + 0XFF, 0XFF, 0XC3, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF1, 0XFF, 0XFF, 0XFF, 0XFF, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, + 0XFF, 0XFF, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XF0, 0X03, 0XFF, 0XFF, 0XF0, 0X03, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X83, 0XFF, 0XFC, + 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XC0, 0X00, 0XFF, 0XFF, 0XC0, 0X00, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF8, 0X00, 0X03, + 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X3F, 0XFF, 0X80, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X01, 0XFF, 0XFF, 0XFE, 0X03, 0XFF, 0XF0, 0X00, 0X01, 0XFF, 0XFF, + 0XFF, 0X00, 0X00, 0X1F, 0XFF, 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFE, 0X01, 0X00, 0XFF, 0XFF, 0XFC, 0X03, 0XFF, 0XE0, 0X00, 0X00, 0XFF, 0XFF, 0XFE, 0X00, + 0X00, 0X0F, 0XFE, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, + 0X3E, 0XF8, 0X3F, 0XFF, 0XF8, 0X03, 0XFF, 0XC0, 0X1E, 0X00, 0XFF, 0XFF, 0XFC, 0X01, 0XE0, 0X0F, + 0XFC, 0X01, 0XE0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFC, 0X7E, + 0X1F, 0XFF, 0XE0, 0X03, 0XFF, 0XC0, 0X3F, 0X80, 0X7F, 0XFF, 0XFC, 0X03, 0XF8, 0X07, 0XFC, 0X03, + 0XF8, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFC, 0X7F, 0X0F, 0XFF, + 0XC0, 0X03, 0XFF, 0X80, 0XFF, 0XC0, 0X7F, 0XFF, 0XF8, 0X0F, 0XFC, 0X07, 0XF8, 0X0F, 0XFC, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, 0XFC, 0X7F, 0XC7, 0XFF, 0X00, 0X03, + 0XFF, 0X80, 0XFF, 0XE0, 0X7F, 0XFF, 0XF8, 0X0F, 0XFE, 0X07, 0XF8, 0X0F, 0XFE, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0XFC, 0X7F, 0XE3, 0XFE, 0X00, 0X03, 0XFF, 0X81, + 0XFF, 0XE0, 0X7F, 0XFF, 0XF8, 0X1F, 0XFE, 0X07, 0XF8, 0X1F, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X8F, 0XFC, 0X7F, 0XE3, 0XFE, 0X00, 0X03, 0XFF, 0XE1, 0XFF, 0XE0, + 0X7F, 0X03, 0XFE, 0X1F, 0XFE, 0X07, 0XFE, 0X1F, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X1F, 0XFC, 0X7F, 0XF1, 0XFE, 0X01, 0X03, 0XFF, 0XFF, 0XFF, 0XE0, 0X7F, 0X03, + 0XFF, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFE, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFE, 0X3F, 0XFC, 0X7F, 0XF8, 0XFE, 0X07, 0X03, 0XFF, 0XFF, 0XFF, 0XC0, 0X7F, 0X03, 0XFF, 0XFF, + 0XFC, 0X07, 0XFF, 0XFF, 0XFC, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, + 0XFC, 0X7F, 0XF8, 0XFE, 0X1F, 0X03, 0XFF, 0XFF, 0XFF, 0X80, 0XFF, 0X03, 0XFF, 0XFF, 0XF8, 0X0F, + 0XFF, 0XFF, 0XF8, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, + 0XFC, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFE, 0X00, 0XFF, 0X03, 0XFF, 0XFF, 0XE0, 0X0F, 0XFF, 0XFF, + 0XE0, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, 0XFC, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X01, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X1F, 0XFF, 0XFC, 0X00, 0X1F, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XFC, 0X7F, 0XFC, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XC0, 0X03, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFC, 0X00, 0X3F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X7F, 0XFC, 0X7F, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, + 0XC0, 0X01, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X1F, 0XFF, 0XFC, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0XFF, 0XFC, 0X7F, 0XFE, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X00, + 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X0F, 0XFF, 0XFC, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0XFF, 0XFC, 0XFF, 0XFE, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XC0, 0X00, 0X7F, 0XFF, + 0XFF, 0XFC, 0X00, 0X07, 0XFF, 0XFC, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFC, 0X7F, 0XF8, 0XFF, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XC0, 0X3F, 0XFF, 0XFF, 0XFF, + 0XFC, 0X03, 0XFF, 0XFF, 0XFC, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, + 0XF1, 0XFF, 0XFC, 0X7F, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XE0, 0X3F, 0XFF, 0XFF, 0XFF, 0XFE, 0X03, + 0XFF, 0XFF, 0XFE, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XE3, 0XFF, + 0XFC, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, + 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X7F, 0XC7, 0XFF, 0XFC, 0XFF, + 0XFF, 0X03, 0XFF, 0XFF, 0XFF, 0XF0, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0X01, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0X8F, 0XFF, 0XF8, 0XFF, 0XFF, 0X03, + 0XFF, 0XFF, 0XFF, 0XF8, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0X81, 0XFF, 0XFF, 0XFF, 0X81, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X3F, 0X1F, 0XFF, 0XF8, 0XFF, 0XFF, 0X03, 0XFF, 0XE1, + 0XFF, 0XF8, 0X1F, 0XFF, 0XFE, 0X1F, 0XFF, 0X81, 0XFE, 0X1F, 0XFF, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X1F, 0XBF, 0XFF, 0XF1, 0XFF, 0XFF, 0X03, 0XFF, 0X81, 0XFF, 0XF8, + 0X1F, 0XFF, 0XF8, 0X1F, 0XFF, 0X81, 0XF8, 0X1F, 0XFF, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0X8F, 0XFF, 0XFF, 0XF3, 0XFF, 0XFF, 0X03, 0XFF, 0X80, 0XFF, 0XF8, 0X1F, 0XFF, + 0XF8, 0X0F, 0XFF, 0X81, 0XF8, 0X0F, 0XFF, 0X81, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0X8F, 0XFF, 0XFF, 0XE3, 0XFF, 0XFF, 0X03, 0XFF, 0X80, 0XFF, 0XF0, 0X1F, 0XFF, 0XF8, 0X0F, + 0XFF, 0X01, 0XF8, 0X0F, 0XFF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XC7, + 0XFF, 0XFF, 0XC7, 0XFF, 0XFF, 0X03, 0XFF, 0XC0, 0X7F, 0XE0, 0X3F, 0XFF, 0XFC, 0X07, 0XFE, 0X03, + 0XFC, 0X07, 0XFE, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XE1, 0XFF, 0XFF, + 0X8F, 0XFF, 0XFF, 0X03, 0XFF, 0XC0, 0X3F, 0XC0, 0X3F, 0XFF, 0XFC, 0X03, 0XFC, 0X03, 0XFC, 0X03, + 0XFC, 0X03, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF0, 0XFF, 0XFE, 0X1F, 0XFF, + 0XFF, 0X03, 0XFF, 0XC0, 0X0F, 0X00, 0X7F, 0XFF, 0XFC, 0X00, 0XF0, 0X07, 0XFC, 0X00, 0XF0, 0X07, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XF8, 0X3F, 0XFF, 0XFF, 0X03, + 0XFF, 0XE0, 0X00, 0X00, 0X7F, 0X03, 0XFE, 0X00, 0X00, 0X07, 0XFE, 0X00, 0X00, 0X07, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFE, 0X03, 0X80, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF0, + 0X00, 0X00, 0XFF, 0X03, 0XFF, 0X00, 0X00, 0X0F, 0XFF, 0X00, 0X00, 0X0F, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X01, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XF8, 0X00, 0X01, + 0XFF, 0X03, 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0X80, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X3F, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFC, 0X00, 0X07, 0XFF, 0X03, + 0XFF, 0XC0, 0X00, 0X7F, 0XFF, 0XC0, 0X00, 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X03, 0XFF, 0XFF, 0X80, 0X1F, 0XFF, 0X03, 0XFF, 0XF8, + 0X01, 0XFF, 0XFF, 0XF8, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, +}; + +#endif diff --git a/src/epd/GxEPD2_1160_T91.cpp b/src/epd/GxEPD2_1160_T91.cpp index f767569c..3b9bc36b 100644 --- a/src/epd/GxEPD2_1160_T91.cpp +++ b/src/epd/GxEPD2_1160_T91.cpp @@ -20,28 +20,29 @@ GxEPD2_1160_T91::GxEPD2_1160_T91(int16_t cs, int16_t dc, int16_t rst, int16_t bu void GxEPD2_1160_T91::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_1160_T91::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_1160_T91::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - _writeScreenBuffer(0x26, value); // set previous _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_1160_T91::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -58,20 +59,19 @@ void GxEPD2_1160_T91::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, i void GxEPD2_1160_T91::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_1160_T91::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_1160_T91::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int32_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -85,7 +85,8 @@ void GxEPD2_1160_T91::_writeImage(uint8_t command, const uint8_t bitmap[], int16 w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -125,14 +126,13 @@ void GxEPD2_1160_T91::writeImagePart(const uint8_t bitmap[], int16_t x_part, int void GxEPD2_1160_T91::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImagePart(0x26, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImagePart(0x26, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_1160_T91::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -152,7 +152,8 @@ void GxEPD2_1160_T91::_writeImagePart(uint8_t command, const uint8_t bitmap[], i w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -253,7 +254,6 @@ void GxEPD2_1160_T91::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -274,7 +274,6 @@ void GxEPD2_1160_T91::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -292,6 +291,7 @@ void GxEPD2_1160_T91::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x3); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -367,6 +367,8 @@ void GxEPD2_1160_T91::_InitDisplay() _writeCommand(0x20); _waitWhileBusy("_InitDisplay", power_on_time); _setPartialRamArea(0, 0, WIDTH, HEIGHT); + _using_partial_mode = false; + _init_display_done = true; } const uint8_t GxEPD2_1160_T91::lut_partial[] PROGMEM = @@ -384,16 +386,8 @@ const uint8_t GxEPD2_1160_T91::lut_partial[] PROGMEM = 0x22, 0x22, 0x22, 0x22, 0x22 }; -void GxEPD2_1160_T91::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - void GxEPD2_1160_T91::_Init_Part() { - _InitDisplay(); if (hasFastPartialUpdate) { _writeCommand(0x3C); // Border Waveform Control @@ -401,12 +395,13 @@ void GxEPD2_1160_T91::_Init_Part() _writeCommand(0x32); _writeDataPGM(lut_partial, sizeof(lut_partial)); } - _PowerOn(); _using_partial_mode = true; } void GxEPD2_1160_T91::_Update_Full() { + _using_partial_mode = false; + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -415,6 +410,8 @@ void GxEPD2_1160_T91::_Update_Full() void GxEPD2_1160_T91::_Update_Part() { + if (!_using_partial_mode) _Init_Part(); + _PowerOn(); _writeCommand(0x22); _writeData(0xcc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_1160_T91.h b/src/epd/GxEPD2_1160_T91.h index 41b19a60..b2fcce33 100644 --- a/src/epd/GxEPD2_1160_T91.h +++ b/src/epd/GxEPD2_1160_T91.h @@ -74,7 +74,6 @@ class GxEPD2_1160_T91 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); void _Init_Part(); void _Update_Full(); void _Update_Part(); diff --git a/src/epd/GxEPD2_150_BN.cpp b/src/epd/GxEPD2_150_BN.cpp index bfb3ddfb..3fd6e726 100644 --- a/src/epd/GxEPD2_150_BN.cpp +++ b/src/epd/GxEPD2_150_BN.cpp @@ -21,28 +21,29 @@ GxEPD2_150_BN::GxEPD2_150_BN(int16_t cs, int16_t dc, int16_t rst, int16_t busy) void GxEPD2_150_BN::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_150_BN::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_150_BN::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - _writeScreenBuffer(0x26, value); // set previous _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_150_BN::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -59,8 +60,8 @@ void GxEPD2_150_BN::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int void GxEPD2_150_BN::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_150_BN::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) @@ -71,7 +72,6 @@ void GxEPD2_150_BN::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y void GxEPD2_150_BN::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -85,7 +85,8 @@ void GxEPD2_150_BN::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -132,7 +133,6 @@ void GxEPD2_150_BN::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, void GxEPD2_150_BN::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -152,7 +152,8 @@ void GxEPD2_150_BN::_writeImagePart(uint8_t command, const uint8_t bitmap[], int w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -253,7 +254,6 @@ void GxEPD2_150_BN::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -274,7 +274,6 @@ void GxEPD2_150_BN::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -292,6 +291,7 @@ void GxEPD2_150_BN::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -354,6 +354,8 @@ void GxEPD2_150_BN::_InitDisplay() _writeCommand(0x18); // Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); + _using_partial_mode = false; + _init_display_done = true; } const unsigned char GxEPD2_150_BN::lut_partial[] PROGMEM = @@ -378,32 +380,28 @@ const unsigned char GxEPD2_150_BN::lut_partial[] PROGMEM = 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, }; -void GxEPD2_150_BN::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - void GxEPD2_150_BN::_Init_Part() { - _InitDisplay(); _writeCommand(0x32); _writeDataPGM(lut_partial, sizeof(lut_partial)); - _PowerOn(); _using_partial_mode = true; } void GxEPD2_150_BN::_Update_Full() { + _using_partial_mode = false; + _PowerOn(); _writeCommand(0x22); _writeData(0xf7); // immediate power off _writeCommand(0x20); _waitWhileBusy("_Update_Full", full_refresh_time); + _power_is_on = false; } void GxEPD2_150_BN::_Update_Part() { + if (!_using_partial_mode) _Init_Part(); + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_150_BN.h b/src/epd/GxEPD2_150_BN.h index bc46a450..1a0924ce 100644 --- a/src/epd/GxEPD2_150_BN.h +++ b/src/epd/GxEPD2_150_BN.h @@ -75,7 +75,6 @@ class GxEPD2_150_BN : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); void _Init_Part(); void _Update_Full(); void _Update_Part(); diff --git a/src/epd/GxEPD2_154_D67.cpp b/src/epd/GxEPD2_154_D67.cpp index 0995040e..648985dd 100644 --- a/src/epd/GxEPD2_154_D67.cpp +++ b/src/epd/GxEPD2_154_D67.cpp @@ -20,27 +20,29 @@ GxEPD2_154_D67::GxEPD2_154_D67(int16_t cs, int16_t dc, int16_t rst, int16_t busy void GxEPD2_154_D67::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_154_D67::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_154_D67::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_154_D67::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,18 +59,17 @@ void GxEPD2_154_D67::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, in void GxEPD2_154_D67::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_154_D67::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_154_D67::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -82,7 +83,8 @@ void GxEPD2_154_D67::_writeImage(uint8_t command, const uint8_t bitmap[], int16_ w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -128,7 +130,6 @@ void GxEPD2_154_D67::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, void GxEPD2_154_D67::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -148,7 +149,8 @@ void GxEPD2_154_D67::_writeImagePart(uint8_t command, const uint8_t bitmap[], in w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -249,7 +251,6 @@ void GxEPD2_154_D67::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -270,7 +271,6 @@ void GxEPD2_154_D67::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -288,6 +288,7 @@ void GxEPD2_154_D67::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -350,24 +351,12 @@ void GxEPD2_154_D67::_InitDisplay() _writeCommand(0x18); // Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_154_D67::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_154_D67::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_154_D67::_Update_Full() { + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -376,6 +365,7 @@ void GxEPD2_154_D67::_Update_Full() void GxEPD2_154_D67::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_154_D67.h b/src/epd/GxEPD2_154_D67.h index 5809b632..3de62516 100644 --- a/src/epd/GxEPD2_154_D67.h +++ b/src/epd/GxEPD2_154_D67.h @@ -74,8 +74,6 @@ class GxEPD2_154_D67 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/epd/GxEPD2_213_B72.cpp b/src/epd/GxEPD2_213_B72.cpp index d54d88c5..cc0c0416 100644 --- a/src/epd/GxEPD2_213_B72.cpp +++ b/src/epd/GxEPD2_213_B72.cpp @@ -20,7 +20,7 @@ GxEPD2_213_B72::GxEPD2_213_B72(int16_t cs, int16_t dc, int16_t rst, int16_t busy void GxEPD2_213_B72::clearScreen(uint8_t value) { writeScreenBuffer(value); - refresh(true); + refresh(false); writeScreenBufferAgain(value); } diff --git a/src/epd/GxEPD2_213_B74.cpp b/src/epd/GxEPD2_213_B74.cpp index 6c8fe2c5..c25233ae 100644 --- a/src/epd/GxEPD2_213_B74.cpp +++ b/src/epd/GxEPD2_213_B74.cpp @@ -20,27 +20,29 @@ GxEPD2_213_B74::GxEPD2_213_B74(int16_t cs, int16_t dc, int16_t rst, int16_t busy void GxEPD2_213_B74::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_213_B74::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_213_B74::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_213_B74::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,19 +59,19 @@ void GxEPD2_213_B74::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, in void GxEPD2_213_B74::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_213_B74::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_213_B74::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -83,7 +85,8 @@ void GxEPD2_213_B74::_writeImage(uint8_t command, const uint8_t bitmap[], int16_ w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -123,13 +126,13 @@ void GxEPD2_213_B74::writeImagePart(const uint8_t bitmap[], int16_t x_part, int1 void GxEPD2_213_B74::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImagePart(0x26, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_213_B74::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -149,7 +152,8 @@ void GxEPD2_213_B74::_writeImagePart(uint8_t command, const uint8_t bitmap[], in w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -250,7 +254,6 @@ void GxEPD2_213_B74::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -271,7 +274,6 @@ void GxEPD2_213_B74::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -289,6 +291,7 @@ void GxEPD2_213_B74::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -354,24 +357,12 @@ void GxEPD2_213_B74::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_213_B74::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_213_B74::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_213_B74::_Update_Full() { + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -380,6 +371,7 @@ void GxEPD2_213_B74::_Update_Full() void GxEPD2_213_B74::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_213_B74.h b/src/epd/GxEPD2_213_B74.h index 5e860243..c5fb4dbe 100644 --- a/src/epd/GxEPD2_213_B74.h +++ b/src/epd/GxEPD2_213_B74.h @@ -74,8 +74,6 @@ class GxEPD2_213_B74 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/epd/GxEPD2_213_BN.cpp b/src/epd/GxEPD2_213_BN.cpp index 34b2b395..1c2b12e0 100644 --- a/src/epd/GxEPD2_213_BN.cpp +++ b/src/epd/GxEPD2_213_BN.cpp @@ -5,7 +5,7 @@ // Controller : SSD1680 : https://www.good-display.com/companyfile/101.html // Display: LILYGO® T5 V2.3.1 2.13 inch : https://www.aliexpress.com/item/32869729970.html // -// Author: Jean-Marc Zingg/ +// Author: Jean-Marc Zingg // // Version: see library.properties // @@ -20,28 +20,29 @@ GxEPD2_213_BN::GxEPD2_213_BN(int16_t cs, int16_t dc, int16_t rst, int16_t busy) void GxEPD2_213_BN::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_213_BN::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_213_BN::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - _writeScreenBuffer(0x26, value); // set previous _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_213_BN::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -59,10 +60,9 @@ void GxEPD2_213_BN::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int void GxEPD2_213_BN::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } - void GxEPD2_213_BN::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous @@ -71,7 +71,6 @@ void GxEPD2_213_BN::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y void GxEPD2_213_BN::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -85,7 +84,8 @@ void GxEPD2_213_BN::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -117,22 +117,21 @@ void GxEPD2_213_BN::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t } void GxEPD2_213_BN::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); } void GxEPD2_213_BN::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImagePart(0x26, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_213_BN::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -152,7 +151,8 @@ void GxEPD2_213_BN::_writeImagePart(uint8_t command, const uint8_t bitmap[], int w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -192,7 +192,7 @@ void GxEPD2_213_BN::writeImage(const uint8_t* black, const uint8_t* color, int16 } void GxEPD2_213_BN::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, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { if (black) { @@ -216,7 +216,7 @@ void GxEPD2_213_BN::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int1 } void GxEPD2_213_BN::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); refresh(x, y, w, h); @@ -232,7 +232,7 @@ void GxEPD2_213_BN::drawImage(const uint8_t* black, const uint8_t* color, int16_ } void GxEPD2_213_BN::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, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { if (black) { @@ -253,7 +253,6 @@ void GxEPD2_213_BN::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -269,12 +268,11 @@ void GxEPD2_213_BN::refresh(int16_t x, int16_t y, int16_t w, int16_t h) int16_t y1 = y < 0 ? 0 : y; // limit w1 = x1 + w1 < int16_t(WIDTH) ? w1 : int16_t(WIDTH) - x1; // limit h1 = y1 + h1 < int16_t(HEIGHT) ? h1 : int16_t(HEIGHT) - y1; // limit - if ((w1 <= 0) || (h1 <= 0)) return; + if ((w1 <= 0) || (h1 <= 0)) return; // make x1, w1 multiple of 8 w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -292,6 +290,7 @@ void GxEPD2_213_BN::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -359,6 +358,8 @@ void GxEPD2_213_BN::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); + _using_partial_mode = false; + _init_display_done = true; } const unsigned char GxEPD2_213_BN::lut_partial[] PROGMEM = @@ -383,24 +384,17 @@ const unsigned char GxEPD2_213_BN::lut_partial[] PROGMEM = 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, }; -void GxEPD2_213_BN::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - void GxEPD2_213_BN::_Init_Part() { - _InitDisplay(); _writeCommand(0x32); _writeDataPGM(lut_partial, sizeof(lut_partial)); - _PowerOn(); _using_partial_mode = true; } void GxEPD2_213_BN::_Update_Full() { + _using_partial_mode = false; + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -409,6 +403,8 @@ void GxEPD2_213_BN::_Update_Full() void GxEPD2_213_BN::_Update_Part() { + if (!_using_partial_mode) _Init_Part(); + _PowerOn(); _writeCommand(0x22); _writeData(0xcc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_213_BN.h b/src/epd/GxEPD2_213_BN.h index c20fdb76..8e5eefd6 100644 --- a/src/epd/GxEPD2_213_BN.h +++ b/src/epd/GxEPD2_213_BN.h @@ -5,7 +5,7 @@ // Controller : SSD1680 : https://www.good-display.com/companyfile/101.html // Display: LILYGO® T5 V2.3.1 2.13 inch : https://www.aliexpress.com/item/32869729970.html // -// Author: Jean-Marc Zingg/ +// Author: Jean-Marc Zingg // // Version: see library.properties // @@ -74,7 +74,6 @@ class GxEPD2_213_BN : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); void _Init_Part(); void _Update_Full(); void _Update_Part(); diff --git a/src/epd/GxEPD2_266_BN.cpp b/src/epd/GxEPD2_266_BN.cpp index 2edb2fb2..3c522d4b 100644 --- a/src/epd/GxEPD2_266_BN.cpp +++ b/src/epd/GxEPD2_266_BN.cpp @@ -23,28 +23,29 @@ GxEPD2_266_BN::GxEPD2_266_BN(int16_t cs, int16_t dc, int16_t rst, int16_t busy) void GxEPD2_266_BN::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_266_BN::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_266_BN::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - _writeScreenBuffer(0x26, value); // set previous _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_266_BN::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -62,7 +63,7 @@ void GxEPD2_266_BN::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int void GxEPD2_266_BN::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } @@ -74,7 +75,6 @@ void GxEPD2_266_BN::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y void GxEPD2_266_BN::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -88,7 +88,8 @@ void GxEPD2_266_BN::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -135,7 +136,6 @@ void GxEPD2_266_BN::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, void GxEPD2_266_BN::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -155,7 +155,8 @@ void GxEPD2_266_BN::_writeImagePart(uint8_t command, const uint8_t bitmap[], int w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -256,7 +257,6 @@ void GxEPD2_266_BN::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -277,7 +277,6 @@ void GxEPD2_266_BN::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -295,6 +294,7 @@ void GxEPD2_266_BN::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -362,6 +362,8 @@ void GxEPD2_266_BN::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); + _using_partial_mode = false; + _init_display_done = true; } const unsigned char GxEPD2_266_BN::lut_partial[] PROGMEM = @@ -386,24 +388,17 @@ const unsigned char GxEPD2_266_BN::lut_partial[] PROGMEM = 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, }; -void GxEPD2_266_BN::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - void GxEPD2_266_BN::_Init_Part() { - _InitDisplay(); _writeCommand(0x32); _writeDataPGM(lut_partial, sizeof(lut_partial)); - _PowerOn(); _using_partial_mode = true; } void GxEPD2_266_BN::_Update_Full() { + _using_partial_mode = false; + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -412,6 +407,8 @@ void GxEPD2_266_BN::_Update_Full() void GxEPD2_266_BN::_Update_Part() { + if (!_using_partial_mode) _Init_Part(); + _PowerOn(); _writeCommand(0x22); _writeData(0xcc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_266_BN.h b/src/epd/GxEPD2_266_BN.h index e920a162..cf3a5006 100644 --- a/src/epd/GxEPD2_266_BN.h +++ b/src/epd/GxEPD2_266_BN.h @@ -75,7 +75,6 @@ class GxEPD2_266_BN : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); void _Init_Part(); void _Update_Full(); void _Update_Part(); diff --git a/src/epd/GxEPD2_270.cpp b/src/epd/GxEPD2_270.cpp index 510df887..787a4866 100644 --- a/src/epd/GxEPD2_270.cpp +++ b/src/epd/GxEPD2_270.cpp @@ -20,7 +20,7 @@ GxEPD2_270::GxEPD2_270(int16_t cs, int16_t dc, int16_t rst, int16_t busy) : void GxEPD2_270::clearScreen(uint8_t value) { writeScreenBuffer(value); - refresh(true); + refresh(false); writeScreenBufferAgain(value); } diff --git a/src/epd/GxEPD2_290_BS.cpp b/src/epd/GxEPD2_290_BS.cpp index f657b0ec..c655bb3f 100644 --- a/src/epd/GxEPD2_290_BS.cpp +++ b/src/epd/GxEPD2_290_BS.cpp @@ -23,28 +23,29 @@ GxEPD2_290_BS::GxEPD2_290_BS(int16_t cs, int16_t dc, int16_t rst, int16_t busy) void GxEPD2_290_BS::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_290_BS::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_290_BS::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - _writeScreenBuffer(0x26, value); // set previous _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_290_BS::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -62,7 +63,7 @@ void GxEPD2_290_BS::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int void GxEPD2_290_BS::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } @@ -74,7 +75,6 @@ void GxEPD2_290_BS::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y void GxEPD2_290_BS::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -88,7 +88,8 @@ void GxEPD2_290_BS::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -135,7 +136,6 @@ void GxEPD2_290_BS::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, void GxEPD2_290_BS::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -155,7 +155,8 @@ void GxEPD2_290_BS::_writeImagePart(uint8_t command, const uint8_t bitmap[], int w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -256,7 +257,6 @@ void GxEPD2_290_BS::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -277,7 +277,6 @@ void GxEPD2_290_BS::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -295,6 +294,7 @@ void GxEPD2_290_BS::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -362,6 +362,8 @@ void GxEPD2_290_BS::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); + _using_partial_mode = false; + _init_display_done = true; } const unsigned char GxEPD2_290_BS::lut_partial[] PROGMEM = @@ -386,24 +388,17 @@ const unsigned char GxEPD2_290_BS::lut_partial[] PROGMEM = 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, }; -void GxEPD2_290_BS::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - void GxEPD2_290_BS::_Init_Part() { - _InitDisplay(); _writeCommand(0x32); _writeDataPGM(lut_partial, sizeof(lut_partial)); - _PowerOn(); _using_partial_mode = true; } void GxEPD2_290_BS::_Update_Full() { + _using_partial_mode = false; + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -412,6 +407,8 @@ void GxEPD2_290_BS::_Update_Full() void GxEPD2_290_BS::_Update_Part() { + if (!_using_partial_mode) _Init_Part(); + _PowerOn(); _writeCommand(0x22); _writeData(0xcc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_290_BS.h b/src/epd/GxEPD2_290_BS.h index 43a6ec2d..f153e5c9 100644 --- a/src/epd/GxEPD2_290_BS.h +++ b/src/epd/GxEPD2_290_BS.h @@ -75,7 +75,6 @@ class GxEPD2_290_BS : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); void _Init_Part(); void _Update_Full(); void _Update_Part(); diff --git a/src/epd/GxEPD2_290_T94.cpp b/src/epd/GxEPD2_290_T94.cpp index e988539d..df0afab1 100644 --- a/src/epd/GxEPD2_290_T94.cpp +++ b/src/epd/GxEPD2_290_T94.cpp @@ -20,27 +20,29 @@ GxEPD2_290_T94::GxEPD2_290_T94(int16_t cs, int16_t dc, int16_t rst, int16_t busy void GxEPD2_290_T94::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_290_T94::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_290_T94::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_290_T94::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,19 +59,18 @@ void GxEPD2_290_T94::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, in void GxEPD2_290_T94::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_290_T94::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_290_T94::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -83,7 +84,8 @@ void GxEPD2_290_T94::_writeImage(uint8_t command, const uint8_t bitmap[], int16_ w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -129,7 +131,6 @@ void GxEPD2_290_T94::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, void GxEPD2_290_T94::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -149,7 +150,8 @@ void GxEPD2_290_T94::_writeImagePart(uint8_t command, const uint8_t bitmap[], in w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -250,7 +252,6 @@ void GxEPD2_290_T94::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -266,12 +267,11 @@ void GxEPD2_290_T94::refresh(int16_t x, int16_t y, int16_t w, int16_t h) int16_t y1 = y < 0 ? 0 : y; // limit w1 = x1 + w1 < int16_t(WIDTH) ? w1 : int16_t(WIDTH) - x1; // limit h1 = y1 + h1 < int16_t(HEIGHT) ? h1 : int16_t(HEIGHT) - y1; // limit - if ((w1 <= 0) || (h1 <= 0)) return; + if ((w1 <= 0) || (h1 <= 0)) return; // make x1, w1 multiple of 8 w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -289,6 +289,7 @@ void GxEPD2_290_T94::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -338,42 +339,31 @@ void GxEPD2_290_T94::_PowerOff() void GxEPD2_290_T94::_InitDisplay() { + //Serial.println("_InitDisplay"); if (_hibernating) _reset(); delay(10); // 10ms according to specs _writeCommand(0x12); //SWRESET delay(10); // 10ms according to specs - _writeCommand(0x01); //Driver output control + _writeCommand(0x01); //Driver output control _writeData(0x27); _writeData(0x01); _writeData(0x00); - _writeCommand(0x11); //data entry mode + _writeCommand(0x11); //data entry mode _writeData(0x03); _writeCommand(0x3C); //BorderWavefrom - _writeData(0x05); + _writeData(0x05); _writeCommand(0x21); // Display update control - _writeData(0x00); - _writeData(0x80); + _writeData(0x00); + _writeData(0x80); _writeCommand(0x18); //Read built-in temperature sensor - _writeData(0x80); + _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_290_T94::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_290_T94::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_290_T94::_Update_Full() { + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -382,6 +372,7 @@ void GxEPD2_290_T94::_Update_Full() void GxEPD2_290_T94::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_290_T94.h b/src/epd/GxEPD2_290_T94.h index 6ea29525..05743f6a 100644 --- a/src/epd/GxEPD2_290_T94.h +++ b/src/epd/GxEPD2_290_T94.h @@ -74,8 +74,6 @@ class GxEPD2_290_T94 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/epd/GxEPD2_290_T94_V2.cpp b/src/epd/GxEPD2_290_T94_V2.cpp index 3c60969d..78484234 100644 --- a/src/epd/GxEPD2_290_T94_V2.cpp +++ b/src/epd/GxEPD2_290_T94_V2.cpp @@ -23,28 +23,29 @@ GxEPD2_290_T94_V2::GxEPD2_290_T94_V2(int16_t cs, int16_t dc, int16_t rst, int16_ void GxEPD2_290_T94_V2::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_290_T94_V2::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_290_T94_V2::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - _writeScreenBuffer(0x26, value); // set previous _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_290_T94_V2::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -62,7 +63,7 @@ void GxEPD2_290_T94_V2::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, void GxEPD2_290_T94_V2::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } @@ -74,7 +75,6 @@ void GxEPD2_290_T94_V2::writeImageAgain(const uint8_t bitmap[], int16_t x, int16 void GxEPD2_290_T94_V2::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -88,7 +88,8 @@ void GxEPD2_290_T94_V2::_writeImage(uint8_t command, const uint8_t bitmap[], int w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -135,7 +136,6 @@ void GxEPD2_290_T94_V2::writeImagePartAgain(const uint8_t bitmap[], int16_t x_pa void GxEPD2_290_T94_V2::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -155,7 +155,8 @@ void GxEPD2_290_T94_V2::_writeImagePart(uint8_t command, const uint8_t bitmap[], w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -256,7 +257,6 @@ void GxEPD2_290_T94_V2::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -277,7 +277,6 @@ void GxEPD2_290_T94_V2::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -295,6 +294,7 @@ void GxEPD2_290_T94_V2::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -362,6 +362,8 @@ void GxEPD2_290_T94_V2::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); + _using_partial_mode = false; + _init_display_done = true; } const unsigned char GxEPD2_290_T94_V2::lut_partial[] PROGMEM = @@ -386,24 +388,17 @@ const unsigned char GxEPD2_290_T94_V2::lut_partial[] PROGMEM = 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, }; -void GxEPD2_290_T94_V2::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - void GxEPD2_290_T94_V2::_Init_Part() { - _InitDisplay(); _writeCommand(0x32); _writeDataPGM(lut_partial, sizeof(lut_partial)); - _PowerOn(); _using_partial_mode = true; } void GxEPD2_290_T94_V2::_Update_Full() { + _using_partial_mode = false; + _PowerOn(); _writeCommand(0x22); _writeData(0xf4); _writeCommand(0x20); @@ -412,6 +407,8 @@ void GxEPD2_290_T94_V2::_Update_Full() void GxEPD2_290_T94_V2::_Update_Part() { + if (!_using_partial_mode) _Init_Part(); + _PowerOn(); _writeCommand(0x22); _writeData(0xcc); _writeCommand(0x20); diff --git a/src/epd/GxEPD2_290_T94_V2.h b/src/epd/GxEPD2_290_T94_V2.h index 88ec8728..9559253c 100644 --- a/src/epd/GxEPD2_290_T94_V2.h +++ b/src/epd/GxEPD2_290_T94_V2.h @@ -77,7 +77,6 @@ class GxEPD2_290_T94_V2 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); void _Init_Part(); void _Update_Full(); void _Update_Part(); diff --git a/src/epd/GxEPD2_370_TC1.cpp b/src/epd/GxEPD2_370_TC1.cpp index 835aa40f..7b64e668 100644 --- a/src/epd/GxEPD2_370_TC1.cpp +++ b/src/epd/GxEPD2_370_TC1.cpp @@ -21,28 +21,29 @@ GxEPD2_370_TC1::GxEPD2_370_TC1(int16_t cs, int16_t dc, int16_t rst, int16_t busy void GxEPD2_370_TC1::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_370_TC1::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_370_TC1::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - _writeScreenBuffer(0x26, value); // set previous _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_370_TC1::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -59,20 +60,19 @@ void GxEPD2_370_TC1::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, in void GxEPD2_370_TC1::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_370_TC1::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_370_TC1::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int32_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -86,7 +86,8 @@ void GxEPD2_370_TC1::_writeImage(uint8_t command, const uint8_t bitmap[], int16_ w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -126,14 +127,13 @@ void GxEPD2_370_TC1::writeImagePart(const uint8_t bitmap[], int16_t x_part, int1 void GxEPD2_370_TC1::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImagePart(0x26, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImagePart(0x26, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImagePart(0x24, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_370_TC1::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -153,7 +153,8 @@ void GxEPD2_370_TC1::_writeImagePart(uint8_t command, const uint8_t bitmap[], in w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -254,7 +255,6 @@ void GxEPD2_370_TC1::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -275,7 +275,6 @@ void GxEPD2_370_TC1::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -293,6 +292,7 @@ void GxEPD2_370_TC1::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x3); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -340,7 +340,6 @@ void GxEPD2_370_TC1::_PowerOff() _waitWhileBusy("_PowerOff", power_off_time); } _power_is_on = false; - _using_partial_mode = false; } void GxEPD2_370_TC1::_InitDisplay() @@ -355,7 +354,7 @@ void GxEPD2_370_TC1::_InitDisplay() //_writeCommand(0x47); // Auto Write B/W RAM **DON'T USE WITH GxEPD2** //_writeData(0xF7); //_waitWhileBusy("_InitDisplay 2", power_on_time); - _writeCommand(0x01); // Driver Output control + _writeCommand(0x01); // Driver Output control _writeData(0xDF); _writeData(0x01); _writeData(0x00); @@ -389,6 +388,8 @@ void GxEPD2_370_TC1::_InitDisplay() _writeData(0xff); _writeData(0xff); _setPartialRamArea(0, 0, WIDTH, HEIGHT); + _Init_Full(); + _init_display_done = true; } const uint8_t GxEPD2_370_TC1::lut_full[] PROGMEM = @@ -423,42 +424,44 @@ const uint8_t GxEPD2_370_TC1::lut_partial[] PROGMEM = void GxEPD2_370_TC1::_Init_Full() { - _InitDisplay(); _writeCommand(0x3C); // Border Waveform Control _writeData(0x01); // LUT1, for white _writeCommand(0x32); _writeDataPGM(lut_full, sizeof(lut_full)); - _PowerOn(); _using_partial_mode = false; } void GxEPD2_370_TC1::_Init_Part() { - _InitDisplay(); _writeCommand(0x3C); // Border Waveform Control _writeData(0xC0); // HiZ, [POR], floating _writeCommand(0x32); _writeDataPGM(lut_partial, sizeof(lut_partial)); - _PowerOn(); _using_partial_mode = true; } void GxEPD2_370_TC1::_Update_Full() { + if (_using_partial_mode) _Init_Full(); + _PowerOn(); _writeCommand(0x22); _writeData(0xcf); // enable clock, enable analog, display mode 2, disable analog, disable clock. Waveshare demo //_writeData(0xc4); // enable clock, enable analog, display mode 1 //_writeData(0xf4); // enable clock, enable analog, read temp, load LUT, display mode 1 _writeCommand(0x20); _waitWhileBusy("_Update_Full", full_refresh_time); + _power_is_on = false; } void GxEPD2_370_TC1::_Update_Part() { + if (!_using_partial_mode) _Init_Part(); + _PowerOn(); _writeCommand(0x22); _writeData(0xcf); // enable clock, enable analog, display mode 2, disable analog, disable clock. Waveshare demo //_writeData(0xc8); // enable clock, enable analog, display mode 2, ? //_writeData(0xcc); // enable clock, enable analog, display mode 2, ? _writeCommand(0x20); _waitWhileBusy("_Update_Part", partial_refresh_time); + _power_is_on = false; } diff --git a/src/epd7c/GxEPD2_565c.cpp b/src/epd7c/GxEPD2_565c.cpp index 193b1ef1..9862f6ac 100644 --- a/src/epd7c/GxEPD2_565c.cpp +++ b/src/epd7c/GxEPD2_565c.cpp @@ -28,7 +28,7 @@ void GxEPD2_565c::clearScreen(uint8_t value) void GxEPD2_565c::clearScreen(uint8_t black_value, uint8_t color_value) { writeScreenBuffer(black_value, color_value); - _Update_Full(); + refresh(); } void GxEPD2_565c::writeScreenBuffer(uint8_t value) @@ -38,8 +38,7 @@ void GxEPD2_565c::writeScreenBuffer(uint8_t value) void GxEPD2_565c::writeScreenBuffer(uint8_t black_value, uint8_t color_value) { - _initial_write = false; // initial full screen buffer clean done - _Init_Full(); + if (!_init_display_done) _InitDisplay(); _writeCommand(0x10); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 2; i++) @@ -48,6 +47,7 @@ void GxEPD2_565c::writeScreenBuffer(uint8_t black_value, uint8_t color_value) _transfer(0xFF == black_value ? 0x11 : black_value); } _endTransfer(); + _initial_write = false; // initial full screen buffer clean done } void GxEPD2_565c::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) @@ -55,6 +55,8 @@ void GxEPD2_565c::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16 //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) { //Serial.println("paged"); @@ -83,7 +85,6 @@ void GxEPD2_565c::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16 x -= x % 8; // byte boundary w = wb * 8; // byte boundary if ((w <= 0) || (h <= 0)) return; - _Init_Full(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -128,6 +129,8 @@ void GxEPD2_565c::writeImage(const uint8_t* black, const uint8_t* color, int16_t //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) { //Serial.println("paged"); @@ -164,7 +167,6 @@ void GxEPD2_565c::writeImage(const uint8_t* black, const uint8_t* color, int16_t x -= x % 8; // byte boundary w = wb * 8; // byte boundary if ((w <= 0) || (h <= 0)) return; - _Init_Full(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -238,7 +240,8 @@ void GxEPD2_565c::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -304,7 +307,8 @@ void GxEPD2_565c::writeImagePart(const uint8_t* black, const uint8_t* color, int w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -363,6 +367,8 @@ void GxEPD2_565c::writeNative(const uint8_t* data1, const uint8_t* data2, int16_ //Serial.print("writeNative("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) { //Serial.println("paged"); @@ -386,7 +392,6 @@ void GxEPD2_565c::writeNative(const uint8_t* data1, const uint8_t* data2, int16_ x -= x % 2; // byte boundary w = wb * 2; // byte boundary if ((w <= 0) || (h <= 0)) return; - _Init_Full(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -450,7 +455,8 @@ void GxEPD2_565c::writeNativePart(const uint8_t* data1, const uint8_t* data2, in w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -517,13 +523,20 @@ void GxEPD2_565c::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t void GxEPD2_565c::refresh(bool partial_update_mode) { - if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); - else _Update_Full(); + _PowerOn(); + _writeCommand(0x12); // Display Refresh + _writeData(0x00); + delay(1); + _waitWhileBusy("_refresh", full_refresh_time); } void GxEPD2_565c::refresh(int16_t x, int16_t y, int16_t w, int16_t h) { - _Update_Part(); + _PowerOn(); + _writeCommand(0x12); // Display Refresh + _writeData(0x00); + delay(1); + _waitWhileBusy("_refresh", full_refresh_time); } void GxEPD2_565c::powerOff() @@ -539,13 +552,14 @@ void GxEPD2_565c::hibernate() _writeCommand(0x07); // deep sleep _writeData(0xA5); // control code _hibernating = true; + _init_display_done = false; } } void GxEPD2_565c::setPaged() { _paged = true; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); _writeCommand(0x10); } @@ -567,12 +581,23 @@ void GxEPD2_565c::_PowerOff() _waitWhileBusy("_PowerOff", power_off_time); } _power_is_on = false; - _using_partial_mode = false; } void GxEPD2_565c::_InitDisplay() { - if (_hibernating) _reset(); + if ((_rst >= 0) && (_hibernating || _initial_write)) + { + pinMode(_rst, OUTPUT); // just in case + digitalWrite(_rst, HIGH); + delay(20); + digitalWrite(_rst, LOW); + delay(2); + digitalWrite(_rst, HIGH); + delay(2); + _waitWhileBusy("_InitDisplay reset", power_on_time); + _hibernating = false; + _power_is_on = false; + } _writeCommand(0x00); // Panel Settings _writeData(0xEF); _writeData(0x08); @@ -606,27 +631,3 @@ void GxEPD2_565c::_InitDisplay() _writeCommand(0x50); // VCOM and Data Interval Setting _writeData(0x37); // white border } - -void GxEPD2_565c::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); -} - -void GxEPD2_565c::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); -} - -void GxEPD2_565c::_Update_Full() -{ - _writeCommand(0x12); // Display Refresh - _waitWhileBusy("_Update_Full", full_refresh_time); -} - -void GxEPD2_565c::_Update_Part() -{ - _writeCommand(0x12); // Display Refresh - _waitWhileBusy("_Update_Part", partial_refresh_time); -} diff --git a/src/epd7c/GxEPD2_565c.h b/src/epd7c/GxEPD2_565c.h index 17c333fb..9d3e2d4c 100644 --- a/src/epd7c/GxEPD2_565c.h +++ b/src/epd7c/GxEPD2_565c.h @@ -68,10 +68,6 @@ class GxEPD2_565c : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); - void _Update_Full(); - void _Update_Part(); private: bool _paged; }; diff --git a/src/epd7c/GxEPD2_730c_ACeP_730.cpp b/src/epd7c/GxEPD2_730c_ACeP_730.cpp new file mode 100644 index 00000000..6ec82775 --- /dev/null +++ b/src/epd7c/GxEPD2_730c_ACeP_730.cpp @@ -0,0 +1,740 @@ +// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! +// +// based on Demo Example from Good Display: https://www.good-display.com/product/442.html +// Panel: 7.3inch ACeP 7-Color E-Paper : https://www.waveshare.com/product/displays/e-paper/7.3inch-e-paper-f.htm +// Controller: unknown +// +// Author: Jean-Marc Zingg +// +// Version: see library.properties +// +// Library: https://github.com/ZinggJM/GxEPD2 + +#include "GxEPD2_730c_ACeP_730.h" + +GxEPD2_730c_ACeP_730::GxEPD2_730c_ACeP_730(int16_t cs, int16_t dc, int16_t rst, int16_t busy) : + GxEPD2_EPD(cs, dc, rst, busy, LOW, 60000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate) +{ + _paged = false; +} + +void GxEPD2_730c_ACeP_730::clearScreen(uint8_t value) +{ + clearScreen(value, 0xFF); +} + +void GxEPD2_730c_ACeP_730::clearScreen(uint8_t black_value, uint8_t color_value) +{ + writeScreenBuffer(black_value, color_value); + refresh(); +} + +void GxEPD2_730c_ACeP_730::writeScreenBuffer(uint8_t value) +{ + writeScreenBuffer(value, 0xFF); +} + +void GxEPD2_730c_ACeP_730::writeScreenBuffer(uint8_t black_value, uint8_t color_value) +{ + if (!_init_display_done) _InitDisplay(); + _writeCommand(0x10); + _startTransfer(); + for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 2; i++) + { + //_transfer(0x11); + _transfer(0xFF == black_value ? 0x11 : black_value); + } + _endTransfer(); + _initial_write = false; // initial full screen buffer clean done +} + +void GxEPD2_730c_ACeP_730::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); + //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); + if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) + { + //Serial.println("paged"); + _startTransfer(); + for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(h) / 8; i++) + { + uint8_t data = bitmap[i]; + for (int16_t k = 0; k < 4; k++) + { + uint8_t data2 = (data & 0x80 ? 0x10 : 0x00) | (data & 0x40 ? 0x01 : 0x00); + data <<= 2; + _transfer(data2); + } + } + _endTransfer(); + if (y + h == HEIGHT) // last page + { + //Serial.println("paged ended"); + _paged = false; + } + } + else + { + _paged = false; + int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded + x -= x % 8; // byte boundary + w = wb * 8; // byte boundary + if ((w <= 0) || (h <= 0)) return; + _writeCommand(0x10); + _startTransfer(); + for (int16_t i = 0; i < int16_t(HEIGHT); i++) + { + for (int16_t j = 0; j < int16_t(WIDTH); j += 8) + { + uint8_t data = 0xFF; + if ((j >= x) && (j <= x + w) && (i >= y) && (i < y + h)) + { + uint32_t idx = mirror_y ? (j - x) / 8 + uint32_t((h - 1 - (i - y))) * wb : (j - x) / 8 + uint32_t(i - y) * wb; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&bitmap[idx]); +#else + data = bitmap[idx]; +#endif + } + else + { + data = bitmap[idx]; + } + if (invert) data = ~data; + } + for (int16_t k = 0; k < 4; k++) + { + uint8_t data2 = (data & 0x80 ? 0x10 : 0x00) | (data & 0x40 ? 0x01 : 0x00); + data <<= 2; + _transfer(data2); + } + } + } + _endTransfer(); + } + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 +} + +void GxEPD2_730c_ACeP_730::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) +{ + if (!black && !color) return; + if (!color) return writeImage(black, x, y, w, h, invert, mirror_y, pgm); + //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); + //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); + if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) + { + //Serial.println("paged"); + _startTransfer(); + for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(h) / 8; i++) + { + uint8_t black_data = black[i]; + uint8_t color_data = color[i]; + for (int16_t k = 0; k < 4; k++) + { + uint8_t out_data = 0x00; + for (int16_t l = 0; l < 2; l++) + { + out_data <<= 4; + if (!(color_data & 0x80)) out_data |= 0x04; + else out_data |= black_data & 0x80 ? 0x01 : 0x00; + black_data <<= 1; + color_data <<= 1; + } + _transfer(out_data); + } + } + _endTransfer(); + if (y + h == HEIGHT) // last page + { + //Serial.println("paged ended"); + _paged = false; + } + } + else + { + _paged = false; + int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded + x -= x % 8; // byte boundary + w = wb * 8; // byte boundary + if ((w <= 0) || (h <= 0)) return; + _writeCommand(0x10); + _startTransfer(); + for (int16_t i = 0; i < int16_t(HEIGHT); i++) + { + for (int16_t j = 0; j < int16_t(WIDTH); j += 8) + { + uint8_t black_data = 0xFF, color_data = 0xFF; + if ((j >= x) && (j < x + w) && (i >= y) && (i < y + h)) + { + uint32_t idx = mirror_y ? (j - x) / 8 + uint32_t((h - 1 - (i - y))) * wb : (j - x) / 8 + uint32_t(i - y) * wb; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + black_data = pgm_read_byte(&black[idx]); + color_data = pgm_read_byte(&color[idx]); +#else + black_data = black[idx]; + color_data = color[idx]; +#endif + } + else + { + black_data = black[idx]; + color_data = color[idx]; + } + if (invert) + { + black_data = ~black_data; + color_data = ~color_data; + } + } + for (int16_t k = 0; k < 4; k++) + { + uint8_t out_data = 0x00; + for (int16_t l = 0; l < 2; l++) + { + out_data <<= 4; + if (!(color_data & 0x80)) out_data |= 0x04; + else out_data |= black_data & 0x80 ? 0x01 : 0x00; + black_data <<= 1; + color_data <<= 1; + } + _transfer(out_data); + } + } + } + _endTransfer(); + } + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 +} + +void GxEPD2_730c_ACeP_730::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; + if ((x_part < 0) || (x_part >= w_bitmap)) return; + if ((y_part < 0) || (y_part >= h_bitmap)) return; + int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded + x_part -= x_part % 8; // byte boundary + w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit + h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit + x -= x % 8; // byte boundary + w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded + int16_t x1 = x < 0 ? 0 : x; // limit + int16_t y1 = y < 0 ? 0 : y; // limit + int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit + int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit + int16_t dx = x1 - x; + int16_t dy = y1 - y; + w1 -= dx; + h1 -= dy; + if ((w1 <= 0) || (h1 <= 0)) return; + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); + _writeCommand(0x10); + _startTransfer(); + for (int16_t i = 0; i < int16_t(HEIGHT); i++) + { + for (int16_t j = 0; j < int16_t(WIDTH); j += 8) + { + uint8_t data = 0xFF; + if ((j >= x1) && (j < x1 + w) && (i >= y1) && (i < y1 + h)) + { + // use wb_bitmap, h_bitmap of bitmap for index! + uint32_t idx = mirror_y ? (x_part + j - x1) / 8 + uint32_t((h_bitmap - 1 - (y_part + i - y1))) * wb_bitmap : (x_part + j - x1) / 8 + uint32_t(y_part + i - y1) * wb_bitmap; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&bitmap[idx]); +#else + data = bitmap[idx]; +#endif + } + else + { + data = bitmap[idx]; + } + if (invert) data = ~data; + } + for (int16_t k = 0; k < 4; k++) + { + uint8_t data2 = (data & 0x80 ? 0x10 : 0x00) | (data & 0x40 ? 0x01 : 0x00); + data <<= 2; + _transfer(data2); + } + } + } + _endTransfer(); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 +} + +void GxEPD2_730c_ACeP_730::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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + //Serial.print("writeImagePart("); Serial.print(x_part); Serial.print(", "); Serial.print(y_part); Serial.print(", "); + //Serial.print(w_bitmap); Serial.print(", "); Serial.print(h_bitmap); Serial.print(", "); + //Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); + //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); + if (!black && !color) return; + if (!color) return writeImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; + if ((x_part < 0) || (x_part >= w_bitmap)) return; + if ((y_part < 0) || (y_part >= h_bitmap)) return; + int16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded + x_part -= x_part % 8; // byte boundary + w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit + h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit + x -= x % 8; // byte boundary + w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded + int16_t x1 = x < 0 ? 0 : x; // limit + int16_t y1 = y < 0 ? 0 : y; // limit + int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit + int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit + int16_t dx = x1 - x; + int16_t dy = y1 - y; + w1 -= dx; + h1 -= dy; + if ((w1 <= 0) || (h1 <= 0)) return; + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); + _writeCommand(0x10); + _startTransfer(); + for (int16_t i = 0; i < int16_t(HEIGHT); i++) + { + for (int16_t j = 0; j < int16_t(WIDTH); j += 8) + { + uint8_t black_data = 0xFF, color_data = 0xFF; + if ((j >= x1) && (j < x1 + w) && (i >= y1) && (i < y1 + h)) + { + // use wb_bitmap, h_bitmap of bitmap for index! + uint32_t idx = mirror_y ? (x_part + j - x1) / 8 + uint32_t((h_bitmap - 1 - (y_part + i - y1))) * wb_bitmap : (x_part + j - x1) / 8 + uint32_t(y_part + i - y1) * wb_bitmap; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + black_data = pgm_read_byte(&black[idx]); + color_data = pgm_read_byte(&color[idx]); +#else + black_data = black[idx]; + color_data = color[idx]; +#endif + } + else + { + black_data = black[idx]; + color_data = color[idx]; + } + if (invert) + { + black_data = ~black_data; + color_data = ~color_data; + } + } + for (int16_t k = 0; k < 4; k++) + { + uint8_t out_data = 0x00; + for (int16_t l = 0; l < 2; l++) + { + out_data <<= 4; + if (!(color_data & 0x80)) out_data |= 0x04; + else out_data |= black_data & 0x80 ? 0x01 : 0x00; + black_data <<= 1; + color_data <<= 1; + } + _transfer(out_data); + } + } + } + _endTransfer(); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 +} + +void GxEPD2_730c_ACeP_730::writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + if (data1) + { + //Serial.print("writeNative("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); + //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); + if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) + { + //Serial.println("paged"); + _startTransfer(); + for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(h) / 2; i++) + { + uint8_t data = data1[i]; + _transfer(data); + } + _endTransfer(); + if (y + h == HEIGHT) // last page + { + //Serial.println("paged ended"); + _paged = false; + } + } + else + { + _paged = false; + int16_t wb = (w + 1) / 2; // width bytes, bitmaps are padded + x -= x % 2; // byte boundary + w = wb * 2; // byte boundary + if ((w <= 0) || (h <= 0)) return; + _writeCommand(0x10); + _startTransfer(); + for (int16_t i = 0; i < int16_t(HEIGHT); i++) + { + for (int16_t j = 0; j < int16_t(WIDTH); j += 2) + { + uint8_t data = 0x11; + if (data1) + { + if ((j >= x) && (j < x + w) && (i >= y) && (i < y + h)) + { + uint32_t idx = mirror_y ? (j - x) / 2 + uint32_t((h - 1 - (i - y))) * wb : (j - x) / 2 + uint32_t(i - y) * wb; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&data1[idx]); +#else + data = data1[idx]; +#endif + } + else + { + data = data1[idx]; + } + if (invert) data = ~data; + } + } + _transfer(data); + } + } + _endTransfer(); + } + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + } +} + +void GxEPD2_730c_ACeP_730::writeNativePart(const uint8_t* data1, const uint8_t* data2, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + //Serial.print("writeNativePart("); Serial.print(x_part); Serial.print(", "); Serial.print(y_part); Serial.print(", "); + //Serial.print(w_bitmap); Serial.print(", "); Serial.print(h_bitmap); Serial.print(", "); + //Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); + //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); + if (!data1) return; + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; + if ((x_part < 0) || (x_part >= w_bitmap)) return; + if ((y_part < 0) || (y_part >= h_bitmap)) return; + int16_t wb_bitmap = (w_bitmap + 1) / 2; // width bytes, bitmaps are padded + x_part -= x_part % 2; // byte boundary + w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit + h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit + x -= x % 2; // byte boundary + w = 2 * ((w + 1) / 2); // byte boundary, bitmaps are padded + int16_t x1 = x < 0 ? 0 : x; // limit + int16_t y1 = y < 0 ? 0 : y; // limit + int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit + int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit + int16_t dx = x1 - x; + int16_t dy = y1 - y; + w1 -= dx; + h1 -= dy; + if ((w1 <= 0) || (h1 <= 0)) return; + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); + _writeCommand(0x10); + _startTransfer(); + for (int16_t i = 0; i < int16_t(HEIGHT); i++) + { + for (int16_t j = 0; j < int16_t(WIDTH); j += 2) + { + uint8_t data = 0x11; + if ((j >= x1) && (j < x1 + w) && (i >= y1) && (i < y1 + h)) + { + // use wb_bitmap, h_bitmap of bitmap for index! + uint32_t idx = mirror_y ? (x_part + j - x1) / 2 + uint32_t((h_bitmap - 1 - (y_part + i - y1))) * wb_bitmap : (x_part + j - x1) / 2 + uint32_t(y_part + i - y1) * wb_bitmap; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&data1[idx]); +#else + data = data1[idx]; +#endif + } + else + { + data = data1[idx]; + } + if (invert) data = ~data; + } + _transfer(data); + } + } + _endTransfer(); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 +} + +void GxEPD2_730c_ACeP_730::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm); + refresh(x, y, w, h); +} + +void GxEPD2_730c_ACeP_730::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + refresh(x, y, w, h); +} + +void GxEPD2_730c_ACeP_730::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) +{ + writeImage(black, color, x, y, w, h, invert, mirror_y, pgm); + refresh(x, y, w, h); +} + +void GxEPD2_730c_ACeP_730::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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + refresh(x, y, w, h); +} + +void GxEPD2_730c_ACeP_730::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm); + refresh(x, y, w, h); +} + +void GxEPD2_730c_ACeP_730::refresh(bool partial_update_mode) +{ + _PowerOn(); + _writeCommand(0x12); // Display Refresh + _writeData(0x00); + delay(1); + _waitWhileBusy("_refresh", full_refresh_time); +} + +void GxEPD2_730c_ACeP_730::refresh(int16_t x, int16_t y, int16_t w, int16_t h) +{ + _PowerOn(); + _writeCommand(0x12); // Display Refresh + _writeData(0x00); + delay(1); + _waitWhileBusy("_refresh", full_refresh_time); +} + +void GxEPD2_730c_ACeP_730::powerOff() +{ + _PowerOff(); +} + +void GxEPD2_730c_ACeP_730::hibernate() +{ + _PowerOff(); + if (_rst >= 0) + { + _writeCommand(0x07); // deep sleep + _writeData(0xA5); // control code + _hibernating = true; + _init_display_done = false; + } +} + +void GxEPD2_730c_ACeP_730::setPaged() +{ + _paged = true; + if (!_init_display_done) _InitDisplay(); + _writeCommand(0x10); +} + +void GxEPD2_730c_ACeP_730::_PowerOn() +{ + if (!_power_is_on) + { + _writeCommand(0x04); + _waitWhileBusy("_PowerOn", power_on_time); + } + _power_is_on = true; +} + +void GxEPD2_730c_ACeP_730::_PowerOff() +{ + if (_power_is_on) + { + _writeCommand(0x02); + _writeData(0x00); + _waitWhileBusy("_PowerOff", power_off_time); + } + _power_is_on = false; +} + +void GxEPD2_730c_ACeP_730::_InitDisplay() +{ + if ((_rst >= 0) && (_hibernating || _initial_write)) + { + pinMode(_rst, OUTPUT); // just in case + digitalWrite(_rst, HIGH); + delay(20); + digitalWrite(_rst, LOW); + delay(2); + digitalWrite(_rst, HIGH); + delay(2); + _waitWhileBusy("_InitDisplay reset", power_on_time); + _hibernating = false; + _power_is_on = false; + } + _writeCommand(0xAA); // CMDH + _writeData(0x49); + _writeData(0x55); + _writeData(0x20); + _writeData(0x08); + _writeData(0x09); + _writeData(0x18); + _writeCommand(0x01); // PWRR + _writeData(0x3F); + _writeData(0x00); + _writeData(0x32); + _writeData(0x2A); + _writeData(0x0E); + _writeData(0x2A); + _writeCommand(0x00); // PSR + _writeData(0x5F); + _writeData(0x69); + _writeCommand(0x03); // POFS + _writeData(0x00); + _writeData(0x54); + _writeData(0x00); + _writeData(0x44); + _writeCommand(0x05); // BTST1 + _writeData(0x40); + _writeData(0x1F); + _writeData(0x1F); + _writeData(0x2C); + _writeCommand(0x06); // BTST2 + _writeData(0x6F); + _writeData(0x1F); + _writeData(0x1F); + _writeData(0x22); + _writeCommand(0x08); // BTST3 + _writeData(0x6F); + _writeData(0x1F); + _writeData(0x1F); + _writeData(0x22); + _writeCommand(0x13); // IPC + _writeData(0x00); + _writeData(0x04); + _writeCommand(0x30); // PLL + _writeData(0x3C); + _writeCommand(0x41); // TSE + _writeData(0x00); + _writeCommand(0x50); // CDI + _writeData(0x3F); + _writeCommand(0x60); // TCON + _writeData(0x02); + _writeData(0x00); + _writeCommand(0x61); // TRES + _writeData(0x03); + _writeData(0x20); + _writeData(0x01); + _writeData(0xE0); + _writeCommand(0x82); // VDCS + _writeData(0x1E); + _writeCommand(0x84); // T_VDCS + _writeData(0x00); + _writeCommand(0x86); // AGID + _writeData(0x00); + _writeCommand(0xE3); // PWS + _writeData(0x2F); + _writeCommand(0xE0); // CCSET + _writeData(0x00); + _writeCommand(0xE6); // TSSET + _writeData(0x00); + _PowerOn(); + _init_display_done = true; +} + +uint8_t GxEPD2_730c_ACeP_730::_colorOfDemoBitmap(uint8_t from) +{ + switch (from) + { + case 0xFF: return (0x01); // white; + case 0xFC: return (0x05); // yellow; + case 0xF1: return (0x06); // orange; + case 0xE5: return (0x04); // red; + case 0x4B: return (0x03); // blue; + case 0x39: return (0x02); // green; + case 0x00: return (0x00); // black; + default: return (0x01); // white; + } +} + +void GxEPD2_730c_ACeP_730::writeDemoBitmap(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, int16_t mode, bool mirror_y, bool pgm) +{ + (void) mode; + if (data1) + { + //Serial.print("writeNative("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); + //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); + if (!_init_display_done) _InitDisplay(); + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + { + _paged = false; + if ((w <= 0) || (h <= 0)) return; + _writeCommand(0x10); + _startTransfer(); + for (int16_t i = 0; i < int16_t(HEIGHT); i++) + { + for (int16_t j = 0; j < int16_t(WIDTH); j += 2) + { + uint8_t data = 0x11; + if (data1) + { + if ((j >= x) && (j < x + w) && (i >= y) && (i < y + h)) + { + uint32_t idx = mirror_y ? (j - x) + uint32_t((h - 1 - (i - y))) * w : (j - x) + uint32_t(i - y) * w; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = _colorOfDemoBitmap(pgm_read_byte(&data1[idx++])) << 4; + data |= _colorOfDemoBitmap(pgm_read_byte(&data1[idx])); +#else + data = _colorOfDemoBitmap(data1[idx++]) << 4; + data |= _colorOfDemoBitmap(data1[idx]); +#endif + } + else + { + data = _colorOfDemoBitmap(data1[idx++]) << 4; + data |= _colorOfDemoBitmap(data1[idx]); + } + } + } + _transfer(data); + } + } + _endTransfer(); + } + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + } +} + +void GxEPD2_730c_ACeP_730::drawDemoBitmap(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, int16_t mode, bool mirror_y, bool pgm) +{ + writeDemoBitmap(data1, data2, x, y, w, h, mode, mirror_y, pgm); + refresh(x, y, w, h); +} diff --git a/src/epd7c/GxEPD2_730c_ACeP_730.h b/src/epd7c/GxEPD2_730c_ACeP_730.h new file mode 100644 index 00000000..ce991e9c --- /dev/null +++ b/src/epd7c/GxEPD2_730c_ACeP_730.h @@ -0,0 +1,78 @@ +// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! +// +// based on Demo Example from Good Display: https://www.good-display.com/product/442.html +// Panel: 7.3inch ACeP 7-Color E-Paper : https://www.waveshare.com/product/displays/e-paper/7.3inch-e-paper-f.htm +// Controller: unknown +// +// Author: Jean-Marc Zingg +// +// Version: see library.properties +// +// Library: https://github.com/ZinggJM/GxEPD2 + +#ifndef _GxEPD2_730c_ACeP_730_H_ +#define _GxEPD2_730c_ACeP_730_H_ + +#include "../GxEPD2_EPD.h" + +class GxEPD2_730c_ACeP_730 : public GxEPD2_EPD +{ + public: + // attributes + static const uint16_t WIDTH = 800; + static const uint16_t WIDTH_VISIBLE = WIDTH; + static const uint16_t HEIGHT = 480; + static const GxEPD2::Panel panel = GxEPD2::ACeP730; + static const bool hasColor = true; + static const bool hasPartialUpdate = false; + static const bool hasFastPartialUpdate = false; + static const uint16_t power_on_time = 200; // ms, e.g. 172000us + static const uint16_t power_off_time = 150; // ms, e.g. 145000us + static const uint16_t full_refresh_time = 40000; // ms, e.g. 38858000us + static const uint16_t partial_refresh_time = 40000; // ms, e.g. 38858000us + // constructor + GxEPD2_730c_ACeP_730(int16_t cs, int16_t dc, int16_t rst, int16_t busy); + // methods (virtual) + // Support for Bitmaps (Sprites) to Controller Buffer and to Screen + void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) + void clearScreen(uint8_t black_value, uint8_t color_value); // init controller memory and screen + void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) + void writeScreenBuffer(uint8_t black_value, uint8_t color_value); // init controller memory + // write to controller memory, without screen refresh; x and w should be multiple of 8 + 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); + void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + 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); + 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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 + 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); + void writeNativePart(const uint8_t* data1, const uint8_t* data2, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + // write to controller memory, with screen refresh; x and w should be multiple of 8 + 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); + void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + 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); + 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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 + 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); + void writeDemoBitmap(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, int16_t mode = 0, bool mirror_y = false, bool pgm = false); + void drawDemoBitmap(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, int16_t mode = 0, bool mirror_y = false, bool pgm = false); + void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen + void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen + void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time + void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) + void setPaged(); // for GxEPD2_154c and GxEPD2_565c and GxEPD2_730c_ACeP_730 paged workaround + private: + uint8_t _colorOfDemoBitmap(uint8_t from); + void _PowerOn(); + void _PowerOff(); + void _InitDisplay(); + private: + bool _paged; +}; + +#endif diff --git a/src/epd7c/GxEPD2_730c_GDEY073D46.cpp b/src/epd7c/GxEPD2_730c_GDEY073D46.cpp index 0cbb51f1..a849d734 100644 --- a/src/epd7c/GxEPD2_730c_GDEY073D46.cpp +++ b/src/epd7c/GxEPD2_730c_GDEY073D46.cpp @@ -27,7 +27,7 @@ void GxEPD2_730c_GDEY073D46::clearScreen(uint8_t value) void GxEPD2_730c_GDEY073D46::clearScreen(uint8_t black_value, uint8_t color_value) { writeScreenBuffer(black_value, color_value); - _Update_Full(); + refresh(); } void GxEPD2_730c_GDEY073D46::writeScreenBuffer(uint8_t value) @@ -37,8 +37,7 @@ void GxEPD2_730c_GDEY073D46::writeScreenBuffer(uint8_t value) void GxEPD2_730c_GDEY073D46::writeScreenBuffer(uint8_t black_value, uint8_t color_value) { - _initial_write = false; // initial full screen buffer clean done - _Init_Full(); + if (!_init_display_done) _InitDisplay(); _writeCommand(0x10); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 2; i++) @@ -47,6 +46,7 @@ void GxEPD2_730c_GDEY073D46::writeScreenBuffer(uint8_t black_value, uint8_t colo _transfer(0xFF == black_value ? 0x11 : black_value); } _endTransfer(); + _initial_write = false; // initial full screen buffer clean done } void GxEPD2_730c_GDEY073D46::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) @@ -54,6 +54,8 @@ void GxEPD2_730c_GDEY073D46::writeImage(const uint8_t bitmap[], int16_t x, int16 //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) { //Serial.println("paged"); @@ -82,7 +84,6 @@ void GxEPD2_730c_GDEY073D46::writeImage(const uint8_t bitmap[], int16_t x, int16 x -= x % 8; // byte boundary w = wb * 8; // byte boundary if ((w <= 0) || (h <= 0)) return; - _Init_Full(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -127,6 +128,8 @@ void GxEPD2_730c_GDEY073D46::writeImage(const uint8_t* black, const uint8_t* col //Serial.print("writeImage("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) { //Serial.println("paged"); @@ -163,7 +166,6 @@ void GxEPD2_730c_GDEY073D46::writeImage(const uint8_t* black, const uint8_t* col x -= x % 8; // byte boundary w = wb * 8; // byte boundary if ((w <= 0) || (h <= 0)) return; - _Init_Full(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -237,7 +239,8 @@ void GxEPD2_730c_GDEY073D46::writeImagePart(const uint8_t bitmap[], int16_t x_pa w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -303,7 +306,8 @@ void GxEPD2_730c_GDEY073D46::writeImagePart(const uint8_t* black, const uint8_t* w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -362,6 +366,8 @@ void GxEPD2_730c_GDEY073D46::writeNative(const uint8_t* data1, const uint8_t* da //Serial.print("writeNative("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); if (_paged && (x == 0) && (w == int16_t(WIDTH)) && (h < int16_t(HEIGHT))) { //Serial.println("paged"); @@ -385,7 +391,6 @@ void GxEPD2_730c_GDEY073D46::writeNative(const uint8_t* data1, const uint8_t* da x -= x % 2; // byte boundary w = wb * 2; // byte boundary if ((w <= 0) || (h <= 0)) return; - _Init_Full(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -449,7 +454,8 @@ void GxEPD2_730c_GDEY073D46::writeNativePart(const uint8_t* data1, const uint8_t w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) @@ -516,13 +522,20 @@ void GxEPD2_730c_GDEY073D46::drawNative(const uint8_t* data1, const uint8_t* dat void GxEPD2_730c_GDEY073D46::refresh(bool partial_update_mode) { - if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); - else _Update_Full(); + _PowerOn(); + _writeCommand(0x12); // Display Refresh + _writeData(0x00); + delay(1); + _waitWhileBusy("_refresh", full_refresh_time); } void GxEPD2_730c_GDEY073D46::refresh(int16_t x, int16_t y, int16_t w, int16_t h) { - _Update_Part(); + _PowerOn(); + _writeCommand(0x12); // Display Refresh + _writeData(0x00); + delay(1); + _waitWhileBusy("_refresh", full_refresh_time); } void GxEPD2_730c_GDEY073D46::powerOff() @@ -538,13 +551,14 @@ void GxEPD2_730c_GDEY073D46::hibernate() _writeCommand(0x07); // deep sleep _writeData(0xA5); // control code _hibernating = true; + _init_display_done = false; } } void GxEPD2_730c_GDEY073D46::setPaged() { _paged = true; - _Init_Full(); + if (!_init_display_done) _InitDisplay(); _writeCommand(0x10); } @@ -567,12 +581,23 @@ void GxEPD2_730c_GDEY073D46::_PowerOff() _waitWhileBusy("_PowerOff", power_off_time); } _power_is_on = false; - _using_partial_mode = false; } void GxEPD2_730c_GDEY073D46::_InitDisplay() { - if (_hibernating) _reset(); + if ((_rst >= 0) && (_hibernating || _initial_write)) + { + pinMode(_rst, OUTPUT); // just in case + digitalWrite(_rst, HIGH); + delay(20); + digitalWrite(_rst, LOW); + delay(20); + digitalWrite(_rst, HIGH); + delay(2); + _waitWhileBusy("_InitDisplay reset", power_on_time); + _hibernating = false; + _power_is_on = false; + } _writeCommand(0xAA); // CMDH _writeData(0x49); _writeData(0x55); @@ -639,48 +664,22 @@ void GxEPD2_730c_GDEY073D46::_InitDisplay() _writeData(0x00); _writeCommand(0xE6); // TSSET _writeData(0x00); -} - -void GxEPD2_730c_GDEY073D46::_Init_Full() -{ - _InitDisplay(); _PowerOn(); -} - -void GxEPD2_730c_GDEY073D46::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); -} - -void GxEPD2_730c_GDEY073D46::_Update_Full() -{ - _writeCommand(0x12); // Display Refresh - _writeData(0x00); - delay(1); - _waitWhileBusy("_Update_Full", full_refresh_time); -} - -void GxEPD2_730c_GDEY073D46::_Update_Part() -{ - _writeCommand(0x12); // Display Refresh - _writeData(0x00); - delay(1); - _waitWhileBusy("_Update_Part", partial_refresh_time); + _init_display_done = true; } uint8_t GxEPD2_730c_GDEY073D46::_colorOfDemoBitmap(uint8_t from) { switch (from) { - case 0xFF: return(0x01); // white; - case 0xFC: return(0x05); // yellow; - case 0xF1: return(0x06); // orange; - case 0xE5: return(0x04); // red; - case 0x4B: return(0x03); // blue; - case 0x39: return(0x02); // green; - case 0x00: return(0x00); // black; - default: return(0x01); // white; + case 0xFF: return (0x01); // white; + case 0xFC: return (0x05); // yellow; + case 0xF1: return (0x06); // orange; + case 0xE5: return (0x04); // red; + case 0x4B: return (0x03); // blue; + case 0x39: return (0x02); // green; + case 0x00: return (0x00); // black; + default: return (0x01); // white; } } @@ -691,11 +690,11 @@ void GxEPD2_730c_GDEY073D46::writeDemoBitmap(const uint8_t* data1, const uint8_t { //Serial.print("writeNative("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print(", "); //Serial.print(w); Serial.print(", "); Serial.print(h); Serial.println(")"); + if (!_init_display_done) _InitDisplay(); delay(1); // yield() to avoid WDT on ESP8266 and ESP32 { _paged = false; if ((w <= 0) || (h <= 0)) return; - _Init_Full(); _writeCommand(0x10); _startTransfer(); for (int16_t i = 0; i < int16_t(HEIGHT); i++) diff --git a/src/epd7c/GxEPD2_730c_GDEY073D46.h b/src/epd7c/GxEPD2_730c_GDEY073D46.h index 1fe23046..3e4ae4f5 100644 --- a/src/epd7c/GxEPD2_730c_GDEY073D46.h +++ b/src/epd7c/GxEPD2_730c_GDEY073D46.h @@ -71,10 +71,6 @@ class GxEPD2_730c_GDEY073D46 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); - void _Update_Full(); - void _Update_Part(); private: bool _paged; }; diff --git a/src/gdeq/GxEPD2_310_GDEQ031T10.cpp b/src/gdeq/GxEPD2_310_GDEQ031T10.cpp new file mode 100644 index 00000000..3cb1e9f7 --- /dev/null +++ b/src/gdeq/GxEPD2_310_GDEQ031T10.cpp @@ -0,0 +1,387 @@ +// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! +// +// based on Demo Example from Good Display: https://www.good-display.com/product/426.html +// Panel: GDEQ031T10 : https://www.good-display.com/product/426.html +// Controller: UC8253 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8253.pdf +// +// Author: Jean-Marc Zingg +// +// Version: see library.properties +// +// Library: https://github.com/ZinggJM/GxEPD2 + +#include "GxEPD2_310_GDEQ031T10.h" + +GxEPD2_310_GDEQ031T10::GxEPD2_310_GDEQ031T10(int16_t cs, int16_t dc, int16_t rst, int16_t busy) : + GxEPD2_EPD(cs, dc, rst, busy, LOW, 10000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate) +{ +} + +void GxEPD2_310_GDEQ031T10::clearScreen(uint8_t value) +{ + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x10, value); // set previous + _writeScreenBuffer(0x13, value); // set current + refresh(false); // full refresh + _initial_write = false; +} + +void GxEPD2_310_GDEQ031T10::writeScreenBuffer(uint8_t value) +{ + if (_initial_write) return clearScreen(value); + _writeScreenBuffer(0x13, value); // set current +} + +void GxEPD2_310_GDEQ031T10::writeScreenBufferAgain(uint8_t value) +{ + _writeScreenBuffer(0x10, value); // set previous + //_writeScreenBuffer(0x13, value); // set current, not needed +} + +void GxEPD2_310_GDEQ031T10::_writeScreenBuffer(uint8_t command, uint8_t value) +{ + if (!_init_display_done) _InitDisplay(); + _writeCommand(command); + _startTransfer(); + for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) + { + _transfer(value); + } + _endTransfer(); +} + +void GxEPD2_310_GDEQ031T10::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + _writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm); +} + +void GxEPD2_310_GDEQ031T10::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current +} + +void GxEPD2_310_GDEQ031T10::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + //_writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current, not needed +} + +void GxEPD2_310_GDEQ031T10::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + uint16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded + x -= x % 8; // byte boundary + w = wb * 8; // byte boundary + int16_t x1 = x < 0 ? 0 : x; // limit + int16_t y1 = y < 0 ? 0 : y; // limit + int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit + int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit + int16_t dx = x1 - x; + int16_t dy = y1 - y; + w1 -= dx; + h1 -= dy; + if ((w1 <= 0) || (h1 <= 0)) return; + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean + _writeCommand(0x91); // partial in + _setPartialRamArea(x1, y1, w1, h1); + _writeCommand(command); + _startTransfer(); + for (int16_t i = 0; i < h1; i++) + { + for (int16_t j = 0; j < w1 / 8; j++) + { + uint8_t data; + // use wb, h of bitmap for index! + uint16_t idx = mirror_y ? j + dx / 8 + uint16_t((h - 1 - (i + dy))) * wb : j + dx / 8 + uint16_t(i + dy) * wb; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&bitmap[idx]); +#else + data = bitmap[idx]; +#endif + } + else + { + data = bitmap[idx]; + } + if (invert) data = ~data; + _transfer(data); + } + } + _endTransfer(); + _writeCommand(0x92); // partial out + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 +} + +void GxEPD2_310_GDEQ031T10::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + _writeImagePart(0x13, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); +} + +void GxEPD2_310_GDEQ031T10::writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + _writeImagePart(0x10, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + //_writeImagePart(0x13, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); // set current, not needed +} + +void GxEPD2_310_GDEQ031T10::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 + if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; + if ((x_part < 0) || (x_part >= w_bitmap)) return; + if ((y_part < 0) || (y_part >= h_bitmap)) return; + uint16_t wb_bitmap = (w_bitmap + 7) / 8; // width bytes, bitmaps are padded + x_part -= x_part % 8; // byte boundary + w = w_bitmap - x_part < w ? w_bitmap - x_part : w; // limit + h = h_bitmap - y_part < h ? h_bitmap - y_part : h; // limit + x -= x % 8; // byte boundary + w = 8 * ((w + 7) / 8); // byte boundary, bitmaps are padded + int16_t x1 = x < 0 ? 0 : x; // limit + int16_t y1 = y < 0 ? 0 : y; // limit + int16_t w1 = x + w < int16_t(WIDTH) ? w : int16_t(WIDTH) - x; // limit + int16_t h1 = y + h < int16_t(HEIGHT) ? h : int16_t(HEIGHT) - y; // limit + int16_t dx = x1 - x; + int16_t dy = y1 - y; + w1 -= dx; + h1 -= dy; + if ((w1 <= 0) || (h1 <= 0)) return; + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean + _writeCommand(0x91); // partial in + _setPartialRamArea(x1, y1, w1, h1); + _writeCommand(command); + _startTransfer(); + for (int16_t i = 0; i < h1; i++) + { + for (int16_t j = 0; j < w1 / 8; j++) + { + uint8_t data; + // use wb_bitmap, h_bitmap of bitmap for index! + uint16_t idx = mirror_y ? x_part / 8 + j + dx / 8 + uint16_t((h_bitmap - 1 - (y_part + i + dy))) * wb_bitmap : x_part / 8 + j + dx / 8 + uint16_t(y_part + i + dy) * wb_bitmap; + if (pgm) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&bitmap[idx]); +#else + data = bitmap[idx]; +#endif + } + else + { + data = bitmap[idx]; + } + if (invert) data = ~data; + _transfer(data); + } + } + _endTransfer(); + _writeCommand(0x92); // partial out + delay(1); // yield() to avoid WDT on ESP8266 and ESP32 +} + +void GxEPD2_310_GDEQ031T10::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) +{ + if (black) + { + writeImage(black, x, y, w, h, invert, mirror_y, pgm); + } +} + +void GxEPD2_310_GDEQ031T10::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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + if (black) + { + writeImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + } +} + +void GxEPD2_310_GDEQ031T10::writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + if (data1) + { + writeImage(data1, x, y, w, h, invert, mirror_y, pgm); + } +} + +void GxEPD2_310_GDEQ031T10::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm); + refresh(x, y, w, h); + writeImageAgain(bitmap, x, y, w, h, invert, mirror_y, pgm); +} + +void GxEPD2_310_GDEQ031T10::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + refresh(x, y, w, h); + writeImagePartAgain(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); +} + +void GxEPD2_310_GDEQ031T10::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) +{ + if (black) + { + drawImage(black, x, y, w, h, invert, mirror_y, pgm); + } +} + +void GxEPD2_310_GDEQ031T10::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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + if (black) + { + drawImagePart(black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); + } +} + +void GxEPD2_310_GDEQ031T10::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +{ + if (data1) + { + drawImage(data1, x, y, w, h, invert, mirror_y, pgm); + } +} + +void GxEPD2_310_GDEQ031T10::refresh(bool partial_update_mode) +{ + if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); + else + { + _Update_Full(); + _initial_refresh = false; // initial full update done + } +} + +void GxEPD2_310_GDEQ031T10::refresh(int16_t x, int16_t y, int16_t w, int16_t h) +{ + if (_initial_refresh) return refresh(false); // initial update needs be full update + // intersection with screen + int16_t w1 = x < 0 ? w + x : w; // reduce + int16_t h1 = y < 0 ? h + y : h; // reduce + int16_t x1 = x < 0 ? 0 : x; // limit + int16_t y1 = y < 0 ? 0 : y; // limit + w1 = x1 + w1 < int16_t(WIDTH) ? w1 : int16_t(WIDTH) - x1; // limit + h1 = y1 + h1 < int16_t(HEIGHT) ? h1 : int16_t(HEIGHT) - y1; // limit + if ((w1 <= 0) || (h1 <= 0)) return; + // make x1, w1 multiple of 8 + w1 += x1 % 8; + if (w1 % 8 > 0) w1 += 8 - w1 % 8; + x1 -= x1 % 8; + if (usePartialUpdateWindow) _writeCommand(0x91); // partial in + _setPartialRamArea(x1, y1, w1, h1); + _Update_Part(); + if (usePartialUpdateWindow) _writeCommand(0x92); // partial out +} + +void GxEPD2_310_GDEQ031T10::powerOff(void) +{ + _PowerOff(); +} + +void GxEPD2_310_GDEQ031T10::hibernate() +{ + _PowerOff(); + if (_rst >= 0) + { + _writeCommand(0x07); // deep sleep + _writeData(0xA5); // check code + _hibernating = true; + _init_display_done = false; + } +} + +void GxEPD2_310_GDEQ031T10::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h) +{ + uint16_t xe = (x + w - 1) | 0x0007; // byte boundary inclusive (last byte) + uint16_t ye = y + h - 1; + x &= 0xFFF8; // byte boundary + _writeCommand(0x90); // partial window + _writeData(x); + _writeData(xe); + _writeData(y / 256); + _writeData(y % 256); + _writeData(ye / 256); + _writeData(ye % 256); + _writeData(0x01); +} + +void GxEPD2_310_GDEQ031T10::_PowerOn() +{ + if (!_power_is_on) + { + _writeCommand(0x04); + _waitWhileBusy("_PowerOn", power_on_time); + } + _power_is_on = true; +} + +void GxEPD2_310_GDEQ031T10::_PowerOff() +{ + if (_power_is_on) + { + _writeCommand(0x02); // power off + _waitWhileBusy("_PowerOff", power_off_time); + } + _power_is_on = false; +} + +void GxEPD2_310_GDEQ031T10::_InitDisplay() +{ + if (_hibernating) _reset(); + else + { + _writeCommand(0x00); // PANEL SETTING + _writeData(0x1e); // soft reset + _writeData(0x0d); + delay(1); + } + _power_is_on = false; + _writeCommand(0x00); // PANEL SETTING + _writeData(0x1f); // KW: 3f, KWR: 2F, BWROTP: 0f, BWOTP: 1f + _writeData(0x0d); + _init_display_done = true; +} + +void GxEPD2_310_GDEQ031T10::_Update_Full() +{ + if (useFastFullUpdate) + { + _writeCommand(0xE0); // Cascade Setting (CCSET) + _writeData(0x02); // TSFIX + _writeCommand(0xE5); // Force Temperature (TSSET) + _writeData(0x5A); // 90, 1015000us + //_writeData(0x6E); // 110, 1542001 + } + _writeCommand(0x50); + _writeData(0x97); + _PowerOn(); + _writeCommand(0x12); //display refresh + _waitWhileBusy("_Update_Full", full_refresh_time); + _init_display_done = false; // needed, reason unknown +} + +void GxEPD2_310_GDEQ031T10::_Update_Part() +{ + if (hasFastPartialUpdate) + { + _writeCommand(0xE0); // Cascade Setting (CCSET) + _writeData(0x02); // TSFIX + _writeCommand(0xE5); // Force Temperature (TSSET) + _writeData(0x79); // 121 + } + _writeCommand(0x50); + _writeData(0xD7); + _PowerOn(); + _writeCommand(0x12); //display refresh + _waitWhileBusy("_Update_Part", partial_refresh_time); + _init_display_done = false; // needed, reason unknown +} diff --git a/src/gdeq/GxEPD2_310_GDEQ031T10.h b/src/gdeq/GxEPD2_310_GDEQ031T10.h new file mode 100644 index 00000000..9a4458b1 --- /dev/null +++ b/src/gdeq/GxEPD2_310_GDEQ031T10.h @@ -0,0 +1,83 @@ +// Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. +// Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! +// +// based on Demo Example from Good Display: https://www.good-display.com/product/426.html +// Panel: GDEQ031T10 : https://www.good-display.com/product/426.html +// Controller: UC8253 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8253.pdf +// +// Author: Jean-Marc Zingg +// +// Version: see library.properties +// +// Library: https://github.com/ZinggJM/GxEPD2 + +#ifndef _GxEPD2_310_GDEQ031T10_H_ +#define _GxEPD2_310_GDEQ031T10_H_ + +#include "../GxEPD2_EPD.h" + +class GxEPD2_310_GDEQ031T10 : public GxEPD2_EPD +{ + public: + // attributes + static const uint16_t WIDTH = 240; + static const uint16_t WIDTH_VISIBLE = WIDTH; + static const uint16_t HEIGHT = 320; + static const GxEPD2::Panel panel = GxEPD2::GDEQ031T10; + static const bool hasColor = false; + static const bool hasPartialUpdate = true; + static const bool usePartialUpdateWindow = true; // set false for better image + static const bool hasFastPartialUpdate = true; // set this false to force full refresh always + static const bool useFastFullUpdate = true; // set false for extended (low) temperature range, 1015000us vs 3082001us + static const uint16_t power_on_time = 50; // ms, e.g. 45000us + static const uint16_t power_off_time = 50; // ms, e.g. 45000us + static const uint16_t full_refresh_time = 1100; // ms, e.g. 1015000us + static const uint16_t partial_refresh_time = 700; // ms, e.g. 650000us + // constructor + GxEPD2_310_GDEQ031T10(int16_t cs, int16_t dc, int16_t rst, int16_t busy); + // methods (virtual) + // Support for Bitmaps (Sprites) to Controller Buffer and to Screen + void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white) + void writeScreenBuffer(uint8_t value = 0xFF); // init controller memory (default white) + void writeScreenBufferAgain(uint8_t value = 0xFF); // init previous buffer controller memory (default white) + // write to controller memory, without screen refresh; x and w should be multiple of 8 + 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); + 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); + void writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + 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); + 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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + // for differential update: set current and previous buffers equal (for fast partial update to work correctly) + 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); + void writeImagePartAgain(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + // write sprite of native data to controller memory, without screen refresh; x and w should be multiple of 8 + 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); + // write to controller memory, with screen refresh; x and w should be multiple of 8 + 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); + void drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + 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); + 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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + // write sprite of native data to controller memory, with screen refresh; x and w should be multiple of 8 + 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); + void refresh(bool partial_update_mode = false); // screen refresh from controller memory to full screen + void refresh(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen + void powerOff(); // turns off generation of panel driving voltages, avoids screen fading over time + void hibernate(); // turns powerOff() and sets controller to deep sleep for minimum power use, ONLY if wakeable by RST (rst >= 0) + private: + void _writeScreenBuffer(uint8_t command, uint8_t value); + 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); + 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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false); + void _setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h); + void _PowerOn(); + void _PowerOff(); + void _InitDisplay(); + void _Update_Full(); + void _Update_Part(); +}; + +#endif diff --git a/src/gdeq/GxEPD2_426_GDEQ0426T82.cpp b/src/gdeq/GxEPD2_426_GDEQ0426T82.cpp index d0af9dc1..964fddcc 100644 --- a/src/gdeq/GxEPD2_426_GDEQ0426T82.cpp +++ b/src/gdeq/GxEPD2_426_GDEQ0426T82.cpp @@ -20,27 +20,29 @@ GxEPD2_426_GDEQ0426T82::GxEPD2_426_GDEQ0426T82(int16_t cs, int16_t dc, int16_t r void GxEPD2_426_GDEQ0426T82::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_426_GDEQ0426T82::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_426_GDEQ0426T82::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_426_GDEQ0426T82::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,20 +59,18 @@ void GxEPD2_426_GDEQ0426T82::writeImage(const uint8_t bitmap[], int16_t x, int16 void GxEPD2_426_GDEQ0426T82::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } - void GxEPD2_426_GDEQ0426T82::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_426_GDEQ0426T82::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -84,7 +84,8 @@ void GxEPD2_426_GDEQ0426T82::_writeImage(uint8_t command, const uint8_t bitmap[] w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -131,7 +132,6 @@ void GxEPD2_426_GDEQ0426T82::writeImagePartAgain(const uint8_t bitmap[], int16_t void GxEPD2_426_GDEQ0426T82::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -151,7 +151,8 @@ void GxEPD2_426_GDEQ0426T82::_writeImagePart(uint8_t command, const uint8_t bitm w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -252,7 +253,6 @@ void GxEPD2_426_GDEQ0426T82::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -273,7 +273,6 @@ void GxEPD2_426_GDEQ0426T82::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -291,6 +290,7 @@ void GxEPD2_426_GDEQ0426T82::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -368,24 +368,12 @@ void GxEPD2_426_GDEQ0426T82::_InitDisplay() _writeCommand(0x3C); // BorderWavefrom _writeData(0x01); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_426_GDEQ0426T82::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_426_GDEQ0426T82::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_426_GDEQ0426T82::_Update_Full() { + _PowerOn(); _writeCommand(0x21); // Display Update Controll _writeData(0x40); // bypass RED as 0 _writeData(0x00); // single chip application @@ -407,6 +395,7 @@ void GxEPD2_426_GDEQ0426T82::_Update_Full() void GxEPD2_426_GDEQ0426T82::_Update_Part() { + _PowerOn(); _writeCommand(0x21); // Display Update Controll _writeData(0x00); // RED normal _writeData(0x00); // single chip application diff --git a/src/gdeq/GxEPD2_426_GDEQ0426T82.h b/src/gdeq/GxEPD2_426_GDEQ0426T82.h index 7761f9ef..e877e965 100644 --- a/src/gdeq/GxEPD2_426_GDEQ0426T82.h +++ b/src/gdeq/GxEPD2_426_GDEQ0426T82.h @@ -75,8 +75,6 @@ class GxEPD2_426_GDEQ0426T82 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/gdey/GxEPD2_154_GDEY0154D67.cpp b/src/gdey/GxEPD2_154_GDEY0154D67.cpp index 50093085..c3ee30d6 100644 --- a/src/gdey/GxEPD2_154_GDEY0154D67.cpp +++ b/src/gdey/GxEPD2_154_GDEY0154D67.cpp @@ -1,9 +1,9 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display, available here: http://www.e-paper-display.com/download_detail/downloadsId=806.html -// Panel: GDEH0154D67 : http://www.e-paper-display.com/products_detail/productId=455.html -// Controller : SSD1681 : http://www.e-paper-display.com/download_detail/downloadsId=825.html +// based on Demo Example from Good Display, available here: https://www.good-display.com/product/388.html +// Panel: GDEY0154D67 : https://www.good-display.com/product/388.html +// Controller : SSD1681 : https://v4.cecdn.yun300.cn/100001_1909185148/SSD1681.pdf // // Author: Jean-Marc Zingg // @@ -20,27 +20,29 @@ GxEPD2_154_GDEY0154D67::GxEPD2_154_GDEY0154D67(int16_t cs, int16_t dc, int16_t r void GxEPD2_154_GDEY0154D67::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_154_GDEY0154D67::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_154_GDEY0154D67::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_154_GDEY0154D67::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,18 +59,17 @@ void GxEPD2_154_GDEY0154D67::writeImage(const uint8_t bitmap[], int16_t x, int16 void GxEPD2_154_GDEY0154D67::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_154_GDEY0154D67::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_154_GDEY0154D67::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -82,7 +83,8 @@ void GxEPD2_154_GDEY0154D67::_writeImage(uint8_t command, const uint8_t bitmap[] w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -128,7 +130,6 @@ void GxEPD2_154_GDEY0154D67::writeImagePartAgain(const uint8_t bitmap[], int16_t void GxEPD2_154_GDEY0154D67::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -148,7 +149,8 @@ void GxEPD2_154_GDEY0154D67::_writeImagePart(uint8_t command, const uint8_t bitm w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -249,7 +251,6 @@ void GxEPD2_154_GDEY0154D67::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -270,7 +271,6 @@ void GxEPD2_154_GDEY0154D67::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -288,6 +288,7 @@ void GxEPD2_154_GDEY0154D67::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -350,24 +351,12 @@ void GxEPD2_154_GDEY0154D67::_InitDisplay() _writeCommand(0x18); //Reading temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_154_GDEY0154D67::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_154_GDEY0154D67::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_154_GDEY0154D67::_Update_Full() { + _PowerOn(); if (useFastFullUpdate) { _writeCommand(0x1A); // Write to temperature register @@ -386,6 +375,7 @@ void GxEPD2_154_GDEY0154D67::_Update_Full() void GxEPD2_154_GDEY0154D67::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/gdey/GxEPD2_154_GDEY0154D67.h b/src/gdey/GxEPD2_154_GDEY0154D67.h index aa535482..fa4632a2 100644 --- a/src/gdey/GxEPD2_154_GDEY0154D67.h +++ b/src/gdey/GxEPD2_154_GDEY0154D67.h @@ -75,8 +75,6 @@ class GxEPD2_154_GDEY0154D67 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/gdey/GxEPD2_213_GDEY0213B74.cpp b/src/gdey/GxEPD2_213_GDEY0213B74.cpp index 1b39a1f2..2c8d5c87 100644 --- a/src/gdey/GxEPD2_213_GDEY0213B74.cpp +++ b/src/gdey/GxEPD2_213_GDEY0213B74.cpp @@ -20,27 +20,29 @@ GxEPD2_213_GDEY0213B74::GxEPD2_213_GDEY0213B74(int16_t cs, int16_t dc, int16_t r void GxEPD2_213_GDEY0213B74::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_213_GDEY0213B74::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_213_GDEY0213B74::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_213_GDEY0213B74::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,19 +59,18 @@ void GxEPD2_213_GDEY0213B74::writeImage(const uint8_t bitmap[], int16_t x, int16 void GxEPD2_213_GDEY0213B74::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_213_GDEY0213B74::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_213_GDEY0213B74::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -83,7 +84,8 @@ void GxEPD2_213_GDEY0213B74::_writeImage(uint8_t command, const uint8_t bitmap[] w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -129,7 +131,6 @@ void GxEPD2_213_GDEY0213B74::writeImagePartAgain(const uint8_t bitmap[], int16_t void GxEPD2_213_GDEY0213B74::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -149,7 +150,8 @@ void GxEPD2_213_GDEY0213B74::_writeImagePart(uint8_t command, const uint8_t bitm w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -250,7 +252,6 @@ void GxEPD2_213_GDEY0213B74::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -271,7 +272,6 @@ void GxEPD2_213_GDEY0213B74::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -289,6 +289,7 @@ void GxEPD2_213_GDEY0213B74::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -356,24 +357,12 @@ void GxEPD2_213_GDEY0213B74::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_213_GDEY0213B74::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_213_GDEY0213B74::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_213_GDEY0213B74::_Update_Full() { + _PowerOn(); if (useFastFullUpdate) { _writeCommand(0x1A); // Write to temperature register @@ -392,6 +381,7 @@ void GxEPD2_213_GDEY0213B74::_Update_Full() void GxEPD2_213_GDEY0213B74::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/gdey/GxEPD2_213_GDEY0213B74.h b/src/gdey/GxEPD2_213_GDEY0213B74.h index c2e01c27..b7930db8 100644 --- a/src/gdey/GxEPD2_213_GDEY0213B74.h +++ b/src/gdey/GxEPD2_213_GDEY0213B74.h @@ -75,8 +75,6 @@ class GxEPD2_213_GDEY0213B74 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/gdey/GxEPD2_266_GDEY0266T90.cpp b/src/gdey/GxEPD2_266_GDEY0266T90.cpp index a25ec66d..a052f164 100644 --- a/src/gdey/GxEPD2_266_GDEY0266T90.cpp +++ b/src/gdey/GxEPD2_266_GDEY0266T90.cpp @@ -20,27 +20,29 @@ GxEPD2_266_GDEY0266T90::GxEPD2_266_GDEY0266T90(int16_t cs, int16_t dc, int16_t r void GxEPD2_266_GDEY0266T90::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_266_GDEY0266T90::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_266_GDEY0266T90::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_266_GDEY0266T90::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,19 +59,18 @@ void GxEPD2_266_GDEY0266T90::writeImage(const uint8_t bitmap[], int16_t x, int16 void GxEPD2_266_GDEY0266T90::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_266_GDEY0266T90::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_266_GDEY0266T90::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -83,7 +84,8 @@ void GxEPD2_266_GDEY0266T90::_writeImage(uint8_t command, const uint8_t bitmap[] w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -129,7 +131,6 @@ void GxEPD2_266_GDEY0266T90::writeImagePartAgain(const uint8_t bitmap[], int16_t void GxEPD2_266_GDEY0266T90::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -149,7 +150,8 @@ void GxEPD2_266_GDEY0266T90::_writeImagePart(uint8_t command, const uint8_t bitm w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -250,7 +252,6 @@ void GxEPD2_266_GDEY0266T90::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -271,7 +272,6 @@ void GxEPD2_266_GDEY0266T90::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -289,6 +289,7 @@ void GxEPD2_266_GDEY0266T90::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -354,24 +355,12 @@ void GxEPD2_266_GDEY0266T90::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_266_GDEY0266T90::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_266_GDEY0266T90::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_266_GDEY0266T90::_Update_Full() { + _PowerOn(); if (useFastFullUpdate) { _writeCommand(0x1A); // Write to temperature register @@ -390,6 +379,7 @@ void GxEPD2_266_GDEY0266T90::_Update_Full() void GxEPD2_266_GDEY0266T90::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/gdey/GxEPD2_266_GDEY0266T90.h b/src/gdey/GxEPD2_266_GDEY0266T90.h index dcf79825..be253817 100644 --- a/src/gdey/GxEPD2_266_GDEY0266T90.h +++ b/src/gdey/GxEPD2_266_GDEY0266T90.h @@ -75,8 +75,6 @@ class GxEPD2_266_GDEY0266T90 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/gdey/GxEPD2_270_GDEY027T91.cpp b/src/gdey/GxEPD2_270_GDEY027T91.cpp index 9a5589f5..f4a9369a 100644 --- a/src/gdey/GxEPD2_270_GDEY027T91.cpp +++ b/src/gdey/GxEPD2_270_GDEY027T91.cpp @@ -20,27 +20,29 @@ GxEPD2_270_GDEY027T91::GxEPD2_270_GDEY027T91(int16_t cs, int16_t dc, int16_t rst void GxEPD2_270_GDEY027T91::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_270_GDEY027T91::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_270_GDEY027T91::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_270_GDEY027T91::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,19 +59,18 @@ void GxEPD2_270_GDEY027T91::writeImage(const uint8_t bitmap[], int16_t x, int16_ void GxEPD2_270_GDEY027T91::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_270_GDEY027T91::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_270_GDEY027T91::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -83,7 +84,8 @@ void GxEPD2_270_GDEY027T91::_writeImage(uint8_t command, const uint8_t bitmap[], w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -129,7 +131,6 @@ void GxEPD2_270_GDEY027T91::writeImagePartAgain(const uint8_t bitmap[], int16_t void GxEPD2_270_GDEY027T91::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -149,7 +150,8 @@ void GxEPD2_270_GDEY027T91::_writeImagePart(uint8_t command, const uint8_t bitma w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -250,7 +252,6 @@ void GxEPD2_270_GDEY027T91::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -271,7 +272,6 @@ void GxEPD2_270_GDEY027T91::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -289,6 +289,7 @@ void GxEPD2_270_GDEY027T91::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -349,24 +350,12 @@ void GxEPD2_270_GDEY027T91::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_270_GDEY027T91::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_270_GDEY027T91::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_270_GDEY027T91::_Update_Full() { + _PowerOn(); if (useFastFullUpdate) { _writeCommand(0x1A); // Write to temperature register @@ -385,6 +374,7 @@ void GxEPD2_270_GDEY027T91::_Update_Full() void GxEPD2_270_GDEY027T91::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/gdey/GxEPD2_270_GDEY027T91.h b/src/gdey/GxEPD2_270_GDEY027T91.h index d42da71f..4310e63a 100644 --- a/src/gdey/GxEPD2_270_GDEY027T91.h +++ b/src/gdey/GxEPD2_270_GDEY027T91.h @@ -75,8 +75,6 @@ class GxEPD2_270_GDEY027T91 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/gdey/GxEPD2_290_GDEY029T94.cpp b/src/gdey/GxEPD2_290_GDEY029T94.cpp index 4be186ca..fb60ffc0 100644 --- a/src/gdey/GxEPD2_290_GDEY029T94.cpp +++ b/src/gdey/GxEPD2_290_GDEY029T94.cpp @@ -20,27 +20,29 @@ GxEPD2_290_GDEY029T94::GxEPD2_290_GDEY029T94(int16_t cs, int16_t dc, int16_t rst void GxEPD2_290_GDEY029T94::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_290_GDEY029T94::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); - if (_initial_write) _writeScreenBuffer(0x26, value); // set previous + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_290_GDEY029T94::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current + _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_290_GDEY029T94::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,19 +59,18 @@ void GxEPD2_290_GDEY029T94::writeImage(const uint8_t bitmap[], int16_t x, int16_ void GxEPD2_290_GDEY029T94::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_290_GDEY029T94::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_290_GDEY029T94::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -83,7 +84,8 @@ void GxEPD2_290_GDEY029T94::_writeImage(uint8_t command, const uint8_t bitmap[], w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -129,7 +131,6 @@ void GxEPD2_290_GDEY029T94::writeImagePartAgain(const uint8_t bitmap[], int16_t void GxEPD2_290_GDEY029T94::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -149,7 +150,8 @@ void GxEPD2_290_GDEY029T94::_writeImagePart(uint8_t command, const uint8_t bitma w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -250,7 +252,6 @@ void GxEPD2_290_GDEY029T94::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -271,7 +272,6 @@ void GxEPD2_290_GDEY029T94::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -289,6 +289,7 @@ void GxEPD2_290_GDEY029T94::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -354,24 +355,12 @@ void GxEPD2_290_GDEY029T94::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_290_GDEY029T94::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_290_GDEY029T94::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_290_GDEY029T94::_Update_Full() { + _PowerOn(); if (useFastFullUpdate) { _writeCommand(0x1A); // Write to temperature register @@ -390,6 +379,7 @@ void GxEPD2_290_GDEY029T94::_Update_Full() void GxEPD2_290_GDEY029T94::_Update_Part() { + _PowerOn(); _writeCommand(0x22); _writeData(0xfc); _writeCommand(0x20); diff --git a/src/gdey/GxEPD2_290_GDEY029T94.h b/src/gdey/GxEPD2_290_GDEY029T94.h index ae4622dd..601aed75 100644 --- a/src/gdey/GxEPD2_290_GDEY029T94.h +++ b/src/gdey/GxEPD2_290_GDEY029T94.h @@ -75,8 +75,6 @@ class GxEPD2_290_GDEY029T94 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/gdey/GxEPD2_420_GDEY042T81.cpp b/src/gdey/GxEPD2_420_GDEY042T81.cpp index 5c6aa565..9fe50b82 100644 --- a/src/gdey/GxEPD2_420_GDEY042T81.cpp +++ b/src/gdey/GxEPD2_420_GDEY042T81.cpp @@ -20,27 +20,29 @@ GxEPD2_420_GDEY042T81::GxEPD2_420_GDEY042T81(int16_t cs, int16_t dc, int16_t rst void GxEPD2_420_GDEY042T81::clearScreen(uint8_t value) { - writeScreenBuffer(value); - refresh(true); - writeScreenBufferAgain(value); + // full refresh needed for all cases (previous != screen) + _writeScreenBuffer(0x26, value); // set previous + _writeScreenBuffer(0x24, value); // set current + refresh(false); // full refresh + _initial_write = false; } void GxEPD2_420_GDEY042T81::writeScreenBuffer(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); + if (_initial_write) return clearScreen(value); _writeScreenBuffer(0x24, value); // set current - _initial_write = false; // initial full screen buffer clean done } void GxEPD2_420_GDEY042T81::writeScreenBufferAgain(uint8_t value) { - if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x24, value); // set current _writeScreenBuffer(0x26, value); // set previous } void GxEPD2_420_GDEY042T81::_writeScreenBuffer(uint8_t command, uint8_t value) { + if (!_init_display_done) _InitDisplay(); + _setPartialRamArea(0, 0, WIDTH, HEIGHT); _writeCommand(command); _startTransfer(); for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++) @@ -57,20 +59,19 @@ void GxEPD2_420_GDEY042T81::writeImage(const uint8_t bitmap[], int16_t x, int16_ void GxEPD2_420_GDEY042T81::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_420_GDEY042T81::writeImageAgain(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); - _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); + _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous + _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm); // set current } void GxEPD2_420_GDEY042T81::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 int16_t wb = (w + 7) / 8; // width bytes, bitmaps are padded x -= x % 8; // byte boundary @@ -84,7 +85,8 @@ void GxEPD2_420_GDEY042T81::_writeImage(uint8_t command, const uint8_t bitmap[], w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -131,7 +133,6 @@ void GxEPD2_420_GDEY042T81::writeImagePartAgain(const uint8_t bitmap[], int16_t void GxEPD2_420_GDEY042T81::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 if ((w_bitmap < 0) || (h_bitmap < 0) || (w < 0) || (h < 0)) return; if ((x_part < 0) || (x_part >= w_bitmap)) return; @@ -151,7 +152,8 @@ void GxEPD2_420_GDEY042T81::_writeImagePart(uint8_t command, const uint8_t bitma w1 -= dx; h1 -= dy; if ((w1 <= 0) || (h1 <= 0)) return; - if (!_using_partial_mode) _Init_Part(); + if (!_init_display_done) _InitDisplay(); + if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean _setPartialRamArea(x1, y1, w1, h1); _writeCommand(command); _startTransfer(); @@ -252,7 +254,6 @@ void GxEPD2_420_GDEY042T81::refresh(bool partial_update_mode) if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else { - if (_using_partial_mode) _Init_Full(); _Update_Full(); _initial_refresh = false; // initial full update done } @@ -273,7 +274,6 @@ void GxEPD2_420_GDEY042T81::refresh(int16_t x, int16_t y, int16_t w, int16_t h) w1 += x1 % 8; if (w1 % 8 > 0) w1 += 8 - w1 % 8; x1 -= x1 % 8; - if (!_using_partial_mode) _Init_Part(); _setPartialRamArea(x1, y1, w1, h1); _Update_Part(); } @@ -291,6 +291,7 @@ void GxEPD2_420_GDEY042T81::hibernate() _writeCommand(0x10); // deep sleep mode _writeData(0x1); // enter deep sleep _hibernating = true; + _init_display_done = false; } } @@ -353,24 +354,12 @@ void GxEPD2_420_GDEY042T81::_InitDisplay() _writeCommand(0x18); //Read built-in temperature sensor _writeData(0x80); _setPartialRamArea(0, 0, WIDTH, HEIGHT); -} - -void GxEPD2_420_GDEY042T81::_Init_Full() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = false; -} - -void GxEPD2_420_GDEY042T81::_Init_Part() -{ - _InitDisplay(); - _PowerOn(); - _using_partial_mode = true; + _init_display_done = true; } void GxEPD2_420_GDEY042T81::_Update_Full() { + _PowerOn(); _writeCommand(0x21); // Display Update Controll _writeData(0x40); // bypass RED as 0 _writeData(0x00); // single chip application @@ -392,6 +381,7 @@ void GxEPD2_420_GDEY042T81::_Update_Full() void GxEPD2_420_GDEY042T81::_Update_Part() { + _PowerOn(); _writeCommand(0x21); // Display Update Controll _writeData(0x00); // RED normal _writeData(0x00); // single chip application diff --git a/src/gdey/GxEPD2_420_GDEY042T81.h b/src/gdey/GxEPD2_420_GDEY042T81.h index 802d1fb4..0df98283 100644 --- a/src/gdey/GxEPD2_420_GDEY042T81.h +++ b/src/gdey/GxEPD2_420_GDEY042T81.h @@ -75,8 +75,6 @@ class GxEPD2_420_GDEY042T81 : public GxEPD2_EPD void _PowerOn(); void _PowerOff(); void _InitDisplay(); - void _Init_Full(); - void _Init_Part(); void _Update_Full(); void _Update_Part(); }; diff --git a/src/epd/GxEPD2_750_YT7.cpp b/src/gdey/GxEPD2_750_GDEY075T7.cpp similarity index 60% rename from src/epd/GxEPD2_750_YT7.cpp rename to src/gdey/GxEPD2_750_GDEY075T7.cpp index 13b3a208..39f2357d 100644 --- a/src/epd/GxEPD2_750_YT7.cpp +++ b/src/gdey/GxEPD2_750_GDEY075T7.cpp @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: +// based on Demo Example from Good Display: https://www.good-display.com/comp/xcompanyFile/downloadNew.do?appId=24&fid=1373&id=1125 // Panel: GDEY075T7 : https://www.good-display.com/product/396.html // Controller: UC8179 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8179.pdf // @@ -11,21 +11,21 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -#include "GxEPD2_750_YT7.h" +#include "GxEPD2_750_GDEY075T7.h" -GxEPD2_750_YT7::GxEPD2_750_YT7(int16_t cs, int16_t dc, int16_t rst, int16_t busy) : +GxEPD2_750_GDEY075T7::GxEPD2_750_GDEY075T7(int16_t cs, int16_t dc, int16_t rst, int16_t busy) : GxEPD2_EPD(cs, dc, rst, busy, LOW, 10000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate) { } -void GxEPD2_750_YT7::clearScreen(uint8_t value) +void GxEPD2_750_GDEY075T7::clearScreen(uint8_t value) { writeScreenBuffer(value); refresh(true); writeScreenBuffer(value); } -void GxEPD2_750_YT7::writeScreenBuffer(uint8_t value) +void GxEPD2_750_GDEY075T7::writeScreenBuffer(uint8_t value) { if (!_using_partial_mode) _Init_Part(); _writeScreenBuffer(0x13, value); // set current @@ -33,7 +33,7 @@ void GxEPD2_750_YT7::writeScreenBuffer(uint8_t value) _initial_write = false; // initial full screen buffer clean done } -void GxEPD2_750_YT7::_writeScreenBuffer(uint8_t command, uint8_t value) +void GxEPD2_750_GDEY075T7::_writeScreenBuffer(uint8_t command, uint8_t value) { _writeCommand(command); _startTransfer(); @@ -44,18 +44,17 @@ void GxEPD2_750_YT7::_writeScreenBuffer(uint8_t command, uint8_t value) _endTransfer(); } -void GxEPD2_750_YT7::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm); } -void GxEPD2_750_YT7::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::writeImageForFullRefresh(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { - _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm); // set previous, needed for dithered lion _writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm); } -void GxEPD2_750_YT7::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::_writeImage(uint8_t command, const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 @@ -104,14 +103,14 @@ void GxEPD2_750_YT7::_writeImage(uint8_t command, const uint8_t bitmap[], int16_ delay(1); // yield() to avoid WDT on ESP8266 and ESP32 } -void GxEPD2_750_YT7::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { _writeImagePart(0x13, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); } -void GxEPD2_750_YT7::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::_writeImagePart(uint8_t command, const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { if (_initial_write) writeScreenBuffer(); // initial full screen buffer clean delay(1); // yield() to avoid WDT on ESP8266 and ESP32 @@ -166,7 +165,7 @@ void GxEPD2_750_YT7::_writeImagePart(uint8_t command, const uint8_t bitmap[], in delay(1); // yield() to avoid WDT on ESP8266 and ESP32 } -void GxEPD2_750_YT7::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) +void GxEPD2_750_GDEY075T7::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) { if (black) { @@ -174,8 +173,8 @@ void GxEPD2_750_YT7::writeImage(const uint8_t* black, const uint8_t* color, int1 } } -void GxEPD2_750_YT7::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, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { if (black) { @@ -183,7 +182,7 @@ void GxEPD2_750_YT7::writeImagePart(const uint8_t* black, const uint8_t* color, } } -void GxEPD2_750_YT7::writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::writeNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { if (data1) { @@ -191,39 +190,39 @@ void GxEPD2_750_YT7::writeNative(const uint8_t* data1, const uint8_t* data2, int } } -void GxEPD2_750_YT7::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::drawImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { writeImage(bitmap, x, y, w, h, invert, mirror_y, pgm); refresh(x, y, w, h); } -void GxEPD2_750_YT7::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::drawImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { writeImagePart(bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); refresh(x, y, w, h); } -void GxEPD2_750_YT7::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) +void GxEPD2_750_GDEY075T7::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) { writeImage(black, color, x, y, w, h, invert, mirror_y, pgm); refresh(x, y, w, h); } -void GxEPD2_750_YT7::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, - int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::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, + int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { writeImagePart(black, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm); refresh(x, y, w, h); } -void GxEPD2_750_YT7::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) +void GxEPD2_750_GDEY075T7::drawNative(const uint8_t* data1, const uint8_t* data2, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm) { writeNative(data1, data2, x, y, w, h, invert, mirror_y, pgm); refresh(x, y, w, h); } -void GxEPD2_750_YT7::refresh(bool partial_update_mode) +void GxEPD2_750_GDEY075T7::refresh(bool partial_update_mode) { if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT); else @@ -234,7 +233,7 @@ void GxEPD2_750_YT7::refresh(bool partial_update_mode) } } -void GxEPD2_750_YT7::refresh(int16_t x, int16_t y, int16_t w, int16_t h) +void GxEPD2_750_GDEY075T7::refresh(int16_t x, int16_t y, int16_t w, int16_t h) { if (_initial_refresh) return refresh(false); // initial update needs be full update // intersection with screen @@ -256,12 +255,12 @@ void GxEPD2_750_YT7::refresh(int16_t x, int16_t y, int16_t w, int16_t h) if (usePartialUpdateWindow) _writeCommand(0x92); // partial out } -void GxEPD2_750_YT7::powerOff(void) +void GxEPD2_750_GDEY075T7::powerOff(void) { _PowerOff(); } -void GxEPD2_750_YT7::hibernate() +void GxEPD2_750_GDEY075T7::hibernate() { _PowerOff(); if (_rst >= 0) @@ -272,7 +271,7 @@ void GxEPD2_750_YT7::hibernate() } } -void GxEPD2_750_YT7::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h) +void GxEPD2_750_GDEY075T7::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { uint16_t xe = (x + w - 1) | 0x0007; // byte boundary inclusive (last byte) uint16_t ye = y + h - 1; @@ -290,7 +289,7 @@ void GxEPD2_750_YT7::_setPartialRamArea(uint16_t x, uint16_t y, uint16_t w, uint //_writeData(0x00); // don't see any difference } -void GxEPD2_750_YT7::_PowerOn() +void GxEPD2_750_GDEY075T7::_PowerOn() { if (!_power_is_on) { @@ -300,7 +299,7 @@ void GxEPD2_750_YT7::_PowerOn() _power_is_on = true; } -void GxEPD2_750_YT7::_PowerOff() +void GxEPD2_750_GDEY075T7::_PowerOff() { if (_power_is_on) { @@ -311,7 +310,7 @@ void GxEPD2_750_YT7::_PowerOff() _using_partial_mode = false; } -void GxEPD2_750_YT7::_InitDisplay() +void GxEPD2_750_GDEY075T7::_InitDisplay() { if (_hibernating) _reset(); _writeCommand(0x01); // POWER SETTING @@ -319,6 +318,12 @@ void GxEPD2_750_YT7::_InitDisplay() _writeData (0x07); // VGH=20V,VGL=-20V _writeData (0x3f); // VDH=15V _writeData (0x3f); // VDL=-15V + //Enhanced display drive(Add 0x06 command) + _writeCommand(0x06); //Booster Soft Start + _writeData (0x17); + _writeData (0x17); + _writeData (0x28); + _writeData (0x17); _writeCommand(0x00); //PANEL SETTING _writeData(0x1f); //KW: 3f, KWR: 2F, BWROTP: 0f, BWOTP: 1f _writeCommand(0x61); //tres @@ -343,39 +348,39 @@ void GxEPD2_750_YT7::_InitDisplay() #define T3 30 // color change phase (b/w) #define T4 5 // optional extension for one color -const unsigned char GxEPD2_750_YT7::lut_20_LUTC_partial[] PROGMEM = +const unsigned char GxEPD2_750_GDEY075T7::lut_20_LUTC_partial[] PROGMEM = { 0x00, T1, T2, T3, T4, 1, // 00 00 00 00 }; -const unsigned char GxEPD2_750_YT7::lut_21_LUTWW_partial[] PROGMEM = +const unsigned char GxEPD2_750_GDEY075T7::lut_21_LUTWW_partial[] PROGMEM = { // 10 w 0x00, T1, T2, T3, T4, 1, // 00 00 00 00 }; -const unsigned char GxEPD2_750_YT7::lut_22_LUTKW_partial[] PROGMEM = +const unsigned char GxEPD2_750_GDEY075T7::lut_22_LUTKW_partial[] PROGMEM = { // 10 w //0x48, T1, T2, T3, T4, 1, // 01 00 10 00 0x5A, T1, T2, T3, T4, 1, // 01 01 10 10 more white }; -const unsigned char GxEPD2_750_YT7::lut_23_LUTWK_partial[] PROGMEM = +const unsigned char GxEPD2_750_GDEY075T7::lut_23_LUTWK_partial[] PROGMEM = { // 01 b 0x84, T1, T2, T3, T4, 1, // 10 00 01 00 //0xA5, T1, T2, T3, T4, 1, // 10 10 01 01 more black }; -const unsigned char GxEPD2_750_YT7::lut_24_LUTKK_partial[] PROGMEM = +const unsigned char GxEPD2_750_GDEY075T7::lut_24_LUTKK_partial[] PROGMEM = { // 01 b 0x00, T1, T2, T3, T4, 1, // 00 00 00 00 }; -const unsigned char GxEPD2_750_YT7::lut_25_LUTBD_partial[] PROGMEM = +const unsigned char GxEPD2_750_GDEY075T7::lut_25_LUTBD_partial[] PROGMEM = { 0x00, T1, T2, T3, T4, 1, // 00 00 00 00 }; -void GxEPD2_750_YT7::_Init_Full() +void GxEPD2_750_GDEY075T7::_Init_Full() { _InitDisplay(); _writeCommand(0x00); // panel setting @@ -384,39 +389,66 @@ void GxEPD2_750_YT7::_Init_Full() _using_partial_mode = false; } -void GxEPD2_750_YT7::_Init_Part() +void GxEPD2_750_GDEY075T7::_Init_Part() { _InitDisplay(); - _writeCommand(0x00); //panel setting - _writeData(hasFastPartialUpdate ? 0x3f : 0x1f); // partial update LUT from registers - _writeCommand(0x82); // vcom_DC setting - _writeData (0x30); // -2.5V same value as in OTP - _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING - _writeData(0x39); // LUTBD, N2OCP: copy new to old - _writeData(0x07); - _writeCommand(0x20); - _writeDataPGM(lut_20_LUTC_partial, sizeof(lut_20_LUTC_partial), 42 - sizeof(lut_20_LUTC_partial)); - _writeCommand(0x21); - _writeDataPGM(lut_21_LUTWW_partial, sizeof(lut_21_LUTWW_partial), 42 - sizeof(lut_21_LUTWW_partial)); - _writeCommand(0x22); - _writeDataPGM(lut_22_LUTKW_partial, sizeof(lut_22_LUTKW_partial), 42 - sizeof(lut_22_LUTKW_partial)); - _writeCommand(0x23); - _writeDataPGM(lut_23_LUTWK_partial, sizeof(lut_23_LUTWK_partial), 42 - sizeof(lut_23_LUTWK_partial)); - _writeCommand(0x24); - _writeDataPGM(lut_24_LUTKK_partial, sizeof(lut_24_LUTKK_partial), 42 - sizeof(lut_24_LUTKK_partial)); - _writeCommand(0x25); - _writeDataPGM(lut_25_LUTBD_partial, sizeof(lut_25_LUTBD_partial), 42 - sizeof(lut_25_LUTBD_partial)); + if (hasFastPartialUpdate) + { + if (useFastPartialUpdateFromOTP) + { + _writeCommand(0xE0); // Cascade Setting (CCSET) + _writeData(0x02); // TSFIX + _writeCommand(0xE5); // Force Temperature (TSSET) + _writeData(0x6E); // 110 + } + else + { + _writeCommand(0x00); //panel setting + _writeData(0x3f); // partial update LUT from registers + _writeCommand(0x82); // vcom_DC setting + _writeData (0x30); // -2.5V same value as in OTP + _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING + _writeData(0x39); // LUTBD, N2OCP: copy new to old + _writeData(0x07); + _writeCommand(0x20); + _writeDataPGM(lut_20_LUTC_partial, sizeof(lut_20_LUTC_partial), 42 - sizeof(lut_20_LUTC_partial)); + _writeCommand(0x21); + _writeDataPGM(lut_21_LUTWW_partial, sizeof(lut_21_LUTWW_partial), 42 - sizeof(lut_21_LUTWW_partial)); + _writeCommand(0x22); + _writeDataPGM(lut_22_LUTKW_partial, sizeof(lut_22_LUTKW_partial), 42 - sizeof(lut_22_LUTKW_partial)); + _writeCommand(0x23); + _writeDataPGM(lut_23_LUTWK_partial, sizeof(lut_23_LUTWK_partial), 42 - sizeof(lut_23_LUTWK_partial)); + _writeCommand(0x24); + _writeDataPGM(lut_24_LUTKK_partial, sizeof(lut_24_LUTKK_partial), 42 - sizeof(lut_24_LUTKK_partial)); + _writeCommand(0x25); + _writeDataPGM(lut_25_LUTBD_partial, sizeof(lut_25_LUTBD_partial), 42 - sizeof(lut_25_LUTBD_partial)); + } + } _PowerOn(); _using_partial_mode = true; } -void GxEPD2_750_YT7::_Update_Full() +void GxEPD2_750_GDEY075T7::_Update_Full() { + if (useFastFullUpdate) + { + _writeCommand(0xE0); // Cascade Setting (CCSET) + _writeData(0x02); // TSFIX + _writeCommand(0xE5); // Force Temperature (TSSET) + _writeData(0x5A); // 90 + } + else + { + _writeCommand(0xE0); // Cascade Setting (CCSET) + _writeData(0x00); // no TSFIX, Temperature value is defined by internal temperature sensor + _writeCommand(0x41); // TSE, Enable Temperature Sensor + _writeData(0x00); // TSE, Internal temperature sensor switch + } _writeCommand(0x12); //display refresh _waitWhileBusy("_Update_Full", full_refresh_time); } -void GxEPD2_750_YT7::_Update_Part() +void GxEPD2_750_GDEY075T7::_Update_Part() { _writeCommand(0x12); //display refresh _waitWhileBusy("_Update_Part", partial_refresh_time); diff --git a/src/epd/GxEPD2_750_YT7.h b/src/gdey/GxEPD2_750_GDEY075T7.h similarity index 87% rename from src/epd/GxEPD2_750_YT7.h rename to src/gdey/GxEPD2_750_GDEY075T7.h index 17debe93..51797aad 100644 --- a/src/epd/GxEPD2_750_YT7.h +++ b/src/gdey/GxEPD2_750_GDEY075T7.h @@ -1,7 +1,7 @@ // Display Library for SPI e-paper panels from Dalian Good Display and boards from Waveshare. // Requires HW SPI and Adafruit_GFX. Caution: the e-paper panels require 3.3V supply AND data lines! // -// based on Demo Example from Good Display: +// based on Demo Example from Good Display: https://www.good-display.com/comp/xcompanyFile/downloadNew.do?appId=24&fid=1373&id=1125 // Panel: GDEY075T7 : https://www.good-display.com/product/396.html // Controller: UC8179 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8179.pdf // @@ -11,12 +11,12 @@ // // Library: https://github.com/ZinggJM/GxEPD2 -#ifndef _GxEPD2_750_YT7_H_ -#define _GxEPD2_750_YT7_H_ +#ifndef _GxEPD2_750_GDEY075T7_H_ +#define _GxEPD2_750_GDEY075T7_H_ #include "../GxEPD2_EPD.h" -class GxEPD2_750_YT7 : public GxEPD2_EPD +class GxEPD2_750_GDEY075T7 : public GxEPD2_EPD { public: // attributes @@ -28,12 +28,14 @@ class GxEPD2_750_YT7 : public GxEPD2_EPD static const bool hasPartialUpdate = true; static const bool usePartialUpdateWindow = false; // set false for better image static const bool hasFastPartialUpdate = true; // set this false to force full refresh always - static const uint16_t power_on_time = 140; // ms, e.g. 134460us - static const uint16_t power_off_time = 42; // ms, e.g. 40033us - static const uint16_t full_refresh_time = 4200; // ms, e.g. 4108238us - static const uint16_t partial_refresh_time = 1600; // ms, e.g. 1584124us + static const bool useFastFullUpdate = true; // set false for extended (low) temperature range + static const bool useFastPartialUpdateFromOTP = true; // set this false for earlier batches, such as the panel I have (1580258us) + static const uint16_t power_on_time = 140; // ms, e.g. 129018us + static const uint16_t power_off_time = 42; // ms, e.g. 40430us + static const uint16_t full_refresh_time = 1200; // ms, e.g. 1171000us + static const uint16_t partial_refresh_time = 450; // ms, e.g. 435000us // constructor - GxEPD2_750_YT7(int16_t cs, int16_t dc, int16_t rst, int16_t busy); + GxEPD2_750_GDEY075T7(int16_t cs, int16_t dc, int16_t rst, int16_t busy); // methods (virtual) // Support for Bitmaps (Sprites) to Controller Buffer and to Screen void clearScreen(uint8_t value = 0xFF); // init controller memory and screen (default white)