Explorar el Código

Merge pull request #78 from ZinggJM/work_in_progress

Version 1.6.2
ZinggJM hace 1 año
padre
commit
66ea1cf2e2

+ 7 - 2
README.md

@@ -46,7 +46,8 @@
 - 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
 - Note that these topics are closed. Use only for reference.
-- create a new topic for each question or issue in https://forum.arduino.cc/c/using-arduino/displays/23
+- The Arduino Forum is no longer watched and answered by the Author.
+- New questions or issues should be posted on https://github.com/ZinggJM/GxEPD2/discussions
 
 ### Note on documentation
 - GxEPD2 uses Adafruit_GFX for Graphics and Text support, which is well documented there
@@ -162,7 +163,11 @@
 - But only few panels at any time, and only panels from known sources. 
 - Adding support will take as much time as needed.
 
-### Version 1.6.1
+### Version 1.6.2
+- fixed support for GDEY029T71H 2.9" b/w 168x384, SSD1685
+- GxEPD2_WiFi_Example: added direct (non-buffered) BMP download to 7-color displays
+- some minor fixes
+#### Version 1.6.1
 - fixed and updated GxEPD2_WiFi_Example
 #### Version 1.6.0
 - updated support for GDEY029T94: fixed a partial refresh issue

+ 1 - 1
examples/GxEPD2_Example/GxEPD2_Example.ino

@@ -108,7 +108,7 @@
 #include "bitmaps/WS_Bitmaps7c192x143.h" // 5.65" 7-color
 #include "bitmaps/WS_Bitmaps7c300x180.h" // 7.3" 7-color
 #endif
-#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
+#if defined(ESP32) || defined(ESP_PLATFORM) || defined(ARDUINO_ARCH_RP2040)
 #include "bitmaps/Bitmaps1304x984.h" // 12.48" b/w
 #include "bitmaps/Bitmaps1360x480.h" // 10.85" b/w
 #include "bitmaps/Bitmaps3c1304x984.h" // 12.48" b/w/r

+ 4 - 1
examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 4 - 1
examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h

@@ -181,7 +181,7 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #endif
 
 #if defined(ARDUINO_ARCH_MEGAAVR)
-#if defined(ARDUINO_AVR_NANO_EVERY)
+#if defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_AVR_UNO_WIFI_REV2)
 #define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
 #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))
@@ -212,6 +212,9 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13)); // Good Display ESP32 Development Kit ESP32-L
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 27, /*DC=*/ 14, /*RST=*/ 12, /*BUSY=*/ 13, /*CS2=*/ 4)); // for GDEM1085T51 with ESP32-L

+ 2 - 2
examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_Buffered.h

@@ -4,7 +4,7 @@ void drawBitmapFrom_HTTP_ToBuffer(const char* host, const char* path, const char
   bool connection_ok = false;
   bool valid = false; // valid format to be handled
   bool flip = true; // bitmap is stored bottom-to-top
-  bool has_multicolors = (display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46);
+  bool has_multicolors = (display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46)|| (display.epd2.panel == GxEPD2::GDEP073E01);
   uint32_t startTime = millis();
   if ((x >= display.width()) || (y >= display.height())) return;
   display.fillScreen(GxEPD_WHITE);
@@ -257,7 +257,7 @@ void drawBitmapFrom_HTTPS_ToBuffer(const char* host, const char* path, const cha
   bool connection_ok = false;
   bool valid = false; // valid format to be handled
   bool flip = true; // bitmap is stored bottom-to-top
-  bool has_multicolors = (display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46);
+  bool has_multicolors = (display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46)|| (display.epd2.panel == GxEPD2::GDEP073E01);
   uint32_t startTime = millis();
   if ((x >= display.width()) || (y >= display.height())) return;
   display.fillScreen(GxEPD_WHITE);

+ 5 - 0
examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_DisplaySelection.h

@@ -158,6 +158,11 @@ GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> displ
 #if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS)
 #if defined(ARDUINO_LOLIN_D32_PRO)
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 33, /*DC=*/ 35, /*RST=*/ 37, /*BUSY=*/ 39)); // my LOLIN ESP32 S2 mini connection
+#elif defined(ARDUINO_ESP32S3_DEV)
+// ESP32E6-E01 : only 50 pin FPC works on actual version (11.1.2025)
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS*/ 2, /*DC=*/ 3, /*RST=*/ 4, /*BUSY=*/ 5)); // Good Display ESP32E6-E01 board
 #else
 GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // my suggested wiring and proto board
 //GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=5*/ 5, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // LILYGO_T5_V2.4.1

+ 90 - 12
examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_Example.ino

@@ -77,7 +77,11 @@ void showBitmapFrom_HTTPS_Buffered(const char* host, const char* path, const cha
 
 void showNative4cFrom_HTTP(const char* host, const char* path, const char* filename, int16_t x, int16_t y, bool with_color = true);
 void showNative4cFrom_HTTPS(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);
+                            const char* certificate = certificate_rawcontent);
+
+void showNative7cFrom_HTTP(const char* host, const char* path, const char* filename, int16_t x, int16_t y, bool with_color = true);
+void showNative7cFrom_HTTPS(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
@@ -146,11 +150,13 @@ void setup()
 
   setClock();
 
-  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::GDEP073E01) || false)
   {
     //drawBitmapsBuffered_200x200();
     //drawBitmapsBuffered_other();
-    drawBitmapsBuffered_7C();
+    //drawBitmapsBuffered_7C();
+    drawBitmaps_7C();
+    //drawBitmaps_7C_mixed();
   }
   else
   {
@@ -308,24 +314,95 @@ void drawBitmapsBuffered_other()
 
 void drawBitmapsBuffered_7C()
 {
-  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::GDEP073E01))
+  {
+    int16_t w2 = display.width() / 2;
+    int16_t h2 = display.height() / 2;
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f2.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f3.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_py, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_py, "N-Color1.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_small_but_padded.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_large.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+  }
+}
+
+void drawBitmaps_7C()
+{
+  if ((display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46) || (display.epd2.panel == GxEPD2::GDEP073E01))
+  {
+    int16_t w2 = display.epd2.WIDTH / 2;
+    int16_t h2 = display.epd2.HEIGHT / 2;
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f2.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f3.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_py, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_py, "N-Color1.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+
+    showNative7cFrom_HTTPS(host_rawcontent, path_rawcontent, "displayed_bmp_small_but_padded.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_rawcontent, "displayed_bmp_large.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+  }
+}
+
+void drawBitmaps_7C_mixed()
+{
+  if ((display.epd2.panel == GxEPD2::ACeP565) || (display.epd2.panel == GxEPD2::GDEY073D46) || (display.epd2.panel == GxEPD2::GDEP073E01))
   {
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f.bmp", fp_rawcontent, 0, 0);
+    int16_t w2 = display.epd2.WIDTH / 2;
+    int16_t h2 = display.epd2.HEIGHT / 2;
+    display.setRotation(2);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f2.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f2.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f3.bmp", fp_rawcontent, w2 - 300, h2 - 224);
     delay(2000);
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f2.bmp", fp_rawcontent, 0, 0);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f3.bmp", fp_rawcontent, w2 - 300, h2 - 224);
     delay(2000);
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f3.bmp", fp_rawcontent, 0, 0);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
     delay(2000);
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_c, "5in65f4.bmp", fp_rawcontent, 0, 0);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_c, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
     delay(2000);
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_py, "5in65f4.bmp", fp_rawcontent, 0, 0);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_py, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
     delay(2000);
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_py, "N-Color1.bmp", fp_rawcontent, 0, 0);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_py, "5in65f4.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_waveshare_py, "N-Color1.bmp", fp_rawcontent, w2 - 300, h2 - 224);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_waveshare_py, "N-Color1.bmp", fp_rawcontent, w2 - 300, h2 - 224);
     delay(2000);
 
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_small_but_padded.bmp", fp_rawcontent, 0, 0);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_small_but_padded.bmp", fp_rawcontent, w2 - 400, h2 - 240);
+    delay(2000);
+    showNative7cFrom_HTTPS(host_rawcontent, path_rawcontent, "displayed_bmp_small_but_padded.bmp", fp_rawcontent, w2 - 400, h2 - 240);
+    delay(2000);
+    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_large.bmp", fp_rawcontent, w2 - 400, h2 - 240);
     delay(2000);
-    showBitmapFrom_HTTPS_Buffered(host_rawcontent, path_rawcontent, "displayed_bmp_large.bmp", fp_rawcontent, 0, 0);
+    showNative7cFrom_HTTPS(host_rawcontent, path_rawcontent, "displayed_bmp_large.bmp", fp_rawcontent, w2 - 400, h2 - 240);
     delay(2000);
   }
 }
@@ -845,6 +922,7 @@ void showBitmapFrom_HTTPS(const char* host, const char* path, const char* filena
 #include "GxEPD2_WiFi_Buffered.h"
 
 #include "GxEPD2_WiFi_Native4c.h"
+#include "GxEPD2_WiFi_Native7c.h"
 
 uint16_t read16(WiFiClient& client)
 {

+ 479 - 0
examples/GxEPD2_WiFi_Example/GxEPD2_WiFi_Native7c.h

@@ -0,0 +1,479 @@
+uint8_t color7(uint16_t red, uint16_t green, uint16_t blue)
+{
+  uint8_t cv7 = 0x00;
+  if ((red < 0x80) && (green < 0x80) && (blue < 0x80)) cv7 = 0x00; // black
+  else if ((red >= 0x80) && (green >= 0x80) && (blue >= 0x80)) cv7 = 0x01; // white
+  else if ((red >= 0x80) && (blue >= 0x80)) cv7 = red > blue ? 0x04 : 0x03; // red, blue
+  else if ((green >= 0x80) && (blue >= 0x80)) cv7 = green > blue ? 0x02 : 0x03; // green, blue
+  else if ((red >= 0x80) && (green >= 0xC0)) cv7 = 0x05; // yellow
+  else if ((red >= 0x80) && (green >= 0x40)) cv7 = 0x06; // orange
+  else if (red >= 0x80) cv7 = 0x04; // red
+  else if (green >= 0x80) cv7 = 0x02; // green
+  else cv7 = 0x03; // blue
+  return cv7;
+}
+
+void whiteLine()
+{
+  for (size_t i = 0; i < sizeof(output_row_native4c_buffer); i++) output_row_native4c_buffer[i] = 0x11;
+}
+
+void showNative7cFrom_HTTP(const char* host, const char* path, const char* filename, int16_t x, int16_t y)
+{
+  WiFiClient client;
+  bool connection_ok = false;
+  bool valid = false; // valid format to be handled
+  bool flip = true; // bitmap is stored bottom-to-top
+  uint32_t startTime = millis();
+  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 (!client.connect(host, httpPort))
+  {
+    Serial.println("connection failed");
+    return;
+  }
+  Serial.print("requesting URL: ");
+  Serial.println(String("http://") + host + path + filename);
+  client.print(String("GET ") + path + filename + " HTTP/1.1\r\n" +
+               "Host: " + host + "\r\n" +
+               "User-Agent: GxEPD2_WiFi_Example\r\n" +
+               "Connection: close\r\n\r\n");
+  Serial.println("request sent");
+  while (client.connected())
+  {
+    String line = client.readStringUntil('\n');
+    if (!connection_ok)
+    {
+      connection_ok = line.startsWith("HTTP/1.1 200 OK");
+      if (connection_ok) Serial.println(line);
+    }
+    if (!connection_ok) Serial.println(line);
+    if (line == "\r")
+    {
+      Serial.println("headers received");
+      break;
+    }
+  }
+  if (!connection_ok) return;
+  // Parse BMP header
+  if (read16(client) == 0x4D42) // BMP signature
+  {
+    uint32_t fileSize = read32(client);
+    uint32_t creatorBytes = read32(client); (void)creatorBytes; //unused
+    uint32_t imageOffset = read32(client); // Start of image data
+    uint32_t headerSize = read32(client);
+    uint32_t width  = read32(client);
+    int32_t height = (int32_t) read32(client);
+    uint16_t planes = read16(client);
+    uint16_t depth = read16(client); // bits per pixel
+    uint32_t format = read32(client);
+    uint32_t bytes_read = 7 * 4 + 3 * 2; // read so far
+    if ((planes == 1) && ((format == 0) || (format == 3))) // uncompressed is handled, 565 also
+    {
+      Serial.print("File size: "); Serial.println(fileSize);
+      Serial.print("Image Offset: "); Serial.println(imageOffset);
+      Serial.print("Header size: "); Serial.println(headerSize);
+      Serial.print("Bit Depth: "); Serial.println(depth);
+      Serial.print("Image size: ");
+      Serial.print(width);
+      Serial.print('x');
+      Serial.println(abs(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;
+        flip = false;
+      }
+      uint16_t w = width;
+      uint16_t h = height;
+      if ((x + w - 1) >= display.epd2.WIDTH)  w = display.epd2.WIDTH  - x;
+      if ((y + h - 1) >= display.epd2.HEIGHT) h = display.epd2.HEIGHT - y;
+      if (w <= max_row_width) // handle with direct drawing
+      {
+        valid = true;
+        uint8_t bitmask = 0xFF;
+        uint8_t bitshift = 8 - depth;
+        uint16_t red, green, blue;
+        uint8_t cv7 = 0x00;
+        if (depth <= 8)
+        {
+          if (depth < 8) bitmask >>= depth;
+          bytes_read += skip(client, imageOffset - (4 << depth) - bytes_read); // 54 for regular, diff for colorsimportant
+          for (uint16_t pn = 0; pn < (1 << depth); pn++)
+          {
+            blue  = client.read();
+            green = client.read();
+            red   = client.read();
+            client.read();
+            bytes_read += 4;
+            rgb_palette_buffer[pn] = color7(red, green, blue);
+          }
+        }
+        display.epd2.setPaged();
+        whiteLine();
+        for (uint16_t l = 0; l < y; l++)
+        {
+          display.writeNative(output_row_native4c_buffer, 0, 0, l, display.epd2.WIDTH, 1, false, false, false);
+        }
+        uint32_t rowPosition = imageOffset;
+        bytes_read += skip(client, rowPosition - bytes_read);
+        for (uint16_t row = 0; row < h; row++, rowPosition += rowSize) // for each line
+        {
+          if (!connection_ok || !(client.connected() || client.available())) break;
+          delay(1); // yield() to avoid WDT
+          uint32_t in_remain = rowSize;
+          uint32_t in_idx = 0;
+          uint32_t in_bytes = 0;
+          uint8_t in_byte = 0; // for depth <= 8
+          uint8_t in_bits = 0; // for depth <= 8
+          uint8_t out_cv7_byte = 0x00;
+          uint32_t out_idx = 0;
+          for (uint16_t col = 0; col < w; col++) // for each pixel
+          {
+            yield();
+            if (!connection_ok || !(client.connected() || client.available())) break;
+            // Time to read more pixel data?
+            if (in_idx >= in_bytes) // ok, exact match for 24bit also (size IS multiple of 3)
+            {
+              uint32_t get = in_remain > sizeof(input_buffer) ? sizeof(input_buffer) : in_remain;
+              uint32_t got = read8n(client, input_buffer, get);
+              while ((got < get) && connection_ok)
+              {
+                //Serial.print("got "); Serial.print(got); Serial.print(" < "); Serial.print(get); Serial.print(" @ "); Serial.println(bytes_read);
+                uint32_t gotmore = read8n(client, input_buffer + got, get - got);
+                got += gotmore;
+                connection_ok = gotmore > 0;
+              }
+              in_bytes = got;
+              in_remain -= got;
+              bytes_read += got;
+              in_idx = 0;
+            }
+            if (!connection_ok)
+            {
+              Serial.print("Error: got no more after "); Serial.print(bytes_read); Serial.println(" bytes read!");
+              break;
+            }
+            switch (depth)
+            {
+              case 32:
+                blue = input_buffer[in_idx++];
+                green = input_buffer[in_idx++];
+                red = input_buffer[in_idx++];
+                in_idx++; // skip alpha
+                cv7 = color7(red, green, blue);
+                break;
+              case 24:
+                blue = input_buffer[in_idx++];
+                green = input_buffer[in_idx++];
+                red = input_buffer[in_idx++];
+                cv7 = color7(red, green, blue);
+                break;
+              case 16:
+                {
+                  uint8_t lsb = input_buffer[in_idx++];
+                  uint8_t msb = input_buffer[in_idx++];
+                  if (format == 0) // 555
+                  {
+                    blue  = (lsb & 0x1F) << 3;
+                    green = ((msb & 0x03) << 6) | ((lsb & 0xE0) >> 2);
+                    red   = (msb & 0x7C) << 1;
+                  }
+                  else // 565
+                  {
+                    blue  = (lsb & 0x1F) << 3;
+                    green = ((msb & 0x07) << 5) | ((lsb & 0xE0) >> 3);
+                    red   = (msb & 0xF8);
+                  }
+                }
+                cv7 = color7(red, green, blue);
+                break;
+              case 1:
+              case 2:
+              case 4:
+              case 8:
+                {
+                  if (0 == in_bits)
+                  {
+                    in_byte = input_buffer[in_idx++];
+                    in_bits = 8;
+                  }
+                  uint16_t pn = (in_byte >> bitshift) & bitmask;
+                  cv7 = rgb_palette_buffer[pn];
+                  in_byte <<= depth;
+                  in_bits -= depth;
+                }
+                break;
+            }
+            out_cv7_byte |= cv7 << (4 * (1 - col % 2));
+            if ((1 == col % 2) || (col == w - 1)) // write that last byte! (for w%2!=0 border)
+            {
+              uint32_t bx = flip ? (display.epd2.WIDTH - x) / 2 - out_idx++ : x / 2 + out_idx++;
+              output_row_native4c_buffer[bx] = out_cv7_byte;
+              out_cv7_byte = 0x00;
+            }
+          } // end pixel
+          display.writeNative(output_row_native4c_buffer, 0, 0, y + row, display.epd2.WIDTH, 1, false, false, false);
+        } // end line
+        Serial.print("downloaded in ");
+        Serial.print(millis() - startTime);
+        Serial.println(" ms");
+        whiteLine();
+        for (uint16_t l = y + h; l < display.epd2.HEIGHT; l++)
+        {
+          display.writeNative(output_row_native4c_buffer, 0, 0, l, display.epd2.WIDTH, 1, false, false, false);
+        }
+        display.refresh();
+      }
+      Serial.print("bytes read "); Serial.println(bytes_read);
+    }
+  }
+  client.stop();
+  if (!valid)
+  {
+    Serial.println("bitmap format not handled.");
+  }
+}
+
+void showNative7cFrom_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) || defined(ARDUINO_RASPBERRY_PI_PICO_W)
+  BearSSL::WiFiClientSecure client;
+  BearSSL::X509List cert(certificate ? certificate : certificate_rawcontent);
+#else
+  WiFiClientSecure client;
+#endif
+  bool connection_ok = false;
+  bool valid = false; // valid format to be handled
+  bool flip = true; // bitmap is stored bottom-to-top
+  uint32_t startTime = millis();
+  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) || defined(ARDUINO_RASPBERRY_PI_PICO_W)
+  if (certificate) client.setTrustAnchors(&cert);
+  else if (fingerprint) client.setFingerprint(fingerprint);
+  else client.setInsecure();
+#elif defined (ESP32)
+  if (certificate) client.setCACert(certificate);
+#endif
+  if (!client.connect(host, httpsPort))
+  {
+    Serial.println("connection failed");
+    return;
+  }
+  Serial.print("requesting URL: ");
+  Serial.println(String("https://") + host + path + filename);
+  client.print(String("GET ") + path + filename + " HTTP/1.1\r\n" +
+               "Host: " + host + "\r\n" +
+               "User-Agent: GxEPD2_WiFi_Example\r\n" +
+               "Connection: close\r\n\r\n");
+  Serial.println("request sent");
+  while (client.connected())
+  {
+    String line = client.readStringUntil('\n');
+    if (!connection_ok)
+    {
+      connection_ok = line.startsWith("HTTP/1.1 200 OK");
+      if (connection_ok) Serial.println(line);
+    }
+    if (!connection_ok) Serial.println(line);
+    if (line == "\r")
+    {
+      Serial.println("headers received");
+      break;
+    }
+  }
+  if (!connection_ok) return;
+  // Parse BMP header
+  uint16_t signature = 0;
+  for (int16_t i = 0; i < 50; i++)
+  {
+    if (!client.available()) delay(100);
+    else signature = read16(client);
+    if (signature == 0x4D42) break;
+  }
+  if (signature == 0x4D42) // BMP signature
+  {
+    uint32_t fileSize = read32(client);
+    uint32_t creatorBytes = read32(client); (void)creatorBytes; //unused
+    uint32_t imageOffset = read32(client); // Start of image data
+    uint32_t headerSize = read32(client);
+    uint32_t width  = read32(client);
+    int32_t height = (int32_t) read32(client);
+    uint16_t planes = read16(client);
+    uint16_t depth = read16(client); // bits per pixel
+    uint32_t format = read32(client);
+    uint32_t bytes_read = 7 * 4 + 3 * 2; // read so far
+    if ((planes == 1) && ((format == 0) || (format == 3))) // uncompressed is handled, 565 also
+    {
+      Serial.print("File size: "); Serial.println(fileSize);
+      Serial.print("Image Offset: "); Serial.println(imageOffset);
+      Serial.print("Header size: "); Serial.println(headerSize);
+      Serial.print("Bit Depth: "); Serial.println(depth);
+      Serial.print("Image size: ");
+      Serial.print(width);
+      Serial.print('x');
+      Serial.println(abs(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;
+        flip = false;
+      }
+      uint16_t w = width;
+      uint16_t h = height;
+      if ((x + w - 1) >= display.epd2.WIDTH)  w = display.epd2.WIDTH  - x;
+      if ((y + h - 1) >= display.epd2.HEIGHT) h = display.epd2.HEIGHT - y;
+      if (w <= max_row_width) // handle with direct drawing
+      {
+        valid = true;
+        uint8_t bitmask = 0xFF;
+        uint8_t bitshift = 8 - depth;
+        uint16_t red, green, blue;
+        uint8_t cv7 = 0x00;
+        if (depth <= 8)
+        {
+          if (depth < 8) bitmask >>= depth;
+          bytes_read += skip(client, imageOffset - (4 << depth) - bytes_read); // 54 for regular, diff for colorsimportant
+          for (uint16_t pn = 0; pn < (1 << depth); pn++)
+          {
+            blue  = client.read();
+            green = client.read();
+            red   = client.read();
+            client.read();
+            bytes_read += 4;
+            rgb_palette_buffer[pn] = color7(red, green, blue);
+          }
+        }
+        display.epd2.setPaged();
+        whiteLine();
+        for (uint16_t l = 0; l < y; l++)
+        {
+          display.writeNative(output_row_native4c_buffer, 0, 0, l, display.epd2.WIDTH, 1, false, false, false);
+        }
+        uint32_t rowPosition = imageOffset;
+        bytes_read += skip(client, rowPosition - bytes_read);
+        for (uint16_t row = 0; row < h; row++, rowPosition += rowSize) // for each line
+        {
+          if (!connection_ok || !(client.connected() || client.available())) break;
+          delay(1); // yield() to avoid WDT
+          uint32_t in_remain = rowSize;
+          uint32_t in_idx = 0;
+          uint32_t in_bytes = 0;
+          uint8_t in_byte = 0; // for depth <= 8
+          uint8_t in_bits = 0; // for depth <= 8
+          uint8_t out_cv7_byte = 0x00;
+          uint32_t out_idx = 0;
+          for (uint16_t col = 0; col < w; col++) // for each pixel
+          {
+            yield();
+            if (!connection_ok || !(client.connected() || client.available())) break;
+            // Time to read more pixel data?
+            if (in_idx >= in_bytes) // ok, exact match for 24bit also (size IS multiple of 3)
+            {
+              uint32_t get = in_remain > sizeof(input_buffer) ? sizeof(input_buffer) : in_remain;
+              uint32_t got = read8n(client, input_buffer, get);
+              while ((got < get) && connection_ok)
+              {
+                //Serial.print("got "); Serial.print(got); Serial.print(" < "); Serial.print(get); Serial.print(" @ "); Serial.println(bytes_read);
+                uint32_t gotmore = read8n(client, input_buffer + got, get - got);
+                got += gotmore;
+                connection_ok = gotmore > 0;
+              }
+              in_bytes = got;
+              in_remain -= got;
+              bytes_read += got;
+              in_idx = 0;
+            }
+            if (!connection_ok)
+            {
+              Serial.print("Error: got no more after "); Serial.print(bytes_read); Serial.println(" bytes read!");
+              break;
+            }
+            switch (depth)
+            {
+              case 32:
+                blue = input_buffer[in_idx++];
+                green = input_buffer[in_idx++];
+                red = input_buffer[in_idx++];
+                in_idx++; // skip alpha
+                cv7 = color7(red, green, blue);
+                break;
+              case 24:
+                blue = input_buffer[in_idx++];
+                green = input_buffer[in_idx++];
+                red = input_buffer[in_idx++];
+                cv7 = color7(red, green, blue);
+                break;
+              case 16:
+                {
+                  uint8_t lsb = input_buffer[in_idx++];
+                  uint8_t msb = input_buffer[in_idx++];
+                  if (format == 0) // 555
+                  {
+                    blue  = (lsb & 0x1F) << 3;
+                    green = ((msb & 0x03) << 6) | ((lsb & 0xE0) >> 2);
+                    red   = (msb & 0x7C) << 1;
+                  }
+                  else // 565
+                  {
+                    blue  = (lsb & 0x1F) << 3;
+                    green = ((msb & 0x07) << 5) | ((lsb & 0xE0) >> 3);
+                    red   = (msb & 0xF8);
+                  }
+                }
+                cv7 = color7(red, green, blue);
+                break;
+              case 1:
+              case 2:
+              case 4:
+              case 8:
+                {
+                  if (0 == in_bits)
+                  {
+                    in_byte = input_buffer[in_idx++];
+                    in_bits = 8;
+                  }
+                  uint16_t pn = (in_byte >> bitshift) & bitmask;
+                  cv7 = rgb_palette_buffer[pn];
+                  in_byte <<= depth;
+                  in_bits -= depth;
+                }
+                break;
+            }
+            out_cv7_byte |= cv7 << (4 * (1 - col % 2));
+            if ((1 == col % 2) || (col == w - 1)) // write that last byte! (for w%2!=0 border)
+            {
+              uint32_t bx = flip ? (display.epd2.WIDTH - x) / 2 - out_idx++ : x / 2 + out_idx++;
+              output_row_native4c_buffer[bx] = out_cv7_byte;
+              out_cv7_byte = 0x00;
+            }
+          } // end pixel
+          display.writeNative(output_row_native4c_buffer, 0, 0, y + row, display.epd2.WIDTH, 1, false, false, false);
+        } // end line
+        Serial.print("downloaded in ");
+        Serial.print(millis() - startTime);
+        Serial.println(" ms");
+        whiteLine();
+        for (uint16_t l = y + h; l < display.epd2.HEIGHT; l++)
+        {
+          display.writeNative(output_row_native4c_buffer, 0, 0, l, display.epd2.WIDTH, 1, false, false, false);
+        }
+        display.refresh();
+      }
+      Serial.print("bytes read "); Serial.println(bytes_read);
+    }
+  }
+  client.stop();
+  if (!valid)
+  {
+    Serial.println("bitmap format not handled.");
+  }
+}

+ 1 - 1
library.properties

@@ -1,5 +1,5 @@
 name=GxEPD2
-version=1.6.1
+version=1.6.2
 author=Jean-Marc Zingg
 maintainer=Jean-Marc Zingg
 sentence=Arduino Display Library for SPI E-Paper displays from Dalian Good Display and Waveshare. 

+ 1 - 4
src/GxEPD2_3C.h

@@ -75,7 +75,7 @@
 #if __has_include("epd3c/GxEPD2_266c.h")
 #include "epd3c/GxEPD2_266c.h"
 #endif
-#if __has_include("epd3c/GxEPD2_150_BN.h")
+#if __has_include("epd3c/GxEPD2_270c.h")
 #include "epd3c/GxEPD2_270c.h"
 #endif
 #if __has_include("epd3c/GxEPD2_420c.h")
@@ -99,9 +99,6 @@
 #if __has_include("epd3c/GxEPD2_583c_Z83.h")
 #include "epd3c/GxEPD2_583c_Z83.h"
 #endif
-#if __has_include("epd7c/GxEPD2_565c.h")
-#include "epd7c/GxEPD2_565c.h"
-#endif
 #if __has_include("epd3c/GxEPD2_750c.h")
 #include "epd3c/GxEPD2_750c.h"
 #endif

+ 7 - 2
src/gdey/GxEPD2_290_GDEY029T71H.cpp

@@ -372,6 +372,11 @@ void GxEPD2_290_GDEY029T71H::_InitDisplay()
   _writeData(0x05);
   _writeCommand(0x18); //Read built-in temperature sensor
   _writeData(0x80);
+  // NEEDED before first _setPartialRamArea
+  // reason: OTP set for 168x384, but TFT shifted: S8..S175 connected to TFT sources
+  _writeCommand(0x21); // Display Update Controll
+  _writeData(0x00);    // RED normal
+  _writeData(0x00);    // 200x384
   _setPartialRamArea(0, 0, WIDTH, HEIGHT);
   _init_display_done = true;
 }
@@ -380,7 +385,7 @@ void GxEPD2_290_GDEY029T71H::_Update_Full()
 {
   _writeCommand(0x21); // Display Update Controll
   _writeData(0x40);    // bypass RED as 0
-  _writeData(0x00);    // single chip application
+  _writeData(0x00);    // 200x384
   if (useFastFullUpdate)
   {
     _writeCommand(0x1A); // Write to temperature register
@@ -408,7 +413,7 @@ void GxEPD2_290_GDEY029T71H::_Update_Part()
 {
   _writeCommand(0x21); // Display Update Controll
   _writeData(0x00);    // RED normal
-  _writeData(0x00);    // single chip application
+  _writeData(0x00);    // 200x384
   _writeCommand(0x22);
   _writeData(0xdc);
   _writeCommand(0x20);