Explorar o código

Merge pull request #179 from ZinggJM/work_in_progress

Version 1.6.7
ZinggJM hai 9 meses
pai
achega
bd833e751f
Modificáronse 56 ficheiros con 4474 adicións e 50 borrados
  1. 12 2
      README.md
  2. 1 1
      examples/GxEPD2_Example/GxEPD2_Example.ino
  3. 14 0
      examples/GxEPD2_Example/GxEPD2_display_selection.h
  4. 2 0
      examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h
  5. 2 0
      examples/GxEPD2_Example/GxEPD2_selection_check.h
  6. 14 0
      examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h
  7. 2 0
      examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h
  8. 2 0
      examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h
  9. 14 0
      examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h
  10. 2 0
      examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h
  11. 2 0
      examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h
  12. 2 0
      examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h
  13. 2 0
      examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h
  14. 2 0
      examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h
  15. 2 0
      examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h
  16. 2 0
      examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_display_selection_new_style.h
  17. 2 0
      examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_selection_check.h
  18. 2 0
      examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h
  19. 2 0
      examples/GxEPD2_SD_Example/GxEPD2_selection_check.h
  20. 2 0
      examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h
  21. 2 0
      examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h
  22. 2 0
      examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h
  23. 2 0
      examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h
  24. 2 0
      examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h
  25. 2 0
      examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h
  26. 8 3
      examples/GxEPD2x_FastBlackWhiteOnColor/GxEPD2x_FastBlackWhiteOnColor.ino
  27. 403 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_FastBlackWhiteOnColorRefreshTests.ino
  28. 602 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_display_selection.h
  29. 540 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_display_selection_added.h
  30. 288 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_display_selection_new_style.h
  31. 111 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_selection_check.h
  32. 86 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_wiring_examples.h
  33. 8 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/Open_Sans_ExtraBold_120.h
  34. 199 0
      extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/Open_Sans_ExtraBold_60.h
  35. 258 0
      extras/tests/GxEPD2_OTP/GDEW075Z08_OTP.cpp
  36. 24 0
      extras/tests/GxEPD2_OTP/GDEW075Z08_OTP.h
  37. 258 0
      extras/tests/GxEPD2_OTP/GDEY075Z08_OTP.cpp
  38. 24 0
      extras/tests/GxEPD2_OTP/GDEY075Z08_OTP.h
  39. 205 0
      extras/tests/GxEPD2_OTP/GxEPD2_OTP.ino
  40. 1 1
      extras/tests/GxEPD2_RefreshTests/GxEPD2_RefreshTests.ino
  41. 1 1
      library.properties
  42. 1 0
      src/GxEPD2.h
  43. 15 8
      src/GxEPD2_3C.h
  44. 60 0
      src/GxEPD2_EPD.cpp
  45. 6 0
      src/GxEPD2_EPD.h
  46. 14 0
      src/GxEPD2_EPD_friends.h
  47. 8 8
      src/epd3c/GxEPD2_213_Z19c.cpp
  48. 4 4
      src/epd3c/GxEPD2_213_Z19c.h
  49. 8 8
      src/epd3c/GxEPD2_290_Z13c.cpp
  50. 4 4
      src/epd3c/GxEPD2_290_Z13c.h
  51. 490 0
      src/epd3c/GxEPD2_750c_GDEW075Z08.cpp
  52. 93 0
      src/epd3c/GxEPD2_750c_GDEW075Z08.h
  53. 6 6
      src/gdey3c/GxEPD2_420c_GDEY042Z98.cpp
  54. 4 4
      src/gdey3c/GxEPD2_420c_GDEY042Z98.h
  55. 553 0
      src/gdey3c/GxEPD2_750c_GDEY075Z08.cpp
  56. 97 0
      src/gdey3c/GxEPD2_750c_GDEY075Z08.h

+ 12 - 2
README.md

@@ -4,7 +4,7 @@
 - With full Graphics and Text support using Adafruit_GFX
 
 - For SPI e-paper displays from Dalian Good Display 
-- and SPI e-paper boards from Waveshare
+- and SPI e-paper boards from Waveshare having the same panels
 
 ### important note:
 - the display panels are for 3.3V supply and 3.3V data lines
@@ -146,6 +146,7 @@
 - GDEY075T7      7.5" b/w 800x480, UC8179 (GD7965)
 - GDEW075Z09     7.5" b/w/r 640x384, UC8159c (IL0371)
 - GDEW075Z08     7.5" b/w/r 800x480, EK79655 (GD7965)
+- GDEY075Z08     7.5" b/w/r 800x480, UC8179
 - GDEH075Z90     7.5" b/w/r 880x528, SSD1677
 - GDEM075F52     7.5" 4-color, 800x480, JD79665AA
 - GDEM102T91    10.2" b/w 960x640, SSD1677
@@ -172,7 +173,16 @@
 - Let me know about interesting panels that fall into this category.
 - I occasionally buy new panels, but adding support will take as much time as needed.
 
-### Version 1.6.6
+### Version 1.6.7
+- added support for GDEW075Z08 fast b/w refresh in new class GxEPD2_750c_GDEW075Z08
+- GxEPD2_750c_GDEW075Z08 uses a b/w waveform written to registers, none available in OTP
+- added support for GDEY075Z08 fast b/w refresh in new class GxEPD2_750c_GDEY075Z08
+- GxEPD2_750c_GDEY075Z08 uses a b/w waveform written to registers, OTP version is faulty
+- GDEW075Z08 and GDEY075Z08 both have distortion on borders between black and white
+- therefore narrow or small fonts are barely readable with fast b/w refresh
+- renamed method writeImagePrevious to writeImageToPrevious
+- renamed method writeImageNew to writeImageToCurrent
+#### Version 1.6.6
 - added support for GDEM0154F51H, 1.54" 4-color 200x200, JD79660
 - added support for GDEM035F51, 3.5" 4-color 184x384, JD79667
 - added support for GDEM0397F81, 3.97" 4-color, 800x480, SSD2677

+ 1 - 1
examples/GxEPD2_Example/GxEPD2_Example.ino

@@ -2065,7 +2065,7 @@ void drawBitmaps3c800x480()
 #else
   bitmap_pair bitmap_pairs[] = {}; // not enough code space
 #endif
-  if (display.epd2.panel == GxEPD2::GDEW075Z08)
+  if ((display.epd2.panel == GxEPD2::GDEW075Z08) || (display.epd2.panel == GxEPD2::GDEY075Z08))
   {
     for (uint16_t i = 0; i < sizeof(bitmap_pairs) / sizeof(bitmap_pair); i++)
     {

+ 14 - 0
examples/GxEPD2_Example/GxEPD2_display_selection.h

@@ -94,6 +94,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //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, GD7965
 //GxEPD2_3C < GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4 > display(GxEPD2_750c_Z90(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEW075Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEY075Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 4> display(GxEPD2_1160c_GDEY116Z91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 4> display(GxEPD2_1330c_GDEM133Z91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -198,6 +200,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4> display(GxEPD2_750c_Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4> display(GxEPD2_750c_Z90(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEW075Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEY075Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 4> display(GxEPD2_1160c_GDEY116Z91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 4> display(GxEPD2_1330c_GDEM133Z91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -297,6 +301,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 2> display(GxEPD2_1160c_GDEY116Z91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 2> display(GxEPD2_1330c_GDEM133Z91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -414,6 +420,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 2> display(GxEPD2_1160c_GDEY116Z91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 2> display(GxEPD2_1330c_GDEM133Z91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -519,6 +527,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -629,6 +639,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -729,6 +741,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); //GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper

+ 2 - 0
examples/GxEPD2_Example/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_Example/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 14 - 0
examples/GxEPD2_GFX_Example/GxEPD2_display_selection.h

@@ -94,6 +94,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //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, GD7965
 //GxEPD2_3C < GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4 > display(GxEPD2_750c_Z90(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEW075Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEY075Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 4> display(GxEPD2_1160c_GDEY116Z91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 4> display(GxEPD2_1330c_GDEM133Z91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -198,6 +200,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4> display(GxEPD2_750c_Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4> display(GxEPD2_750c_Z90(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEW075Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEY075Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 4> display(GxEPD2_1160c_GDEY116Z91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 4> display(GxEPD2_1330c_GDEM133Z91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -297,6 +301,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 2> display(GxEPD2_1160c_GDEY116Z91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 2> display(GxEPD2_1330c_GDEM133Z91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -414,6 +420,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 2> display(GxEPD2_1160c_GDEY116Z91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 2> display(GxEPD2_1330c_GDEM133Z91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -519,6 +527,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -629,6 +639,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -729,6 +741,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); //GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper

+ 2 - 0
examples/GxEPD2_GFX_Example/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_GFX_Example/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 14 - 0
examples/GxEPD2_HelloWorld/GxEPD2_display_selection.h

@@ -94,6 +94,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //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, GD7965
 //GxEPD2_3C < GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4 > display(GxEPD2_750c_Z90(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEW075Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEY075Z08(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 4> display(GxEPD2_1160c_GDEY116Z91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 4> display(GxEPD2_1330c_GDEM133Z91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -198,6 +200,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4> display(GxEPD2_750c_Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4> display(GxEPD2_750c_Z90(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEW075Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEY075Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 4> display(GxEPD2_1160c_GDEY116Z91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 4> display(GxEPD2_1330c_GDEM133Z91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -297,6 +301,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 2> display(GxEPD2_1160c_GDEY116Z91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 2> display(GxEPD2_1330c_GDEM133Z91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -414,6 +420,8 @@
 //GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, GxEPD2_1160c_GDEY116Z91::HEIGHT / 2> display(GxEPD2_1160c_GDEY116Z91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, GxEPD2_1330c_GDEM133Z91::HEIGHT / 2> display(GxEPD2_1330c_GDEM133Z91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -519,6 +527,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -629,6 +639,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper
@@ -729,6 +741,8 @@
 //GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
 //GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
 //GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); //GDEH075Z90 880x528, SSD1677
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEW075Z08)> display(GxEPD2_750c_GDEW075Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//GxEPD2_3C<GxEPD2_750c_GDEY075Z08, MAX_HEIGHT_3C(GxEPD2_750c_GDEY075Z08)> display(GxEPD2_750c_GDEY075Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //GxEPD2_3C<GxEPD2_1160c_GDEY116Z91, MAX_HEIGHT_3C(GxEPD2_1160c_GDEY116Z91)> display(GxEPD2_1160c_GDEY116Z91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY116Z91 960x640, SSD1677
 //GxEPD2_3C<GxEPD2_1330c_GDEM133Z91, MAX_HEIGHT_3C(GxEPD2_1330c_GDEM133Z91)> display(GxEPD2_1330c_GDEM133Z91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEM133Z91 960x680, SSD1677
 // 4-color e-paper

+ 2 - 0
examples/GxEPD2_HelloWorld/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_HelloWorld/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 2 - 0
examples/GxEPD2_NotPagedExample/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_NotPagedExample/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 2 - 0
examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_PagedDisplayUsingCallback/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 2 - 0
examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_RotaryUsingBusyCallback/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 2 - 0
examples/GxEPD2_SD_Example/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_SD_Example/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 2 - 0
examples/GxEPD2_SerialFlash_Example/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_SerialFlash_Example/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 2 - 0
examples/GxEPD2_Spiffs_Example/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_Spiffs_Example/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 2 - 0
examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_display_selection_new_style.h

@@ -101,6 +101,8 @@
 //#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_750c_GDEW075Z08 // GDEW075Z08 800x480, UC8179, (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_GDEY075Z08 // GDEY075Z08 800x480, UC8179, (FPC-C001 21.08.30)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1160c_GDEY116Z91 // GDEY116Z91 960x640, SSD1677, (FPV-K002 22.04.15)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
 //#define GxEPD2_DRIVER_CLASS GxEPD2_1330c_GDEM133Z91 // GDEM133Z91 960x680, SSD1677 (FPC-7701 REV.B)

+ 2 - 0
examples/GxEPD2_U8G2_Fonts_Example/GxEPD2_selection_check.h

@@ -96,6 +96,8 @@
 #define GxEPD2_750c_IS_3C true
 #define GxEPD2_750c_Z08_IS_3C true
 #define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_750c_GDEW075Z08_IS_3C true
+#define GxEPD2_750c_GDEY075Z08_IS_3C true
 #define GxEPD2_1160c_GDEY116Z91_IS_3C true
 #define GxEPD2_1248c_IS_3C true
 #define GxEPD2_1330c_GDEM133Z91_IS_3C true

+ 8 - 3
examples/GxEPD2x_FastBlackWhiteOnColor/GxEPD2x_FastBlackWhiteOnColor.ino

@@ -20,6 +20,7 @@
 #include <GxEPD2_BW.h>
 #include <GxEPD2_3C.h>
 #include <Fonts/FreeMonoBold9pt7b.h>
+#include <Fonts/FreeMonoBold12pt7b.h>
 
 // e.g. for Wemos D1 mini:
 #if defined (ESP8266)
@@ -31,7 +32,9 @@
 #if defined(ESP32)
 //GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213Z19
 //GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH029Z13
-GxEPD2_3C<GxEPD2_420c_GDEY042Z98, GxEPD2_420c_GDEY042Z98::HEIGHT> display(GxEPD2_420c_GDEY042Z98(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY042Z98
+//GxEPD2_3C<GxEPD2_420c_GDEY042Z98, GxEPD2_420c_GDEY042Z98::HEIGHT> display(GxEPD2_420c_GDEY042Z98(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY042Z98
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08
+GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075Z08
 #endif
 
 const uint16_t window_x = 8;
@@ -76,7 +79,8 @@ void clearWindow()
 void showValue(uint16_t value)
 {
   display.setRotation(0);
-  display.setFont(&FreeMonoBold9pt7b);
+  //display.setFont(&FreeMonoBold9pt7b);
+  display.setFont(&FreeMonoBold12pt7b);
   display.setTextColor(GxEPD_BLACK);
   if ((1 == display.pages()) && true) // test non-paged
   {
@@ -107,7 +111,8 @@ const char HelloWorld[] = "Hello World!";
 void helloWorld()
 {
   display.setRotation(1);
-  display.setFont(&FreeMonoBold9pt7b);
+  //display.setFont(&FreeMonoBold9pt7b);
+  display.setFont(&FreeMonoBold12pt7b);
   display.setTextColor(GxEPD_RED);
   int16_t tbx, tby; uint16_t tbw, tbh;
   display.getTextBounds(HelloWorld, 0, 0, &tbx, &tby, &tbw, &tbh);

+ 403 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_FastBlackWhiteOnColorRefreshTests.ino

@@ -0,0 +1,403 @@
+// 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!
+//
+// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+// see GxEPD2_wiring_examples.h for wiring suggestions and examples
+
+// uncomment next line to use HSPI for EPD (and VSPI for SD), e.g. with Waveshare ESP32 Driver Board
+//#define USE_HSPI_FOR_EPD
+
+// uncomment next line to use class GFX of library GFX_Root instead of Adafruit_GFX
+//#include <GFX.h>
+// Note: if you use this with ENABLE_GxEPD2_GFX 1:
+//       uncomment it in GxEPD2_GFX.h too, or add #include <GFX.h> before any #include <GxEPD2_GFX.h>
+
+#include <GxEPD2_BW.h>
+#include <GxEPD2_3C.h>
+
+// select the display constructor line in one of the following files (old style):
+#include "GxEPD2_display_selection.h"
+#include "GxEPD2_display_selection_added.h"
+//#include "GxEPD2_display_selection_more.h" // private
+
+// or select the display class and display driver class in the following file (new style):
+#include "GxEPD2_display_selection_new_style.h"
+
+// or select one of the panels supporting fast black white refresh on color
+#if defined(ESP32)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213Z19
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH029Z13
+//GxEPD2_3C<GxEPD2_420c_GDEY042Z98, GxEPD2_420c_GDEY042Z98::HEIGHT> display(GxEPD2_420c_GDEY042Z98(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY042Z98
+//GxEPD2_3C<GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEW075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08
+GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 2> display(GxEPD2_750c_GDEY075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075Z08
+#endif
+
+#include "Open_Sans_ExtraBold_120.h"
+
+
+//const uint32_t partial_update_period_s = 2;
+const uint32_t partial_update_period_s = 60;
+const uint32_t full_update_period_s = 1 * 60 * 60;
+const uint32_t speed_up_factor = 20; // for simulation
+const uint32_t millis_per_second = 1000 / speed_up_factor;
+
+uint32_t start_time;
+uint32_t next_time;
+uint32_t previous_time;
+uint32_t previous_full_update;
+
+uint32_t total_seconds = 0;
+uint32_t seconds, minutes, hours, days;
+
+#if defined(ESP32) && defined(USE_HSPI_FOR_EPD)
+SPIClass hspi(HSPI);
+#endif
+
+void setup()
+{
+  Serial.begin(115200);
+  Serial.println();
+  Serial.println("setup");
+  delay(100);
+#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
+  display.init(115200);
+  // cleanup
+  for (int i = 0; i < 1; i++)
+  {
+    full_black();
+    delay(500);
+    full_white(); // don't comment out!
+    delay(500);
+  }
+  //full_white(); // IS NEEDED BEFORE ANY FAST BW (make both controller buffer equal in the partial window)
+  // stripes tests
+  for (int i = 0; i < 0; i++)
+  {
+    horizontal_stripes(8);
+    delay(1000);
+    horizontal_stripes_inverted(8);
+    delay(1000);
+  }
+  for (int i = 0; i < 0; i++)
+  {
+    vertical_stripes(8);
+    delay(3000);
+    vertical_stripes_inverted(8);
+    delay(3000);
+  }
+  for (int i = 0; i < 1; i++)
+  {
+    horizontal_stripes(8);
+    delay(1000);
+    vertical_stripes(8);
+    delay(3000);
+  }
+  //display.powerOff(); return;
+  full_white();
+  delay(1000);
+  //display.powerOff(); return;
+  // clock simulation test, for limited length
+  start_time = next_time = previous_time = previous_full_update = millis();
+  for (int i = 0; i < 50; i++)
+  {
+    clock_test();
+  }
+  delay(3000);
+  full_white();
+  delay(1000);
+  display.powerOff();
+  delay(1000);
+  start_time = next_time = previous_time = previous_full_update = millis();
+  Serial.println("setup done");
+}
+
+void loop()
+{
+  // uncomment for continuous clock simulation test
+  //clock_test();
+}
+
+void full_white()
+{
+  display.setFullWindow();
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_WHITE);
+  }
+  while (display.nextPage());
+}
+
+void full_black()
+{
+  display.setFullWindow();
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_BLACK);
+  }
+  while (display.nextPage());
+}
+
+void partial_white()
+{
+  display.setPartialWindow(0, 0, display.width(), display.height());
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_WHITE);
+  }
+  while (display.nextPageBW());
+}
+
+void partial_black()
+{
+  display.setPartialWindow(0, 0, display.width(), display.height());
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_BLACK);
+  }
+  while (display.nextPageBW());
+}
+
+void horizontal_stripes(uint16_t nr)
+{
+  uint16_t h = display.height() / nr;
+  display.setPartialWindow(0, 0, display.width(), display.height());
+  display.firstPage();
+  do
+  {
+    uint16_t y = 0;
+    do
+    {
+      display.fillRect(0, y, display.width(), h, GxEPD_BLACK);
+      y += h;
+      if (y >= display.height()) break;
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE);
+      y += h;
+    } while (y < display.height());
+  }
+  while (display.nextPageBW());
+}
+
+void vertical_stripes(uint16_t nr)
+{
+  uint16_t w = display.width() / nr;
+  display.setPartialWindow(0, 0, display.width(), display.height());
+  display.firstPage();
+  do
+  {
+    uint16_t x = 0;
+    do
+    {
+      display.fillRect(x, 0, w, display.height(), GxEPD_BLACK);
+      x += w;
+      if (x >= display.width()) break;
+      display.fillRect(x, 0, w, display.height(), GxEPD_WHITE);
+      x += w;
+    } while (x < display.width());
+  }
+  while (display.nextPageBW());
+}
+
+void horizontal_stripes_inverted(uint16_t nr)
+{
+  uint16_t h = display.height() / nr;
+  display.setPartialWindow(0, 0, display.width(), display.height());
+  display.firstPage();
+  do
+  {
+    uint16_t y = 0;
+    do
+    {
+      display.fillRect(0, y, display.width(), h, GxEPD_WHITE);
+      y += h;
+      if (y >= display.height()) break;
+      display.fillRect(0, y, display.width(), h, GxEPD_BLACK);
+      y += h;
+    } while (y < display.height());
+  }
+  while (display.nextPageBW());
+}
+
+void vertical_stripes_inverted(uint16_t nr)
+{
+  uint16_t w = display.width() / nr;
+  display.setPartialWindow(0, 0, display.width(), display.height());
+  display.firstPage();
+  do
+  {
+    uint16_t x = 0;
+    do
+    {
+      display.fillRect(x, 0, w, display.height(), GxEPD_WHITE);
+      x += w;
+      if (x >= display.width()) break;
+      display.fillRect(x, 0, w, display.height(), GxEPD_BLACK);
+      x += w;
+    } while (x < display.width());
+  }
+  while (display.nextPageBW());
+}
+
+void clock_test()
+{
+  uint32_t actual = millis();
+  while (actual < next_time)
+  {
+    // the "BlinkWithoutDelay" method works also for overflowed millis
+    if ((actual - previous_time) > (partial_update_period_s * 1000))
+    {
+      //Serial.print(actual - previous_time); Serial.print(" > "); Serial.println(partial_update_period_s * 1000);
+      break;
+    }
+    delay(100);
+    actual = millis();
+  }
+  if ((actual - previous_full_update) > full_update_period_s * millis_per_second)
+  {
+    //display.clearScreen();
+    previous_full_update = actual;
+  }
+  previous_time = actual;
+  next_time += uint32_t(partial_update_period_s * millis_per_second);
+  total_seconds += partial_update_period_s;
+  seconds = total_seconds % 60;
+  minutes = (total_seconds / 60) % 60;
+  hours = (total_seconds / 3600) % 24;
+  days = (total_seconds / 3600) / 24;
+  if ((display.width() >= 400) && (display.height() >= 300))
+  {
+    showDays();
+    showTime();
+  }
+  else showMinutes();
+  display.powerOff();
+}
+
+String str02(uint32_t v)
+{
+  return (v < 10 ? String(0) + String(v) : String(v));
+}
+
+void showMinutes()
+{
+  static int16_t bbx = 400;
+  static int16_t bby = 300;
+  static uint16_t bbw = 0;
+  static uint16_t bbh = 0;
+  //Serial.println("showMinutes");
+  String str = str02(minutes);
+  display.setRotation(display.epd2.WIDTH > display.epd2.HEIGHT ? 0 : 1);
+  display.setFont(&Open_Sans_ExtraBold_120);
+  display.setTextColor(GxEPD_BLACK);
+  int16_t tbx, tby; uint16_t tbw, tbh;
+  display.getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh);
+  // place the bounding box, cover any previous ones
+  int16_t tx = max(0, ((display.width() - tbw) / 2));
+  int16_t ty = max(0, ((display.height() - tbh) / 2));
+  bbx = min(bbx, tx);
+  bby = min(bby, ty);
+  bbw = max(bbw, tbw);
+  bbh = max(bbh, tbh);
+  // calculate the cursor
+  int16_t x = bbx - tbx;
+  int16_t y = bby - tby;
+  display.setPartialWindow(bbx, bby, bbw, bbh);
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_WHITE);
+    //display.drawRect(bbx, bby, bbw, bbh, GxEPD_BLACK);
+    display.setCursor(x, y);
+    display.print(str);
+  }
+  while (display.nextPageBW());
+  delay(1000);
+  //Serial.println("showMinutes done");
+}
+
+void showDays()
+{
+  static int16_t bbx = 400;
+  static int16_t bby = 300;
+  static uint16_t bbw = 0;
+  static uint16_t bbh = 0;
+  //Serial.println("showDays");
+  String str(days); str += " days";
+  display.setRotation(0);
+  display.setFont(&Open_Sans_ExtraBold_120);
+  display.setTextColor(GxEPD_BLACK);
+  int16_t tbx, tby; uint16_t tbw, tbh;
+  display.getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh);
+  // place the bounding box
+  int16_t tx = max(0, ((display.width() - tbw) / 2));
+  int16_t ty = max(0, (display.height() / 4 - tbh / 2));
+  bbx = min(bbx, tx);
+  bby = min(bby, ty);
+  bbw = max(bbw, tbw);
+  bbh = max(bbh, tbh);
+  // calculate the cursor
+  uint16_t x = bbx - tbx;
+  uint16_t y = bby - tby;
+  display.setPartialWindow(bbx, bby, bbw, bbh);
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_WHITE);
+    //display.drawRect(bbx, bby, bbw, bbh, GxEPD_BLACK);
+    display.setCursor(x, y);
+    display.print(str);
+  }
+  while (display.nextPageBW());
+  delay(1000);
+  //Serial.println("showDays done");
+}
+
+void showTime()
+{
+  static int16_t bbx = 400;
+  static int16_t bby = 300;
+  static uint16_t bbw = 0;
+  static uint16_t bbh = 0;
+  //Serial.println("showTime");
+  //String str = str02(minutes) + ":" + str02(seconds);
+  String str = str02(hours) + ":" + str02(minutes);
+  display.setRotation(0);
+  display.setFont(&Open_Sans_ExtraBold_120);
+  display.setTextColor(GxEPD_BLACK);
+  int16_t tbx, tby; uint16_t tbw, tbh;
+  display.getTextBounds(str, 0, 0, &tbx, &tby, &tbw, &tbh);
+  // place the bounding box
+  int16_t tx = max(0, ((display.width() - tbw) / 2));
+  int16_t ty = max(0, (display.height() * 3 / 4 - tbh / 2));
+  bbx = min(bbx, tx);
+  bby = min(bby, ty);
+  bbw = max(bbw, tbw);
+  bbh = max(bbh, tbh);
+  // calculate the cursor
+  uint16_t x = bbx - tbx;
+  uint16_t y = bby - tby;
+  display.setPartialWindow(bbx, bby, bbw, bbh);
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_WHITE);
+    //display.drawRect(bbx, bby, bbw, bbh, GxEPD_BLACK);
+    display.setCursor(x, y);
+    display.print(str);
+  }
+  while (display.nextPageBW());
+  //Serial.println("showTime done");
+}

+ 602 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_display_selection.h

@@ -0,0 +1,602 @@
+// 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
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// 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
+
+#if defined (ESP8266)
+// select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(GxEPD2_154_GDEY0154D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> display(GxEPD2_213_B74(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, GxEPD2_213_M21::HEIGHT> display(GxEPD2_213_M21(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, GxEPD2_213_T5D::HEIGHT> display(GxEPD2_213_T5D(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, GxEPD2_213_GDEY0213B74::HEIGHT> display(GxEPD2_213_GDEY0213B74(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, GxEPD2_260_M01::HEIGHT> display(GxEPD2_260_M01(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, GxEPD2_266_BN::HEIGHT> display(GxEPD2_266_BN(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT> display(GxEPD2_270_GDEY027T91(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, GxEPD2_290_I6FD::HEIGHT> display(GxEPD2_290_I6FD(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(GxEPD2_290_T94_V2(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> 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<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, GxEPD2_370_TC1::HEIGHT> display(GxEPD2_370_TC1(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> display(GxEPD2_426_GDEQ0426T82(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+// 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)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//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)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//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_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<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, GxEPD2_266c::HEIGHT> display(GxEPD2_266c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM029C90 128x296, SSD1680
+// can use only half buffer size
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT / 2> display(GxEPD2_420c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, GxEPD2_420c_Z21::HEIGHT / 2> display(GxEPD2_420c_Z21(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEQ042Z21 400x300, UC8276
+// can use only quarter buffer size
+//GxEPD2_3C < GxEPD2_583c, GxEPD2_583c::HEIGHT / 4 > display(GxEPD2_583c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C < GxEPD2_583c_Z83, GxEPD2_583c_Z83::HEIGHT / 4 > display(GxEPD2_583c_Z83(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//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, GD7965
+//GxEPD2_3C < GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4 > display(GxEPD2_750c_Z90(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, GxEPD2_266c_GDEY0266F51H::HEIGHT> display(GxEPD2_266c_GDEY0266F51H(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, GxEPD2_290c_GDEY029F51H::HEIGHT> 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<GxEPD2_300c, GxEPD2_300c::HEIGHT> display(GxEPD2_300c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, GxEPD2_420c_GDEY0420F51::HEIGHT> 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
+// 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
+//GxEPD2_7C < GxEPD2_730c_GDEY073D46, GxEPD2_730c_GDEY073D46::HEIGHT / 6 > display(GxEPD2_730c_GDEY073D46(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+// 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!
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT / 8> display(GxEPD2_it60(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it60_1448x1072, GxEPD2_it60_1448x1072::HEIGHT / 8 > display(GxEPD2_it60_1448x1072(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it78_1872x1404, GxEPD2_it78_1872x1404::HEIGHT / 8 > display(GxEPD2_it78_1872x1404(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it103_1872x1404, GxEPD2_it103_1872x1404::HEIGHT / 8 > display(GxEPD2_it103_1872x1404(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 4));
+
+// ***** for mapping of Waveshare e-Paper ESP8266 Driver Board *****
+// select one , can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(GxEPD2_154_GDEY0154D67(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> display(GxEPD2_213_B74(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, GxEPD2_213_M21::HEIGHT> display(GxEPD2_213_M21(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, GxEPD2_213_T5D::HEIGHT> display(GxEPD2_213_T5D(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, GxEPD2_213_GDEY0213B74::HEIGHT> display(GxEPD2_213_GDEY0213B74(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, GxEPD2_260_M01::HEIGHT> display(GxEPD2_260_M01(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, GxEPD2_266_BN::HEIGHT> display(GxEPD2_266_BN(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT> display(GxEPD2_270_GDEY027T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, GxEPD2_290_I6FD::HEIGHT> display(GxEPD2_290_I6FD(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(GxEPD2_290_T94_V2(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> 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<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, GxEPD2_370_TC1::HEIGHT> display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> 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)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//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)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//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_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<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, GxEPD2_266c::HEIGHT> display(GxEPD2_266c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEM029C90 128x296, SSD1680
+// can use only half buffer size
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT / 2> display(GxEPD2_420c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, GxEPD2_420c_Z21::HEIGHT / 2> display(GxEPD2_420c_Z21(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEQ042Z21 400x300, UC8276
+// can use only quarter buffer size
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT / 4> display(GxEPD2_583c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, GxEPD2_583c_Z83::HEIGHT / 4> display(GxEPD2_583c_Z83(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4> display(GxEPD2_750c_Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4> display(GxEPD2_750c_Z90(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, GxEPD2_266c_GDEY0266F51H::HEIGHT> 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<GxEPD2_290c_GDEY029F51H, GxEPD2_290c_GDEY029F51H::HEIGHT> 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<GxEPD2_300c, GxEPD2_300c::HEIGHT> display(GxEPD2_300c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, GxEPD2_420c_GDEY0420F51::HEIGHT> 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
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // Waveshare 5.65" 7-color
+//GxEPD2_7C < GxEPD2_730c_GDEY073D46, GxEPD2_730c_GDEY073D46::HEIGHT / 6 > display(GxEPD2_730c_GDEY073D46(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+#endif
+
+#if defined(ESP32)
+// select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(GxEPD2_154_GDEY0154D67(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> display(GxEPD2_213_B74(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, GxEPD2_213_M21::HEIGHT> display(GxEPD2_213_M21(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, GxEPD2_213_T5D::HEIGHT> display(GxEPD2_213_T5D(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, GxEPD2_213_GDEY0213B74::HEIGHT> display(GxEPD2_213_GDEY0213B74(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, GxEPD2_260_M01::HEIGHT> display(GxEPD2_260_M01(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, GxEPD2_266_BN::HEIGHT> display(GxEPD2_266_BN(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT> display(GxEPD2_270_GDEY027T91(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, GxEPD2_290_I6FD::HEIGHT> display(GxEPD2_290_I6FD(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(GxEPD2_290_T94_V2(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> display(GxEPD2_290_GDEY029T94(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, GxEPD2_370_TC1::HEIGHT> display(GxEPD2_370_TC1(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> display(GxEPD2_426_GDEQ0426T82(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, GxEPD2_583::HEIGHT> display(GxEPD2_583(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, GxEPD2_583_T8::HEIGHT> display(GxEPD2_583_T8(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT> display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> display(GxEPD2_750_T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT> display(GxEPD2_750_YT7(/*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<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, GxEPD2_266c::HEIGHT> display(GxEPD2_266c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, GxEPD2_420c_Z21::HEIGHT> display(GxEPD2_420c_Z21(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT> display(GxEPD2_583c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, GxEPD2_583c_Z83::HEIGHT> display(GxEPD2_583c_Z83(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, GxEPD2_266c_GDEY0266F51H::HEIGHT> display(GxEPD2_266c_GDEY0266F51H(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, GxEPD2_290c_GDEY029F51H::HEIGHT> display(GxEPD2_290c_GDEY029F51H(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, GxEPD2_300c::HEIGHT> display(GxEPD2_300c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, GxEPD2_420c_GDEY0420F51::HEIGHT> display(GxEPD2_420c_GDEY0420F51(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C<GxEPD2_437c, GxEPD2_437c::HEIGHT> display(GxEPD2_437c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 4.37" 4-color
+// 7-color e-paper
+//GxEPD2_3C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 5.65" 7-color (3C graphics)
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // Waveshare 5.65" 7-color
+//GxEPD2_7C < GxEPD2_730c_GDEY073D46, GxEPD2_730c_GDEY073D46::HEIGHT / 4 > display(GxEPD2_730c_GDEY073D46(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+
+// 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
+// note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT> display(GxEPD2_it60(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it60_1448x1072, GxEPD2_it60_1448x1072::HEIGHT / 4 > display(GxEPD2_it60_1448x1072(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it78_1872x1404, GxEPD2_it78_1872x1404::HEIGHT / 8 > display(GxEPD2_it78_1872x1404(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it103_1872x1404, GxEPD2_it103_1872x1404::HEIGHT / 8 > display(GxEPD2_it103_1872x1404(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+
+// Waveshare 12.48 b/w SPI display board and frame or Good Display 12.48 b/w panel GDEW1248T3
+// general constructor for use with all parameters, e.g. for Waveshare ESP32 driver board mounted on connection board
+//GxEPD2_BW < GxEPD2_1248, GxEPD2_1248::HEIGHT / 4 >
+//display(GxEPD2_1248(/*sck=*/ 13, /*miso=*/ 12, /*mosi=*/ 14, /*cs_m1=*/ 23, /*cs_s1=*/ 22, /*cs_m2=*/ 16, /*cs_s2=*/ 19,
+//                             /*dc1=*/ 25, /*dc2=*/ 17, /*rst1=*/ 33, /*rst2=*/ 5, /*busy_m1=*/ 32, /*busy_s1=*/ 26, /*busy_m2=*/ 18, /*busy_s2=*/ 4));
+// Waveshare 12.48 b/w/r SPI display board and frame or Good Display 12.48 b/w/r panel GDEY1248Z51
+// general constructor for use with all parameters, e.g. for Waveshare ESP32 driver board mounted on connection board
+//GxEPD2_3C < GxEPD2_1248c, GxEPD2_1248c::HEIGHT / 4 >
+//display(GxEPD2_1248c(/*sck=*/ 13, /*miso=*/ 12, /*mosi=*/ 14, /*cs_m1=*/ 23, /*cs_s1=*/ 22, /*cs_m2=*/ 16, /*cs_s2=*/ 19,
+//                             /*dc1=*/ 25, /*dc2=*/ 17, /*rst1=*/ 33, /*rst2=*/ 5, /*busy_m1=*/ 32, /*busy_s1=*/ 26, /*busy_m2=*/ 18, /*busy_s2=*/ 4));
+
+// ***** for mapping of Waveshare ESP32 Driver Board *****
+// use Board "ESP32 Dev Module" to build with Arduino IDE
+// uncomment next line to use HSPI for EPD (and e.g VSPI for SD), e.g. with Waveshare ESP32 Driver Board
+//#define USE_HSPI_FOR_EPD
+// select one, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(GxEPD2_154_GDEY0154D67(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> display(GxEPD2_213_B74(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, GxEPD2_213_M21::HEIGHT> display(GxEPD2_213_M21(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, GxEPD2_213_T5D::HEIGHT> display(GxEPD2_213_T5D(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, GxEPD2_213_GDEY0213B74::HEIGHT> display(GxEPD2_213_GDEY0213B74(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, GxEPD2_260_M01::HEIGHT> display(GxEPD2_260_M01(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, GxEPD2_266_BN::HEIGHT> display(GxEPD2_266_BN(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT> display(GxEPD2_270_GDEY027T91(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, GxEPD2_290_I6FD::HEIGHT> display(GxEPD2_290_I6FD(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(GxEPD2_290_T94_V2(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> display(GxEPD2_290_GDEY029T94(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, GxEPD2_370_TC1::HEIGHT> display(GxEPD2_370_TC1(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> display(GxEPD2_426_GDEQ0426T82(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, GxEPD2_583::HEIGHT> display(GxEPD2_583(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, GxEPD2_583_T8::HEIGHT> display(GxEPD2_583_T8(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT> display(GxEPD2_583_GDEQ0583T31(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> display(GxEPD2_750_T7(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT> display(GxEPD2_750_YT7(/*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<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, GxEPD2_266c::HEIGHT> display(GxEPD2_266c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, GxEPD2_420c_Z21::HEIGHT> display(GxEPD2_420c_Z21(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT> display(GxEPD2_583c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, GxEPD2_583c_Z83::HEIGHT> display(GxEPD2_583c_Z83(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 2> display(GxEPD2_750c_Z90(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, GxEPD2_266c_GDEY0266F51H::HEIGHT> display(GxEPD2_266c_GDEY0266F51H(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, GxEPD2_290c_GDEY029F51H::HEIGHT> display(GxEPD2_290c_GDEY029F51H(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, GxEPD2_300c::HEIGHT> display(GxEPD2_300c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, GxEPD2_420c_GDEY0420F51::HEIGHT> display(GxEPD2_420c_GDEY0420F51(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare 4.37" 4-color
+// 7-color e-paper
+//GxEPD2_3C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare 5.65" 7-color (3C graphics)
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare 5.65" 7-color
+//GxEPD2_7C < GxEPD2_730c_GDEY073D46, GxEPD2_730c_GDEY073D46::HEIGHT / 4 > display(GxEPD2_730c_GDEY073D46(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+#endif
+
+// can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics)
+#if defined(ARDUINO_ARCH_STM32)
+#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
+#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<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, MAX_HEIGHT(GxEPD2_154_M09)> display(GxEPD2_154_M09(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, MAX_HEIGHT(GxEPD2_154_M10)> display(GxEPD2_154_M10(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, MAX_HEIGHT(GxEPD2_154_GDEY0154D67)> display(GxEPD2_154_GDEY0154D67(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, MAX_HEIGHT(GxEPD2_213_B73)> display(GxEPD2_213_B73(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, MAX_HEIGHT(GxEPD2_213_B74)> display(GxEPD2_213_B74(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, MAX_HEIGHT(GxEPD2_213_M21)> display(GxEPD2_213_M21(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, MAX_HEIGHT(GxEPD2_213_T5D)> display(GxEPD2_213_T5D(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, MAX_HEIGHT(GxEPD2_213_BN)> 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<GxEPD2_213_GDEY0213B74, MAX_HEIGHT(GxEPD2_213_GDEY0213B74)> display(GxEPD2_213_GDEY0213B74(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, MAX_HEIGHT(GxEPD2_260)> display(GxEPD2_260(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, MAX_HEIGHT(GxEPD2_260_M01)> display(GxEPD2_260_M01(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, MAX_HEIGHT(GxEPD2_266_BN)> 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<GxEPD2_270, MAX_HEIGHT(GxEPD2_270)> display(GxEPD2_270(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, MAX_HEIGHT(GxEPD2_270_GDEY027T91)> display(GxEPD2_270_GDEY027T91(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, MAX_HEIGHT(GxEPD2_290_T5D)> display(GxEPD2_290_T5D(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, MAX_HEIGHT(GxEPD2_290_I6FD)> display(GxEPD2_290_I6FD(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, MAX_HEIGHT(GxEPD2_290_T94)> display(GxEPD2_290_T94(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, MAX_HEIGHT(GxEPD2_290_T94_V2)> display(GxEPD2_290_T94_V2(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, MAX_HEIGHT(GxEPD2_290_BS)> display(GxEPD2_290_BS(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, MAX_HEIGHT(GxEPD2_290_M06)> display(GxEPD2_290_M06(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, MAX_HEIGHT(GxEPD2_290_GDEY029T94)> display(GxEPD2_290_GDEY029T94(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, MAX_HEIGHT(GxEPD2_371)> display(GxEPD2_371(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, MAX_HEIGHT(GxEPD2_370_TC1)> display(GxEPD2_370_TC1(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, MAX_HEIGHT(GxEPD2_420)> display(GxEPD2_420(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, MAX_HEIGHT(GxEPD2_420_M01)> display(GxEPD2_420_M01(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, MAX_HEIGHT(GxEPD2_420_GDEY042T81)> display(GxEPD2_420_GDEY042T81(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, MAX_HEIGHT(GxEPD2_426_GDEQ0426T82)> display(GxEPD2_426_GDEQ0426T82(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, MAX_HEIGHT(GxEPD2_583)> display(GxEPD2_583(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW <GxEPD2_583_T8,  MAX_HEIGHT(GxEPD2_583_T8)> display(GxEPD2_583_T8(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, MAX_HEIGHT(GxEPD2_583_GDEQ0583T31)> display(GxEPD2_583_GDEQ0583T31(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, MAX_HEIGHT(GxEPD2_750)> display(GxEPD2_750(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, MAX_HEIGHT(GxEPD2_750_T7)> display(GxEPD2_750_T7(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, MAX_HEIGHT(GxEPD2_750_YT7)> display(GxEPD2_750_YT7(/*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<GxEPD2_154c, MAX_HEIGHT_3C(GxEPD2_154c)> display(GxEPD2_154c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, MAX_HEIGHT_3C(GxEPD2_154_Z90c)> display(GxEPD2_154_Z90c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, MAX_HEIGHT_3C(GxEPD2_213c)> display(GxEPD2_213c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, MAX_HEIGHT_3C(GxEPD2_213_Z19c)> display(GxEPD2_213_Z19c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, MAX_HEIGHT_3C(GxEPD2_213_Z98c)> display(GxEPD2_213_Z98c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, MAX_HEIGHT_3C(GxEPD2_266c)> display(GxEPD2_266c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, MAX_HEIGHT_3C(GxEPD2_270c)> display(GxEPD2_270c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, MAX_HEIGHT_3C(GxEPD2_290c)> display(GxEPD2_290c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, MAX_HEIGHT_3C(GxEPD2_290_Z13c)> display(GxEPD2_290_Z13c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT_3C(GxEPD2_290_C90c)> display(GxEPD2_290_C90c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, MAX_HEIGHT_3C(GxEPD2_420c)> display(GxEPD2_420c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, MAX_HEIGHT_3C(GxEPD2_420c_Z21)> display(GxEPD2_420c_Z21(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, MAX_HEIGHT_3C(GxEPD2_583c)> display(GxEPD2_583c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, MAX_HEIGHT_3C(GxEPD2_583c_Z83)> display(GxEPD2_583c_Z83(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, MAX_HEIGHT_3C(GxEPD2_266c_GDEY0266F51H)> display(GxEPD2_266c_GDEY0266F51H(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, MAX_HEIGHT_3C(GxEPD2_290c_GDEY029F51H)> display(GxEPD2_290c_GDEY029F51H(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, MAX_HEIGHT_3C(GxEPD2_300c)> display(GxEPD2_300c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, MAX_HEIGHT_3C(GxEPD2_420c_GDEY0420F51)> display(GxEPD2_420c_GDEY0420F51(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C <GxEPD2_437c, MAX_HEIGHT_3C(GxEPD2_437c)> 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<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=PA4*/ SS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1)); // Waveshare 5.65" 7-color
+//GxEPD2_7C<GxEPD2_730c_GDEY073D46, MAX_HEIGHT_7C(GxEPD2_730c_GDEY073D46)> 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)
+#if defined (ARDUINO_AVR_MEGA2560) // Note: SS is on 53 on MEGA
+#define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
+#else // Note: SS is on 10 on UNO, NANO
+#define MAX_DISPLAY_BUFFER_SIZE 800
+#endif
+#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<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, MAX_HEIGHT(GxEPD2_150_BN)> display(GxEPD2_150_BN(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, MAX_HEIGHT(GxEPD2_154_M09)> display(GxEPD2_154_M09(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, MAX_HEIGHT(GxEPD2_154_M10)> display(GxEPD2_154_M10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, MAX_HEIGHT(GxEPD2_154_GDEY0154D67)> display(GxEPD2_154_GDEY0154D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, MAX_HEIGHT(GxEPD2_213_B73)> display(GxEPD2_213_B73(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, MAX_HEIGHT(GxEPD2_213_B74)> display(GxEPD2_213_B74(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, MAX_HEIGHT(GxEPD2_213_M21)> display(GxEPD2_213_M21(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, MAX_HEIGHT(GxEPD2_213_T5D)> display(GxEPD2_213_T5D(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, MAX_HEIGHT(GxEPD2_213_BN)> display(GxEPD2_213_BN(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, MAX_HEIGHT(GxEPD2_213_GDEY0213B74)> display(GxEPD2_213_GDEY0213B74(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, MAX_HEIGHT(GxEPD2_260)> display(GxEPD2_260(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, MAX_HEIGHT(GxEPD2_260_M01)> display(GxEPD2_260_M01(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, MAX_HEIGHT(GxEPD2_266_BN)> display(GxEPD2_266_BN(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, MAX_HEIGHT(GxEPD2_270)> display(GxEPD2_270(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, MAX_HEIGHT(GxEPD2_270_GDEY027T91)> display(GxEPD2_270_GDEY027T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, MAX_HEIGHT(GxEPD2_290_T5D)> display(GxEPD2_290_T5D(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, MAX_HEIGHT(GxEPD2_290_I6FD)> display(GxEPD2_290_I6FD(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, MAX_HEIGHT(GxEPD2_290_T94)> display(GxEPD2_290_T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, MAX_HEIGHT(GxEPD2_290_T94_V2)> display(GxEPD2_290_T94_V2(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, MAX_HEIGHT(GxEPD2_290_BS)> display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, MAX_HEIGHT(GxEPD2_290_M06)> display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, MAX_HEIGHT(GxEPD2_290_GDEY029T94)> display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, MAX_HEIGHT(GxEPD2_371)> display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, MAX_HEIGHT(GxEPD2_370_TC1)> display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, MAX_HEIGHT(GxEPD2_420)> display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, MAX_HEIGHT(GxEPD2_420_M01)> display(GxEPD2_420_M01(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, MAX_HEIGHT(GxEPD2_420_GDEY042T81)> display(GxEPD2_420_GDEY042T81(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, MAX_HEIGHT(GxEPD2_426_GDEQ0426T82)> display(GxEPD2_426_GDEQ0426T82(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, MAX_HEIGHT(GxEPD2_583)> display(GxEPD2_583(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, MAX_HEIGHT(GxEPD2_583_T8)> display(GxEPD2_583_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, MAX_HEIGHT(GxEPD2_583_GDEQ0583T31)> display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, MAX_HEIGHT(GxEPD2_750)> display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, MAX_HEIGHT(GxEPD2_750_T7)> display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, MAX_HEIGHT(GxEPD2_750_YT7)> display(GxEPD2_750_YT7(/*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))
+//GxEPD2_3C<GxEPD2_154c, MAX_HEIGHT_3C(GxEPD2_154c)> display(GxEPD2_154c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, MAX_HEIGHT_3C(GxEPD2_154_Z90c)> display(GxEPD2_154_Z90c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, MAX_HEIGHT_3C(GxEPD2_213c)> display(GxEPD2_213c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, MAX_HEIGHT_3C(GxEPD2_213_Z19c)> display(GxEPD2_213_Z19c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, MAX_HEIGHT_3C(GxEPD2_213_Z98c)> display(GxEPD2_213_Z98c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, MAX_HEIGHT_3C(GxEPD2_266c)> display(GxEPD2_266c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, MAX_HEIGHT_3C(GxEPD2_270c)> display(GxEPD2_270c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, MAX_HEIGHT_3C(GxEPD2_290c)> display(GxEPD2_290c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, MAX_HEIGHT_3C(GxEPD2_290_Z13c)> display(GxEPD2_290_Z13c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT_3C(GxEPD2_290_C90c)> display(GxEPD2_290_C90c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, MAX_HEIGHT_3C(GxEPD2_420c)> display(GxEPD2_420c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, MAX_HEIGHT_3C(GxEPD2_420c_Z21)> display(GxEPD2_420c_Z21(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, MAX_HEIGHT_3C(GxEPD2_583c)> display(GxEPD2_583c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, MAX_HEIGHT_3C(GxEPD2_583c_Z83)> display(GxEPD2_583c_Z83(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, MAX_HEIGHT_3C(GxEPD2_266c_GDEY0266F51H)> display(GxEPD2_266c_GDEY0266F51H(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, MAX_HEIGHT_3C(GxEPD2_290c_GDEY029F51H)> display(GxEPD2_290c_GDEY029F51H(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, MAX_HEIGHT_3C(GxEPD2_300c)> display(GxEPD2_300c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, MAX_HEIGHT_3C(GxEPD2_420c_GDEY0420F51)> display(GxEPD2_420c_GDEY0420F51(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C <GxEPD2_437c, MAX_HEIGHT_3C(GxEPD2_437c)> display(GxEPD2_437c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // 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<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 5.65" 7-color
+//GxEPD2_7C<GxEPD2_730c_GDEY073D46, MAX_HEIGHT_7C(GxEPD2_730c_GDEY073D46)> display(GxEPD2_730c_GDEY073D46(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+
+// ***** for mapping of Waveshare Universal e-Paper Raw Panel Driver Shield for Arduino / NUCLEO *****
+// the RST line is not connected through level converter, but has a pull up resistor and a pull down diode to the Arduino pin; this is safe for 5V Arduino
+// NOTE: the 11-pinholes for pin connectors are not through level converter, and the VCC pin is ~4.2V, only FCP connector pins are through level converter
+// NOTE: the VCC pin on the 11-pinholes for pin connectors shouldn't be used, it seems to get back-fed from Arduino data pins through protection diodes of the level converter
+// NOTE: the VCC pin should be fed from Arduino 5V pin for use on any 5V Arduino (did they forget to add this connection or add a jumper?)
+// select one and adapt to your mapping
+//GxEPD2_BW<GxEPD2_150_BN, MAX_HEIGHT(GxEPD2_150_BN)> display(GxEPD2_150_BN(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, MAX_HEIGHT(GxEPD2_154_M09)> display(GxEPD2_154_M09(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, MAX_HEIGHT(GxEPD2_154_M10)> display(GxEPD2_154_M10(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, MAX_HEIGHT(GxEPD2_154_GDEY0154D67)> display(GxEPD2_154_GDEY0154D67(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, MAX_HEIGHT(GxEPD2_213_B73)> display(GxEPD2_213_B73(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, MAX_HEIGHT(GxEPD2_213_B74)> display(GxEPD2_213_B74(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, MAX_HEIGHT(GxEPD2_213_M21)> display(GxEPD2_213_M21(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, MAX_HEIGHT(GxEPD2_213_T5D)> display(GxEPD2_213_T5D(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, MAX_HEIGHT(GxEPD2_213_BN)> display(GxEPD2_213_BN(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, MAX_HEIGHT(GxEPD2_213_GDEY0213B74)> display(GxEPD2_213_GDEY0213B74(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, MAX_HEIGHT(GxEPD2_260)> display(GxEPD2_260(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, MAX_HEIGHT(GxEPD2_260_M01)> display(GxEPD2_260_M01(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, MAX_HEIGHT(GxEPD2_266_BN)> display(GxEPD2_266_BN(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, MAX_HEIGHT(GxEPD2_270)> display(GxEPD2_270(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, MAX_HEIGHT(GxEPD2_270_GDEY027T91)> display(GxEPD2_270_GDEY027T91(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, MAX_HEIGHT(GxEPD2_290_T5D)> display(GxEPD2_290_T5D(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, MAX_HEIGHT(GxEPD2_290_I6FD)> display(GxEPD2_290_I6FD(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, MAX_HEIGHT(GxEPD2_290_T94)> display(GxEPD2_290_T94(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, MAX_HEIGHT(GxEPD2_290_T94_V2)> display(GxEPD2_290_T94_V2(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, MAX_HEIGHT(GxEPD2_290_BS)> display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, MAX_HEIGHT(GxEPD2_290_M06)> display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, MAX_HEIGHT(GxEPD2_290_GDEY029T94)> display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, MAX_HEIGHT(GxEPD2_371)> display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, MAX_HEIGHT(GxEPD2_370_TC1)> display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, MAX_HEIGHT(GxEPD2_420)> display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, MAX_HEIGHT(GxEPD2_420_M01)> display(GxEPD2_420_M01(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, MAX_HEIGHT(GxEPD2_420_GDEY042T81)> display(GxEPD2_420_GDEY042T81(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, MAX_HEIGHT(GxEPD2_426_GDEQ0426T82)> display(GxEPD2_426_GDEQ0426T82(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, MAX_HEIGHT(GxEPD2_583)> display(GxEPD2_583(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, MAX_HEIGHT(GxEPD2_583_T8)> display(GxEPD2_583_T8(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, MAX_HEIGHT(GxEPD2_583_GDEQ0583T31)> display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, MAX_HEIGHT(GxEPD2_750)> display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, MAX_HEIGHT(GxEPD2_750_T7)> display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, MAX_HEIGHT(GxEPD2_750_YT7)> display(GxEPD2_750_YT7(/*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<GxEPD2_154c, MAX_HEIGHT_3C(GxEPD2_154c)> display(GxEPD2_154c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, MAX_HEIGHT_3C(GxEPD2_154_Z90c)> display(GxEPD2_154_Z90c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, MAX_HEIGHT_3C(GxEPD2_213c)> display(GxEPD2_213c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, MAX_HEIGHT_3C(GxEPD2_213_Z19c)> display(GxEPD2_213_Z19c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, MAX_HEIGHT_3C(GxEPD2_213_Z98c)> display(GxEPD2_213_Z98c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, MAX_HEIGHT_3C(GxEPD2_266c)> display(GxEPD2_266c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, MAX_HEIGHT_3C(GxEPD2_270c)> display(GxEPD2_270c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, MAX_HEIGHT_3C(GxEPD2_290c)> display(GxEPD2_290c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, MAX_HEIGHT_3C(GxEPD2_290_Z13c)> display(GxEPD2_290_Z13c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT_3C(GxEPD2_290_C90c)> display(GxEPD2_290_C90c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, MAX_HEIGHT_3C(GxEPD2_420c)> display(GxEPD2_420c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, MAX_HEIGHT_3C(GxEPD2_420c_Z21)> display(GxEPD2_420c_Z21(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, MAX_HEIGHT_3C(GxEPD2_583c)> display(GxEPD2_583c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, MAX_HEIGHT_3C(GxEPD2_583c_Z83)> display(GxEPD2_583c_Z83(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); //GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, MAX_HEIGHT_3C(GxEPD2_266c_GDEY0266F51H)> display(GxEPD2_266c_GDEY0266F51H(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, MAX_HEIGHT_3C(GxEPD2_290c_GDEY029F51H)> display(GxEPD2_290c_GDEY029F51H(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, MAX_HEIGHT_3C(GxEPD2_300c)> display(GxEPD2_300c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, MAX_HEIGHT_3C(GxEPD2_420c_GDEY0420F51)> display(GxEPD2_420c_GDEY0420F51(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C <GxEPD2_437c, MAX_HEIGHT_3C(GxEPD2_437c)> display(GxEPD2_437c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // Waveshare 4.37" 4-color
+// 7-color e-paper
+//GxEPD2_7C<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=10*/ SS, /*DC=*/ 9, /*RST=*/ 8, /*BUSY=*/ 7)); // Waveshare 5.65" 7-color
+
+// Waveshare 12.48 b/w SPI display board and frame or Good Display 12.48 b/w panel GDEW1248T3
+// general constructor for use with standard SPI pins, default SCK, MISO and MOSI, for UNO on UNO connectors
+//GxEPD2_BW < GxEPD2_1248, MAX_HEIGHT(GxEPD2_1248)>
+//display(GxEPD2_1248(/*cs_m1=*/ 2, /*cs_s1=*/ 3, /*cs_m2=*/ A4, /*cs_s2=*/ A0, /*dc1=*/ 6, /*dc2=*/ A3, /*rst1=*/ 5, /*rst2=*/ A2,
+//                               /*busy_m1=*/ 4, /*busy_s1=*/ 7, /*busy_m2=*/ A1, /*busy_s2=*/ A5));
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#undef MAX_HEIGHT_3C
+#undef MAX_HEIGHT_7C
+#endif

+ 540 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_display_selection_added.h

@@ -0,0 +1,540 @@
+// 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
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#ifndef _GxEPD2_boards_added_H_
+#define _GxEPD2_boards_added_H_
+
+// Arduino DUE
+
+// mapping suggestion for Arduino DUE, note: pin 77 is on board pin 10, SS is 10
+// BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 76, DIN -> 75
+// SPI pins are on 6 pin 2x3 SPI header, no SS on SPI header!
+
+#if defined(ARDUINO_ARCH_SAM)
+#define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k
+#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<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, MAX_HEIGHT(GxEPD2_150_BN)> display(GxEPD2_150_BN(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, MAX_HEIGHT(GxEPD2_154_M09)> display(GxEPD2_154_M09(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, MAX_HEIGHT(GxEPD2_154_M10)> display(GxEPD2_154_M10(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, MAX_HEIGHT(GxEPD2_154_GDEY0154D67)> display(GxEPD2_154_GDEY0154D67(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, MAX_HEIGHT(GxEPD2_213_B73)> display(GxEPD2_213_B73(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, MAX_HEIGHT(GxEPD2_213_B74)> display(GxEPD2_213_B74(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, MAX_HEIGHT(GxEPD2_213_M21)> display(GxEPD2_213_M21(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, MAX_HEIGHT(GxEPD2_213_T5D)> display(GxEPD2_213_T5D(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, MAX_HEIGHT(GxEPD2_213_BN)> display(GxEPD2_213_BN(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, MAX_HEIGHT(GxEPD2_213_GDEY0213B74)> display(GxEPD2_213_GDEY0213B74(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, MAX_HEIGHT(GxEPD2_260)> display(GxEPD2_260(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, MAX_HEIGHT(GxEPD2_260_M01)> display(GxEPD2_260_M01(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, MAX_HEIGHT(GxEPD2_266_BN)> display(GxEPD2_266_BN(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, MAX_HEIGHT(GxEPD2_270)> display(GxEPD2_270(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, MAX_HEIGHT(GxEPD2_270_GDEY027T91)> display(GxEPD2_270_GDEY027T91(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, MAX_HEIGHT(GxEPD2_290_T5D)> display(GxEPD2_290_T5D(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, MAX_HEIGHT(GxEPD2_290_I6FD)> display(GxEPD2_290_I6FD(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, MAX_HEIGHT(GxEPD2_290_T94)> display(GxEPD2_290_T94(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, MAX_HEIGHT(GxEPD2_290_T94_V2)> display(GxEPD2_290_T94_V2(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, MAX_HEIGHT(GxEPD2_290_BS)> display(GxEPD2_290_BS(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, MAX_HEIGHT(GxEPD2_290_M06)> display(GxEPD2_290_M06(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, MAX_HEIGHT(GxEPD2_290_GDEY029T94)> display(GxEPD2_290_GDEY029T94(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, MAX_HEIGHT(GxEPD2_371)> display(GxEPD2_371(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, MAX_HEIGHT(GxEPD2_370_TC1)> display(GxEPD2_370_TC1(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, MAX_HEIGHT(GxEPD2_420)> display(GxEPD2_420(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, MAX_HEIGHT(GxEPD2_420_M01)> display(GxEPD2_420_M01(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, MAX_HEIGHT(GxEPD2_420_GDEY042T81)> display(GxEPD2_420_GDEY042T81(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, MAX_HEIGHT(GxEPD2_426_GDEQ0426T82)> display(GxEPD2_426_GDEQ0426T82(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, MAX_HEIGHT(GxEPD2_583)> display(GxEPD2_583(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, MAX_HEIGHT(GxEPD2_583_T8)> display(GxEPD2_583_T8(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, MAX_HEIGHT(GxEPD2_583_GDEQ0583T31)> display(GxEPD2_583_GDEQ0583T31(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, MAX_HEIGHT(GxEPD2_750)> display(GxEPD2_750(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, MAX_HEIGHT(GxEPD2_750_T7)> display(GxEPD2_750_T7(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, MAX_HEIGHT(GxEPD2_750_YT7)> display(GxEPD2_750_YT7(/*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))
+//GxEPD2_3C<GxEPD2_154c, MAX_HEIGHT_3C(GxEPD2_154c)> display(GxEPD2_154c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, MAX_HEIGHT_3C(GxEPD2_154_Z90c)> display(GxEPD2_154_Z90c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, MAX_HEIGHT_3C(GxEPD2_213c)> display(GxEPD2_213c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, MAX_HEIGHT_3C(GxEPD2_213_Z19c)> display(GxEPD2_213_Z19c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, MAX_HEIGHT_3C(GxEPD2_213_Z98c)> display(GxEPD2_213_Z98c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, MAX_HEIGHT_3C(GxEPD2_266c)> display(GxEPD2_266c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, MAX_HEIGHT_3C(GxEPD2_270c)> display(GxEPD2_270c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, MAX_HEIGHT_3C(GxEPD2_290c)> display(GxEPD2_290c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, MAX_HEIGHT_3C(GxEPD2_290_Z13c)> display(GxEPD2_290_Z13c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT_3C(GxEPD2_290_C90c)> display(GxEPD2_290_C90c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, MAX_HEIGHT_3C(GxEPD2_420c)> display(GxEPD2_420c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, MAX_HEIGHT_3C(GxEPD2_420c_Z21)> display(GxEPD2_420c_Z21(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, MAX_HEIGHT_3C(GxEPD2_583c)> display(GxEPD2_583c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, MAX_HEIGHT_3C(GxEPD2_583c_Z83)> display(GxEPD2_583c_Z83(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, MAX_HEIGHT_3C(GxEPD2_266c_GDEY0266F51H)> display(GxEPD2_266c_GDEY0266F51H(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, MAX_HEIGHT_3C(GxEPD2_290c_GDEY029F51H)> display(GxEPD2_290c_GDEY029F51H(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, MAX_HEIGHT_3C(GxEPD2_300c)> display(GxEPD2_300c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, MAX_HEIGHT_3C(GxEPD2_420c_GDEY0420F51)> display(GxEPD2_420c_GDEY0420F51(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C <GxEPD2_437c, MAX_HEIGHT_3C(GxEPD2_437c)> display(GxEPD2_437c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // 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<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 5.65" 7-color
+//GxEPD2_7C<GxEPD2_730c_GDEY073D46, MAX_HEIGHT_7C(GxEPD2_730c_GDEY073D46)> display(GxEPD2_730c_GDEY073D46(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+// grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
+// HRDY -> 7, RST -> 9, CS -> SS(77), SCK -> SCK(76), MOSI -> MOSI(75), MISO -> MISO(74), GND -> GND, 5V -> 5V
+// note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
+//GxEPD2_BW<GxEPD2_it60, MAX_HEIGHT(GxEPD2_it60)> display(GxEPD2_it60(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+//GxEPD2_BW<GxEPD2_it60_1448x1072, MAX_HEIGHT(GxEPD2_it60_1448x1072)> display(GxEPD2_it60_1448x1072(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+//GxEPD2_BW<GxEPD2_it78_1872x1404, MAX_HEIGHT(GxEPD2_it78_1872x1404)> display(GxEPD2_it78_1872x1404(/*CS=10*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#undef MAX_HEIGHT_3C
+#undef MAX_HEIGHT_7C
+#endif
+
+// Arduino MKR1000 or MKRZERO
+
+// mapping suggestion for Arduino MKR1000 or MKRZERO
+// 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
+
+#if defined(ARDUINO_ARCH_SAMD)
+#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k 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<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, MAX_HEIGHT(GxEPD2_150_BN)> display(GxEPD2_150_BN(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, MAX_HEIGHT(GxEPD2_154_GDEY0154D67)> display(GxEPD2_154_GDEY0154D67(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, MAX_HEIGHT(GxEPD2_213_B73)> display(GxEPD2_213_B73(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, MAX_HEIGHT(GxEPD2_213_B74)> display(GxEPD2_213_B74(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, MAX_HEIGHT(GxEPD2_213_M21)> display(GxEPD2_213_M21(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, MAX_HEIGHT(GxEPD2_213_T5D)> display(GxEPD2_213_T5D(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, MAX_HEIGHT(GxEPD2_213_BN)> display(GxEPD2_213_BN(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, MAX_HEIGHT(GxEPD2_213_GDEY0213B74)> display(GxEPD2_213_GDEY0213B74(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, MAX_HEIGHT(GxEPD2_260)> display(GxEPD2_260(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, MAX_HEIGHT(GxEPD2_260_M01)> display(GxEPD2_260_M01(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, MAX_HEIGHT(GxEPD2_266_BN)> display(GxEPD2_266_BN(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, MAX_HEIGHT(GxEPD2_270)> display(GxEPD2_270(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, MAX_HEIGHT(GxEPD2_270_GDEY027T91)> display(GxEPD2_270_GDEY027T91(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, MAX_HEIGHT(GxEPD2_290_T5D)> display(GxEPD2_290_T5D(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, MAX_HEIGHT(GxEPD2_290_I6FD)> display(GxEPD2_290_I6FD(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, MAX_HEIGHT(GxEPD2_290_T94)> display(GxEPD2_290_T94(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, MAX_HEIGHT(GxEPD2_290_T94_V2)> display(GxEPD2_290_T94_V2(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, MAX_HEIGHT(GxEPD2_290_BS)> display(GxEPD2_290_BS(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, MAX_HEIGHT(GxEPD2_290_M06)> display(GxEPD2_290_M06(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, MAX_HEIGHT(GxEPD2_290_GDEY029T94)> display(GxEPD2_290_GDEY029T94(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, MAX_HEIGHT(GxEPD2_371)> display(GxEPD2_371(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, MAX_HEIGHT(GxEPD2_370_TC1)> display(GxEPD2_370_TC1(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, MAX_HEIGHT(GxEPD2_420)> display(GxEPD2_420(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, MAX_HEIGHT(GxEPD2_420_M01)> display(GxEPD2_420_M01(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, MAX_HEIGHT(GxEPD2_420_GDEY042T81)> display(GxEPD2_420_GDEY042T81(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, MAX_HEIGHT(GxEPD2_426_GDEQ0426T82)> display(GxEPD2_426_GDEQ0426T82(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, MAX_HEIGHT(GxEPD2_583)> display(GxEPD2_583(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, MAX_HEIGHT(GxEPD2_583_T8)> display(GxEPD2_583_T8(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, MAX_HEIGHT(GxEPD2_583_GDEQ0583T31)> display(GxEPD2_583_GDEQ0583T31(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, MAX_HEIGHT(GxEPD2_750)> display(GxEPD2_750(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, MAX_HEIGHT(GxEPD2_750_T7)> display(GxEPD2_750_T7(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, MAX_HEIGHT(GxEPD2_750_YT7)> display(GxEPD2_750_YT7(/*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))
+//GxEPD2_3C<GxEPD2_154c, MAX_HEIGHT_3C(GxEPD2_154c)> display(GxEPD2_154c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, MAX_HEIGHT_3C(GxEPD2_154_Z90c)> display(GxEPD2_154_Z90c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, MAX_HEIGHT_3C(GxEPD2_213c)> display(GxEPD2_213c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, MAX_HEIGHT_3C(GxEPD2_213_Z19c)> display(GxEPD2_213_Z19c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, MAX_HEIGHT_3C(GxEPD2_213_Z98c)> display(GxEPD2_213_Z98c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, MAX_HEIGHT_3C(GxEPD2_266c)> display(GxEPD2_266c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, MAX_HEIGHT_3C(GxEPD2_270c)> display(GxEPD2_270c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, MAX_HEIGHT_3C(GxEPD2_290c)> display(GxEPD2_290c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, MAX_HEIGHT_3C(GxEPD2_290_Z13c)> display(GxEPD2_290_Z13c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT_3C(GxEPD2_290_C90c)> display(GxEPD2_290_C90c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, MAX_HEIGHT_3C(GxEPD2_420c)> display(GxEPD2_420c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, MAX_HEIGHT_3C(GxEPD2_420c_Z21)> display(GxEPD2_420c_Z21(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, MAX_HEIGHT_3C(GxEPD2_583c)> display(GxEPD2_583c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, MAX_HEIGHT_3C(GxEPD2_583c_Z83)> display(GxEPD2_583c_Z83(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, MAX_HEIGHT_3C(GxEPD2_266c_GDEY0266F51H)> display(GxEPD2_266c_GDEY0266F51H(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, MAX_HEIGHT_3C(GxEPD2_290c_GDEY029F51H)> display(GxEPD2_290c_GDEY029F51H(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, MAX_HEIGHT_3C(GxEPD2_300c)> display(GxEPD2_300c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, MAX_HEIGHT_3C(GxEPD2_420c_GDEY0420F51)> display(GxEPD2_420c_GDEY0420F51(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C <GxEPD2_437c, MAX_HEIGHT_3C(GxEPD2_437c)> display(GxEPD2_437c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // 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<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // Waveshare 5.65" 7-color
+//GxEPD2_7C<GxEPD2_730c_GDEY073D46, MAX_HEIGHT_7C(GxEPD2_730c_GDEY073D46)> display(GxEPD2_730c_GDEY073D46(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+// grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
+// HRDY -> 5, RST -> 6, CS -> 4, SCK -> SCK(9), MOSI -> MOSI(8), MISO -> MISO(10), GND -> GND, 5V -> 5V
+// note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
+//GxEPD2_BW<GxEPD2_it60, MAX_HEIGHT(GxEPD2_it60)> display(GxEPD2_it60(/*CS=*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5));
+//GxEPD2_BW<GxEPD2_it60_1448x1072, MAX_HEIGHT(GxEPD2_it60_1448x1072)> display(GxEPD2_it60_1448x1072(/*CS=*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5));
+//GxEPD2_BW<GxEPD2_it78_1872x1404, MAX_HEIGHT(GxEPD2_it78_1872x1404)> display(GxEPD2_it78_1872x1404(/*CS=*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5));
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#undef MAX_HEIGHT_3C
+#undef MAX_HEIGHT_7C
+#endif
+
+// mapping suggestion for ESP32, e.g. LOLIN32 D32 PRO
+// BUSY -> 15, RST -> 2, DC -> 0, CS -> 5, CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V
+// note: use explicit value for CS, as SS is re-defined to TF_CS(4) in pins_arduino.h for Board: "LOLIN D32 PRO"
+
+#if defined(ESP32) && defined(ARDUINO_LOLIN_D32_PRO)
+// select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(GxEPD2_154_GDEY0154D67(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> display(GxEPD2_213_B74(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, GxEPD2_213_M21::HEIGHT> display(GxEPD2_213_M21(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, GxEPD2_213_T5D::HEIGHT> display(GxEPD2_213_T5D(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, GxEPD2_213_GDEY0213B74::HEIGHT> display(GxEPD2_213_GDEY0213B74(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, GxEPD2_260_M01::HEIGHT> display(GxEPD2_260_M01(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, GxEPD2_266_BN::HEIGHT> display(GxEPD2_266_BN(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT> display(GxEPD2_270_GDEY027T91(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, GxEPD2_290_I6FD::HEIGHT> display(GxEPD2_290_I6FD(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(GxEPD2_290_T94_V2(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, GxEPD2_370_TC1::HEIGHT> display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> display(GxEPD2_426_GDEQ0426T82(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, GxEPD2_583::HEIGHT> display(GxEPD2_583(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, GxEPD2_583_T8::HEIGHT> display(GxEPD2_583_T8(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT> display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT> display(GxEPD2_750_YT7(/*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<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, GxEPD2_266c::HEIGHT> display(GxEPD2_266c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, GxEPD2_420c_Z21::HEIGHT> display(GxEPD2_420c_Z21(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT> display(GxEPD2_583c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, GxEPD2_583c_Z83::HEIGHT> display(GxEPD2_583c_Z83(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT> display(GxEPD2_750c_Z90(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, GxEPD2_266c_GDEY0266F51H::HEIGHT> display(GxEPD2_266c_GDEY0266F51H(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, GxEPD2_290c_GDEY029F51H::HEIGHT> display(GxEPD2_290c_GDEY029F51H(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, GxEPD2_300c::HEIGHT> display(GxEPD2_300c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, GxEPD2_420c_GDEY0420F51::HEIGHT> display(GxEPD2_420c_GDEY0420F51(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // Waveshare 4.37" 4-color
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // Waveshare 5.65" 7-color
+//GxEPD2_7C < GxEPD2_730c_GDEY073D46, GxEPD2_730c_GDEY073D46::HEIGHT / 4 > display(GxEPD2_730c_GDEY073D46(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+// grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
+// HRDY -> 4, RST -> 16, CS -> 5, SCK -> SCK(18), MOSI -> MOSI(23), MISO -> MISO(19), GND -> GND, 5V -> 5V
+// note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT> display(GxEPD2_it60(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW < GxEPD2_it60_1448x1072, GxEPD2_it60_1448x1072::HEIGHT / 4 > display(GxEPD2_it60_1448x1072(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+//GxEPD2_BW < GxEPD2_it78_1872x1404, GxEPD2_it78_1872x1404::HEIGHT / 8 > display(GxEPD2_it78_1872x1404(/*CS=5*/ 5, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 15));
+#endif
+
+// mapping suggestion for ESP32, e.g. TTGO T8 ESP32-WROVER
+// 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":
+
+#if defined(ESP32) && defined(ARDUINO_ESP32_DEV)
+// select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_102, GxEPD2_102::HEIGHT> display(GxEPD2_102(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(GxEPD2_154_GDEY0154D67(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> display(GxEPD2_213_B74(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, GxEPD2_213_M21::HEIGHT> display(GxEPD2_213_M21(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, GxEPD2_213_T5D::HEIGHT> display(GxEPD2_213_T5D(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, GxEPD2_213_GDEY0213B74::HEIGHT> display(GxEPD2_213_GDEY0213B74(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, GxEPD2_260_M01::HEIGHT> display(GxEPD2_260_M01(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, GxEPD2_266_BN::HEIGHT> display(GxEPD2_266_BN(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT> display(GxEPD2_270_GDEY027T91(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, GxEPD2_290_I6FD::HEIGHT> display(GxEPD2_290_I6FD(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(GxEPD2_290_T94_V2(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> display(GxEPD2_290_GDEY029T94(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, GxEPD2_370_TC1::HEIGHT> display(GxEPD2_370_TC1(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> display(GxEPD2_426_GDEQ0426T82(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, GxEPD2_583::HEIGHT> display(GxEPD2_583(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, GxEPD2_583_T8::HEIGHT> display(GxEPD2_583_T8(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, GxEPD2_583_GDEQ0583T31::HEIGHT> display(GxEPD2_583_GDEQ0583T31(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> display(GxEPD2_750_T7(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075T7 800x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT> display(GxEPD2_750_YT7(/*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<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, GxEPD2_266c::HEIGHT> display(GxEPD2_266c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, GxEPD2_420c_Z21::HEIGHT> display(GxEPD2_420c_Z21(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT> display(GxEPD2_583c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, GxEPD2_583c_Z83::HEIGHT> display(GxEPD2_583c_Z83(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT> display(GxEPD2_750c_Z90(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, GxEPD2_266c_GDEY0266F51H::HEIGHT> display(GxEPD2_266c_GDEY0266F51H(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, GxEPD2_290c_GDEY029F51H::HEIGHT> display(GxEPD2_290c_GDEY029F51H(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, GxEPD2_300c::HEIGHT> display(GxEPD2_300c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, GxEPD2_420c_GDEY0420F51::HEIGHT> display(GxEPD2_420c_GDEY0420F51(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // Waveshare 4.37" 4-color
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 2 > display(GxEPD2_565c(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // Waveshare 5.65" 7-color
+//GxEPD2_7C < GxEPD2_730c_GDEY073D46, GxEPD2_730c_GDEY073D46::HEIGHT / 4 > display(GxEPD2_730c_GDEY073D46(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+// 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
+// note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT> display(GxEPD2_it60(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it60_1448x1072, GxEPD2_it60_1448x1072::HEIGHT / 4 > display(GxEPD2_it60_1448x1072(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+//GxEPD2_BW < GxEPD2_it78_1872x1404, GxEPD2_it78_1872x1404::HEIGHT / 8 > display(GxEPD2_it78_1872x1404(/*CS=5*/ 5, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4));
+#endif
+
+// mapping of Waveshare e-Paper ESP8266 Driver Board, old version
+// BUSY -> GPIO16, RST -> GPIO5, 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
+
+#if defined (ESP8266)
+// select one , can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_150_BN, GxEPD2_150_BN::HEIGHT> display(GxEPD2_150_BN(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, GxEPD2_154_GDEY0154D67::HEIGHT> display(GxEPD2_154_GDEY0154D67(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, GxEPD2_213_B74::HEIGHT> display(GxEPD2_213_B74(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, GxEPD2_213_M21::HEIGHT> display(GxEPD2_213_M21(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, GxEPD2_213_T5D::HEIGHT> display(GxEPD2_213_T5D(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, GxEPD2_213_BN::HEIGHT> display(GxEPD2_213_BN(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, GxEPD2_213_GDEY0213B74::HEIGHT> display(GxEPD2_213_GDEY0213B74(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, GxEPD2_260_M01::HEIGHT> display(GxEPD2_260_M01(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, GxEPD2_266_BN::HEIGHT> display(GxEPD2_266_BN(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // DEPG0266BN 152x296, SSD1680, TTGO T5 V2.66 / T92_V1.0
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, GxEPD2_270_GDEY027T91::HEIGHT> display(GxEPD2_270_GDEY027T91(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY027T91 176x264, SSD1680
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, GxEPD2_290_I6FD::HEIGHT> display(GxEPD2_290_I6FD(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(GxEPD2_290_T94_V2(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> display(GxEPD2_290_BS(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, GxEPD2_290_M06::HEIGHT> display(GxEPD2_290_M06(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, GxEPD2_290_GDEY029T94::HEIGHT> 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<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, GxEPD2_370_TC1::HEIGHT> display(GxEPD2_370_TC1(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, GxEPD2_426_GDEQ0426T82::HEIGHT> display(GxEPD2_426_GDEQ0426T82(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // 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=5*/ 5, /*BUSY=16*/ 16)); GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW < GxEPD2_583_T8, GxEPD2_583_T8::HEIGHT / 2 > display(GxEPD2_583_T8(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//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_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<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, GxEPD2_213_Z98c::HEIGHT> display(GxEPD2_213_Z98c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, GxEPD2_266c::HEIGHT> display(GxEPD2_266c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> display(GxEPD2_290_C90c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEM029C90 128x296, SSD1680
+// can use only half buffer size
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT / 2> display(GxEPD2_420c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, GxEPD2_420c_Z21::HEIGHT / 2> display(GxEPD2_420c_Z21(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEQ042Z21 400x300, UC8276
+// can use only quarter buffer size
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT / 4> display(GxEPD2_583c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, GxEPD2_583c_Z83::HEIGHT / 4> display(GxEPD2_583c_Z83(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4> display(GxEPD2_750c_Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4> display(GxEPD2_750c_Z90(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, GxEPD2_266c_GDEY0266F51H::HEIGHT> display(GxEPD2_266c_GDEY0266F51H(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, GxEPD2_290c_GDEY029F51H::HEIGHT> display(GxEPD2_290c_GDEY029F51H(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, GxEPD2_300c::HEIGHT> display(GxEPD2_300c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, GxEPD2_420c_GDEY0420F51::HEIGHT> display(GxEPD2_420c_GDEY0420F51(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C < GxEPD2_437c, GxEPD2_437c::HEIGHT / 4 > display(GxEPD2_437c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // Waveshare 4.37" 4-color
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // Waveshare 5.65" 7-color
+//GxEPD2_7C < GxEPD2_730c_GDEY073D46, GxEPD2_730c_GDEY073D46::HEIGHT / 6 > display(GxEPD2_730c_GDEY073D46(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=5*/ 5, /*BUSY=16*/ 16)); // GDEY073D46 800x480 7-color, (N-FPC-001 2021.11.26)
+#endif
+
+#if defined(ARDUINO_ARCH_RP2040)
+#define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram
+#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<GxEPD2_102, MAX_HEIGHT(GxEPD2_102)> display(GxEPD2_102(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0102T4 80x128, UC8175
+//GxEPD2_BW<GxEPD2_150_BN, MAX_HEIGHT(GxEPD2_150_BN)> display(GxEPD2_150_BN(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0150BN 200x200, SSD1681, TTGO T5 V2.4.1
+//GxEPD2_BW<GxEPD2_154, MAX_HEIGHT(GxEPD2_154)> display(GxEPD2_154(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEP015OC1 200x200, IL3829, no longer available
+//GxEPD2_BW<GxEPD2_154_D67, MAX_HEIGHT(GxEPD2_154_D67)> display(GxEPD2_154_D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154D67 200x200, SSD1681
+//GxEPD2_BW<GxEPD2_154_T8, MAX_HEIGHT(GxEPD2_154_T8)> display(GxEPD2_154_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154T8  152x152, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_154_M09, MAX_HEIGHT(GxEPD2_154_M09)> display(GxEPD2_154_M09(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154M09 200x200, JD79653A
+//GxEPD2_BW<GxEPD2_154_M10, MAX_HEIGHT(GxEPD2_154_M10)> display(GxEPD2_154_M10(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154M10 152x152, UC8151D
+//GxEPD2_BW<GxEPD2_154_GDEY0154D67, MAX_HEIGHT(GxEPD2_154_GDEY0154D67)> display(GxEPD2_154_GDEY0154D67(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//GxEPD2_BW<GxEPD2_213, MAX_HEIGHT(GxEPD2_213)> display(GxEPD2_213(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDE0213B1 122x250, IL3895, phased out
+//GxEPD2_BW<GxEPD2_213_B72, MAX_HEIGHT(GxEPD2_213_B72)> display(GxEPD2_213_B72(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213B72 122x250, SSD1675A (IL3897)
+//GxEPD2_BW<GxEPD2_213_B73, MAX_HEIGHT(GxEPD2_213_B73)> display(GxEPD2_213_B73(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213B73 122x250, SSD1675B
+//GxEPD2_BW<GxEPD2_213_B74, MAX_HEIGHT(GxEPD2_213_B74)> display(GxEPD2_213_B74(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM0213B74 122x250, SSD1680
+//GxEPD2_BW<GxEPD2_213_flex, MAX_HEIGHT(GxEPD2_213_flex)> display(GxEPD2_213_flex(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213I5F 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_M21, MAX_HEIGHT(GxEPD2_213_M21)> display(GxEPD2_213_M21(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213M21 104x212, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_213_T5D, MAX_HEIGHT(GxEPD2_213_T5D)> display(GxEPD2_213_T5D(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213T5D 104x212, UC8151D
+//GxEPD2_BW<GxEPD2_213_BN, MAX_HEIGHT(GxEPD2_213_BN)> display(GxEPD2_213_BN(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0213BN 122x250, SSD1680, TTGO T5 V2.4.1, V2.3.1
+//GxEPD2_BW<GxEPD2_213_GDEY0213B74, MAX_HEIGHT(GxEPD2_213_GDEY0213B74)> display(GxEPD2_213_GDEY0213B74(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213B74 122x250, SSD1680, (FPC-A002 20.04.08)
+//GxEPD2_BW<GxEPD2_260, MAX_HEIGHT(GxEPD2_260)> display(GxEPD2_260(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW026T0 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_260_M01, MAX_HEIGHT(GxEPD2_260_M01)> display(GxEPD2_260_M01(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW026M01 152x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_266_BN, MAX_HEIGHT(GxEPD2_266_BN)> 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<GxEPD2_270, MAX_HEIGHT(GxEPD2_270)> display(GxEPD2_270(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_270_GDEY027T91, MAX_HEIGHT(GxEPD2_270_GDEY027T91)> display(GxEPD2_270_GDEY027T91(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027W3 176x264, EK79652 (IL91874)
+//GxEPD2_BW<GxEPD2_290, MAX_HEIGHT(GxEPD2_290)> display(GxEPD2_290(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH029A1 128x296, SSD1608 (IL3820)
+//GxEPD2_BW<GxEPD2_290_T5, MAX_HEIGHT(GxEPD2_290_T5)> display(GxEPD2_290_T5(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5 128x296, UC8151 (IL0373)
+//GxEPD2_BW<GxEPD2_290_T5D, MAX_HEIGHT(GxEPD2_290_T5D)> display(GxEPD2_290_T5D(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029T5D 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_I6FD, MAX_HEIGHT(GxEPD2_290_I6FD)> display(GxEPD2_290_I6FD(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029I6FD 128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_T94, MAX_HEIGHT(GxEPD2_290_T94)> display(GxEPD2_290_T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_T94_V2, MAX_HEIGHT(GxEPD2_290_T94_V2)> display(GxEPD2_290_T94_V2(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029T94 128x296, SSD1680, Waveshare 2.9" V2 variant
+//GxEPD2_BW<GxEPD2_290_BS, MAX_HEIGHT(GxEPD2_290_BS)> display(GxEPD2_290_BS(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // DEPG0290BS 128x296, SSD1680
+//GxEPD2_BW<GxEPD2_290_M06, MAX_HEIGHT(GxEPD2_290_M06)> display(GxEPD2_290_M06(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029M06  128x296, UC8151D
+//GxEPD2_BW<GxEPD2_290_GDEY029T94, MAX_HEIGHT(GxEPD2_290_GDEY029T94)> display(GxEPD2_290_GDEY029T94(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029T94  128x296, SSD1680, (FPC-A005 20.06.15)
+//GxEPD2_BW<GxEPD2_371, MAX_HEIGHT(GxEPD2_371)> display(GxEPD2_371(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0371W7 240x416, UC8171 (IL0324)
+//GxEPD2_BW<GxEPD2_370_TC1, MAX_HEIGHT(GxEPD2_370_TC1)> display(GxEPD2_370_TC1(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // ED037TC1 280x480, SSD1677, Waveshare 3.7"
+//GxEPD2_BW<GxEPD2_420, MAX_HEIGHT(GxEPD2_420)> display(GxEPD2_420(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042T2 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_M01, MAX_HEIGHT(GxEPD2_420_M01)> display(GxEPD2_420_M01(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042M01 400x300, UC8176 (IL0398)
+//GxEPD2_BW<GxEPD2_420_GDEY042T81, MAX_HEIGHT(GxEPD2_420_GDEY042T81)> display(GxEPD2_420_GDEY042T81(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); GDEY042T81, 400x300, SSD1683 (no inking)
+//GxEPD2_BW<GxEPD2_426_GDEQ0426T82, MAX_HEIGHT(GxEPD2_426_GDEQ0426T82)> display(GxEPD2_426_GDEQ0426T82(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0426T82 480x800, SSD1677 (P426010-MF1-A)
+//GxEPD2_BW<GxEPD2_583, MAX_HEIGHT(GxEPD2_583)> display(GxEPD2_583(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583T7 600x448, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_583_T8, MAX_HEIGHT(GxEPD2_583_T8)> display(GxEPD2_583_T8(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583T8 648x480, EK79655 (GD7965)
+//GxEPD2_BW<GxEPD2_583_GDEQ0583T31, MAX_HEIGHT(GxEPD2_583_GDEQ0583T31)> display(GxEPD2_583_GDEQ0583T31(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ0583T31 648x480, UC8179, (P583010-MF1-B)
+//GxEPD2_BW<GxEPD2_750, MAX_HEIGHT(GxEPD2_750)> display(GxEPD2_750(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075T8 640x384, UC8159c (IL0371)
+//GxEPD2_BW<GxEPD2_750_T7, MAX_HEIGHT(GxEPD2_750_T7)> display(GxEPD2_750_T7(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY075T7 800x480, UC8179 (GD7965)
+//GxEPD2_BW<GxEPD2_750_YT7, MAX_HEIGHT(GxEPD2_750_YT7)> display(GxEPD2_750_YT7(/*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))
+//GxEPD2_3C<GxEPD2_154c, MAX_HEIGHT_3C(GxEPD2_154c)> display(GxEPD2_154c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0154Z04 200x200, IL0376F, no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, MAX_HEIGHT_3C(GxEPD2_154_Z90c)> display(GxEPD2_154_Z90c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0154Z90 200x200, SSD1681
+//GxEPD2_3C<GxEPD2_213c, MAX_HEIGHT_3C(GxEPD2_213c)> display(GxEPD2_213c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0213Z16 104x212, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_213_Z19c, MAX_HEIGHT_3C(GxEPD2_213_Z19c)> display(GxEPD2_213_Z19c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH0213Z19 104x212, UC8151D
+//GxEPD2_3C<GxEPD2_213_Z98c, MAX_HEIGHT_3C(GxEPD2_213_Z98c)> display(GxEPD2_213_Z98c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0213Z98 122x250, SSD1680
+//GxEPD2_3C<GxEPD2_266c, MAX_HEIGHT_3C(GxEPD2_266c)> display(GxEPD2_266c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0266Z90 152x296, SSD1680
+//GxEPD2_3C<GxEPD2_270c, MAX_HEIGHT_3C(GxEPD2_270c)> display(GxEPD2_270c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW027C44 176x264, IL91874
+//GxEPD2_3C<GxEPD2_290c, MAX_HEIGHT_3C(GxEPD2_290c)> display(GxEPD2_290c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW029Z10 128x296, UC8151 (IL0373)
+//GxEPD2_3C<GxEPD2_290_Z13c, MAX_HEIGHT_3C(GxEPD2_290_Z13c)> display(GxEPD2_290_Z13c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH029Z13 128x296, UC8151D
+//GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT_3C(GxEPD2_290_C90c)> display(GxEPD2_290_C90c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEM029C90 128x296, SSD1680
+//GxEPD2_3C<GxEPD2_420c, MAX_HEIGHT_3C(GxEPD2_420c)> display(GxEPD2_420c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW042Z15 400x300, UC8176 (IL0398)
+//GxEPD2_3C<GxEPD2_420c_Z21, MAX_HEIGHT_3C(GxEPD2_420c_Z21)> display(GxEPD2_420c_Z21(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEQ042Z21 400x300, UC8276
+//GxEPD2_3C<GxEPD2_583c, MAX_HEIGHT_3C(GxEPD2_583c)> display(GxEPD2_583c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583Z21 600x448, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_583c_Z83, MAX_HEIGHT_3C(GxEPD2_583c_Z83)> display(GxEPD2_583c_Z83(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW0583Z83 648x480, GD7965
+//GxEPD2_3C<GxEPD2_750c, MAX_HEIGHT_3C(GxEPD2_750c)> display(GxEPD2_750c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z09 640x384, UC8179 (IL0371)
+//GxEPD2_3C<GxEPD2_750c_Z08, MAX_HEIGHT_3C(GxEPD2_750c_Z08)> display(GxEPD2_750c_Z08(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEW075Z08 800x480, GD7965
+//GxEPD2_3C<GxEPD2_750c_Z90, MAX_HEIGHT_3C(GxEPD2_750c_Z90)> display(GxEPD2_750c_Z90(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEH075Z90 880x528, SSD1677
+// 4-color e-paper
+//GxEPD2_4C<GxEPD2_266c_GDEY0266F51H, MAX_HEIGHT_3C(GxEPD2_266c_GDEY0266F51H)> display(GxEPD2_266c_GDEY0266F51H(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0266F51H 184x360, JD79667 (FPC-H006 22.04.02)
+//GxEPD2_4C<GxEPD2_290c_GDEY029F51H, MAX_HEIGHT_3C(GxEPD2_290c_GDEY029F51H)> display(GxEPD2_290c_GDEY029F51H(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY029F51H 168x384, JD79667 (FPC-H004 22.03.24)
+//GxEPD2_4C<GxEPD2_300c, MAX_HEIGHT_3C(GxEPD2_300c)> display(GxEPD2_300c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 3.00" 4-color
+//GxEPD2_4C<GxEPD2_420c_GDEY0420F51, MAX_HEIGHT_3C(GxEPD2_420c_GDEY0420F51)> display(GxEPD2_420c_GDEY0420F51(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // GDEY0420F51 400x300, HX8717 (no inking)
+//GxEPD2_4C <GxEPD2_437c, MAX_HEIGHT_3C(GxEPD2_437c)> display(GxEPD2_437c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // 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<GxEPD2_565c, MAX_HEIGHT_7C(GxEPD2_565c)> display(GxEPD2_565c(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // Waveshare 5.65" 7-color
+//GxEPD2_7C<GxEPD2_730c_GDEY073D46, MAX_HEIGHT_7C(GxEPD2_730c_GDEY073D46)> display(GxEPD2_730c_GDEY073D46(/*CS=*/ SS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // 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
+
+#endif

+ 288 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_display_selection_new_style.h

@@ -0,0 +1,288 @@
+// 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
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// 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
+
+// NOTE: you may need to adapt or select for your wiring in the processor specific conditional compile sections below
+
+// select the display class (only one), matching the kind of display panel
+#define GxEPD2_DISPLAY_CLASS GxEPD2_BW
+//#define GxEPD2_DISPLAY_CLASS GxEPD2_3C
+//#define GxEPD2_DISPLAY_CLASS GxEPD2_4C
+//#define GxEPD2_DISPLAY_CLASS GxEPD2_7C
+
+// select the display driver class (only one) for your  panel
+//#define GxEPD2_DRIVER_CLASS GxEPD2_102     // GDEW0102T4   80x128, UC8175, (WFT0102CZA2)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_150_BN  // DEPG0150BN 200x200, SSD1681, (FPC8101), TTGO T5 V2.4.1
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154     // GDEP015OC1  200x200, IL3829, (WFC0000CZ07), no longer available
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154_D67 // GDEH0154D67 200x200, SSD1681, (HINK-E154A07-A1)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154_T8  // GDEW0154T8  152x152, UC8151 (IL0373), (WFT0154CZ17)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154_M09 // GDEW0154M09 200x200, JD79653A, (WFT0154CZB3)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154_M10 // GDEW0154M10 152x152, UC8151D, (WFT0154CZ17)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154_GDEY0154D67 // GDEY0154D67 200x200, SSD1681, (FPC-B001 20.05.21)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_213     // GDE0213B1   122x250, IL3895, (HINK-E0213-G01), phased out
+//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B72 // GDEH0213B72 122x250, SSD1675A (IL3897), (HINK-E0213A22-A0 SLH1852)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B73 // GDEH0213B73 122x250, SSD1675B, (HINK-E0213A22-A0 SLH1914)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_213_B74 // GDEM0213B74 122x250, SSD1680, FPC-7528B)
+//#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_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_YT7  // GDEY075T7  800x480, UC8179 (GD7965), (FPC-C001 20.8.20)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_1160_T91 // GDEH116T91 960x640, SSD1677, (none or hidden)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_1248     // GDEW1248T3 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
+// 3-color e-papers
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154c     // GDEW0154Z04 200x200, IL0376F, (WFT0000CZ04), no longer available
+//#define GxEPD2_DRIVER_CLASS GxEPD2_154_Z90c // GDEH0154Z90 200x200, SSD1681, (HINK-E154A07-A1)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_213c     // GDEW0213Z16 104x212, UC8151 (IL0373), (WFT0213CZ16)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_213_Z19c // GDEH0213Z19 104x212, UC8151D, (HINK-E0213A20-A2 2020-11-19)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_213_Z98c // GDEY0213Z98 122x250, SSD1680, (FPC-A002 20.04.08)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_266c     // GDEY0266Z90 152x296, SSD1680, (FPC-7510)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_270c     // GDEW027C44  176x264, IL91874, (WFI0190CZ22)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_290c     // GDEW029Z10  128x296, UC8151 (IL0373), (WFT0290CZ10)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_290_Z13c // GDEH029Z13  128x296, UC8151D, (HINK-E029A10-A3 20160809)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_290_C90c // GDEM029C90  128x296, SSD1680, (FPC-7519 rev.b)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_420c     // GDEW042Z15  400x300, UC8176 (IL0398), (WFT0420CZ15)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_420c_Z21 // GDEQ042Z21  400x300, UC8276, (hidden)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_583c     // GDEW0583Z21 600x448, UC8159c (IL0371), (missing)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_583c_Z83 // GDEW0583Z83 648x480, EK79655 (GD7965), (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c     // GDEW075Z09  640x384, UC8159c (IL0371), (WF0583CZ09)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z08 // GDEW075Z08  800x480, EK79655 (GD7965), (WFT0583CZ61)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_750c_Z90 // GDEH075Z90  880x528, SSD1677, (HINK-E075A07-A0)
+//#define GxEPD2_DRIVER_CLASS GxEPD2_1248c    // GDEY1248Z51 1304x984, UC8179, (WFT1248BZ23,WFT1248BZ24)
+// 4-color e-paper
+//#define GxEPD2_DRIVER_CLASS GxEPD2_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)
+// grey levels parallel IF e-papers on Waveshare e-Paper IT8951 Driver HAT
+//#define GxEPD2_DRIVER_CLASS GxEPD2_it60           // ED060SCT 800x600
+//#define GxEPD2_DRIVER_CLASS GxEPD2_it60_1448x1072 // ED060KC1 1448x1072
+//#define GxEPD2_DRIVER_CLASS GxEPD2_it78_1872x1404 // ED078KC2 1872x1404
+//#define GxEPD2_DRIVER_CLASS GxEPD2_it103_1872x1404 // ES103TC1 1872x1404
+
+// SS is usually used for CS. define here for easy change
+#ifndef EPD_CS
+#define EPD_CS SS
+#endif
+
+#if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS)
+
+// somehow there should be an easier way to do this
+#define GxEPD2_BW_IS_GxEPD2_BW true
+#define GxEPD2_3C_IS_GxEPD2_3C true
+#define GxEPD2_4C_IS_GxEPD2_4C true
+#define GxEPD2_7C_IS_GxEPD2_7C true
+#define GxEPD2_1248_IS_GxEPD2_1248 true
+#define GxEPD2_1248c_IS_GxEPD2_1248c true
+#define IS_GxEPD(c, x) (c##x)
+#define IS_GxEPD2_BW(x) IS_GxEPD(GxEPD2_BW_IS_, x)
+#define IS_GxEPD2_3C(x) IS_GxEPD(GxEPD2_3C_IS_, x)
+#define IS_GxEPD2_4C(x) IS_GxEPD(GxEPD2_4C_IS_, x)
+#define IS_GxEPD2_7C(x) IS_GxEPD(GxEPD2_7C_IS_, x)
+#define IS_GxEPD2_1248(x) IS_GxEPD(GxEPD2_1248_IS_, x)
+#define IS_GxEPD2_1248c(x) IS_GxEPD(GxEPD2_1248c_IS_, x)
+
+#include "GxEPD2_selection_check.h"
+
+#if defined (ESP8266)
+#define MAX_DISPLAY_BUFFER_SIZE (81920ul-34000ul-5000ul) // ~34000 base use, change 5000 to your application use
+#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
+#endif
+// adapt the constructor parameters to your wiring
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=D8*/ EPD_CS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+// mapping of Waveshare e-Paper ESP8266 Driver Board, new version
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_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) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
+#endif
+// adapt the constructor parameters to your wiring
+#if !IS_GxEPD2_1248(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_1248c(GxEPD2_DRIVER_CLASS)
+#if defined(ARDUINO_LOLIN_D32_PRO)
+GxEPD2_DISPLAY_CLASS<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
+#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
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 19, /*RST=*/ 4, /*BUSY=*/ 34)); // LILYGO® TTGO T5 2.66
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=5*/ EPD_CS, /*DC=*/ 2, /*RST=*/ 0, /*BUSY=*/ 4)); // e.g. TTGO T8 ESP32-WROVER
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); // Waveshare ESP32 Driver Board
+#endif
+#else // GxEPD2_1248 or GxEPD2_1248c
+// Waveshare 12.48 b/w or b/w/r SPI display board and frame or Good Display 12.48 b/w panel GDEW1248T3 or b/w/r panel GDEY1248Z51
+// general constructor for use with all parameters, e.g. for Waveshare ESP32 driver board mounted on connection board
+GxEPD2_DISPLAY_CLASS < GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS) > display(GxEPD2_DRIVER_CLASS(/*sck=*/ 13, /*miso=*/ 12, /*mosi=*/ 14,
+    /*cs_m1=*/ 23, /*cs_s1=*/ 22, /*cs_m2=*/ 16, /*cs_s2=*/ 19,
+    /*dc1=*/ 25, /*dc2=*/ 17, /*rst1=*/ 33, /*rst2=*/ 5,
+    /*busy_m1=*/ 32, /*busy_s1=*/ 26, /*busy_m2=*/ 18, /*busy_s2=*/ 4));
+#endif
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#endif
+
+// can't use package "STMF1 Boards (STM32Duino.com)" (Roger Clark) anymore with Adafruit_GFX, use "STM32 Boards (selected from submenu)" (STMicroelectronics)
+#if defined(ARDUINO_ARCH_STM32)
+#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
+#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
+#endif
+// adapt the constructor parameters to your wiring
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=PA4*/ EPD_CS, /*DC=*/ PA3, /*RST=*/ PA2, /*BUSY=*/ PA1));
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#endif
+
+#if defined(__AVR)
+#if defined (ARDUINO_AVR_MEGA2560) // Note: SS is on 53 on MEGA
+#define MAX_DISPLAY_BUFFER_SIZE 5000 // e.g. full height for 200x200
+#else // Note: SS is on 10 on UNO, NANO
+#define MAX_DISPLAY_BUFFER_SIZE 800 // 
+#endif
+#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
+#endif
+// adapt the constructor parameters to your wiring
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+// for Arduino Micro or Arduino Leonardo with CS on 10 on my proto boards (SS would be 17) uncomment instead:
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 10, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+#endif
+
+#if defined(ARDUINO_UNOR4_MINIMA) || 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<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+#endif
+
+#if defined(ARDUINO_ARCH_SAM)
+#define MAX_DISPLAY_BUFFER_SIZE 32768ul // e.g., up to 96k
+#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
+#endif
+// adapt the constructor parameters to your wiring
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=10*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#endif
+
+#if defined(ARDUINO_ARCH_SAMD)
+#define MAX_DISPLAY_BUFFER_SIZE 15000ul // ~15k is a good compromise
+#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
+#endif
+// adapt the constructor parameters to your wiring
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/ 7, /*RST=*/ 6, /*BUSY=*/ 5));
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 4, /*DC=*/ 3, /*RST=*/ 2, /*BUSY=*/ 1)); // my Seed XIOA0
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=4*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // my other Seed XIOA0
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#endif
+
+#if defined(ARDUINO_ARCH_RP2040)
+#define MAX_DISPLAY_BUFFER_SIZE 131072ul // e.g. half of available ram
+#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) || IS_GxEPD2_4C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE / 2) / (EPD::WIDTH / 8))
+#elif IS_GxEPD2_7C(GxEPD2_DISPLAY_CLASS)
+#define MAX_HEIGHT(EPD) (EPD::HEIGHT <= (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2) ? EPD::HEIGHT : (MAX_DISPLAY_BUFFER_SIZE) / (EPD::WIDTH / 2))
+#endif
+#if defined(ARDUINO_NANO_RP2040_CONNECT)
+// adapt the constructor parameters to your wiring
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7));
+#endif
+#if defined(ARDUINO_RASPBERRY_PI_PICO)
+// adapt the constructor parameters to your wiring
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ EPD_CS, /*DC=*/ 8, /*RST=*/ 9, /*BUSY=*/ 7)); // my proto board
+// mapping of GoodDisplay DESPI-PICO. NOTE: uses alternate HW SPI pins!
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 1, /*BUSY=*/ 0)); // DESPI-PICO
+//GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ 3, /*DC=*/ 2, /*RST=*/ 11, /*BUSY=*/ 10)); // DESPI-PICO modified
+#endif
+#if defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_THINKINK)
+// Adafruit Feather RP2040 ThinkInk used with package https://github.com/earlephilhower/arduino-pico
+GxEPD2_DISPLAY_CLASS<GxEPD2_DRIVER_CLASS, MAX_HEIGHT(GxEPD2_DRIVER_CLASS)> display(GxEPD2_DRIVER_CLASS(/*CS=*/ PIN_EPD_CS, /*DC=*/ PIN_EPD_DC, /*RST=*/ PIN_EPD_RESET, /*BUSY=*/ PIN_EPD_BUSY));
+#endif
+#undef MAX_DISPLAY_BUFFER_SIZE
+#undef MAX_HEIGHT
+#endif
+
+#endif

+ 111 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_selection_check.h

@@ -0,0 +1,111 @@
+// 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
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// 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
+
+#define GxEPD2_102_IS_BW true
+#define GxEPD2_150_BN_IS_BW true
+#define GxEPD2_154_IS_BW true
+#define GxEPD2_154_D67_IS_BW true
+#define GxEPD2_154_T8_IS_BW true
+#define GxEPD2_154_M09_IS_BW true
+#define GxEPD2_154_M10_IS_BW true
+#define GxEPD2_154_GDEY0154D67_IS_BW true
+#define GxEPD2_213_IS_BW true
+#define GxEPD2_213_B72_IS_BW true
+#define GxEPD2_213_B73_IS_BW true
+#define GxEPD2_213_B74_IS_BW true
+#define GxEPD2_213_flex_IS_BW true
+#define GxEPD2_213_M21_IS_BW true
+#define GxEPD2_213_T5D_IS_BW true
+#define GxEPD2_213_BN_IS_BW true
+#define GxEPD2_213_GDEY0213B74_IS_BW true
+#define GxEPD2_260_IS_BW true
+#define GxEPD2_260_M01_IS_BW true
+#define GxEPD2_266_BN_IS_BW true
+#define GxEPD2_266_GDEY0266T90_IS_BW true
+#define GxEPD2_270_IS_BW true
+#define GxEPD2_270_GDEY027T91_IS_BW true
+#define GxEPD2_290_IS_BW true
+#define GxEPD2_290_T5_IS_BW true
+#define GxEPD2_290_T5D_IS_BW true
+#define GxEPD2_290_I6FD_IS_BW true
+#define GxEPD2_290_T94_IS_BW true
+#define GxEPD2_290_T94_V2_IS_BW true
+#define GxEPD2_290_BS_IS_BW true
+#define GxEPD2_290_M06_IS_BW true
+#define GxEPD2_290_GDEY029T94_IS_BW true
+#define GxEPD2_371_IS_BW true
+#define GxEPD2_370_TC1_IS_BW true
+#define GxEPD2_420_IS_BW true
+#define GxEPD2_420_M01_IS_BW true
+#define GxEPD2_420_GDEY042T81_IS_BW true
+#define GxEPD2_426_GDEQ0426T82_IS_BW true
+#define GxEPD2_583_IS_BW true
+#define GxEPD2_583_T8_IS_BW true
+#define GxEPD2_583_GDEQ0583T31_IS_BW true
+#define GxEPD2_750_IS_BW true
+#define GxEPD2_750_T7_IS_BW true
+#define GxEPD2_750_YT7_IS_BW true
+#define GxEPD2_1160_T91_IS_BW true
+#define GxEPD2_1248_IS_BW true
+#define GxEPD2_it60_IS_BW true
+#define GxEPD2_it60_1448x1072_IS_BW true
+#define GxEPD2_it78_1872x1404_IS_BW true
+#define GxEPD2_it103_1872x1404_IS_BW true
+// 3-color e-papers
+#define GxEPD2_154c_IS_3C true
+#define GxEPD2_154_Z90c_IS_3C true
+#define GxEPD2_213c_IS_3C true
+#define GxEPD2_213_Z19c_IS_3C true
+#define GxEPD2_213_Z98c_IS_3C true
+#define GxEPD2_266c_IS_3C true
+#define GxEPD2_270c_IS_3C true
+#define GxEPD2_290c_IS_3C true
+#define GxEPD2_290_Z13c_IS_3C true
+#define GxEPD2_290_C90c_IS_3C true
+#define GxEPD2_420c_IS_3C true
+#define GxEPD2_420c_Z21_IS_3C true
+#define GxEPD2_583c_IS_3C true
+#define GxEPD2_583c_Z83_IS_3C true
+#define GxEPD2_750c_IS_3C true
+#define GxEPD2_750c_Z08_IS_3C true
+#define GxEPD2_750c_Z90_IS_3C true
+#define GxEPD2_1248c_IS_3C true
+// 4-color e-paper
+#define GxEPD2_266c_GDEY0266F51H_IS_4C true
+#define GxEPD2_290c_GDEY029F51H_IS_4C true
+#define GxEPD2_300c_IS_4C true
+#define GxEPD2_420c_GDEY0420F51_IS_4C true
+#define GxEPD2_437c_IS_4C true
+// 7-color e-paper
+#define GxEPD2_565c_IS_7C true
+#define GxEPD2_730c_GDEY073D46_IS_7C true
+
+#if defined(GxEPD2_DISPLAY_CLASS) && defined(GxEPD2_DRIVER_CLASS)
+#define IS_GxEPD2_DRIVER(c, x) (c##x)
+#define IS_GxEPD2_DRIVER_BW(x) IS_GxEPD2_DRIVER(x, _IS_BW)
+#define IS_GxEPD2_DRIVER_3C(x) IS_GxEPD2_DRIVER(x, _IS_3C)
+#define IS_GxEPD2_DRIVER_4C(x) IS_GxEPD2_DRIVER(x, _IS_4C)
+#define IS_GxEPD2_DRIVER_7C(x) IS_GxEPD2_DRIVER(x, _IS_7C)
+#if IS_GxEPD2_BW(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS)
+#error "GxEPD2_BW used with 3-color driver class"
+#endif
+#if IS_GxEPD2_3C(GxEPD2_DISPLAY_CLASS) && IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS)
+#error "GxEPD2_3C used with b/w driver class"
+#endif
+#if !IS_GxEPD2_DRIVER_BW(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_3C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_4C(GxEPD2_DRIVER_CLASS) && !IS_GxEPD2_DRIVER_7C(GxEPD2_DRIVER_CLASS)
+#error "neither BW nor 3C nor 4C nor 7C kind defined for driver class (error in GxEPD2_selection_check.h)"
+#endif
+
+#endif

+ 86 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/GxEPD2_wiring_examples.h

@@ -0,0 +1,86 @@
+// 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
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// 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 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
+// 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
+// NOTE: connect 1k pull-up from GPIO2 (RST) to 3.3V if your board or shield has the "clever" reset circuit, or use a different pin
+
+// mapping of Waveshare e-Paper ESP8266 Driver Board, new 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 of Waveshare e-Paper ESP8266 Driver Board, old version
+// BUSY -> GPIO16, RST -> GPIO5, 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
+
+// mapping suggestion for ESP32, e.g. LOLIN32 D32 PRO
+// BUSY -> 15, RST -> 2, DC -> 0, CS -> 5, CLK -> SCK(18), DIN -> MOSI(23), GND -> GND, 3.3V -> 3.3V
+// note: use explicit value for CS, as SS is re-defined to TF_CS(4) in pins_arduino.h for Board: "LOLIN D32 PRO"
+
+// mapping suggestion for ESP32, e.g. TTGO T8 ESP32-WROVER
+// 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":
+
+// new mapping suggestion for STM32F1, e.g. STM32F103C8T6 "BluePill"
+// BUSY -> A1, RST -> A2, DC -> A3, CS-> A4, CLK -> A5, DIN -> A7
+
+// mapping suggestion for AVR, UNO, NANO etc.
+// BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 13, DIN -> 11
+
+// mapping suggestion for AVR, Arduino Micro, Leonardo
+// note: on Leonardo board HW SPI pins are on 6-pin ICSP header
+// BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 15, DIN -> 16
+
+// mapping of Waveshare Universal e-Paper Raw Panel Driver Shield for Arduino / NUCLEO
+// BUSY -> 7, RST -> 8, DC -> 9, CS-> 10, CLK -> 13, DIN -> 11
+
+// mapping suggestion for Arduino MEGA
+// BUSY -> 7, RST -> 9, DC -> 8, CS-> 53, CLK -> 52, DIN -> 51
+
+// mapping suggestion for Arduino DUE, note: pin 77 is on board pin 10, SS is 10
+// BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 76, DIN -> 75
+// SPI pins are on 6 pin 2x3 SPI header, no SS on SPI header!
+
+// mapping suggestion for Arduino MKR1000 or MKRZERO
+// 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 (Arduino MBED OS Nano Boards)
+// BUSY -> 7, RST -> 9, DC -> 8, CS-> 10, CLK -> 13, DIN -> 11
+
+// 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

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 8 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/Open_Sans_ExtraBold_120.h


+ 199 - 0
extras/tests/GxEPD2_FastBlackWhiteOnColorRefreshTests/Open_Sans_ExtraBold_60.h

@@ -0,0 +1,199 @@
+// Created by http://oleddisplay.squix.ch/ Consider a donation
+// In case of problems make sure that you are using the font file with the correct version!
+const uint8_t Open_Sans_ExtraBold_60Bitmaps[] PROGMEM = {
+
+  // Bitmap Data:
+  0x00, // ' '
+  0xFF,0xFF,0xFF,0xDF,0xFE,0xFF,0xF7,0xFF,0xBF,0xFD,0xFF,0xEF,0xFF,0x7F,0xFB,0xFF,0xDF,0xFE,0xFF,0xE7,0xFF,0x3F,0xF9,0xFF,0xCF,0xFE,0x7F,0xF3,0xFF,0x9F,0xFC,0xFF,0xE7,0xFF,0x1F,0xF8,0xFF,0xC7,0xFE,0x3F,0xF1,0xFF,0x8F,0xFC,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x0F,0xF8,0xFF,0xE7,0xFF,0x3F,0xFD,0xFF,0xEF,0xFF,0x7F,0xF3,0xFF,0x8F,0xF8,0x1F,0x80, // '!'
+  0xFF,0xC3,0xFF,0xFF,0xC3,0xFF,0xFF,0xC3,0xFF,0xFF,0xC3,0xFF,0xFF,0xC3,0xFF,0xFF,0xC3,0xFF,0xFF,0x83,0xFE,0xFF,0x83,0xFE,0xFF,0x83,0xFE,0xFF,0x83,0xFE,0xFF,0x83,0xFE,0xFF,0x83,0xFE,0x7F,0x81,0xFE,0x7F,0x81,0xFE,0x7F,0x81,0xFE, // '"'
+  0x00,0x07,0xF0,0x7F,0x80,0x00,0x3F,0xC1,0xFE,0x00,0x00,0xFF,0x07,0xF8,0x00,0x03,0xFC,0x1F,0xE0,0x00,0x0F,0xF0,0x7F,0x00,0x00,0x3F,0x83,0xFC,0x00,0x01,0xFE,0x0F,0xF0,0x00,0x07,0xF8,0x3F,0xC0,0x00,0x1F,0xE0,0xFF,0x00,0x00,0x7F,0x83,0xF8,0x00,0x01,0xFC,0x1F,0xE0,0x0F,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xC0,0x1F,0xE0,0xFF,0x00,0x00,0x7F,0x87,0xF8,0x00,0x01,0xFC,0x1F,0xE0,0x00,0x0F,0xF0,0x7F,0x80,0x00,0x3F,0xC1,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xFF,0x00,0x7F,0x87,0xF8,0x00,0x01,0xFC,0x1F,0xE0,0x00,0x0F,0xF0,0x7F,0x80,0x00,0x3F,0xC1,0xFE,0x00,0x00,0xFF,0x07,0xF8,0x00,0x03,0xFC,0x1F,0xC0,0x00,0x0F,0xE0,0xFF,0x00,0x00,0x7F,0x83,0xFC,0x00,0x01,0xFE,0x0F,0xF0,0x00,0x07,0xF8,0x3F,0xC0,0x00,0x1F,0xE0,0xFF,0x00,0x00,0x7F,0x87,0xF8,0x00,0x00, // '#'
+  0x00,0x07,0xE0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3F,0x00,0x00,0x03,0xFF,0xE0,0x00,0x3F,0xFF,0xFC,0x01,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF,0x87,0xFF,0x80,0xFF,0x1F,0xFE,0x00,0x1E,0x3F,0xFC,0x00,0x08,0x7F,0xF8,0x00,0x00,0xFF,0xF8,0x00,0x00,0xFF,0xFC,0x00,0x01,0xFF,0xFE,0x00,0x03,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xC0,0x00,0x3F,0xFF,0xC0,0x00,0x1F,0xFF,0x80,0x00,0x0F,0xFF,0xC0,0x00,0x1F,0xFF,0xE0,0x00,0x3F,0xFF,0xF8,0x00,0x7F,0xFF,0xFE,0x01,0xFF,0xEF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0x80,0x3F,0xFF,0xFC,0x00,0x07,0xFF,0xC0,0x00,0x00,0x7E,0x00,0x00,0x00,0xFC,0x00,0x00,0x01,0xF8,0x00,0x00,0x03,0xF0,0x00,0x00,0x07,0xE0,0x00, // '$'
+  0x01,0xFC,0x00,0x00,0x1F,0xE0,0x00,0x0F,0xFF,0x00,0x00,0x7F,0xC0,0x00,0x3F,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x03,0xFE,0x00,0x03,0xFF,0xFF,0x00,0x0F,0xF8,0x00,0x07,0xFF,0xFE,0x00,0x1F,0xF0,0x00,0x1F,0xFF,0xFE,0x00,0x7F,0xC0,0x00,0x3F,0xE7,0xFC,0x00,0xFF,0x00,0x00,0x7F,0xC7,0xFC,0x03,0xFE,0x00,0x01,0xFF,0x0F,0xF8,0x07,0xF8,0x00,0x03,0xFE,0x1F,0xF0,0x1F,0xF0,0x00,0x07,0xFC,0x3F,0xE0,0x3F,0xC0,0x00,0x0F,0xF8,0x7F,0xC0,0xFF,0x80,0x00,0x1F,0xF0,0xFF,0x83,0xFE,0x00,0x00,0x3F,0xE1,0xFF,0x07,0xFC,0x00,0x00,0x7F,0xC3,0xFE,0x1F,0xF0,0x00,0x00,0xFF,0x87,0xFC,0x3F,0xC0,0xFE,0x01,0xFF,0x0F,0xF8,0xFF,0x87,0xFF,0x01,0xFE,0x1F,0xF1,0xFE,0x1F,0xFF,0x83,0xFE,0x7F,0xC7,0xFC,0x7F,0xFF,0x87,0xFF,0xFF,0x8F,0xF1,0xFF,0xFF,0x07,0xFF,0xFF,0x3F,0xE7,0xFF,0xFF,0x0F,0xFF,0xFC,0xFF,0x8F,0xFF,0xFF,0x0F,0xFF,0xF1,0xFF,0x1F,0xF3,0xFE,0x0F,0xFF,0xC7,0xFC,0x7F,0xC7,0xFC,0x0F,0xFF,0x0F,0xF0,0xFF,0x87,0xF8,0x03,0xF8,0x3F,0xE1,0xFF,0x0F,0xF8,0x00,0x00,0x7F,0x83,0xFE,0x1F,0xF0,0x00,0x01,0xFF,0x07,0xFC,0x3F,0xE0,0x00,0x03,0xFC,0x0F,0xF8,0x7F,0xC0,0x00,0x0F,0xF8,0x1F,0xF0,0xFF,0x80,0x00,0x3F,0xE0,0x3F,0xE1,0xFF,0x00,0x00,0x7F,0xC0,0x7F,0xC3,0xFE,0x00,0x01,0xFF,0x00,0xFF,0x87,0xFC,0x00,0x03,0xFC,0x01,0xFF,0x1F,0xF0,0x00,0x0F,0xF8,0x01,0xFF,0x3F,0xE0,0x00,0x1F,0xE0,0x03,0xFF,0xFF,0xC0,0x00,0x7F,0xC0,0x07,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x07,0xFF,0xFE,0x00,0x03,0xFE,0x00,0x07,0xFF,0xF8,0x00,0x0F,0xF8,0x00,0x07,0xFF,0xE0,0x00,0x1F,0xF0,0x00,0x07,0xFF,0x80,0x00,0x7F,0xC0,0x00,0x03,0xF8,0x00, // '%'
+  0x00,0x07,0xFE,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x00,0x00,0x00,0x7F,0xFF,0xFC,0x00,0x00,0x03,0xFF,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xFF,0xF0,0x00,0x00,0x7F,0xFF,0xFF,0xC0,0x00,0x01,0xFF,0xFF,0xFF,0x80,0x00,0x0F,0xFF,0x0F,0xFE,0x00,0x00,0x3F,0xF8,0x3F,0xF8,0x00,0x00,0xFF,0xE0,0x7F,0xE0,0x00,0x03,0xFF,0x83,0xFF,0x80,0x00,0x0F,0xFE,0x0F,0xFE,0x00,0x00,0x1F,0xFC,0x7F,0xF0,0x00,0x00,0x7F,0xF3,0xFF,0xC0,0x00,0x01,0xFF,0xFF,0xFF,0x00,0x00,0x03,0xFF,0xFF,0xF8,0x00,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x00,0x1F,0xFF,0xFE,0x00,0x00,0x00,0x3F,0xFF,0xF0,0x3F,0xFC,0x01,0xFF,0xFF,0x80,0xFF,0xF0,0x1F,0xFF,0xF8,0x07,0xFF,0x80,0xFF,0xFF,0xF0,0x1F,0xFE,0x07,0xFF,0xFF,0xE0,0x7F,0xF8,0x3F,0xFF,0xFF,0xC3,0xFF,0xC0,0xFF,0xFF,0xFF,0x8F,0xFF,0x07,0xFF,0xDF,0xFF,0xFF,0xFC,0x1F,0xFE,0x3F,0xFF,0xFF,0xE0,0xFF,0xF0,0x7F,0xFF,0xFF,0x83,0xFF,0xC0,0xFF,0xFF,0xFC,0x0F,0xFF,0x01,0xFF,0xFF,0xF0,0x3F,0xFC,0x03,0xFF,0xFF,0x80,0xFF,0xF0,0x07,0xFF,0xFC,0x03,0xFF,0xE0,0x0F,0xFF,0xF0,0x0F,0xFF,0xC0,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0xFF,0xFF,0x00,0x7F,0xFF,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF7,0xFF,0xF0,0x0F,0xFF,0xFF,0x8F,0xFF,0xE0,0x0F,0xFF,0xF8,0x1F,0xFF,0xC0,0x07,0xFE,0x00,0x00,0x00, // '&'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0x7F,0x9F,0xE7,0xF8, // '''
+  0x01,0xFF,0x80,0xFF,0x80,0xFF,0xC0,0xFF,0xC0,0x7F,0xE0,0x7F,0xE0,0x3F,0xF0,0x3F,0xF0,0x1F,0xF8,0x1F,0xFC,0x0F,0xFC,0x07,0xFE,0x07,0xFF,0x03,0xFF,0x01,0xFF,0x80,0xFF,0xC0,0x7F,0xE0,0x7F,0xF0,0x3F,0xF0,0x1F,0xF8,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x01,0xFF,0x80,0xFF,0xC0,0x7F,0xE0,0x3F,0xF0,0x1F,0xF8,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x01,0xFF,0x80,0xFF,0xC0,0x7F,0xE0,0x3F,0xF0,0x1F,0xF8,0x0F,0xFC,0x03,0xFF,0x01,0xFF,0x80,0xFF,0xC0,0x7F,0xE0,0x3F,0xF8,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x00,0xFF,0xC0,0x7F,0xE0,0x1F,0xF8,0x0F,0xFC,0x03,0xFF,0x01,0xFF,0x80,0x7F,0xE0,0x1F,0xF0,0x0F,0xFC, // '('
+  0xFF,0xC0,0x3F,0xE0,0x1F,0xF8,0x07,0xFE,0x03,0xFF,0x00,0xFF,0xC0,0x7F,0xE0,0x1F,0xF8,0x0F,0xFC,0x07,0xFE,0x01,0xFF,0x80,0xFF,0xC0,0x7F,0xE0,0x1F,0xF8,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x01,0xFF,0xC0,0x7F,0xE0,0x3F,0xF0,0x1F,0xF8,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x01,0xFF,0x80,0xFF,0xC0,0x7F,0xE0,0x3F,0xF0,0x1F,0xF8,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x01,0xFF,0x80,0xFF,0xC0,0x7F,0xE0,0x3F,0xF0,0x3F,0xF8,0x1F,0xF8,0x0F,0xFC,0x07,0xFE,0x03,0xFF,0x03,0xFF,0x81,0xFF,0x80,0xFF,0xC0,0xFF,0xE0,0x7F,0xE0,0x3F,0xF0,0x3F,0xF0,0x1F,0xF8,0x1F,0xF8,0x0F,0xFC,0x0F,0xFC,0x07,0xFC,0x07,0xFE,0x00, // ')'
+  0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x01,0xFE,0x00,0x00,0x07,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x01,0xFE,0x00,0x00,0x07,0xF8,0x02,0x78,0x0F,0xE0,0x79,0xFE,0x3F,0x1F,0xE7,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xF9,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0x00,0x01,0xFF,0xE0,0x00,0x0F,0xFF,0xC0,0x00,0x7F,0xFF,0x80,0x01,0xFF,0xFE,0x00,0x0F,0xFF,0xFC,0x00,0x7F,0xCF,0xF8,0x03,0xFF,0x3F,0xF0,0x0F,0xF8,0x7F,0xC0,0x1F,0xE1,0xFF,0x00,0x1F,0x03,0xF0,0x00,0x1C,0x0F,0x00,0x00,0x30,0x10,0x00, // '*'
+  0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x01,0xFE,0x00,0x00,0x07,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x01,0xFE,0x00,0x00,0x07,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x01,0xFE,0x00,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,0xFF,0xFF,0xFF,0xC0,0x07,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x01,0xFE,0x00,0x00,0x07,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x7F,0x80,0x00,0x01,0xFE,0x00,0x00,0x07,0xF8,0x00,0x00,0x1F,0xE0,0x00, // '+'
+  0x1F,0xF9,0xFF,0xCF,0xFE,0x7F,0xE3,0xFF,0x1F,0xF8,0xFF,0x8F,0xFC,0x7F,0xE3,0xFF,0x1F,0xF0,0xFF,0x87,0xFC,0x7F,0xC3,0xFE,0x1F,0xF0,0xFF,0x00, // ','
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // '-'
+  0x1F,0x87,0xFC,0xFF,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xE7,0xFC,0x1F,0x80, // '.'
+  0x00,0x00,0x7F,0xE0,0x00,0x1F,0xF8,0x00,0x03,0xFF,0x00,0x00,0xFF,0xE0,0x00,0x1F,0xF8,0x00,0x03,0xFF,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xF8,0x00,0x03,0xFF,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xF8,0x00,0x07,0xFF,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xF8,0x00,0x07,0xFE,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xF8,0x00,0x07,0xFE,0x00,0x00,0xFF,0xC0,0x00,0x3F,0xF8,0x00,0x07,0xFE,0x00,0x00,0xFF,0xC0,0x00,0x3F,0xF0,0x00,0x07,0xFE,0x00,0x00,0xFF,0xC0,0x00,0x3F,0xF0,0x00,0x07,0xFE,0x00,0x01,0xFF,0xC0,0x00,0x3F,0xF0,0x00,0x07,0xFE,0x00,0x01,0xFF,0x80,0x00,0x3F,0xF0,0x00,0x07,0xFE,0x00,0x01,0xFF,0x80,0x00,0x3F,0xF0,0x00,0x0F,0xFE,0x00,0x01,0xFF,0x80,0x00,0x3F,0xF0,0x00,0x0F,0xFE,0x00,0x01,0xFF,0x80,0x00,0x3F,0xF0,0x00,0x0F,0xFC,0x00,0x01,0xFF,0x80,0x00,0x7F,0xF0,0x00,0x00, // '/'
+  0x00,0x1F,0xF0,0x00,0x01,0xFF,0xF8,0x00,0x07,0xFF,0xFC,0x00,0x3F,0xFF,0xFC,0x00,0x7F,0xFF,0xFC,0x01,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x7F,0xF8,0xFF,0xF1,0xFF,0xE0,0xFF,0xE3,0xFF,0xC1,0xFF,0xE7,0xFF,0x01,0xFF,0xCF,0xFE,0x03,0xFF,0x9F,0xFC,0x07,0xFF,0x7F,0xF8,0x0F,0xFE,0xFF,0xF0,0x1F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0x01,0xFF,0xEF,0xFE,0x03,0xFF,0x9F,0xFC,0x07,0xFF,0x3F,0xF8,0x0F,0xFE,0x7F,0xF8,0x3F,0xFC,0x7F,0xF0,0x7F,0xF8,0xFF,0xF1,0xFF,0xE1,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xC0,0x03,0xFF,0xFE,0x00,0x01,0xFF,0xF8,0x00,0x00,0xFF,0x80,0x00, // '0'
+  0x00,0x03,0xFF,0xC0,0x01,0xFF,0xF0,0x00,0xFF,0xFC,0x00,0x7F,0xFF,0x00,0x3F,0xFF,0xC0,0x3F,0xFF,0xF0,0x1F,0xFF,0xFC,0x0F,0xFF,0xFF,0x07,0xFF,0xFF,0xC7,0xFF,0xFF,0xF3,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xCF,0xFE,0xFF,0xF3,0xFF,0x3F,0xFC,0x7F,0x8F,0xFF,0x0F,0xC3,0xFF,0xC1,0xE0,0xFF,0xF0,0x30,0x3F,0xFC,0x00,0x0F,0xFF,0x00,0x03,0xFF,0xC0,0x00,0xFF,0xF0,0x00,0x3F,0xFC,0x00,0x0F,0xFF,0x00,0x03,0xFF,0xC0,0x00,0xFF,0xF0,0x00,0x3F,0xFC,0x00,0x0F,0xFF,0x00,0x03,0xFF,0xC0,0x00,0xFF,0xF0,0x00,0x3F,0xFC,0x00,0x0F,0xFF,0x00,0x03,0xFF,0xC0,0x00,0xFF,0xF0,0x00,0x3F,0xFC,0x00,0x0F,0xFF,0x00,0x03,0xFF,0xC0,0x00,0xFF,0xF0,0x00,0x3F,0xFC,0x00,0x0F,0xFF,0x00,0x03,0xFF,0xC0,0x00,0xFF,0xF0,0x00,0x3F,0xFC, // '1'
+  0x00,0x0F,0xF8,0x00,0x00,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFE,0x1F,0xF8,0x3F,0xFE,0x0F,0xE0,0x1F,0xFE,0x07,0x80,0x1F,0xFE,0x03,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFE,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xFC,0x00,0x00,0x7F,0xF8,0x00,0x00,0xFF,0xF8,0x00,0x01,0xFF,0xF0,0x00,0x03,0xFF,0xE0,0x00,0x07,0xFF,0xE0,0x00,0x0F,0xFF,0xC0,0x00,0x0F,0xFF,0x80,0x00,0x1F,0xFF,0x00,0x00,0x7F,0xFE,0x00,0x00,0xFF,0xFC,0x00,0x01,0xFF,0xF8,0x00,0x03,0xFF,0xE0,0x00,0x07,0xFF,0xC0,0x00,0x0F,0xFF,0x80,0x00,0x1F,0xFF,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF, // '2'
+  0x00,0x7F,0xF0,0x00,0x0F,0xFF,0xFC,0x00,0x7F,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xF8,0x3F,0x81,0xFF,0xF0,0x38,0x01,0xFF,0xE0,0x00,0x01,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00,0x07,0xFF,0x00,0x00,0x1F,0xFC,0x00,0x00,0x7F,0xF8,0x00,0x03,0xFF,0xE0,0x03,0xFF,0xFF,0x80,0x07,0xFF,0xFE,0x00,0x0F,0xFF,0xF0,0x00,0x1F,0xFF,0x80,0x00,0x3F,0xFF,0x80,0x00,0x7F,0xFF,0xE0,0x00,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF0,0x00,0x07,0xFF,0xF0,0x00,0x03,0xFF,0xE0,0x00,0x03,0xFF,0xC0,0x00,0x07,0xFF,0x80,0x00,0x0F,0xFF,0x80,0x00,0x1F,0xFF,0x80,0x00,0x3F,0xFD,0xC0,0x00,0xFF,0xFB,0xF8,0x07,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xF0,0x00,0x1F,0xFF,0x00,0x00, // '3'
+  0x00,0x00,0x7F,0xF0,0x00,0x00,0x3F,0xF8,0x00,0x00,0x3F,0xFC,0x00,0x00,0x3F,0xFE,0x00,0x00,0x1F,0xFF,0x00,0x00,0x1F,0xFF,0x80,0x00,0x1F,0xFF,0xC0,0x00,0x0F,0xFF,0xE0,0x00,0x0F,0xFF,0xF0,0x00,0x0F,0xFF,0xF8,0x00,0x07,0xFF,0xFC,0x00,0x07,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x01,0xFF,0x7F,0xF0,0x01,0xFF,0xBF,0xF8,0x01,0xFF,0x9F,0xFC,0x00,0xFF,0x8F,0xFE,0x00,0xFF,0xC7,0xFF,0x00,0xFF,0xC3,0xFF,0x80,0xFF,0xC1,0xFF,0xC0,0x7F,0xE0,0xFF,0xE0,0x7F,0xE0,0x7F,0xF0,0x7F,0xE0,0x3F,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,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0x07,0xFF,0x00,0x00,0x03,0xFF,0x80,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xF0,0x00,0x00,0x3F,0xF8,0x00,0x00,0x1F,0xFC,0x00, // '4'
+  0x3F,0xFF,0xFF,0xC1,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0x83,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFE,0x1F,0xFC,0x00,0x00,0xFF,0xE0,0x00,0x07,0xFF,0x00,0x00,0x3F,0xF8,0x00,0x01,0xFF,0xC0,0x00,0x0F,0xFF,0xFE,0x00,0x7F,0xFF,0xFE,0x03,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xC7,0xFF,0xFF,0xFE,0x0E,0x03,0xFF,0xF8,0x00,0x07,0xFF,0xC0,0x00,0x1F,0xFE,0x00,0x00,0xFF,0xF0,0x00,0x07,0xFF,0x80,0x00,0x1F,0xFC,0x00,0x01,0xFF,0xE0,0x00,0x0F,0xFF,0x00,0x00,0x7F,0xFF,0x00,0x07,0xFF,0xFF,0x80,0xFF,0xFD,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xF3,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xF0,0x0F,0xFF,0xFE,0x00,0x07,0xFF,0x80,0x00, // '5'
+  0x00,0x00,0x7F,0xF0,0x00,0x0F,0xFF,0xE0,0x00,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFE,0x01,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x3F,0xFF,0x80,0x00,0x7F,0xF8,0x00,0x01,0xFF,0xE0,0x00,0x03,0xFF,0x80,0x00,0x07,0xFE,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xF0,0x7F,0x00,0x7F,0xE3,0xFF,0x80,0xFF,0xCF,0xFF,0xC3,0xFF,0xBF,0xFF,0xC7,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFE,0xFF,0xFC,0x3F,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0x00,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFC,0x03,0xFF,0xBF,0xF8,0x07,0xFF,0x7F,0xF0,0x1F,0xFE,0xFF,0xF0,0x3F,0xFC,0xFF,0xF0,0xFF,0xF1,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0x00,0x01,0xFF,0xFC,0x00,0x00,0x7F,0xC0,0x00, // '6'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0xFF,0xF0,0x00,0x01,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00,0x0F,0xFE,0x00,0x00,0x1F,0xFC,0x00,0x00,0x7F,0xF8,0x00,0x00,0xFF,0xE0,0x00,0x03,0xFF,0xC0,0x00,0x07,0xFF,0x00,0x00,0x1F,0xFE,0x00,0x00,0x3F,0xF8,0x00,0x00,0x7F,0xF0,0x00,0x01,0xFF,0xE0,0x00,0x03,0xFF,0x80,0x00,0x0F,0xFF,0x00,0x00,0x1F,0xFC,0x00,0x00,0x7F,0xF8,0x00,0x00,0xFF,0xF0,0x00,0x03,0xFF,0xC0,0x00,0x07,0xFF,0x80,0x00,0x0F,0xFE,0x00,0x00,0x3F,0xFC,0x00,0x00,0x7F,0xF0,0x00,0x01,0xFF,0xE0,0x00,0x03,0xFF,0xC0,0x00,0x0F,0xFF,0x00,0x00,0x1F,0xFE,0x00,0x00,0x3F,0xF8,0x00,0x00,0xFF,0xF0,0x00,0x01,0xFF,0xE0,0x00,0x07,0xFF,0x80,0x00,0x0F,0xFF,0x00,0x00,0x3F,0xFC,0x00,0x00, // '7'
+  0x00,0x3F,0xF8,0x00,0x03,0xFF,0xFE,0x00,0x1F,0xFF,0xFF,0x00,0x7F,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFC,0x7F,0xFC,0x7F,0xFC,0xFF,0xF0,0x7F,0xF9,0xFF,0xC0,0x7F,0xF3,0xFF,0x80,0xFF,0xE7,0xFF,0x01,0xFF,0xC7,0xFF,0x07,0xFF,0x0F,0xFF,0x1F,0xFE,0x1F,0xFF,0x7F,0xFC,0x1F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0x00,0x1F,0xFF,0xFC,0x00,0x1F,0xFF,0xE0,0x00,0x3F,0xFF,0xE0,0x01,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xF1,0xFF,0xFB,0xFF,0xE3,0xFF,0xC1,0xFF,0xEF,0xFF,0x01,0xFF,0xDF,0xFC,0x01,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xC1,0xFF,0xF7,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0x80,0x07,0xFF,0xFC,0x00,0x01,0xFF,0xC0,0x00, // '8'
+  0x00,0x3F,0xE0,0x00,0x03,0xFF,0xF8,0x00,0x1F,0xFF,0xFC,0x00,0x7F,0xFF,0xFC,0x01,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xF9,0xFF,0xF0,0xFF,0xF3,0xFF,0xC0,0xFF,0xF7,0xFF,0x00,0xFF,0xEF,0xFE,0x01,0xFF,0xDF,0xFC,0x03,0xFF,0xBF,0xF8,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0x3F,0xFF,0xF7,0xFE,0x3F,0xFF,0xDF,0xFC,0x3F,0xFF,0xBF,0xF8,0x3F,0xFC,0x7F,0xE0,0x1F,0xE0,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00,0x07,0xFF,0x00,0x00,0x1F,0xFE,0x00,0x00,0x7F,0xF8,0x00,0x03,0xFF,0xF0,0x00,0x3F,0xFF,0xC1,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0x80,0x3F,0xFF,0xFE,0x00,0x7F,0xFF,0xF0,0x00,0xFF,0xFF,0x80,0x01,0xFF,0xF0,0x00,0x00, // '9'
+  0x0F,0xC1,0xFF,0x1F,0xFC,0xFF,0xE7,0xFF,0xFF,0xFD,0xFF,0xEF,0xFE,0x7F,0xF1,0xFF,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC1,0xFF,0x1F,0xFC,0xFF,0xE7,0xFF,0xFF,0xFD,0xFF,0xEF,0xFE,0x7F,0xF1,0xFF,0x03,0xF0, // ':'
+  0x0F,0xC1,0xFF,0x1F,0xFC,0xFF,0xF7,0xFF,0xBF,0xFD,0xFF,0xEF,0xFF,0x7F,0xF1,0xFF,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xCF,0xFE,0x7F,0xF3,0xFF,0x1F,0xF8,0xFF,0xC7,0xFC,0x7F,0xE3,0xFF,0x1F,0xF8,0xFF,0x87,0xFC,0x3F,0xE3,0xFE,0x1F,0xF0,0xFF,0x07,0xF8,0x00, // ';'
+  0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x07,0xC0,0x00,0x00,0x7F,0x00,0x00,0x07,0xFC,0x00,0x00,0x7F,0xF0,0x00,0x07,0xFF,0xC0,0x00,0x7F,0xFF,0x00,0x07,0xFF,0xFC,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xFC,0x00,0x7F,0xFF,0xC0,0x07,0xFF,0xF8,0x00,0x7F,0xFF,0x80,0x07,0xFF,0xF8,0x00,0x3F,0xFF,0x80,0x00,0xFF,0xF8,0x00,0x03,0xFF,0xE0,0x00,0x0F,0xFF,0xE0,0x00,0x3F,0xFF,0xF0,0x00,0x3F,0xFF,0xF0,0x00,0x3F,0xFF,0xF8,0x00,0x3F,0xFF,0xF8,0x00,0x3F,0xFF,0xFC,0x00,0x1F,0xFF,0xFC,0x00,0x1F,0xFF,0xF0,0x00,0x1F,0xFF,0xC0,0x00,0x1F,0xFF,0x00,0x00,0x0F,0xFC,0x00,0x00,0x0F,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x0F,0x00,0x00,0x00,0x04, // '<'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC, // '='
+  0x80,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x3F,0x80,0x00,0x00,0xFF,0x80,0x00,0x03,0xFF,0x80,0x00,0x0F,0xFF,0x80,0x00,0x3F,0xFF,0x80,0x00,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x80,0x00,0x7F,0xFF,0x80,0x00,0x7F,0xFF,0x80,0x00,0x7F,0xFF,0x00,0x00,0x7F,0xFC,0x00,0x01,0xFF,0xF0,0x00,0x1F,0xFF,0xC0,0x03,0xFF,0xFF,0x00,0x3F,0xFF,0xF0,0x07,0xFF,0xFF,0x00,0x7F,0xFF,0xF0,0x0F,0xFF,0xFF,0x00,0xFF,0xFF,0xE0,0x03,0xFF,0xFE,0x00,0x0F,0xFF,0xE0,0x00,0x3F,0xFE,0x00,0x00,0xFF,0xC0,0x00,0x03,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3C,0x00,0x00,0x00,0x80,0x00,0x00,0x00, // '>'
+  0x00,0x3F,0xF0,0x00,0x1F,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xF9,0xFF,0xFF,0xFF,0xC7,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xF8,0xFF,0x03,0xFF,0xC7,0xC0,0x0F,0xFE,0x10,0x00,0x7F,0xF0,0x00,0x03,0xFF,0x80,0x00,0x1F,0xFC,0x00,0x01,0xFF,0xC0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xE0,0x00,0x3F,0xFF,0x00,0x03,0xFF,0xF0,0x00,0x3F,0xFF,0x00,0x03,0xFF,0xF0,0x00,0x3F,0xFE,0x00,0x01,0xFF,0xE0,0x00,0x0F,0xFC,0x00,0x00,0x7F,0xC0,0x00,0x03,0xFE,0x00,0x00,0x1F,0xF0,0x00,0x00,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x00,0x00,0x1F,0xF0,0x00,0x01,0xFF,0xC0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xF0,0x00,0x07,0xFF,0x80,0x00,0x3F,0xFC,0x00,0x00,0xFF,0xE0,0x00,0x07,0xFF,0x00,0x00,0x1F,0xF0,0x00,0x00,0x3E,0x00,0x00, // '?'
+  0x00,0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFC,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x00,0x00,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFF,0xFF,0xF8,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xC0,0x01,0xFF,0xE0,0x03,0xFF,0xC0,0x00,0x1F,0xFC,0x00,0xFF,0xC0,0x00,0x01,0xFF,0x00,0x7F,0xE0,0x00,0x00,0x3F,0xE0,0x3F,0xE0,0x07,0xFC,0x07,0xF8,0x0F,0xF8,0x0F,0xFF,0xF8,0xFF,0x07,0xFC,0x0F,0xFF,0xFF,0x3F,0xC1,0xFE,0x0F,0xFF,0xFF,0xC7,0xF8,0xFF,0x87,0xFF,0xFF,0xF1,0xFE,0x3F,0xC1,0xFF,0xFF,0xF8,0x7F,0x9F,0xF0,0xFF,0xF3,0xFE,0x1F,0xE7,0xF8,0x7F,0xE0,0x7F,0x83,0xF9,0xFE,0x1F,0xF0,0x1F,0xE0,0xFF,0x7F,0x87,0xF8,0x07,0xF8,0x3F,0xDF,0xE3,0xFE,0x01,0xFE,0x0F,0xF7,0xF8,0xFF,0x80,0x7F,0x83,0xFF,0xFC,0x3F,0xC0,0x1F,0xE0,0xFF,0xFF,0x0F,0xF0,0x07,0xF8,0x3F,0xBF,0xC3,0xFC,0x01,0xFE,0x0F,0xEF,0xF0,0xFF,0x00,0xFF,0x87,0xFB,0xFC,0x3F,0xE0,0x3F,0xE1,0xFE,0x7F,0x8F,0xF8,0x0F,0xF8,0x7F,0x1F,0xE1,0xFF,0x07,0xFE,0x3F,0xC7,0xF8,0x7F,0xF7,0xFF,0xDF,0xF1,0xFE,0x1F,0xFF,0xFF,0xFF,0xF8,0x7F,0x83,0xFF,0xFF,0xFF,0xFE,0x1F,0xF0,0x7F,0xFF,0xFF,0xFF,0x03,0xFC,0x0F,0xFF,0xCF,0xFF,0x80,0xFF,0x81,0xFF,0xE1,0xFF,0xC0,0x1F,0xF0,0x1F,0xC0,0x1F,0xC0,0x07,0xFE,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00,0x00,0x00,0x1F,0xFC,0x00,0x00,0x1C,0x00,0x07,0xFF,0xC0,0x00,0x7F,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x1F,0xFF,0xFF,0xFF,0xF0,0x00,0x01,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0x00,0x00,0x03,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x1F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00, // '@'
+  0x00,0x03,0xFF,0xFC,0x00,0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x07,0xFF,0xFC,0x00,0x00,0x00,0x7F,0xFF,0xE0,0x00,0x00,0x07,0xFF,0xFE,0x00,0x00,0x00,0xFF,0xFF,0xE0,0x00,0x00,0x0F,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xF0,0x00,0x00,0x1F,0xFF,0xFF,0x00,0x00,0x01,0xFF,0x9F,0xF8,0x00,0x00,0x1F,0xF9,0xFF,0x80,0x00,0x03,0xFF,0x9F,0xF8,0x00,0x00,0x3F,0xF9,0xFF,0xC0,0x00,0x03,0xFF,0x8F,0xFC,0x00,0x00,0x7F,0xF0,0xFF,0xC0,0x00,0x07,0xFF,0x0F,0xFE,0x00,0x00,0x7F,0xF0,0xFF,0xE0,0x00,0x0F,0xFE,0x07,0xFE,0x00,0x00,0xFF,0xE0,0x7F,0xF0,0x00,0x0F,0xFE,0x07,0xFF,0x00,0x01,0xFF,0xE0,0x7F,0xF0,0x00,0x1F,0xFC,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x3F,0xF8,0x00,0x3F,0xFC,0x03,0xFF,0x80,0x03,0xFF,0xC0,0x1F,0xFC,0x00,0x3F,0xFF,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0xFC,0x00,0x7F,0xFF,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xFF,0x83,0xFF,0xE0,0x00,0x7F,0xFC,0x3F,0xFE,0x00,0x03,0xFF,0xC3,0xFF,0xC0,0x00,0x3F,0xFC,0x7F,0xFC,0x00,0x03,0xFF,0xE7,0xFF,0xC0,0x00,0x3F,0xFE,0x7F,0xF8,0x00,0x01,0xFF,0xEF,0xFF,0x80,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x01,0xFF,0xF0, // 'A'
+  0xFF,0xFF,0xF8,0x00,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xE0,0x7F,0xFE,0xFF,0xE0,0x1F,0xFE,0xFF,0xE0,0x1F,0xFE,0xFF,0xE0,0x1F,0xFE,0xFF,0xE0,0x1F,0xFE,0xFF,0xE0,0x1F,0xFE,0xFF,0xE0,0x7F,0xFC,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFE,0xFF,0xE0,0x3F,0xFE,0xFF,0xE0,0x1F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xF8,0x00, // 'B'
+  0x00,0x00,0xFF,0xC0,0x00,0x03,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xC1,0xFF,0xFC,0x07,0xE0,0xFF,0xFC,0x00,0x38,0x3F,0xFE,0x00,0x02,0x1F,0xFF,0x00,0x00,0x07,0xFF,0xC0,0x00,0x01,0xFF,0xE0,0x00,0x00,0x7F,0xF8,0x00,0x00,0x3F,0xFC,0x00,0x00,0x0F,0xFF,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0xFF,0xF0,0x00,0x00,0x3F,0xFC,0x00,0x00,0x0F,0xFF,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0xFF,0xF0,0x00,0x00,0x3F,0xFC,0x00,0x00,0x0F,0xFF,0x00,0x00,0x03,0xFF,0xE0,0x00,0x00,0x7F,0xF8,0x00,0x00,0x1F,0xFE,0x00,0x00,0x07,0xFF,0xC0,0x00,0x01,0xFF,0xF8,0x00,0x00,0x3F,0xFF,0x00,0x07,0x0F,0xFF,0xF0,0x0F,0xC1,0xFF,0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xC0,0x00,0x07,0xFF,0x00, // 'C'
+  0xFF,0xFF,0xF0,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0x8F,0xFE,0x03,0xFF,0xF8,0xFF,0xE0,0x0F,0xFF,0xCF,0xFE,0x00,0x7F,0xFC,0xFF,0xE0,0x03,0xFF,0xEF,0xFE,0x00,0x1F,0xFE,0xFF,0xE0,0x01,0xFF,0xEF,0xFE,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFE,0x00,0x1F,0xFF,0xFF,0xE0,0x01,0xFF,0xEF,0xFE,0x00,0x1F,0xFE,0xFF,0xE0,0x03,0xFF,0xEF,0xFE,0x00,0x3F,0xFE,0xFF,0xE0,0x07,0xFF,0xCF,0xFE,0x00,0xFF,0xFC,0xFF,0xE0,0x3F,0xFF,0x8F,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xE0,0x00,0x00, // 'D'
+  0xFF,0xFF,0xFF,0xFF,0xFF,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,0x00,0x3F,0xF8,0x00,0x1F,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xBF,0xFF,0xFF,0xDF,0xFF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFB,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x7F,0xF0,0x00,0x3F,0xF8,0x00,0x1F,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xE0,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,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0, // 'E'
+  0xFF,0xFF,0xFF,0xFF,0xFF,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,0x00,0x3F,0xF8,0x00,0x1F,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x3F,0xFF,0xFF,0xDF,0xFF,0xFF,0xEF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFB,0xFF,0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xBF,0xFF,0xFF,0xDF,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x3F,0xF8,0x00,0x1F,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x3F,0xF8,0x00,0x00, // 'F'
+  0x00,0x00,0x7F,0xF0,0x00,0x00,0x3F,0xFF,0xF8,0x00,0x0F,0xFF,0xFF,0xF8,0x00,0xFF,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0xF8,0x07,0xE0,0x7F,0xFF,0x00,0x03,0x03,0xFF,0xE0,0x00,0x00,0x3F,0xFE,0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xF8,0x00,0x00,0x07,0xFF,0xC0,0x00,0x00,0x3F,0xFC,0x07,0xFF,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0xFC,0x07,0xFF,0xFF,0xFF,0xF0,0x00,0x7F,0xF7,0xFF,0x80,0x03,0xFF,0xBF,0xFC,0x00,0x1F,0xFD,0xFF,0xF0,0x00,0xFF,0xEF,0xFF,0xC0,0x07,0xFF,0x3F,0xFF,0x00,0x3F,0xF9,0xFF,0xFE,0x01,0xFF,0xC7,0xFF,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xE0,0x00,0x03,0xFF,0xE0,0x00, // 'G'
+  0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,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,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xE0,0x00,0x7F,0xF0, // 'H'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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, // 'I'
+  0x00,0x3F,0xF8,0x01,0xFF,0xC0,0x0F,0xFE,0x00,0x7F,0xF0,0x03,0xFF,0x80,0x1F,0xFC,0x00,0xFF,0xE0,0x07,0xFF,0x00,0x3F,0xF8,0x01,0xFF,0xC0,0x0F,0xFE,0x00,0x7F,0xF0,0x03,0xFF,0x80,0x1F,0xFC,0x00,0xFF,0xE0,0x07,0xFF,0x00,0x3F,0xF8,0x01,0xFF,0xC0,0x0F,0xFE,0x00,0x7F,0xF0,0x03,0xFF,0x80,0x1F,0xFC,0x00,0xFF,0xE0,0x07,0xFF,0x00,0x3F,0xF8,0x01,0xFF,0xC0,0x0F,0xFE,0x00,0x7F,0xF0,0x03,0xFF,0x80,0x1F,0xFC,0x00,0xFF,0xE0,0x07,0xFF,0x00,0x3F,0xF8,0x01,0xFF,0xC0,0x0F,0xFE,0x00,0x7F,0xF0,0x03,0xFF,0x80,0x1F,0xFC,0x00,0xFF,0xE0,0x07,0xFF,0x00,0x3F,0xF8,0x01,0xFF,0xC0,0x0F,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0x80,0x7F,0xFE,0x07,0xFF,0xDF,0xFF,0xFE,0xFF,0xFF,0xF7,0xFF,0xFF,0x3F,0xFF,0xF1,0xFF,0xFF,0x8F,0xFF,0xF8,0x7F,0xFF,0x83,0xFF,0xF0,0x0F,0xFC,0x00, // 'J'
+  0xFF,0xE0,0x01,0xFF,0xFF,0xFE,0x00,0x1F,0xFE,0xFF,0xE0,0x03,0xFF,0xEF,0xFE,0x00,0x7F,0xFC,0xFF,0xE0,0x07,0xFF,0x8F,0xFE,0x00,0xFF,0xF0,0xFF,0xE0,0x1F,0xFF,0x0F,0xFE,0x01,0xFF,0xE0,0xFF,0xE0,0x3F,0xFC,0x0F,0xFE,0x07,0xFF,0xC0,0xFF,0xE0,0x7F,0xF8,0x0F,0xFE,0x0F,0xFF,0x00,0xFF,0xE1,0xFF,0xF0,0x0F,0xFE,0x3F,0xFE,0x00,0xFF,0xE3,0xFF,0xC0,0x0F,0xFE,0x7F,0xFC,0x00,0xFF,0xEF,0xFF,0x80,0x0F,0xFE,0xFF,0xF0,0x00,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xF8,0x00,0xFF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0xE0,0x0F,0xFF,0x9F,0xFE,0x00,0xFF,0xE0,0xFF,0xF0,0x0F,0xFE,0x0F,0xFF,0x80,0xFF,0xE0,0x7F,0xF8,0x0F,0xFE,0x07,0xFF,0xC0,0xFF,0xE0,0x3F,0xFC,0x0F,0xFE,0x03,0xFF,0xE0,0xFF,0xE0,0x1F,0xFE,0x0F,0xFE,0x01,0xFF,0xF0,0xFF,0xE0,0x0F,0xFF,0x0F,0xFE,0x00,0xFF,0xF8,0xFF,0xE0,0x07,0xFF,0xCF,0xFE,0x00,0x7F,0xFC,0xFF,0xE0,0x03,0xFF,0xEF,0xFE,0x00,0x3F,0xFE,0xFF,0xE0,0x01,0xFF,0xF0, // 'K'
+  0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,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,0xF0, // 'L'
+  0xFF,0xFE,0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xBF,0xE0,0x07,0xFF,0xFF,0xFF,0xBF,0xE0,0x07,0xFF,0xFF,0xFF,0xBF,0xE0,0x07,0xFB,0xFF,0xFF,0xDF,0xF0,0x07,0xFB,0xFF,0xFF,0xDF,0xF0,0x0F,0xFB,0xFF,0xFF,0xDF,0xF0,0x0F,0xF3,0xFF,0xFF,0xDF,0xF0,0x0F,0xF3,0xFF,0xFF,0xCF,0xF8,0x1F,0xF3,0xFF,0xFF,0xCF,0xF8,0x1F,0xF3,0xFF,0xFF,0xCF,0xF8,0x1F,0xE3,0xFF,0xFF,0xC7,0xFC,0x1F,0xE3,0xFF,0xFF,0xC7,0xFC,0x3F,0xE3,0xFF,0xFF,0xC7,0xFC,0x3F,0xC3,0xFF,0xFF,0xC7,0xFE,0x3F,0xC3,0xFF,0xFF,0xC3,0xFE,0x7F,0xC3,0xFF,0xFF,0xC3,0xFE,0x7F,0xC3,0xFF,0xFF,0xC3,0xFE,0x7F,0x83,0xFF,0xFF,0xC3,0xFF,0x7F,0x83,0xFF,0xFF,0xC1,0xFF,0xFF,0x83,0xFF,0xFF,0xC1,0xFF,0xFF,0x83,0xFF,0xFF,0xC1,0xFF,0xFF,0x03,0xFF,0xFF,0xC0,0xFF,0xFF,0x03,0xFF,0xFF,0xC0,0xFF,0xFF,0x03,0xFF,0xFF,0xC0,0xFF,0xFE,0x03,0xFF,0xFF,0xC0,0xFF,0xFE,0x03,0xFF,0xFF,0xC0,0x7F,0xFE,0x03,0xFF,0xFF,0xC0,0x7F,0xFE,0x03,0xFF,0xFF,0xC0,0x7F,0xFC,0x03,0xFF,0xFF,0xC0,0x3F,0xFC,0x03,0xFF,0xFF,0xC0,0x3F,0xFC,0x03,0xFF,0xFF,0xC0,0x3F,0xF8,0x03,0xFF, // 'M'
+  0xFF,0xFE,0x00,0x03,0xFF,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xBF,0xFC,0x03,0xFF,0xFF,0x9F,0xFC,0x03,0xFF,0xFF,0xDF,0xFE,0x03,0xFF,0xFF,0xCF,0xFE,0x03,0xFF,0xFF,0xCF,0xFF,0x03,0xFF,0xFF,0xC7,0xFF,0x03,0xFF,0xFF,0xC7,0xFF,0x83,0xFF,0xFF,0xC3,0xFF,0x83,0xFF,0xFF,0xC3,0xFF,0xC3,0xFF,0xFF,0xC1,0xFF,0xC3,0xFF,0xFF,0xC1,0xFF,0xE3,0xFF,0xFF,0xC0,0xFF,0xF3,0xFF,0xFF,0xC0,0xFF,0xF3,0xFF,0xFF,0xC0,0x7F,0xFB,0xFF,0xFF,0xC0,0x7F,0xFB,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0xFF,0xC0,0x1F,0xFF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0xFF,0xC0,0x00,0x7F,0xFF, // 'N'
+  0x00,0x00,0xFF,0xE0,0x00,0x00,0x03,0xFF,0xFF,0x00,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x03,0xFF,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFF,0xFC,0x00,0x7F,0xFF,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xFF,0xFF,0x83,0xFF,0xFC,0x0F,0xFF,0xF0,0xFF,0xFC,0x00,0xFF,0xFC,0x7F,0xFE,0x00,0x1F,0xFF,0x1F,0xFF,0x00,0x03,0xFF,0xE7,0xFF,0xC0,0x00,0xFF,0xF9,0xFF,0xE0,0x00,0x1F,0xFE,0xFF,0xF8,0x00,0x07,0xFF,0xBF,0xFE,0x00,0x01,0xFF,0xFF,0xFF,0x80,0x00,0x7F,0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x03,0xFF,0xFF,0xFC,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x3F,0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x03,0xFF,0xFF,0xFC,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x7F,0xFF,0xFF,0xE0,0x00,0x1F,0xFF,0x7F,0xF8,0x00,0x07,0xFF,0x9F,0xFE,0x00,0x01,0xFF,0xE7,0xFF,0xC0,0x00,0xFF,0xF9,0xFF,0xF0,0x00,0x3F,0xFE,0x7F,0xFE,0x00,0x1F,0xFF,0x0F,0xFF,0xC0,0x0F,0xFF,0xC3,0xFF,0xFC,0x0F,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0x00,0x7F,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x3F,0xFF,0xFF,0xF0,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x00,0x3F,0xFF,0xF0,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, // 'O'
+  0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD,0xFF,0xC0,0xFF,0xFB,0xFF,0x80,0xFF,0xF7,0xFF,0x00,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0xC0,0x7F,0xFB,0xFF,0x83,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xE1,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xF8,0x00,0x00,0x7F,0xF0,0x00,0x00,0xFF,0xE0,0x00,0x01,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00,0x07,0xFF,0x00,0x00,0x0F,0xFE,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xF8,0x00,0x00,0x7F,0xF0,0x00,0x00,0xFF,0xE0,0x00,0x01,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00,0x00, // 'P'
+  0x00,0x00,0xFF,0xE0,0x00,0x00,0x01,0xFF,0xFF,0x80,0x00,0x00,0xFF,0xFF,0xFC,0x00,0x00,0x7F,0xFF,0xFF,0xE0,0x00,0x1F,0xFF,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xFF,0xFE,0x00,0x7F,0xFF,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0x03,0xFF,0xFC,0x1F,0xFF,0x80,0x1F,0xFF,0x87,0xFF,0xE0,0x01,0xFF,0xF0,0xFF,0xF8,0x00,0x1F,0xFF,0x1F,0xFF,0x00,0x03,0xFF,0xE3,0xFF,0xC0,0x00,0x3F,0xFC,0xFF,0xF8,0x00,0x07,0xFF,0x9F,0xFF,0x00,0x00,0xFF,0xFB,0xFF,0xE0,0x00,0x1F,0xFF,0x7F,0xF8,0x00,0x01,0xFF,0xEF,0xFF,0x00,0x00,0x3F,0xFD,0xFF,0xE0,0x00,0x07,0xFF,0xBF,0xFC,0x00,0x00,0xFF,0xF7,0xFF,0x80,0x00,0x1F,0xFE,0xFF,0xF0,0x00,0x03,0xFF,0xDF,0xFE,0x00,0x00,0x7F,0xFB,0xFF,0xC0,0x00,0x1F,0xFF,0x7F,0xFC,0x00,0x03,0xFF,0xE7,0xFF,0x80,0x00,0x7F,0xF8,0xFF,0xF0,0x00,0x0F,0xFF,0x1F,0xFF,0x00,0x03,0xFF,0xE3,0xFF,0xE0,0x00,0x7F,0xFC,0x7F,0xFE,0x00,0x1F,0xFF,0x07,0xFF,0xE0,0x07,0xFF,0xE0,0xFF,0xFF,0x03,0xFF,0xFC,0x0F,0xFF,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xFF,0xE0,0x1F,0xFF,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xFF,0xFE,0x00,0x1F,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0xFF,0xFF,0xFE,0x00,0x00,0x07,0xFF,0xFF,0xC0,0x00,0x00,0x0F,0xFF,0xFC,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x00,0xFF,0xFC,0x00,0x00,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x00,0xFF,0xFC,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x01,0xFF,0xF8,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x01,0xFF,0xF8,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x03,0xFF,0xF8, // 'Q'
+  0xFF,0xFF,0xF0,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x3F,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0xFE,0x07,0xFF,0x03,0xFF,0xF0,0x3F,0xF8,0x07,0xFF,0x81,0xFF,0xC0,0x3F,0xFC,0x0F,0xFE,0x00,0xFF,0xE0,0x7F,0xF0,0x07,0xFF,0x03,0xFF,0x80,0x3F,0xF8,0x1F,0xFC,0x03,0xFF,0xC0,0xFF,0xE0,0x3F,0xFE,0x07,0xFF,0x03,0xFF,0xE0,0x3F,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0xF8,0x03,0xFF,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0x80,0x07,0xFF,0xFF,0xFC,0x00,0x3F,0xFF,0xFF,0xF0,0x01,0xFF,0xC3,0xFF,0xC0,0x0F,0xFE,0x1F,0xFE,0x00,0x7F,0xF0,0x7F,0xF8,0x03,0xFF,0x83,0xFF,0xC0,0x1F,0xFC,0x0F,0xFF,0x00,0xFF,0xE0,0x7F,0xFC,0x07,0xFF,0x01,0xFF,0xE0,0x3F,0xF8,0x07,0xFF,0x81,0xFF,0xC0,0x3F,0xFE,0x0F,0xFE,0x00,0xFF,0xF0,0x7F,0xF0,0x07,0xFF,0xC3,0xFF,0x80,0x1F,0xFF,0x1F,0xFC,0x00,0x7F,0xF8,0xFF,0xE0,0x03,0xFF,0xE7,0xFF,0x00,0x0F,0xFF,0xBF,0xF8,0x00,0x7F,0xFC, // 'R'
+  0x00,0x1F,0xFC,0x00,0x03,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xF8,0xFF,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xF3,0xFF,0xE0,0x3F,0x8F,0xFF,0x00,0x1E,0x3F,0xFC,0x00,0x00,0xFF,0xF0,0x00,0x03,0xFF,0xC0,0x00,0x0F,0xFF,0x80,0x00,0x3F,0xFF,0x80,0x00,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0x80,0x07,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0x80,0x1F,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xF8,0x00,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0x80,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFC,0x00,0x00,0xFF,0xF0,0x00,0x03,0xFF,0xF0,0x00,0x0F,0xFF,0xF8,0x00,0x3F,0xFF,0xFE,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFC,0x01,0xFF,0xFF,0xC0,0x00,0x7F,0xF0,0x00, // 'S'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,0x07,0xFF,0x00,0x00,0x03,0xFF,0x80,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xF0,0x00,0x00,0x3F,0xF8,0x00,0x00,0x1F,0xFC,0x00,0x00,0x0F,0xFE,0x00,0x00,0x07,0xFF,0x00,0x00,0x03,0xFF,0x80,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xF0,0x00,0x00,0x3F,0xF8,0x00,0x00,0x1F,0xFC,0x00,0x00,0x0F,0xFE,0x00,0x00,0x07,0xFF,0x00,0x00,0x03,0xFF,0x80,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xF0,0x00,0x00,0x3F,0xF8,0x00,0x00,0x1F,0xFC,0x00,0x00,0x0F,0xFE,0x00,0x00,0x07,0xFF,0x00,0x00,0x03,0xFF,0x80,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xF0,0x00,0x00,0x3F,0xF8,0x00,0x00,0x1F,0xFC,0x00,0x00,0x0F,0xFE,0x00,0x00,0x07,0xFF,0x00,0x00, // 'T'
+  0xFF,0xF0,0x00,0x7F,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFC,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x3F,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x7F,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFC,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x3F,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x7F,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFC,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x3F,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x7F,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFC,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xBF,0xF8,0x00,0x3F,0xF9,0xFF,0xE0,0x03,0xFF,0xCF,0xFF,0x00,0x1F,0xFE,0x7F,0xFC,0x01,0xFF,0xF3,0xFF,0xF8,0x3F,0xFF,0x8F,0xFF,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xFF,0xE0,0x3F,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xFE,0x00,0x07,0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x0F,0xFE,0x00,0x00, // 'U'
+  0xFF,0xF8,0x00,0x07,0xFF,0xFF,0xFE,0x00,0x01,0xFF,0xF7,0xFF,0xC0,0x00,0xFF,0xF9,0xFF,0xF0,0x00,0x3F,0xFE,0x7F,0xFC,0x00,0x0F,0xFF,0x8F,0xFF,0x80,0x03,0xFF,0xC3,0xFF,0xE0,0x01,0xFF,0xF0,0xFF,0xF8,0x00,0x7F,0xFC,0x1F,0xFE,0x00,0x1F,0xFE,0x07,0xFF,0xC0,0x0F,0xFF,0x81,0xFF,0xF0,0x03,0xFF,0xE0,0x3F,0xFC,0x00,0xFF,0xF0,0x0F,0xFF,0x00,0x3F,0xFC,0x03,0xFF,0xE0,0x1F,0xFF,0x00,0x7F,0xF8,0x07,0xFF,0x80,0x1F,0xFE,0x01,0xFF,0xE0,0x07,0xFF,0xC0,0xFF,0xF8,0x00,0xFF,0xF0,0x3F,0xFC,0x00,0x3F,0xFC,0x0F,0xFF,0x00,0x0F,0xFF,0x03,0xFF,0xC0,0x01,0xFF,0xE1,0xFF,0xE0,0x00,0x7F,0xF8,0x7F,0xF8,0x00,0x1F,0xFE,0x1F,0xFE,0x00,0x03,0xFF,0x87,0xFF,0x00,0x00,0xFF,0xF3,0xFF,0xC0,0x00,0x3F,0xFC,0xFF,0xF0,0x00,0x07,0xFF,0x3F,0xF8,0x00,0x01,0xFF,0xCF,0xFE,0x00,0x00,0x7F,0xFB,0xFF,0x80,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x00,0xFF,0xFF,0xFC,0x00,0x00,0x1F,0xFF,0xFE,0x00,0x00,0x07,0xFF,0xFF,0x80,0x00,0x01,0xFF,0xFF,0xE0,0x00,0x00,0x3F,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0xFC,0x00,0x00,0x03,0xFF,0xFF,0x00,0x00,0x00,0x7F,0xFF,0x80,0x00,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0xFF,0xFC,0x00,0x00,0x00,0x3F,0xFF,0x00,0x00, // 'V'
+  0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x7F,0xFF,0xFE,0x00,0x0F,0xFF,0x00,0x07,0xFF,0x7F,0xF0,0x00,0xFF,0xF0,0x00,0xFF,0xE7,0xFF,0x00,0x0F,0xFF,0x00,0x0F,0xFE,0x7F,0xF0,0x00,0xFF,0xF0,0x00,0xFF,0xE7,0xFF,0x00,0x1F,0xFF,0x80,0x0F,0xFE,0x3F,0xF0,0x01,0xFF,0xF8,0x00,0xFF,0xE3,0xFF,0x80,0x1F,0xFF,0x80,0x1F,0xFC,0x3F,0xF8,0x01,0xFF,0xF8,0x01,0xFF,0xC3,0xFF,0x80,0x1F,0xFF,0xC0,0x1F,0xFC,0x3F,0xF8,0x03,0xFF,0xFC,0x01,0xFF,0xC1,0xFF,0xC0,0x3F,0xFF,0xC0,0x3F,0xF8,0x1F,0xFC,0x03,0xFF,0xFC,0x03,0xFF,0x81,0xFF,0xC0,0x3F,0xFF,0xC0,0x3F,0xF8,0x1F,0xFC,0x07,0xFF,0xFE,0x03,0xFF,0x80,0xFF,0xC0,0x7F,0xFF,0xE0,0x3F,0xF0,0x0F,0xFE,0x07,0xFF,0xFE,0x07,0xFF,0x00,0xFF,0xE0,0x7F,0xDF,0xE0,0x7F,0xF0,0x0F,0xFE,0x0F,0xF9,0xFF,0x07,0xFF,0x00,0x7F,0xE0,0xFF,0x9F,0xF0,0x7F,0xE0,0x07,0xFE,0x0F,0xF9,0xFF,0x0F,0xFE,0x00,0x7F,0xF0,0xFF,0x9F,0xF0,0xFF,0xE0,0x07,0xFF,0x0F,0xF8,0xFF,0x0F,0xFE,0x00,0x3F,0xF1,0xFF,0x0F,0xF8,0xFF,0xC0,0x03,0xFF,0x1F,0xF0,0xFF,0x8F,0xFC,0x00,0x3F,0xF1,0xFF,0x0F,0xF9,0xFF,0xC0,0x03,0xFF,0x9F,0xF0,0xFF,0x9F,0xFC,0x00,0x1F,0xF9,0xFF,0x07,0xF9,0xFF,0x80,0x01,0xFF,0xBF,0xE0,0x7F,0x9F,0xF8,0x00,0x1F,0xFB,0xFE,0x07,0xFD,0xFF,0x80,0x01,0xFF,0xBF,0xE0,0x7F,0xFF,0xF8,0x00,0x0F,0xFF,0xFE,0x07,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xC0,0x3F,0xFF,0xF0,0x00,0x0F,0xFF,0xFC,0x03,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xC0,0x3F,0xFF,0xF0,0x00,0x07,0xFF,0xFC,0x03,0xFF,0xFE,0x00,0x00,0x7F,0xFF,0xC0,0x1F,0xFF,0xE0,0x00,0x07,0xFF,0xF8,0x01,0xFF,0xFE,0x00,0x00,0x7F,0xFF,0x80,0x1F,0xFF,0xE0,0x00,0x03,0xFF,0xF8,0x01,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0x80,0x1F,0xFF,0xC0,0x00,0x03,0xFF,0xF0,0x00,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0x00,0x0F,0xFF,0xC0,0x00, // 'W'
+  0x7F,0xFC,0x00,0x0F,0xFF,0xC7,0xFF,0xC0,0x01,0xFF,0xF0,0x7F,0xF8,0x00,0x7F,0xFC,0x0F,0xFF,0x80,0x0F,0xFF,0x80,0xFF,0xF0,0x03,0xFF,0xE0,0x1F,0xFF,0x00,0x7F,0xF8,0x01,0xFF,0xE0,0x1F,0xFF,0x00,0x1F,0xFE,0x07,0xFF,0xC0,0x03,0xFF,0xE0,0xFF,0xF8,0x00,0x3F,0xFC,0x3F,0xFE,0x00,0x03,0xFF,0xC7,0xFF,0x80,0x00,0x7F,0xF9,0xFF,0xF0,0x00,0x07,0xFF,0xBF,0xFC,0x00,0x00,0xFF,0xFF,0xFF,0x80,0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x00,0xFF,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xFF,0x00,0x00,0x01,0xFF,0xFF,0xC0,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x03,0xFF,0xFE,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x07,0xFF,0xF0,0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0x0F,0xFF,0xFC,0x00,0x00,0x03,0xFF,0xFF,0xC0,0x00,0x00,0x7F,0xFF,0xFC,0x00,0x00,0x1F,0xFF,0xFF,0x80,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0xFF,0xFF,0xFF,0x80,0x00,0x3F,0xFE,0xFF,0xF0,0x00,0x0F,0xFF,0x9F,0xFF,0x00,0x01,0xFF,0xF1,0xFF,0xF0,0x00,0x7F,0xFC,0x1F,0xFE,0x00,0x0F,0xFF,0x03,0xFF,0xE0,0x03,0xFF,0xE0,0x3F,0xFE,0x00,0xFF,0xF8,0x07,0xFF,0xC0,0x1F,0xFF,0x00,0x7F,0xFC,0x07,0xFF,0xC0,0x07,0xFF,0xC1,0xFF,0xF0,0x00,0xFF,0xF8,0x3F,0xFE,0x00,0x0F,0xFF,0x8F,0xFF,0x80,0x00,0xFF,0xFB,0xFF,0xF0,0x00,0x1F,0xFF,0x00, // 'X'
+  0xFF,0xF8,0x00,0x1F,0xFF,0x7F,0xF8,0x00,0x1F,0xFE,0x7F,0xFC,0x00,0x3F,0xFE,0x3F,0xFC,0x00,0x3F,0xFC,0x3F,0xFE,0x00,0x7F,0xFC,0x1F,0xFE,0x00,0x7F,0xF8,0x1F,0xFF,0x00,0xFF,0xF0,0x0F,0xFF,0x00,0xFF,0xF0,0x07,0xFF,0x81,0xFF,0xE0,0x07,0xFF,0x81,0xFF,0xE0,0x03,0xFF,0x81,0xFF,0xC0,0x03,0xFF,0xC3,0xFF,0xC0,0x01,0xFF,0xC3,0xFF,0x80,0x01,0xFF,0xE7,0xFF,0x80,0x00,0xFF,0xE7,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x7F,0xFF,0xFE,0x00,0x00,0x3F,0xFF,0xFC,0x00,0x00,0x3F,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0xF0,0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x03,0xFF,0xC0,0x00, // 'Y'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,0x00,0x1F,0xFF,0x00,0x00,0x0F,0xFF,0x80,0x00,0x0F,0xFF,0x80,0x00,0x0F,0xFF,0x80,0x00,0x07,0xFF,0x80,0x00,0x07,0xFF,0xC0,0x00,0x07,0xFF,0xC0,0x00,0x07,0xFF,0xC0,0x00,0x03,0xFF,0xE0,0x00,0x03,0xFF,0xE0,0x00,0x03,0xFF,0xE0,0x00,0x01,0xFF,0xF0,0x00,0x01,0xFF,0xF0,0x00,0x01,0xFF,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x00,0xFF,0xF8,0x00,0x00,0xFF,0xF8,0x00,0x00,0xFF,0xF8,0x00,0x00,0x7F,0xFC,0x00,0x00,0x7F,0xFC,0x00,0x00,0x7F,0xFC,0x00,0x00,0x3F,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x00,0x3F,0xFE,0x00,0x00,0x1F,0xFF,0x00,0x00,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,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0, // 'Z'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // '['
+  0xFF,0xE0,0x00,0x0F,0xFC,0x00,0x01,0xFF,0x80,0x00,0x3F,0xF8,0x00,0x03,0xFF,0x00,0x00,0x7F,0xE0,0x00,0x07,0xFE,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xF8,0x00,0x01,0xFF,0x80,0x00,0x3F,0xF0,0x00,0x07,0xFF,0x00,0x00,0x7F,0xE0,0x00,0x0F,0xFC,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xF8,0x00,0x03,0xFF,0x00,0x00,0x3F,0xF0,0x00,0x07,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFC,0x00,0x01,0xFF,0x80,0x00,0x1F,0xF8,0x00,0x03,0xFF,0x00,0x00,0x7F,0xE0,0x00,0x07,0xFE,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xFC,0x00,0x01,0xFF,0x80,0x00,0x3F,0xF0,0x00,0x03,0xFF,0x00,0x00,0x7F,0xE0,0x00,0x0F,0xFC,0x00,0x00,0xFF,0xC0,0x00,0x1F,0xF8,0x00,0x03,0xFF,0x80,0x00,0x3F,0xF0,0x00,0x07,0xFE,0x00,0x00,0x7F,0xE0,0x00,0x0F,0xFC,0x00,0x01,0xFF,0x80,0x00,0x1F,0xF8,0x00,0x03,0xFF,0x00,0x00,0x7F,0xF0, // '\'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0x07,0xFE,0x0F,0xFC,0x1F,0xF8,0x3F,0xF0,0x7F,0xE0,0xFF,0xC1,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80, // ']'
+  0x00,0x0F,0xC0,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0xF8,0x00,0x00,0x03,0xFE,0x00,0x00,0x01,0xFF,0x00,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xF8,0x00,0x00,0x7F,0xFC,0x00,0x00,0x7F,0xFF,0x00,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0xE0,0x00,0x1F,0xEF,0xF0,0x00,0x1F,0xE3,0xFC,0x00,0x0F,0xF1,0xFE,0x00,0x0F,0xF8,0x7F,0x80,0x07,0xF8,0x3F,0xE0,0x07,0xFC,0x0F,0xF0,0x03,0xFC,0x07,0xFC,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x00,0xFF,0x80,0xFF,0x00,0x3F,0xC0,0xFF,0x00,0x1F,0xF0,0x7F,0x80,0x07,0xF8,0x7F,0xC0,0x03,0xFE,0x3F,0xC0,0x00,0xFF,0x3F,0xE0,0x00,0x7F,0xDF,0xE0,0x00,0x1F,0xF0, // '^'
+  0xFF,0xFF,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,0xF8,0x07,0xFF,0xC0,0x3F,0xFC,0x01,0xFF,0xE0,0x07,0xFF,0x00,0x3F,0xF8,0x01,0xFF,0xC0,0x07,0xFE,0x00,0x3F,0xF0,0x00,0xFF, // '`'
+  0x00,0x1F,0xFC,0x00,0x03,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0x80,0x7F,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x03,0xF0,0x3F,0xFE,0x07,0x00,0x3F,0xFC,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xF0,0x00,0x00,0xFF,0xE0,0x03,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFB,0xFF,0xF0,0x7F,0xF7,0xFF,0x80,0xFF,0xFF,0xFE,0x01,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFD,0xFF,0x9F,0xFF,0xF9,0xFF,0x1F,0xFF,0xE3,0xFE,0x1F,0xFF,0x03,0xFC,0x07,0xF8,0x00,0x00, // 'a'
+  0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x7F,0x00,0xFF,0xE1,0xFF,0xC0,0xFF,0xE7,0xFF,0xE0,0xFF,0xE7,0xFF,0xF0,0xFF,0xEF,0xFF,0xF8,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFC,0x3F,0xFE,0xFF,0xF8,0x1F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x3F,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xF8,0xFF,0xEF,0xFF,0xF0,0xFF,0xC7,0xFF,0xE0,0xFF,0x83,0xFF,0xC0,0x00,0x00,0xFF,0x00, // 'b'
+  0x00,0x0F,0xF8,0x00,0x07,0xFF,0xF8,0x01,0xFF,0xFF,0xF0,0x7F,0xFF,0xFE,0x0F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0x87,0xFF,0xE0,0xF8,0x7F,0xF8,0x01,0x0F,0xFF,0x00,0x00,0xFF,0xF0,0x00,0x0F,0xFF,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFE,0x00,0x00,0xFF,0xE0,0x00,0x0F,0xFF,0x00,0x00,0xFF,0xF0,0x00,0x0F,0xFF,0x00,0x00,0xFF,0xF8,0x00,0xC7,0xFF,0xC0,0x7C,0x7F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xC1,0xFF,0xFF,0xFC,0x0F,0xFF,0xFF,0xC0,0x7F,0xFF,0xFC,0x03,0xFF,0xFF,0xC0,0x0F,0xFF,0xF0,0x00,0x1F,0xF8,0x00, // 'c'
+  0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x0F,0xFF,0x00,0xFE,0x07,0xFF,0x03,0xFF,0x87,0xFF,0x07,0xFF,0xE7,0xFF,0x0F,0xFF,0xF7,0xFF,0x1F,0xFF,0xF7,0xFF,0x3F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFC,0x3F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF8,0x0F,0xFF,0x7F,0xFC,0x1F,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x1F,0xFF,0xF7,0xFF,0x0F,0xFF,0xF3,0xFF,0x07,0xFF,0xE3,0xFF,0x03,0xFF,0x81,0xFF,0x00,0xFE,0x00,0x00, // 'd'
+  0x00,0x1F,0xF8,0x00,0x01,0xFF,0xFE,0x00,0x0F,0xFF,0xFF,0x00,0x3F,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xFE,0x7F,0xFC,0x3F,0xFC,0xFF,0xF0,0x1F,0xFF,0xFF,0xC0,0x3F,0xFF,0xFF,0x80,0x3F,0xFF,0xFE,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,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xF8,0x00,0x00,0x7F,0xF8,0x00,0x00,0xFF,0xF8,0x00,0x08,0xFF,0xF0,0x00,0x71,0xFF,0xF8,0x07,0xE1,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFC,0x01,0xFF,0xFF,0xF8,0x00,0xFF,0xFF,0xC0,0x00,0x3F,0xFC,0x00, // 'e'
+  0x00,0x0F,0xF8,0x00,0x1F,0xFF,0xC0,0x3F,0xFF,0xE0,0x3F,0xFF,0xF0,0x1F,0xFF,0xF8,0x1F,0xFF,0xF8,0x0F,0xFF,0xFC,0x0F,0xFF,0xFE,0x07,0xFF,0xFE,0x03,0xFF,0xC0,0x01,0xFF,0xC0,0x00,0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x7F,0xFF,0xF0,0x7F,0xFF,0xF8,0xFF,0xFF,0xFC,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0x3F,0xFF,0xFF,0x9F,0xFF,0xFF,0xCF,0xFF,0xFF,0xE7,0xFF,0xFF,0xF0,0x1F,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x3F,0xF8,0x00,0x1F,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x3F,0xF8,0x00,0x1F,0xFC,0x00,0x0F,0xFE,0x00,0x07,0xFF,0x00,0x03,0xFF,0x80,0x01,0xFF,0xC0,0x00,0xFF,0xE0,0x00,0x7F,0xF0,0x00,0x3F,0xF8,0x00, // 'f'
+  0x00,0x1F,0xF0,0x00,0x00,0x3F,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xC7,0xFF,0xFF,0xFF,0xF1,0xFF,0xE3,0xFF,0xFC,0x7F,0xF0,0x7F,0xF8,0x3F,0xF8,0x1F,0xFC,0x0F,0xFE,0x07,0xFF,0x03,0xFF,0x81,0xFF,0xC0,0xFF,0xE0,0x3F,0xF0,0x3F,0xF8,0x1F,0xFC,0x0F,0xFE,0x07,0xFF,0x03,0xFF,0x81,0xFF,0xC0,0x7F,0xF0,0x7F,0xF0,0x1F,0xFE,0x3F,0xF8,0x03,0xFF,0xFF,0xFE,0x00,0xFF,0xFF,0xFF,0x00,0x1F,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xC0,0x00,0x7F,0xFF,0xC0,0x00,0x7F,0xFF,0x80,0x00,0x3F,0xC0,0x00,0x00,0x0F,0xF0,0x00,0x00,0x07,0xFF,0x00,0x00,0x01,0xFF,0xFF,0xFE,0x00,0x7F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xFE,0x03,0xFF,0xFF,0xFF,0xC0,0x7F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xFE,0x0F,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xE0,0x00,0x3F,0xEF,0xF8,0x00,0x1F,0xFB,0xFF,0x00,0x0F,0xFE,0xFF,0xE0,0x0F,0xFF,0x3F,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xE1,0xFF,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xF8,0x07,0xFF,0xFF,0xF8,0x00,0x7F,0xFF,0xF8,0x00,0x03,0xFF,0xE0,0x00, // 'g'
+  0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x7F,0x00,0xFF,0xE1,0xFF,0xE0,0xFF,0xE7,0xFF,0xF0,0xFF,0xEF,0xFF,0xF8,0xFF,0xEF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF, // 'h'
+  0x1F,0x87,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x7F,0xE1,0xF8,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,0xF0, // 'i'
+  0x00,0x7F,0x00,0x1F,0xF0,0x07,0xFF,0x00,0xFF,0xF0,0x1F,0xFE,0x03,0xFF,0xC0,0x7F,0xF8,0x0F,0xFE,0x00,0xFF,0xC0,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF0,0x0F,0xFE,0x01,0xFF,0xC0,0x3F,0xF8,0x07,0xFF,0x00,0xFF,0xE0,0x1F,0xFC,0x03,0xFF,0x80,0x7F,0xF0,0x0F,0xFE,0x01,0xFF,0xC0,0x3F,0xF8,0x07,0xFF,0x00,0xFF,0xE0,0x1F,0xFC,0x03,0xFF,0x80,0x7F,0xF0,0x0F,0xFE,0x01,0xFF,0xC0,0x3F,0xF8,0x07,0xFF,0x00,0xFF,0xE0,0x1F,0xFC,0x03,0xFF,0x80,0x7F,0xF0,0x0F,0xFE,0x01,0xFF,0xC0,0x3F,0xF8,0x07,0xFF,0x00,0xFF,0xE0,0x1F,0xFC,0x03,0xFF,0x80,0x7F,0xF0,0x0F,0xFE,0x01,0xFF,0xC0,0x3F,0xF8,0x0F,0xFF,0x03,0xFF,0xEF,0xFF,0xFD,0xFF,0xFF,0xBF,0xFF,0xE7,0xFF,0xFC,0xFF,0xFF,0x1F,0xFF,0xE3,0xFF,0xF0,0x7F,0xFC,0x07,0xFC,0x00, // 'j'
+  0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x0F,0xFF,0x00,0x3F,0xFE,0xFF,0xF0,0x07,0xFF,0xCF,0xFF,0x00,0xFF,0xF8,0xFF,0xF0,0x0F,0xFF,0x0F,0xFF,0x01,0xFF,0xE0,0xFF,0xF0,0x3F,0xFE,0x0F,0xFF,0x07,0xFF,0xC0,0xFF,0xE0,0xFF,0xF8,0x0F,0xFE,0x1F,0xFF,0x00,0xFF,0xE1,0xFF,0xE0,0x0F,0xFE,0x3F,0xFC,0x00,0xFF,0xE7,0xFF,0xC0,0x0F,0xFE,0xFF,0xF8,0x00,0xFF,0xEF,0xFF,0x00,0x0F,0xFF,0xFF,0xF0,0x00,0xFF,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0xF8,0x00,0xFF,0xFF,0xFF,0xC0,0x0F,0xFF,0xFF,0xFC,0x00,0xFF,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xFF,0x00,0xFF,0xFE,0xFF,0xF0,0x0F,0xFF,0xCF,0xFF,0x80,0xFF,0xF0,0x7F,0xFC,0x0F,0xFF,0x07,0xFF,0xC0,0xFF,0xF0,0x3F,0xFE,0x0F,0xFF,0x01,0xFF,0xF0,0xFF,0xF0,0x1F,0xFF,0x0F,0xFF,0x00,0xFF,0xF8,0xFF,0xF0,0x07,0xFF,0xCF,0xFF,0x00,0x7F,0xFC,0xFF,0xF0,0x03,0xFF,0xEF,0xFF,0x00,0x1F,0xFF, // 'k'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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, // 'l'
+  0x00,0x00,0x7F,0x00,0x07,0xF8,0x0F,0xF8,0x3F,0xFE,0x03,0xFF,0xE0,0xFF,0x87,0xFF,0xF8,0x7F,0xFF,0x8F,0xFC,0xFF,0xFF,0xCF,0xFF,0xFC,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0xFF,0xFE,0x1F,0xFF,0xFF,0xF8,0x1F,0xFF,0xC0,0xFF,0xFF,0xFF,0x80,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0x00,0x7F,0xFF,0xFF,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0x00,0x7F,0xFF,0xFE,0x00,0xFF,0xF0,0x07,0xFF, // 'm'
+  0x00,0x00,0x7F,0x00,0xFF,0x83,0xFF,0xE0,0xFF,0x87,0xFF,0xF0,0xFF,0xCF,0xFF,0xF8,0xFF,0xDF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF, // 'n'
+  0x00,0x1F,0xF0,0x00,0x00,0xFF,0xFE,0x00,0x03,0xFF,0xFF,0x80,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xF8,0x3F,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0xFE,0x7F,0xFC,0x3F,0xFE,0xFF,0xF8,0x1F,0xFE,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0x7F,0xF8,0x1F,0xFE,0x7F,0xFC,0x3F,0xFE,0x7F,0xFF,0xFF,0xFE,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x01,0xFF,0xFF,0xC0,0x00,0xFF,0xFF,0x00,0x00,0x1F,0xF8,0x00, // 'o'
+  0x00,0x00,0x7F,0x00,0xFF,0xC1,0xFF,0xC0,0xFF,0xC3,0xFF,0xE0,0xFF,0xC7,0xFF,0xF0,0xFF,0xEF,0xFF,0xF8,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFC,0x3F,0xFE,0xFF,0xF8,0x1F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFC,0x3F,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0xF8,0xFF,0xEF,0xFF,0xF0,0xFF,0xE7,0xFF,0xE0,0xFF,0xE3,0xFF,0xC0,0xFF,0xE0,0xFF,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,0x00,0x00, // 'p'
+  0x00,0xFE,0x00,0x00,0x03,0xFF,0xC3,0xFF,0x07,0xFF,0xE3,0xFF,0x0F,0xFF,0xF3,0xFF,0x1F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFC,0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xF8,0x0F,0xFF,0x7F,0xFC,0x1F,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0x1F,0xFF,0xF7,0xFF,0x0F,0xFF,0xF7,0xFF,0x07,0xFF,0xE7,0xFF,0x03,0xFF,0x87,0xFF,0x00,0xFE,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF,0x00,0x00,0x07,0xFF, // 'q'
+  0x00,0x00,0x7F,0xFF,0x03,0xFF,0xFE,0x0F,0xFF,0xFC,0x3F,0xFF,0xFC,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xF7,0xFF,0xF0,0x0F,0xFF,0x80,0x1F,0xFE,0x00,0x3F,0xFC,0x00,0x7F,0xF8,0x00,0xFF,0xE0,0x01,0xFF,0xC0,0x03,0xFF,0x80,0x07,0xFF,0x00,0x0F,0xFE,0x00,0x1F,0xFC,0x00,0x3F,0xF8,0x00,0x7F,0xF0,0x00,0xFF,0xE0,0x01,0xFF,0xC0,0x03,0xFF,0x80,0x07,0xFF,0x00,0x0F,0xFE,0x00,0x1F,0xFC,0x00,0x3F,0xF8,0x00,0x7F,0xF0,0x00,0xFF,0xE0,0x01,0xFF,0xC0,0x00, // 'r'
+  0x00,0x7F,0xE0,0x00,0x7F,0xFF,0xC0,0x3F,0xFF,0xFE,0x0F,0xFF,0xFF,0xE3,0xFF,0xFF,0xFC,0x7F,0xFF,0xFF,0x1F,0xFF,0xFF,0xE3,0xFF,0xFF,0xF8,0x7F,0xF0,0x7F,0x1F,0xFC,0x00,0xE3,0xFF,0xC0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0xF0,0x00,0xFF,0xFF,0x80,0x1F,0xFF,0xFC,0x01,0xFF,0xFF,0xE0,0x3F,0xFF,0xFE,0x03,0xFF,0xFF,0xE0,0x1F,0xFF,0xFE,0x01,0xFF,0xFF,0xE0,0x0F,0xFF,0xFC,0x00,0x7F,0xFF,0x80,0x01,0xFF,0xF0,0x00,0x0F,0xFF,0x00,0x00,0xFF,0xEE,0x00,0x1F,0xFD,0xFC,0x07,0xFF,0x3F,0xFF,0xFF,0xE7,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xE3,0xFF,0xFF,0xF8,0x7F,0xFF,0xFE,0x0F,0xFF,0xFF,0x00,0x1F,0xFF,0x00,0x00, // 's'
+  0x00,0xFE,0x00,0x01,0xFE,0x00,0x01,0xFE,0x00,0x03,0xFE,0x00,0x03,0xFE,0x00,0x07,0xFE,0x00,0x07,0xFE,0x00,0x0F,0xFF,0xFF,0x1F,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFE,0x00,0x0F,0xFF,0x03,0x0F,0xFF,0xFF,0x0F,0xFF,0xFF,0x0F,0xFF,0xFF,0x07,0xFF,0xFF,0x07,0xFF,0xFF,0x03,0xFF,0xFF,0x03,0xFF,0xFF,0x00,0xFF,0xFE,0x00,0x3F,0xF0, // 't'
+  0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0xF0,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x3F,0xFF,0xFB,0xFF,0x1F,0xFF,0xF3,0xFF,0x0F,0xFF,0xE1,0xFF,0x07,0xFF,0xC1,0xFF,0x01,0xFE,0x00,0x00, // 'u'
+  0xFF,0xF0,0x00,0x7F,0xFB,0xFF,0x80,0x03,0xFF,0x9F,0xFE,0x00,0x3F,0xFC,0xFF,0xF0,0x01,0xFF,0xE3,0xFF,0x80,0x0F,0xFE,0x1F,0xFE,0x00,0xFF,0xF0,0x7F,0xF0,0x07,0xFF,0x03,0xFF,0x80,0x3F,0xF8,0x1F,0xFC,0x03,0xFF,0xC0,0x7F,0xF0,0x1F,0xFC,0x03,0xFF,0x80,0xFF,0xE0,0x1F,0xFC,0x0F,0xFF,0x00,0x7F,0xF0,0x7F,0xF0,0x03,0xFF,0x83,0xFF,0x80,0x0F,0xFC,0x1F,0xF8,0x00,0x7F,0xF1,0xFF,0xC0,0x03,0xFF,0x8F,0xFE,0x00,0x0F,0xFC,0x7F,0xE0,0x00,0x7F,0xE7,0xFF,0x00,0x01,0xFF,0xBF,0xF0,0x00,0x0F,0xFD,0xFF,0x80,0x00,0x7F,0xEF,0xFC,0x00,0x01,0xFF,0xFF,0xC0,0x00,0x0F,0xFF,0xFE,0x00,0x00,0x3F,0xFF,0xE0,0x00,0x01,0xFF,0xFF,0x00,0x00,0x0F,0xFF,0xF8,0x00,0x00,0x3F,0xFF,0x80,0x00,0x01,0xFF,0xFC,0x00,0x00,0x0F,0xFF,0xE0,0x00,0x00,0x3F,0xFE,0x00,0x00,0x01,0xFF,0xF0,0x00,0x00,0x07,0xFF,0x00,0x00, // 'v'
+  0xFF,0xE0,0x0F,0xFF,0x80,0x3F,0xFF,0xFF,0x00,0x7F,0xFC,0x01,0xFF,0xFF,0xFC,0x03,0xFF,0xE0,0x0F,0xFE,0xFF,0xE0,0x3F,0xFF,0x80,0xFF,0xE7,0xFF,0x01,0xFF,0xFC,0x07,0xFF,0x3F,0xF8,0x0F,0xFF,0xE0,0x3F,0xF8,0xFF,0xC0,0x7F,0xFF,0x01,0xFF,0x87,0xFF,0x07,0xFF,0xFC,0x1F,0xFC,0x3F,0xF8,0x3F,0xFF,0xE0,0xFF,0xE1,0xFF,0xC1,0xFE,0xFF,0x07,0xFF,0x07,0xFE,0x0F,0xF7,0xF8,0x3F,0xF0,0x3F,0xF0,0x7F,0xBF,0xC1,0xFF,0x81,0xFF,0xC7,0xFD,0xFF,0x1F,0xFC,0x0F,0xFE,0x3F,0xCF,0xF8,0xFF,0xE0,0x3F,0xF1,0xFE,0x7F,0xC7,0xFE,0x01,0xFF,0x8F,0xF1,0xFE,0x3F,0xF0,0x0F,0xFC,0xFF,0x8F,0xF3,0xFF,0x80,0x3F,0xF7,0xFC,0x7F,0xDF,0xF8,0x01,0xFF,0xBF,0xC3,0xFE,0xFF,0xC0,0x0F,0xFD,0xFE,0x0F,0xF7,0xFE,0x00,0x7F,0xEF,0xF0,0x7F,0xBF,0xF0,0x01,0xFF,0x7F,0x83,0xFD,0xFF,0x00,0x0F,0xFF,0xF8,0x1F,0xEF,0xF8,0x00,0x7F,0xFF,0xC0,0x7F,0xFF,0xC0,0x03,0xFF,0xFE,0x03,0xFF,0xFC,0x00,0x0F,0xFF,0xF0,0x1F,0xFF,0xE0,0x00,0x7F,0xFF,0x00,0xFF,0xFF,0x00,0x03,0xFF,0xF8,0x07,0xFF,0xF8,0x00,0x0F,0xFF,0xC0,0x1F,0xFF,0x80,0x00,0x7F,0xFE,0x00,0xFF,0xFC,0x00,0x03,0xFF,0xF0,0x07,0xFF,0xE0,0x00,0x1F,0xFF,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xF8,0x00,0xFF,0xF0,0x00, // 'w'
+  0x7F,0xFC,0x00,0xFF,0xF8,0xFF,0xF8,0x07,0xFF,0xC3,0xFF,0xE0,0x1F,0xFF,0x07,0xFF,0xC0,0xFF,0xF8,0x0F,0xFF,0x03,0xFF,0xC0,0x3F,0xFE,0x1F,0xFF,0x00,0x7F,0xF8,0x7F,0xF8,0x00,0xFF,0xF3,0xFF,0xC0,0x03,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0x3F,0xFF,0xFF,0x00,0x00,0x7F,0xFF,0xF8,0x00,0x01,0xFF,0xFF,0xE0,0x00,0x03,0xFF,0xFF,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x1F,0xFF,0xE0,0x00,0x00,0xFF,0xFF,0xC0,0x00,0x03,0xFF,0xFF,0x00,0x00,0x1F,0xFF,0xFE,0x00,0x00,0xFF,0xFF,0xFC,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0xFF,0xFF,0xFF,0xC0,0x03,0xFF,0xCF,0xFF,0x00,0x1F,0xFF,0x3F,0xFE,0x00,0xFF,0xF8,0x7F,0xFC,0x03,0xFF,0xC0,0xFF,0xF0,0x1F,0xFF,0x03,0xFF,0xE0,0x7F,0xF8,0x07,0xFF,0x83,0xFF,0xE0,0x1F,0xFF,0x1F,0xFF,0x00,0x3F,0xFE,0x7F,0xFC,0x00,0xFF,0xF8, // 'x'
+  0xFF,0xF0,0x00,0x7F,0xFB,0xFF,0x80,0x03,0xFF,0x9F,0xFE,0x00,0x1F,0xFC,0xFF,0xF0,0x01,0xFF,0xE3,0xFF,0x80,0x0F,0xFE,0x1F,0xFE,0x00,0x7F,0xF0,0x7F,0xF0,0x07,0xFF,0x83,0xFF,0x80,0x3F,0xF8,0x1F,0xFE,0x01,0xFF,0xC0,0x7F,0xF0,0x1F,0xFC,0x03,0xFF,0x80,0xFF,0xE0,0x0F,0xFE,0x07,0xFF,0x00,0x7F,0xF0,0x7F,0xF0,0x03,0xFF,0x83,0xFF,0x80,0x0F,0xFC,0x1F,0xF8,0x00,0x7F,0xF1,0xFF,0xC0,0x01,0xFF,0x8F,0xFE,0x00,0x0F,0xFC,0x7F,0xE0,0x00,0x7F,0xF7,0xFF,0x00,0x01,0xFF,0xBF,0xF8,0x00,0x0F,0xFD,0xFF,0x80,0x00,0x3F,0xEF,0xFC,0x00,0x01,0xFF,0xFF,0xC0,0x00,0x07,0xFF,0xFE,0x00,0x00,0x3F,0xFF,0xF0,0x00,0x01,0xFF,0xFF,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x3F,0xFF,0xC0,0x00,0x00,0xFF,0xFC,0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x3F,0xFE,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x07,0xFF,0x80,0x00,0x00,0x3F,0xF8,0x00,0x00,0x03,0xFF,0xC0,0x00,0x00,0x1F,0xFC,0x00,0x00,0x01,0xFF,0xE0,0x00,0x00,0x3F,0xFF,0x00,0x00,0x7F,0xFF,0xF0,0x00,0x03,0xFF,0xFF,0x80,0x00,0x1F,0xFF,0xF8,0x00,0x00,0xFF,0xFF,0x80,0x00,0x07,0xFF,0xF8,0x00,0x00,0x3F,0xFF,0x80,0x00,0x01,0xFF,0xF8,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00, // 'y'
+  0x7F,0xFF,0xFF,0xE7,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xE7,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xE7,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xE7,0xFF,0xFF,0xFE,0x7F,0xFF,0xFF,0xC0,0x00,0x7F,0xF8,0x00,0x07,0xFF,0x00,0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x3F,0xF8,0x00,0x07,0xFF,0x80,0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x03,0xFF,0xC0,0x00,0x3F,0xFC,0x00,0x07,0xFF,0x80,0x00,0xFF,0xF0,0x00,0x1F,0xFE,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,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, // 'z'
+  0x00,0x01,0xFC,0x00,0x7F,0xF0,0x03,0xFF,0xC0,0x1F,0xFF,0x00,0xFF,0xFC,0x03,0xFF,0xF0,0x1F,0xFF,0xC0,0x7F,0xFF,0x01,0xFF,0xE0,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0xFF,0xC0,0x03,0xFF,0x00,0x3F,0xFC,0x0F,0xFF,0xF0,0x3F,0xFF,0x80,0xFF,0xFC,0x03,0xFF,0xE0,0x0F,0xF8,0x00,0x3F,0xFE,0x00,0xFF,0xFC,0x03,0xFF,0xF8,0x0F,0xFF,0xF0,0x07,0xFF,0xC0,0x07,0xFF,0x00,0x0F,0xFC,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0xE0,0x07,0xFF,0xF0,0x1F,0xFF,0xC0,0x3F,0xFF,0x00,0xFF,0xFC,0x01,0xFF,0xF0,0x03,0xFF,0xC0,0x07,0xFF,0x00,0x01,0xFC, // '{'
+  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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, // '|'
+  0xFE,0x00,0x03,0xFF,0x00,0x0F,0xFF,0x00,0x3F,0xFE,0x00,0xFF,0xFC,0x03,0xFF,0xF0,0x0F,0xFF,0xE0,0x3F,0xFF,0x80,0x1F,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x00,0xFF,0xC0,0x03,0xFF,0x00,0x0F,0xFF,0x00,0x3F,0xFF,0xC0,0x7F,0xFF,0x00,0xFF,0xFC,0x01,0xFF,0xF0,0x00,0x7F,0xC0,0x1F,0xFF,0x00,0xFF,0xFC,0x07,0xFF,0xF0,0x3F,0xFF,0xC0,0xFF,0xF8,0x03,0xFF,0x80,0x1F,0xFC,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x07,0xFE,0x00,0x1F,0xF8,0x00,0x7F,0xE0,0x01,0xFF,0x80,0x1F,0xFE,0x03,0xFF,0xF8,0x0F,0xFF,0xE0,0x3F,0xFF,0x00,0xFF,0xFC,0x03,0xFF,0xE0,0x0F,0xFF,0x00,0x3F,0xF8,0x00,0xFE,0x00,0x00 // '}'
+};
+const GFXglyph Open_Sans_ExtraBold_60Glyphs[] PROGMEM = {
+// bitmapOffset, width, height, xAdvance, xOffset, yOffset
+    {     0,   1,   1,  17,    0,    0 }, // ' '
+    {     1,  13,  44,  18,    2,  -43 }, // '!'
+    {    73,  24,  15,  32,    4,  -43 }, // '"'
+    {   118,  38,  43,  41,    1,  -43 }, // '#'
+    {   323,  31,  49,  36,    2,  -46 }, // '$'
+    {   513,  55,  43,  58,    1,  -43 }, // '%'
+    {   809,  46,  44,  49,    2,  -43 }, // '&'
+    {  1062,  10,  15,  19,    4,  -43 }, // '''
+    {  1081,  17,  54,  23,    3,  -45 }, // '('
+    {  1196,  17,  54,  23,    2,  -45 }, // ')'
+    {  1311,  30,  29,  33,    1,  -46 }, // '*'
+    {  1420,  30,  29,  35,    2,  -36 }, // '+'
+    {  1529,  13,  17,  20,    2,   -9 }, // ','
+    {  1557,  17,   9,  20,    1,  -21 }, // '-'
+    {  1577,  12,  11,  18,    3,  -10 }, // '.'
+    {  1594,  27,  44,  28,    0,  -43 }, // '/'
+    {  1743,  31,  44,  36,    2,  -43 }, // '0'
+    {  1914,  26,  43,  36,    2,  -43 }, // '1'
+    {  2054,  32,  43,  36,    1,  -43 }, // '2'
+    {  2226,  31,  44,  36,    2,  -43 }, // '3'
+    {  2397,  33,  43,  36,    1,  -43 }, // '4'
+    {  2575,  29,  44,  36,    3,  -43 }, // '5'
+    {  2735,  31,  44,  36,    2,  -43 }, // '6'
+    {  2906,  31,  43,  36,    2,  -43 }, // '7'
+    {  3073,  31,  44,  36,    2,  -43 }, // '8'
+    {  3244,  31,  44,  36,    2,  -43 }, // '9'
+    {  3415,  13,  35,  18,    2,  -34 }, // ':'
+    {  3472,  13,  42,  19,    2,  -34 }, // ';'
+    {  3541,  30,  33,  35,    2,  -38 }, // '<'
+    {  3665,  30,  21,  35,    2,  -31 }, // '='
+    {  3744,  30,  33,  35,    2,  -38 }, // '>'
+    {  3868,  29,  44,  31,    0,  -43 }, // '?'
+    {  4028,  50,  48,  55,    2,  -43 }, // '@'
+    {  4328,  44,  43,  45,    0,  -43 }, // 'A'
+    {  4565,  32,  43,  41,    5,  -43 }, // 'B'
+    {  4737,  34,  44,  40,    3,  -43 }, // 'C'
+    {  4924,  36,  43,  45,    5,  -43 }, // 'D'
+    {  5118,  25,  43,  34,    5,  -43 }, // 'E'
+    {  5253,  25,  43,  33,    5,  -43 }, // 'F'
+    {  5388,  37,  44,  45,    3,  -43 }, // 'G'
+    {  5592,  36,  43,  47,    5,  -43 }, // 'H'
+    {  5786,  11,  43,  22,    5,  -43 }, // 'I'
+    {  5846,  21,  56,  22,   -5,  -43 }, // 'J'
+    {  5993,  36,  43,  42,    5,  -43 }, // 'K'
+    {  6187,  28,  43,  36,    5,  -43 }, // 'L'
+    {  6338,  48,  43,  59,    5,  -43 }, // 'M'
+    {  6596,  40,  43,  51,    5,  -43 }, // 'N'
+    {  6811,  42,  45,  49,    3,  -44 }, // 'O'
+    {  7048,  31,  43,  39,    5,  -43 }, // 'P'
+    {  7215,  43,  55,  49,    3,  -44 }, // 'Q'
+    {  7511,  37,  43,  42,    5,  -43 }, // 'R'
+    {  7710,  30,  44,  36,    3,  -43 }, // 'S'
+    {  7875,  33,  43,  36,    1,  -43 }, // 'T'
+    {  8053,  37,  44,  46,    4,  -43 }, // 'U'
+    {  8257,  42,  43,  43,    0,  -43 }, // 'V'
+    {  8483,  60,  43,  63,    1,  -43 }, // 'W'
+    {  8806,  43,  43,  44,    0,  -43 }, // 'X'
+    {  9038,  40,  43,  41,    0,  -43 }, // 'Y'
+    {  9253,  33,  43,  38,    2,  -43 }, // 'Z'
+    {  9431,  15,  55,  20,    3,  -45 }, // '['
+    {  9535,  27,  44,  28,    0,  -43 }, // '\'
+    {  9684,  15,  55,  20,    1,  -45 }, // ']'
+    {  9788,  33,  28,  33,    0,  -43 }, // '^'
+    {  9904,  30,   7,  31,    0,    4 }, // '_'
+    {  9931,  20,  10,  37,    8,  -46 }, // '`'
+    {  9956,  31,  35,  38,    2,  -34 }, // 'a'
+    { 10092,  32,  47,  40,    4,  -46 }, // 'b'
+    { 10280,  28,  35,  33,    3,  -34 }, // 'c'
+    { 10403,  32,  47,  40,    3,  -46 }, // 'd'
+    { 10591,  31,  35,  38,    3,  -34 }, // 'e'
+    { 10727,  25,  46,  26,    1,  -46 }, // 'f'
+    { 10871,  34,  48,  37,    1,  -34 }, // 'g'
+    { 11075,  32,  46,  41,    4,  -46 }, // 'h'
+    { 11259,  12,  47,  21,    4,  -47 }, // 'i'
+    { 11330,  19,  61,  20,   -3,  -47 }, // 'j'
+    { 11475,  36,  46,  41,    4,  -46 }, // 'k'
+    { 11682,  11,  46,  20,    4,  -46 }, // 'l'
+    { 11746,  52,  34,  61,    4,  -34 }, // 'm'
+    { 11967,  32,  34,  41,    4,  -34 }, // 'n'
+    { 12103,  32,  35,  39,    3,  -34 }, // 'o'
+    { 12243,  32,  48,  40,    4,  -34 }, // 'p'
+    { 12435,  32,  48,  40,    3,  -34 }, // 'q'
+    { 12627,  23,  34,  29,    4,  -34 }, // 'r'
+    { 12725,  27,  35,  33,    3,  -34 }, // 's'
+    { 12844,  24,  41,  29,    2,  -40 }, // 't'
+    { 12967,  32,  34,  41,    4,  -33 }, // 'u'
+    { 13103,  37,  33,  38,    0,  -33 }, // 'v'
+    { 13256,  53,  33,  56,    1,  -33 }, // 'w'
+    { 13475,  38,  33,  39,    0,  -33 }, // 'x'
+    { 13632,  37,  47,  38,    0,  -33 }, // 'y'
+    { 13850,  28,  33,  31,    1,  -33 }, // 'z'
+    { 13966,  22,  53,  27,    2,  -43 }, // '{'
+    { 14112,   7,  59,  32,   12,  -46 }, // '|'
+    { 14164,  22,  53,  27,    2,  -43 } // '}'
+};
+const GFXfont Open_Sans_ExtraBold_60 PROGMEM = {
+(uint8_t  *)Open_Sans_ExtraBold_60Bitmaps,(GFXglyph *)Open_Sans_ExtraBold_60Glyphs,0x20, 0x7E, 83};

+ 258 - 0
extras/tests/GxEPD2_OTP/GDEW075Z08_OTP.cpp

@@ -0,0 +1,258 @@
+#include "GDEW075Z08_OTP.h"
+
+#pragma GCC diagnostic ignored "-Wunused-variable"
+
+void GDEW075Z08_OTP::check()
+{
+  //read_TSC();
+  read_temperature();
+  //  read_revision();
+  //  read_status();
+  //read_vcom();
+  read_otp();
+  //  for (int i = 0; i < 10; i++) // 10 temperature ranges
+  //  {
+  //    read_LUT_TR(i);
+  //  }
+}
+
+void GDEW075Z08_OTP::read_TSC()
+{
+  display.epd2._writeCommand(0x40);
+  display.epd2._waitWhileBusy("read_TSC time");
+  uint8_t msb = display.epd2._readData();
+  uint8_t lsb = display.epd2._readData();
+  Serial.print("read_TSC: 0x"); Serial.print(msb, HEX); Serial.print(", 0x"); Serial.println(lsb, HEX);
+}
+
+void GDEW075Z08_OTP::read_temperature()
+{
+  display.epd2._writeCommand(0x43);
+  display.epd2._waitWhileBusy("read_temperature time");
+  uint8_t msb = display.epd2._readData();
+  uint8_t lsb = display.epd2._readData();
+  Serial.print("read_temperature: "); Serial.print(msb); Serial.print(", "); Serial.println(lsb);
+}
+
+void GDEW075Z08_OTP::read_revision()
+{
+  display.epd2._writeCommand(0x70);
+  uint8_t rv = display.epd2._readData();
+  Serial.print("read_revision: "); Serial.println(rv);
+}
+
+void GDEW075Z08_OTP::read_status()
+{
+  display.epd2._writeCommand(0x71);
+  uint8_t rv = display.epd2._readData();
+  Serial.print("read_status: 0x"); Serial.println(rv, HEX);
+}
+
+void GDEW075Z08_OTP::read_vcom()
+{
+  display.epd2._writeCommand(0x81);
+  uint8_t rv = display.epd2._readData();
+  Serial.print("read_vcom: 0x"); Serial.println(rv, HEX);
+}
+
+void GDEW075Z08_OTP::read_otp()
+{
+  uint16_t addr = 0;
+  uint8_t value = 0;
+  Serial.println("read_otp");
+  display.epd2._writeCommand(0xA2);
+  display.epd2._waitWhileBusy("read_otp");
+  value = display.epd2._readData(); addr++;
+  Serial.print("Check Code: 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("LUT Version: 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 0 (TB0): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 1 (TB1): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 2 (TB2): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 3 (TB3): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 4 (TB4): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 5 (TB5): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 6 (TB6): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 7 (TB7): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 8 (TB8): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 9 (TB9): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  //Serial.print("Temperature Boundary 10 (TB10): 0x"); Serial.println(value, HEX);
+  //value = display.epd2._readData(); addr++;
+  Serial.print("CDS : Check Code 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : PSR 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : PFS 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : BTST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : BTST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : BTST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : KWOPT 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : CDI 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : CDI 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TCON 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TRES 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TRES 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TRES 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : GSST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : GSST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : GSST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : PWS 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : LVSEL 0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (; addr < 0x49; addr++)
+  {
+    if (0 == addr % 6) Serial.print(" ");
+    if (0 == addr % 12) Serial.println();
+    uint8_t rv = display.epd2._readData();
+    Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+  }
+  Serial.println();
+  for (int i = 0; i < 9; i++) // 10 temperature ranges, 9 used for 3-color
+  {
+    read_LUT(addr);
+  }
+  //read_LUT_KW(addr); // not used on this panel
+}
+
+void GDEW075Z08_OTP::read_LUT_TR(int n)
+{
+  uint8_t value = 0;
+  int addr = 0x0049 + n * (0x0140 - 0x0049); // 0x0049: @LUT_TR0, 0x140: @LUT_TR1
+  Serial.print("read_LUT_TR("); Serial.print(n); Serial.print(")"); Serial.print(" @ 0x"); Serial.println(addr, HEX);
+  display.epd2._writeCommand(0xA2);
+  display.epd2._waitWhileBusy();
+  for (int skip = 0; skip < addr; skip++)
+  {
+    uint8_t v = display.epd2._readData();
+  }
+  value = display.epd2._readData(); addr++;
+  Serial.print("Frame Rate[3:0],VCOM_HV,VG Voltage[2:0] 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("0b, VCEND, VDH Voltage[5:0]             0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("BDEND[1:0], VDL Voltage [5:0]           0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON[9:8], VDHR Voltage [5:0]            0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON [7:0]                               0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("00b, VCOM_DC[5:0]                       0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("??                                      0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (int lut = 0; lut < 4; lut++) // there are 4 groups for UC8179 in KWR (LUTC, LUTR,  LUTW, LUTK)
+  {
+    for (int r = 0; r < 10; r++)     // there are 10 entries per group
+    {
+      for (int c = 0; c < 6; c++)   // each entry has 6 values
+      {
+        uint8_t rv = display.epd2._readData(); addr++;
+        Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+      }
+      Serial.println();
+    }
+    Serial.println();
+  }
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  Serial.println();
+}
+
+void GDEW075Z08_OTP::read_LUT(uint16_t &addr)
+{
+  uint8_t value = 0;
+  uint16_t n = addr / (0x0140 - 0x0049); // 0x0049: @LUT_TR0, 0x140: @LUT_TR1
+  Serial.print("read_LUT "); Serial.print(n); Serial.print(" @ 0x"); Serial.println(addr, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Frame Rate[3:0],VCOM_HV,VG Voltage[2:0] 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("0b, VCEND, VDH Voltage[5:0]             0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("BDEND[1:0], VDL Voltage [5:0]           0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON[9:8], VDHR Voltage [5:0]            0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON [7:0]                               0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("00b, VCOM_DC[5:0]                       0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("??                                      0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (int lut = 0; lut < 4; lut++) // there are 4 groups for UC8179 in KWR (LUTC, LUTR,  LUTW, LUTK)
+  {
+    for (int r = 0; r < 10; r++)     // there are 10 entries per group
+    {
+      for (int c = 0; c < 6; c++)   // each entry has 6 values
+      {
+        uint8_t rv = display.epd2._readData(); addr++;
+        Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+      }
+      Serial.println();
+    }
+    Serial.println();
+  }
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  Serial.println();
+}
+
+void GDEW075Z08_OTP::read_LUT_KW(uint16_t &addr)
+{
+  uint8_t value = 0;
+  uint16_t n = addr / (0x0140 - 0x0049); // 0x0049: @LUT_TR0, 0x140: @LUT_TR1
+  Serial.print("read_LUT_KW "); Serial.print(n); Serial.print(" @ 0x"); Serial.println(addr, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Frame Rate[3:0],VCOM_HV,VG Voltage[2:0] 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("0b, VCEND, VDH Voltage[5:0]             0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("BDEND[1:0], VDL Voltage [5:0]           0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON[9:8], VDHR Voltage [5:0]            0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON [7:0]                               0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("00b, VCOM_DC[5:0]                       0x"); Serial.println(value, HEX);
+  //value = display.epd2._readData(); addr++;
+  //Serial.print("??                                      0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (int lut = 0; lut < 5; lut++) // there are 5 groups for UC8179 in KW (LUTC, LUTWW,  LUTKW, LUTWK, LUTKK)
+  {
+    for (int r = 0; r < 7; r++)     // there are 7 entries per group
+    {
+      for (int c = 0; c < 6; c++)   // each entry has 6 values
+      {
+        uint8_t rv = display.epd2._readData(); addr++;
+        Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+      }
+      Serial.println();
+    }
+    Serial.println();
+  }
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  Serial.println();
+}

+ 24 - 0
extras/tests/GxEPD2_OTP/GDEW075Z08_OTP.h

@@ -0,0 +1,24 @@
+#ifndef _GDEW075Z08_OTP_H_
+#define _GDEW075Z08_OTP_H_
+
+#include <GxEPD2_GFX.h>
+
+class GDEW075Z08_OTP
+{
+  public:
+    GDEW075Z08_OTP(GxEPD2_GFX& gfx) : display(gfx) {};
+    void check();
+    void read_TSC();
+    void read_temperature();
+    void read_revision();
+    void read_status();
+    void read_vcom();
+    void read_otp();
+    void read_LUT_TR(int n);
+    void read_LUT(uint16_t &addr);
+    void read_LUT_KW(uint16_t &addr);
+  private:
+    GxEPD2_GFX& display;
+};
+
+#endif

+ 258 - 0
extras/tests/GxEPD2_OTP/GDEY075Z08_OTP.cpp

@@ -0,0 +1,258 @@
+#include "GDEY075Z08_OTP.h"
+
+#pragma GCC diagnostic ignored "-Wunused-variable"
+
+void GDEY075Z08_OTP::check()
+{
+  //read_TSC();
+  read_temperature();
+  //  read_revision();
+  //  read_status();
+  //read_vcom();
+  read_otp();
+  //  for (int i = 0; i < 10; i++) // 10 temperature ranges
+  //  {
+  //    read_LUT_TR(i);
+  //  }
+}
+
+void GDEY075Z08_OTP::read_TSC()
+{
+  display.epd2._writeCommand(0x40);
+  display.epd2._waitWhileBusy("read_TSC time");
+  uint8_t msb = display.epd2._readData();
+  uint8_t lsb = display.epd2._readData();
+  Serial.print("read_TSC: 0x"); Serial.print(msb, HEX); Serial.print(", 0x"); Serial.println(lsb, HEX);
+}
+
+void GDEY075Z08_OTP::read_temperature()
+{
+  display.epd2._writeCommand(0x43);
+  display.epd2._waitWhileBusy("read_temperature time");
+  uint8_t msb = display.epd2._readData();
+  uint8_t lsb = display.epd2._readData();
+  Serial.print("read_temperature: "); Serial.print(msb); Serial.print(", "); Serial.println(lsb);
+}
+
+void GDEY075Z08_OTP::read_revision()
+{
+  display.epd2._writeCommand(0x70);
+  uint8_t rv = display.epd2._readData();
+  Serial.print("read_revision: "); Serial.println(rv);
+}
+
+void GDEY075Z08_OTP::read_status()
+{
+  display.epd2._writeCommand(0x71);
+  uint8_t rv = display.epd2._readData();
+  Serial.print("read_status: 0x"); Serial.println(rv, HEX);
+}
+
+void GDEY075Z08_OTP::read_vcom()
+{
+  display.epd2._writeCommand(0x81);
+  uint8_t rv = display.epd2._readData();
+  Serial.print("read_vcom: 0x"); Serial.println(rv, HEX);
+}
+
+void GDEY075Z08_OTP::read_otp()
+{
+  uint16_t addr = 0;
+  uint8_t value = 0;
+  Serial.println("read_otp");
+  display.epd2._writeCommand(0xA2);
+  display.epd2._waitWhileBusy("read_otp");
+  value = display.epd2._readData(); addr++;
+  Serial.print("Check Code: 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("LUT Version: 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 0 (TB0): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 1 (TB1): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 2 (TB2): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 3 (TB3): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 4 (TB4): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 5 (TB5): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 6 (TB6): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 7 (TB7): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 8 (TB8): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Temperature Boundary 9 (TB9): 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  //Serial.print("Temperature Boundary 10 (TB10): 0x"); Serial.println(value, HEX);
+  //value = display.epd2._readData(); addr++;
+  Serial.print("CDS : Check Code 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : PSR 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : PFS 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : BTST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : BTST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : BTST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : KWOPT 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : CDI 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : CDI 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TCON 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TRES 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TRES 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : TRES 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : GSST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : GSST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : GSST 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : PWS 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("CDS : LVSEL 0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (; addr < 0x49; addr++)
+  {
+    if (0 == addr % 6) Serial.print(" ");
+    if (0 == addr % 12) Serial.println();
+    uint8_t rv = display.epd2._readData();
+    Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+  }
+  Serial.println();
+  for (int i = 0; i < 7; i++) // 10 temperature ranges, 7 used for 3-color
+  {
+    read_LUT(addr);
+  }
+  read_LUT_KW(addr); // one used for b/w, with different format
+}
+
+void GDEY075Z08_OTP::read_LUT_TR(int n)
+{
+  uint8_t value = 0;
+  int addr = 0x0049 + n * (0x0140 - 0x0049); // 0x0049: @LUT_TR0, 0x140: @LUT_TR1
+  Serial.print("read_LUT_TR("); Serial.print(n); Serial.print(")"); Serial.print(" @ 0x"); Serial.println(addr, HEX);
+  display.epd2._writeCommand(0xA2);
+  display.epd2._waitWhileBusy();
+  for (int skip = 0; skip < addr; skip++)
+  {
+    uint8_t v = display.epd2._readData();
+  }
+  value = display.epd2._readData(); addr++;
+  Serial.print("Frame Rate[3:0],VCOM_HV,VG Voltage[2:0] 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("0b, VCEND, VDH Voltage[5:0]             0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("BDEND[1:0], VDL Voltage [5:0]           0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON[9:8], VDHR Voltage [5:0]            0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON [7:0]                               0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("00b, VCOM_DC[5:0]                       0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("??                                      0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (int lut = 0; lut < 4; lut++) // there are 4 groups for UC8179 in KWR (LUTC, LUTR,  LUTW, LUTK)
+  {
+    for (int r = 0; r < 10; r++)     // there are 10 entries per group
+    {
+      for (int c = 0; c < 6; c++)   // each entry has 6 values
+      {
+        uint8_t rv = display.epd2._readData(); addr++;
+        Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+      }
+      Serial.println();
+    }
+    Serial.println();
+  }
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  Serial.println();
+}
+
+void GDEY075Z08_OTP::read_LUT(uint16_t &addr)
+{
+  uint8_t value = 0;
+  uint16_t n = addr / (0x0140 - 0x0049); // 0x0049: @LUT_TR0, 0x140: @LUT_TR1
+  Serial.print("read_LUT "); Serial.print(n); Serial.print(" @ 0x"); Serial.println(addr, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Frame Rate[3:0],VCOM_HV,VG Voltage[2:0] 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("0b, VCEND, VDH Voltage[5:0]             0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("BDEND[1:0], VDL Voltage [5:0]           0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON[9:8], VDHR Voltage [5:0]            0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON [7:0]                               0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("00b, VCOM_DC[5:0]                       0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("??                                      0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (int lut = 0; lut < 4; lut++) // there are 4 groups for UC8179 in KWR (LUTC, LUTR,  LUTW, LUTK)
+  {
+    for (int r = 0; r < 10; r++)     // there are 10 entries per group
+    {
+      for (int c = 0; c < 6; c++)   // each entry has 6 values
+      {
+        uint8_t rv = display.epd2._readData(); addr++;
+        Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+      }
+      Serial.println();
+    }
+    Serial.println();
+  }
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  Serial.println();
+}
+
+void GDEY075Z08_OTP::read_LUT_KW(uint16_t &addr)
+{
+  uint8_t value = 0;
+  uint16_t n = addr / (0x0140 - 0x0049); // 0x0049: @LUT_TR0, 0x140: @LUT_TR1
+  Serial.print("read_LUT_KW "); Serial.print(n); Serial.print(" @ 0x"); Serial.println(addr, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("Frame Rate[3:0],VCOM_HV,VG Voltage[2:0] 0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("0b, VCEND, VDH Voltage[5:0]             0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("BDEND[1:0], VDL Voltage [5:0]           0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON[9:8], VDHR Voltage [5:0]            0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("XON [7:0]                               0x"); Serial.println(value, HEX);
+  value = display.epd2._readData(); addr++;
+  Serial.print("00b, VCOM_DC[5:0]                       0x"); Serial.println(value, HEX);
+  //value = display.epd2._readData(); addr++;
+  //Serial.print("??                                      0x"); Serial.println(value, HEX);
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  for (int lut = 0; lut < 5; lut++) // there are 5 groups for UC8179 in KW (LUTC, LUTWW,  LUTKW, LUTWK, LUTKK)
+  {
+    for (int r = 0; r < 7; r++)     // there are 7 entries per group
+    {
+      for (int c = 0; c < 6; c++)   // each entry has 6 values
+      {
+        uint8_t rv = display.epd2._readData(); addr++;
+        Serial.print("0x"); Serial.print(rv, HEX); Serial.print(", ");
+      }
+      Serial.println();
+    }
+    Serial.println();
+  }
+  Serial.print("@ 0x"); Serial.println(addr, HEX);
+  Serial.println();
+}

+ 24 - 0
extras/tests/GxEPD2_OTP/GDEY075Z08_OTP.h

@@ -0,0 +1,24 @@
+#ifndef _GDEY075Z08_OTP_H_
+#define _GDEY075Z08_OTP_H_
+
+#include <GxEPD2_GFX.h>
+
+class GDEY075Z08_OTP
+{
+  public:
+    GDEY075Z08_OTP(GxEPD2_GFX& gfx) : display(gfx) {};
+    void check();
+    void read_TSC();
+    void read_temperature();
+    void read_revision();
+    void read_status();
+    void read_vcom();
+    void read_otp();
+    void read_LUT_TR(int n);
+    void read_LUT(uint16_t &addr);
+    void read_LUT_KW(uint16_t &addr);
+  private:
+    GxEPD2_GFX& display;
+};
+
+#endif

+ 205 - 0
extras/tests/GxEPD2_OTP/GxEPD2_OTP.ino

@@ -0,0 +1,205 @@
+// 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!
+//
+// Display Library based on Demo Example from Good Display: http://www.e-paper-display.com/download_list/downloadcategoryid=34&isMode=false.html
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#define ENABLE_GxEPD2_GFX 1
+
+// uncomment next line to use class GFX of library GFX_Root instead of Adafruit_GFX
+//#include <GFX.h>
+
+#include <GxEPD2_BW.h>
+#include <GxEPD2_3C.h>
+#include <Fonts/FreeMonoBold9pt7b.h>
+
+// these have never been finished, and are not checked-in yet
+//#include "GDEH0154D67_OTP.h" // SSD1681
+//#include "GDEH0154M10_OTP.h" // UC8151D
+//#include "GDEW026T0_OTP.h"   // UC8151 (IL0373)
+//#include "GDEW029T5_OTP.h"   // UC8151 (IL0373)
+//#include "GDEW029T5D_OTP.h"  // UC8151D
+//#include "GDEH029Z13_OTP.h"  // UC8151D
+//#include "GDEH0213Z19_OTP.h" // UC8151D
+//#include "GDEW0371W7_OTP.h"  // UC8171 (IL0324)
+//#include "GDEW042T2_OTP.h"   // UC8176 (IL0398)
+//#include "GDEW075T7_OTP.h"   // GD7965
+//#include "GDEY075T7_OTP.h"   // UC8179
+//#include "GDEH075Z90_OTP.h"  // SSD1677
+// only these are actually updated
+#include "GDEW075Z08_OTP.h"  // GD7965
+#include "GDEY075Z08_OTP.h"  // UC8179
+
+#if defined (ESP8266)
+// select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0154D67
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154T8 152x152
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154M09 200x200
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0154M10 152x152
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0213B72
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH0213B73
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0213I5F
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029T5
+//GxEPD2_BW<GxEPD2_290_T5D, GxEPD2_290_T5D::HEIGHT> display(GxEPD2_290_T5D(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW029T5D
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_BW<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_BW<GxEPD2_420_M01, GxEPD2_420_M01::HEIGHT> display(GxEPD2_420_M01(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW042M01
+// 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_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+// 3-color e-papers
+//GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_3C<GxEPD2_213_Z19c, GxEPD2_213_Z19c::HEIGHT> display(GxEPD2_213_Z19c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEW0213Z19
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+//GxEPD2_3C<GxEPD2_290_Z13c, GxEPD2_290_Z13c::HEIGHT> display(GxEPD2_290_Z13c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEH029Z13
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+// can use only half buffer size
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT / 2> display(GxEPD2_420c(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4));
+// can use only quarter buffer size
+//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<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> 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
+// 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!
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT / 8> display(GxEPD2_it60(/*CS=5*/ SS, /*DC=*/ 0, /*RST=*/ 2, /*BUSY=*/ 4));
+
+// ***** for mapping of Waveshare e-Paper ESP8266 Driver Board *****
+// select one , can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEP015OC1 no longer available
+//GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0154D67
+//GxEPD2_BW<GxEPD2_154_T8, GxEPD2_154_T8::HEIGHT> display(GxEPD2_154_T8(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154T8 152x152
+//GxEPD2_BW<GxEPD2_154_M09, GxEPD2_154_M09::HEIGHT> display(GxEPD2_154_M09(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154M09 200x200
+//GxEPD2_BW<GxEPD2_154_M10, GxEPD2_154_M10::HEIGHT> display(GxEPD2_154_M10(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154M10 152x152
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0213B72
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0213B73
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0213I5F
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW029T5
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_BW<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+// 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));
+//GxEPD2_BW < GxEPD2_750, GxEPD2_750::HEIGHT / 2 > display(GxEPD2_750(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//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
+// 3-color e-papers
+//GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW0154Z04 no longer available
+//GxEPD2_3C<GxEPD2_154_Z90c, GxEPD2_154_Z90c::HEIGHT> display(GxEPD2_154_Z90c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH0154Z90
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+// can use only half buffer size
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT / 2> display(GxEPD2_420c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+// can use only quarter buffer size
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT / 4> display(GxEPD2_583c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT / 4> display(GxEPD2_750c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5));
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT / 4> display(GxEPD2_750c_Z08(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEW075Z08 800x480
+//GxEPD2_3C<GxEPD2_750c_Z90, GxEPD2_750c_Z90::HEIGHT / 4> display(GxEPD2_750c_Z90(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // GDEH075Z90 880x528
+// 7-color e-paper
+//GxEPD2_7C < GxEPD2_565c, GxEPD2_565c::HEIGHT / 4 > display(GxEPD2_565c(/*CS=15*/ SS, /*DC=4*/ 4, /*RST=2*/ 2, /*BUSY=5*/ 5)); // Waveshare 5.65" 7-color
+#endif
+
+#if defined(ESP32)
+// select one and adapt to your mapping, can use full buffer size (full HEIGHT)
+//GxEPD2_BW<GxEPD2_154, GxEPD2_154::HEIGHT> display(GxEPD2_154(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDE0213B1, phased out
+//GxEPD2_BW<GxEPD2_213_B72, GxEPD2_213_B72::HEIGHT> display(GxEPD2_213_B72(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0213B72
+//GxEPD2_BW<GxEPD2_213_B73, GxEPD2_213_B73::HEIGHT> display(GxEPD2_213_B73(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEH0213B73
+//GxEPD2_BW<GxEPD2_213_flex, GxEPD2_213_flex::HEIGHT> display(GxEPD2_213_flex(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW0213I5F
+//GxEPD2_BW<GxEPD2_290, GxEPD2_290::HEIGHT> display(GxEPD2_290(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_290_T5, GxEPD2_290_T5::HEIGHT> display(GxEPD2_290_T5(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW029T5
+//GxEPD2_BW<GxEPD2_260, GxEPD2_260::HEIGHT> display(GxEPD2_260(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_371, GxEPD2_371::HEIGHT> display(GxEPD2_371(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> display(GxEPD2_420(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_583, GxEPD2_583::HEIGHT> display(GxEPD2_583(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_750, GxEPD2_750::HEIGHT> display(GxEPD2_750(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_750_YT7, GxEPD2_750_YT7::HEIGHT> display(GxEPD2_750_YT7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_BW<GxEPD2_750_GDEY075T7, GxEPD2_750_GDEY075T7::HEIGHT> display(GxEPD2_750_GDEY075T7(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075T7 800x480, UC8179 (GD7965)
+// 3-color e-papers
+//GxEPD2_3C<GxEPD2_154c, GxEPD2_154c::HEIGHT> display(GxEPD2_154c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_213c, GxEPD2_213c::HEIGHT> display(GxEPD2_213c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_290c, GxEPD2_290c::HEIGHT> display(GxEPD2_290c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_270c, GxEPD2_270c::HEIGHT> display(GxEPD2_270c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_583c, GxEPD2_583c::HEIGHT> display(GxEPD2_583c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_750c, GxEPD2_750c::HEIGHT> display(GxEPD2_750c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+//GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(GxEPD2_750c_Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08 800x480
+//GxEPD2_3C < GxEPD2_750c_GDEW075Z08, GxEPD2_750c_GDEW075Z08::HEIGHT / 4 > display(GxEPD2_750c_GDEW075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEW075Z08
+GxEPD2_3C<GxEPD2_750c_GDEY075Z08, GxEPD2_750c_GDEY075Z08::HEIGHT / 4> display(GxEPD2_750c_GDEY075Z08(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // GDEY075Z08
+// 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
+// note: 5V supply needs to be exact and strong; 5V over diode from USB (e.g. Wemos D1 mini) doesn't work!
+//GxEPD2_BW<GxEPD2_it60, GxEPD2_it60::HEIGHT> display(GxEPD2_it60(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4));
+#endif
+
+void setup()
+{
+  Serial.begin(115200);
+  Serial.println();
+  Serial.println("setup");
+  delay(100);
+  display.epd2.init(SCK, MOSI, 115200, true, 20, false); // sw_spi
+  display.init(115200);
+  helloWorld();
+  // these have never been finished, and are not checked-in yet
+  //GDEH0154D67_OTP(display).check();
+  //GDEH0154M10_OTP(display).check();
+  //GDEW029T5_OTP(display).check();
+  //GDEW029T5D_OTP(display).check();
+  //GDEH029Z13_OTP(display).check();
+  //GDEH0213Z19_OTP(display).check();
+  //GDEW026T0_OTP(display).check();
+  //GDEW0371W7_OTP(display).check();
+  //GDEW042T2_OTP(display).check();
+  //GDEW075T7_OTP(display).check();
+  //GDEH075Z90_OTP(display).check();
+  //GDEW1248T3_OTP(display).check();
+  // only these are actually updated
+  //GDEW075Z08_OTP(display).check();
+  GDEY075Z08_OTP(display).check();
+}
+
+void loop()
+{
+}
+
+const char HelloWorld[] = "Hello World!";
+
+void helloWorld()
+{
+  //Serial.println("helloWorld");
+  display.setRotation(1);
+  display.setFont(&FreeMonoBold9pt7b);
+  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:
+  uint16_t x = ((display.width() - tbw) / 2) - tbx;
+  uint16_t y = ((display.height() - tbh) / 2) - tby;
+  display.setFullWindow();
+  display.firstPage();
+  do
+  {
+    display.fillScreen(GxEPD_WHITE);
+    display.setCursor(x, y);
+    display.print(HelloWorld);
+  }
+  while (display.nextPage());
+  //Serial.println("helloWorld done");
+}

+ 1 - 1
extras/tests/GxEPD2_RefreshTests/GxEPD2_RefreshTests.ino

@@ -15,7 +15,7 @@
 //#define USE_HSPI_FOR_EPD
 
 // uncomment next line to use class GFX of library GFX_Root instead of Adafruit_GFX
-#include <GFX.h>
+//#include <GFX.h>
 // Note: if you use this with ENABLE_GxEPD2_GFX 1:
 //       uncomment it in GxEPD2_GFX.h too, or add #include <GFX.h> before any #include <GxEPD2_GFX.h>
 

+ 1 - 1
library.properties

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

+ 1 - 0
src/GxEPD2.h

@@ -114,6 +114,7 @@ class GxEPD2
       GDEW0583Z83,
       GDEW075Z09,  Waveshare_7_5_bwr = GDEW075Z09,
       GDEW075Z08,  Waveshare_7_5_bwr_Z08 = GDEW075Z08,
+      GDEY075Z08,
       GDEH075Z90,  Waveshare_7_5_bwr_Z90 = GDEH075Z90,
       GDEY116Z91,
       GDEY1248Z51,

+ 15 - 8
src/GxEPD2_3C.h

@@ -108,6 +108,12 @@
 #if __has_include("epd3c/GxEPD2_750c_Z90.h")
 #include "epd3c/GxEPD2_750c_Z90.h"
 #endif
+#if __has_include("epd3c/GxEPD2_750c_GDEW075Z08.h")
+#include "epd3c/GxEPD2_750c_GDEW075Z08.h"
+#endif
+#if __has_include("gdey3c/GxEPD2_750c_GDEY075Z08.h")
+#include "gdey3c/GxEPD2_750c_GDEY075Z08.h"
+#endif
 #if __has_include("gdey3c/GxEPD2_1160c_GDEY116Z91.h")
 #include "gdey3c/GxEPD2_1160c_GDEY116Z91.h"
 #endif
@@ -275,9 +281,9 @@ class GxEPD2_3C : public GxEPD2_GFX_BASE_CLASS
       w = gx_uint16_min(w, width() - x);
       h = gx_uint16_min(h, height() - y);
       _rotate(x, y, w, h);
-      epd2.writeImagePartNew(_black_buffer, x, y, GxEPD2_Type::WIDTH, _page_height, x, y, w, h);
+      epd2.writeImagePartToCurrent(_black_buffer, x, y, GxEPD2_Type::WIDTH, _page_height, x, y, w, h);
       epd2.refresh_bw(x, y, w, h);
-      epd2.writeImagePartPrevious(_black_buffer, x, y, GxEPD2_Type::WIDTH, _page_height, x, y, w, h);
+      epd2.writeImagePartToPrevious(_black_buffer, x, y, GxEPD2_Type::WIDTH, _page_height, x, y, w, h);
     }
 
     void setFullWindow()
@@ -391,15 +397,16 @@ class GxEPD2_3C : public GxEPD2_GFX_BASE_CLASS
       {
         if (_using_partial_mode)
         {
-          epd2.writeImageNew(_black_buffer, _pw_x, _pw_y, _pw_w, _pw_h);
+          epd2.writeImageToCurrent(_black_buffer, _pw_x, _pw_y, _pw_w, _pw_h);
           epd2.refresh_bw(_pw_x, _pw_y, _pw_w, _pw_h);
-          epd2.writeImagePrevious(_black_buffer, _pw_x, _pw_y, _pw_w, _pw_h);
+          epd2.writeImageToPrevious(_black_buffer, _pw_x, _pw_y, _pw_w, _pw_h);
+          epd2.writeImageToCurrent(_black_buffer, _pw_x, _pw_y, _pw_w, _pw_h);
         }
         else // full update
         {
           epd2.writeImage(_black_buffer, 0, 0, GxEPD2_Type::WIDTH, HEIGHT);
           epd2.refresh(false);
-          epd2.writeImagePrevious(_black_buffer, 0, 0, GxEPD2_Type::WIDTH, HEIGHT);
+          epd2.writeImageToPrevious(_black_buffer, 0, 0, GxEPD2_Type::WIDTH, HEIGHT);
           epd2.powerOff();
         }
         return false;
@@ -416,8 +423,8 @@ class GxEPD2_3C : public GxEPD2_GFX_BASE_CLASS
         {
           //Serial.print("writeImage("); Serial.print(_pw_x); Serial.print(", "); Serial.print(dest_ys); Serial.print(", ");
           //Serial.print(_pw_w); Serial.print(", "); Serial.print(dest_ye - dest_ys); Serial.println(")");
-          if (!_second_phase) epd2.writeImageNew(_black_buffer, _pw_x, dest_ys, _pw_w, dest_ye - dest_ys);
-          else epd2.writeImagePrevious(_black_buffer, _pw_x, dest_ys, _pw_w, dest_ye - dest_ys);
+          epd2.writeImageToCurrent(_black_buffer, _pw_x, dest_ys, _pw_w, dest_ye - dest_ys);
+          if (_second_phase)  epd2.writeImageToPrevious(_black_buffer, _pw_x, dest_ys, _pw_w, dest_ye - dest_ys);
         }
         else
         {
@@ -444,7 +451,7 @@ class GxEPD2_3C : public GxEPD2_GFX_BASE_CLASS
       else // full update
       {
         if (!_second_phase) epd2.writeImage(_black_buffer, 0, page_ys, GxEPD2_Type::WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
-        else epd2.writeImagePrevious(_black_buffer, 0, page_ys, GxEPD2_Type::WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
+        else epd2.writeImageToPrevious(_black_buffer, 0, page_ys, GxEPD2_Type::WIDTH, gx_uint16_min(_page_height, HEIGHT - page_ys));
         _current_page++;
         if (_current_page == _pages)
         {

+ 60 - 0
src/GxEPD2_EPD.cpp

@@ -32,6 +32,8 @@ GxEPD2_EPD::GxEPD2_EPD(int16_t cs, int16_t dc, int16_t rst, int16_t busy, int16_
   _reset_duration = 10;
   _busy_callback = 0;
   _busy_callback_parameter = 0;
+  _sck = -1;
+  _mosi = -1;
 }
 
 void GxEPD2_EPD::init(uint32_t serial_diag_bitrate)
@@ -286,3 +288,61 @@ void GxEPD2_EPD::_endTransfer()
   if (_cs >= 0) digitalWrite(_cs, HIGH);
   _pSPIx->endTransaction();
 }
+
+void GxEPD2_EPD::init(int16_t sck, int16_t mosi, uint32_t serial_diag_bitrate, bool initial, uint16_t reset_duration, bool pulldown_rst_mode)
+{
+  _sck = sck;
+  _mosi = mosi;
+  init(serial_diag_bitrate, initial, reset_duration, pulldown_rst_mode);
+}
+
+uint8_t GxEPD2_EPD::_readData()
+{
+  uint8_t data = 0;
+  if ((_sck >= 0) && (_mosi >= 0))
+  {
+    _pSPIx->end();
+    digitalWrite(_sck, LOW);
+    pinMode(_sck, OUTPUT);
+    digitalWrite(_sck, LOW);
+    pinMode(_mosi, INPUT);
+    if (_cs >= 0) digitalWrite(_cs, LOW);
+    for (int i = 0; i < 8; i++)
+    {
+      data <<= 1;
+      digitalWrite(_sck, HIGH);
+      data |= digitalRead(_mosi);
+      digitalWrite(_sck, LOW);
+    }
+    if (_cs >= 0) digitalWrite(_cs, HIGH);
+    _pSPIx->begin();
+  }
+  return data;
+}
+
+void GxEPD2_EPD::_readData(uint8_t* data, uint16_t n)
+{
+  if ((_sck >= 0) && (_mosi >= 0))
+  {
+    _pSPIx->end();
+    digitalWrite(_sck, LOW);
+    pinMode(_sck, OUTPUT);
+    digitalWrite(_sck, LOW);
+    pinMode(_mosi, INPUT);
+    if (_cs >= 0) digitalWrite(_cs, LOW);
+    for (uint8_t i = 0; i < n; i++)
+    {
+      *data = 0;
+      for (int i = 0; i < 8; i++)
+      {
+        *data <<= 1;
+        digitalWrite(_sck, HIGH);
+        *data |= digitalRead(_mosi);
+        digitalWrite(_sck, LOW);
+      }
+      data++;
+    }
+    if (_cs >= 0) digitalWrite(_cs, HIGH);
+    _pSPIx->begin();
+  }
+}

+ 6 - 0
src/GxEPD2_EPD.h

@@ -35,6 +35,7 @@ class GxEPD2_EPD
                uint16_t w, uint16_t h, GxEPD2::Panel p, bool c, bool pu, bool fpu);
     virtual void init(uint32_t serial_diag_bitrate = 0); // serial_diag_bitrate = 0 : disabled
     virtual void init(uint32_t serial_diag_bitrate, bool initial, uint16_t reset_duration = 10, bool pulldown_rst_mode = false);
+    virtual void init(int16_t sck, int16_t mosi, uint32_t serial_diag_bitrate, bool initial, uint16_t reset_duration = 20, bool pulldown_rst_mode = false);
     virtual void end(); // release SPI and control pins
     //  Support for Bitmaps (Sprites) to Controller Buffer and to Screen
     virtual void clearScreen(uint8_t value) = 0; // init controller memory and screen (default white)
@@ -116,8 +117,12 @@ class GxEPD2_EPD
     void _startTransfer();
     void _transfer(uint8_t value);
     void _endTransfer();
+    // additions for read from OTP
+    uint8_t _readData();
+    void _readData(uint8_t* data, uint16_t n);
   protected:
     int16_t _cs, _dc, _rst, _busy, _busy_level;
+    int16_t _sck, _mosi;
     uint32_t _busy_timeout;
     bool _diag_enabled, _pulldown_rst_mode;
     SPIClass* _pSPIx;
@@ -128,6 +133,7 @@ class GxEPD2_EPD
     uint16_t _reset_duration;
     void (*_busy_callback)(const void*);
     const void* _busy_callback_parameter;
+#include <GxEPD2_EPD_friends.h>
 };
 
 #endif

+ 14 - 0
src/GxEPD2_EPD_friends.h

@@ -0,0 +1,14 @@
+friend class GDEH0154D67_OTP;
+friend class GDEH0154M10_OTP;
+friend class GDEW026T0_OTP;
+friend class GDEW029T5_OTP;
+friend class GDEW029T5D_OTP;
+friend class GDEH029Z13_OTP;
+friend class GDEH0213Z19_OTP;
+friend class GDEW0371W7_OTP;
+friend class GDEW042T2_OTP;
+friend class GDEW075T7_OTP;
+friend class GDEY075T7_OTP;
+friend class GDEH075Z90_OTP;
+friend class GDEW075Z08_OTP;
+friend class GDEY075Z08_OTP;

+ 8 - 8
src/epd3c/GxEPD2_213_Z19c.cpp

@@ -127,14 +127,14 @@ void GxEPD2_213_Z19c::_writeImage(uint8_t command, const uint8_t* bitmap, int16_
   delay(1); // yield() to avoid WDT on ESP8266 and ESP32
 }
 
-void GxEPD2_213_Z19c::writeImagePrevious(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+void GxEPD2_213_Z19c::writeImageToPrevious(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, black, x, y, w, h, invert, mirror_y, pgm);
+  _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
-void GxEPD2_213_Z19c::writeImageNew(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+void GxEPD2_213_Z19c::writeImageToCurrent(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, black, x, y, w, h, invert, mirror_y, pgm);
+  _writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
 void GxEPD2_213_Z19c::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
@@ -204,16 +204,16 @@ void GxEPD2_213_Z19c::_writeImagePart(uint8_t command, const uint8_t* bitmap, in
   delay(1); // yield() to avoid WDT on ESP8266 and ESP32
 }
 
-void GxEPD2_213_Z19c::writeImagePartPrevious(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+void GxEPD2_213_Z19c::writeImagePartToPrevious(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, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  _writeImagePart(0x10, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
-void GxEPD2_213_Z19c::writeImagePartNew(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+void GxEPD2_213_Z19c::writeImagePartToCurrent(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, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  _writeImagePart(0x13, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
 void GxEPD2_213_Z19c::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)

+ 4 - 4
src/epd3c/GxEPD2_213_Z19c.h

@@ -44,13 +44,13 @@ class GxEPD2_213_Z19c : public GxEPD2_EPD
     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 writeImagePrevious(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
-    void writeImageNew(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeImageToPrevious(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 writeImageToCurrent(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* 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);
-    void writeImagePartPrevious(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+    void writeImagePartToPrevious(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 writeImagePartNew(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+    void writeImagePartToCurrent(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);

+ 8 - 8
src/epd3c/GxEPD2_290_Z13c.cpp

@@ -127,14 +127,14 @@ void GxEPD2_290_Z13c::_writeImage(uint8_t command, const uint8_t* bitmap, int16_
   delay(1); // yield() to avoid WDT on ESP8266 and ESP32
 }
 
-void GxEPD2_290_Z13c::writeImagePrevious(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+void GxEPD2_290_Z13c::writeImageToPrevious(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, black, x, y, w, h, invert, mirror_y, pgm);
+  _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
-void GxEPD2_290_Z13c::writeImageNew(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+void GxEPD2_290_Z13c::writeImageToCurrent(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, black, x, y, w, h, invert, mirror_y, pgm);
+  _writeImage(0x13, bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
 void GxEPD2_290_Z13c::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
@@ -204,16 +204,16 @@ void GxEPD2_290_Z13c::_writeImagePart(uint8_t command, const uint8_t* bitmap, in
   delay(1); // yield() to avoid WDT on ESP8266 and ESP32
 }
 
-void GxEPD2_290_Z13c::writeImagePartPrevious(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+void GxEPD2_290_Z13c::writeImagePartToPrevious(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, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  _writeImagePart(0x10, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
-void GxEPD2_290_Z13c::writeImagePartNew(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+void GxEPD2_290_Z13c::writeImagePartToCurrent(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, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  _writeImagePart(0x13, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
 void GxEPD2_290_Z13c::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)

+ 4 - 4
src/epd3c/GxEPD2_290_Z13c.h

@@ -44,13 +44,13 @@ class GxEPD2_290_Z13c : public GxEPD2_EPD
     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 writeImagePrevious(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
-    void writeImageNew(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeImageToPrevious(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 writeImageToCurrent(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* 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);
-    void writeImagePartPrevious(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+    void writeImagePartToPrevious(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 writeImagePartNew(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+    void writeImagePartToCurrent(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);

+ 490 - 0
src/epd3c/GxEPD2_750c_GDEW075Z08.cpp

@@ -0,0 +1,490 @@
+// 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: http://www.e-paper-display.com/download_detail/downloadsId=808.html
+// Panel: GDEW075Z08 : http://www.e-paper-display.com/products_detail/productId=457.html
+// Controller: GD7965 : http://www.e-paper-display.com/download_detail/downloadsId=821.html
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#include "GxEPD2_750c_GDEW075Z08.h"
+
+GxEPD2_750c_GDEW075Z08::GxEPD2_750c_GDEW075Z08(int16_t cs, int16_t dc, int16_t rst, int16_t busy) :
+  GxEPD2_EPD(cs, dc, rst, busy, LOW, 20000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
+{
+}
+
+void GxEPD2_750c_GDEW075Z08::clearScreen(uint8_t value)
+{
+  clearScreen(value, 0xFF);
+}
+
+void GxEPD2_750c_GDEW075Z08::clearScreen(uint8_t black_value, uint8_t color_value)
+{
+  writeScreenBuffer(black_value, color_value);
+  refresh(false);
+}
+
+void GxEPD2_750c_GDEW075Z08::writeScreenBuffer(uint8_t value)
+{
+  writeScreenBuffer(value, 0xFF);
+}
+
+void GxEPD2_750c_GDEW075Z08::writeScreenBuffer(uint8_t black_value, uint8_t color_value)
+{
+  if (!_init_display_done) _InitDisplay();
+  _writeScreenBuffer(0x10, black_value); // set black/white
+  _writeScreenBuffer(0x13, color_value); // set red/white
+  _initial_write = false; // initial full screen buffer clean done
+}
+
+void GxEPD2_750c_GDEW075Z08::_writeScreenBuffer(uint8_t command, uint8_t value)
+{
+  //_writeCommand(0x91); // partial in
+  _setPartialRamArea(0, 0, WIDTH, HEIGHT);
+  _writeCommand(command);
+  _startTransfer();
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _transfer(value);
+  }
+  _endTransfer();
+  //_writeCommand(0x92); // partial out
+}
+
+void GxEPD2_750c_GDEW075Z08::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  _writeScreenBuffer(0x13, 0xFF); // set red/white
+  _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEW075Z08::_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
+  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();
+  _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 = 0xFF;
+      // 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_750c_GDEW075Z08::writeImageToPrevious(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_750c_GDEW075Z08::writeImageToCurrent(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);
+}
+
+void GxEPD2_750c_GDEW075Z08::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(0x10, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEW075Z08::_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;
+  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();
+  _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!
+      uint32_t idx = mirror_y ? x_part / 8 + j + dx / 8 + uint32_t((h_bitmap - 1 - (y_part + i + dy))) * wb_bitmap : x_part / 8 + j + dx / 8 + uint32_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_750c_GDEW075Z08::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(0x10, black, x, y, w, h, invert, mirror_y, pgm);
+  if (color) _writeImage(0x13, color, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEW075Z08::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(0x10, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  if (color) _writeImagePart(0x13, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEW075Z08::writeImagePartToPrevious(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_750c_GDEW075Z08::writeImagePartToCurrent(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);
+}
+
+void GxEPD2_750c_GDEW075Z08::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_750c_GDEW075Z08::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_750c_GDEW075Z08::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_750c_GDEW075Z08::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_750c_GDEW075Z08::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_750c_GDEW075Z08::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_750c_GDEW075Z08::refresh(bool partial_update_mode)
+{
+  if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
+  else _Update_Full();
+}
+
+void GxEPD2_750c_GDEW075Z08::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
+{
+  // 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 (usePartialUpdate) _writeCommand(0x91); // partial in
+  _setPartialRamArea(x1, y1, w1, h1);
+  _Update_Part();
+  if (usePartialUpdate) _writeCommand(0x92); // partial out
+}
+
+void GxEPD2_750c_GDEW075Z08::powerOff()
+{
+  _PowerOff();
+}
+
+void GxEPD2_750c_GDEW075Z08::hibernate()
+{
+  _PowerOff();
+  if (_rst >= 0)
+  {
+    _writeCommand(0x07); // deep sleep
+    _writeData(0xA5);    // check code
+    _hibernating = true;
+    _init_display_done = false;
+  }
+}
+
+void GxEPD2_750c_GDEW075Z08::_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
+  xe |= 0x0007; // byte boundary
+  _writeCommand(0x90); // partial window
+  _writeData(x / 256);
+  _writeData(x % 256);
+  _writeData(xe / 256);
+  _writeData(xe % 256);
+  _writeData(y / 256);
+  _writeData(y % 256);
+  _writeData(ye / 256);
+  _writeData(ye % 256);
+  _writeData(0x00);
+}
+
+void GxEPD2_750c_GDEW075Z08::_PowerOn()
+{
+  if (!_power_is_on)
+  {
+    _writeCommand(0x04);
+    _waitWhileBusy("_PowerOn", power_on_time);
+  }
+  _power_is_on = true;
+}
+
+void GxEPD2_750c_GDEW075Z08::_PowerOff()
+{
+  if (_power_is_on)
+  {
+    _writeCommand(0x02); // power off
+    _waitWhileBusy("_PowerOff", power_off_time);
+    _power_is_on = false;
+  }
+}
+
+void GxEPD2_750c_GDEW075Z08::_InitDisplay()
+{
+  if (_hibernating) _reset();
+  _writeCommand(0x01); // POWER SETTING
+  _writeData (0x07);
+  _writeData (0x07);   // VGH=20V,VGL=-20V
+  _writeData (0x3f);   // VDH=15V
+  _writeData (0x3f);   // VDL=-15V
+  _writeCommand(0x00); // PANEL SETTING
+  _writeData(0x0f);    // KW: 3f, KWR: 2f, BWROTP: 0f, BWOTP: 1f
+  _writeCommand(0x61);      // resolution setting
+  _writeData (WIDTH / 256); // source 800
+  _writeData (WIDTH % 256);
+  _writeData (HEIGHT / 256); // gate 480
+  _writeData (HEIGHT % 256);
+  _writeCommand(0x15);
+  _writeData(0x00);
+  _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+  _writeData(0x13);    // 0xFF white for black, 0xFF white for red
+  _writeData(0x07);
+  _writeCommand(0x60); // TCON SETTING
+  _writeData(0x22);
+  _init_display_done = true;
+}
+
+void GxEPD2_750c_GDEW075Z08::_Update_Full()
+{
+  _writeCommand(0x00); // PANEL SETTING
+  _writeData(0x0f);    // KW: 3f, KWR: 2F, BWROTP: 0f, BWOTP: 1f
+  _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+  _writeData(0x13);    // 0xFF white for black, 0xFF white for red
+  _writeData(0x07);
+  _PowerOn();
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("_Update_Full", full_refresh_time);
+  _PowerOff();
+}
+
+void GxEPD2_750c_GDEW075Z08::_Update_Part()
+{
+  _writeCommand(0x00); // PANEL SETTING
+  _writeData(0x0f);    // KW: 3f, KWR: 2F, BWROTP: 0f, BWOTP: 1f
+  _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+  _writeData(0x13);    // 0xFF white for black, 0xFF white for red
+  _writeData(0x07);
+  _PowerOn();
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("_Update_Part", partial_refresh_time);
+  _PowerOff();
+}
+
+#define T_BW 40
+#define T_WB 40
+const unsigned char GxEPD2_750c_GDEW075Z08::lut_20_LUTC_partial[] PROGMEM =
+{
+  //0x00, T_BW, T_WB, 0, 0, 1,
+  // from GxEPD2_750c_GDEY075Z08: GDEY075Z08 OTP
+  0x0, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEW075Z08::lut_21_LUTWW_partial[] PROGMEM =
+{ // 10 w
+  //0x00, T_BW, T_WB, 0, 0, 1,
+  // from GxEPD2_750c_GDEY075Z08: GDEY075Z08 OTP
+  0x0, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEW075Z08::lut_22_LUTKW_partial[] PROGMEM =
+{ // 10 w
+  //0x80, T_BW, T_WB, 0, 0, 1,
+  // from GxEPD2_750c_GDEY075Z08: GDEY075Z08 OTP
+  0x20, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x20, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x20, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEW075Z08::lut_23_LUTWK_partial[] PROGMEM =
+{ // 01 b
+  //0x40, T_BW, T_WB, 0, 0, 1,
+  // from GxEPD2_750c_GDEY075Z08: GDEY075Z08 OTP
+  0x40, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x40, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x40, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEW075Z08::lut_24_LUTKK_partial[] PROGMEM =
+{ // 01 b
+  //0x00, T_BW, T_WB, 0, 0, 1,
+  // from GxEPD2_750c_GDEY075Z08: GDEY075Z08 OTP
+  0x0, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEW075Z08::lut_25_LUTBD_partial[] PROGMEM =
+{
+  //0x00, T_BW, T_WB, 0, 0, 1,
+};
+
+void GxEPD2_750c_GDEW075Z08::refresh_bw(int16_t x, int16_t y, int16_t w, int16_t h)
+{
+  x -= x % 8; // byte boundary
+  w -= w % 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
+  w1 -= x1 - x;
+  h1 -= y1 - y;
+  _writeCommand(0x00); // panel setting
+  _writeData(0x3f);    // partial update LUT from registers
+  _writeCommand(0x82); // vcom_DC setting
+  _writeData (0x2F);   // -2.45V same value as in OTP
+  _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+  _writeData(0x10);
+  _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();
+  _writeCommand(0x91); // partial in
+  _setPartialRamArea(x1, y1, w1, h1);
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("refresh_bw", full_refresh_time);
+  _writeCommand(0x92); // partial out
+}

+ 93 - 0
src/epd3c/GxEPD2_750c_GDEW075Z08.h

@@ -0,0 +1,93 @@
+// 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: http://www.e-paper-display.com/download_detail/downloadsId=808.html
+// Panel: GDEW075Z08 : http://www.e-paper-display.com/products_detail/productId=457.html
+// Controller: GD7965 : http://www.e-paper-display.com/download_detail/downloadsId=821.html
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#ifndef _GxEPD2_750c_GDEW075Z08_H_
+#define _GxEPD2_750c_GDEW075Z08_H_
+
+#include "../GxEPD2_EPD.h"
+
+class GxEPD2_750c_GDEW075Z08 : 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::GDEW075Z08;
+    static const bool hasColor = true;
+    static const bool hasPartialUpdate = true;
+    static const bool usePartialUpdate = true; // set false to get better image (flashes full screen)
+    static const bool hasFastPartialUpdate = false; // 3-color mode
+    static const bool hasFastBlackWhiteUpdate = true; // b/w refresh mode
+    static const uint16_t power_on_time = 150; // ms, e.g. 139001us
+    static const uint16_t power_off_time = 30; // ms, e.g. 25001us
+    static const uint16_t full_refresh_time = 18000; // ms, e.g. 17141001us
+    static const uint16_t partial_refresh_time = 18000; // ms, e.g. 17141001us
+    // constructor
+    GxEPD2_750c_GDEW075Z08(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 writeImageToPrevious(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 writeImageToCurrent(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* 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);
+    void writeImagePartToPrevious(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 writeImagePartToCurrent(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 refresh_bw(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen, bw differential
+    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();
+  private:
+    static const unsigned char lut_20_LUTC_partial[];
+    static const unsigned char lut_21_LUTWW_partial[];
+    static const unsigned char lut_22_LUTKW_partial[];
+    static const unsigned char lut_23_LUTWK_partial[];
+    static const unsigned char lut_24_LUTKK_partial[];
+    static const unsigned char lut_25_LUTBD_partial[];
+};
+
+#endif

+ 6 - 6
src/gdey3c/GxEPD2_420c_GDEY042Z98.cpp

@@ -113,14 +113,14 @@ void GxEPD2_420c_GDEY042Z98::_writeImage(uint8_t command, const uint8_t bitmap[]
   delay(1); // yield() to avoid WDT on ESP8266 and ESP32
 }
 
-void GxEPD2_420c_GDEY042Z98::writeImagePrevious(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+void GxEPD2_420c_GDEY042Z98::writeImageToPrevious(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, black, x, y, w, h, invert, mirror_y, pgm);
+  _writeImage(0x26, bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
-void GxEPD2_420c_GDEY042Z98::writeImageNew(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+void GxEPD2_420c_GDEY042Z98::writeImageToCurrent(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, black, x, y, w, h, invert, mirror_y, pgm);
+  _writeImage(0x24, bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
 void GxEPD2_420c_GDEY042Z98::writeImagePart(const uint8_t bitmap[], int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
@@ -196,13 +196,13 @@ void GxEPD2_420c_GDEY042Z98::writeImagePart(const uint8_t* black, const uint8_t*
   if (color) _writeImagePart(0x26, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, !invert, mirror_y, pgm);
 }
 
-void GxEPD2_420c_GDEY042Z98::writeImagePartPrevious(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+void GxEPD2_420c_GDEY042Z98::writeImagePartToPrevious(const uint8_t* black, 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(0x26, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
 }
 
-void GxEPD2_420c_GDEY042Z98::writeImagePartNew(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+void GxEPD2_420c_GDEY042Z98::writeImagePartToCurrent(const uint8_t* black, 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, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);

+ 4 - 4
src/gdey3c/GxEPD2_420c_GDEY042Z98.h

@@ -45,13 +45,13 @@ class GxEPD2_420c_GDEY042Z98 : public GxEPD2_EPD
     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 writeImagePrevious(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
-    void writeImageNew(const uint8_t* black, int16_t x, int16_t y, int16_t w, int16_t h, bool invert = false, bool mirror_y = false, bool pgm = false);
+    void writeImageToPrevious(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 writeImageToCurrent(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* 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);
-    void writeImagePartPrevious(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+    void writeImagePartToPrevious(const uint8_t* black, 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 writeImagePartNew(const uint8_t* black, int16_t x_part, int16_t y_part, int16_t w_bitmap, int16_t h_bitmap,
+    void writeImagePartToCurrent(const uint8_t* black, 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);

+ 553 - 0
src/gdey3c/GxEPD2_750c_GDEY075Z08.cpp

@@ -0,0 +1,553 @@
+// 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/companyfile/1391.html
+// Panel: GDEY075Z08 : https://www.good-display.com/product/394.html
+// Controller: UC8179 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8179.pdf
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#include "GxEPD2_750c_GDEY075Z08.h"
+
+GxEPD2_750c_GDEY075Z08::GxEPD2_750c_GDEY075Z08(int16_t cs, int16_t dc, int16_t rst, int16_t busy) :
+  GxEPD2_EPD(cs, dc, rst, busy, LOW, 30000000, WIDTH, HEIGHT, panel, hasColor, hasPartialUpdate, hasFastPartialUpdate)
+{
+  _use_fast_full_update = useFastFullUpdate;
+}
+
+void GxEPD2_750c_GDEY075Z08::selectFastFullUpdate(bool ff)
+{
+  _use_fast_full_update = ff;
+}
+
+void GxEPD2_750c_GDEY075Z08::clearScreen(uint8_t value)
+{
+  clearScreen(value, 0xFF);
+}
+
+void GxEPD2_750c_GDEY075Z08::clearScreen(uint8_t black_value, uint8_t color_value)
+{
+  writeScreenBuffer(black_value, color_value);
+  refresh(false);
+}
+
+void GxEPD2_750c_GDEY075Z08::writeScreenBuffer(uint8_t value)
+{
+  writeScreenBuffer(value, 0xFF);
+}
+
+void GxEPD2_750c_GDEY075Z08::writeScreenBuffer(uint8_t black_value, uint8_t color_value)
+{
+  if (!_init_display_done) _InitDisplay();
+  _writeScreenBuffer(0x10, black_value); // set black/white
+  _writeScreenBuffer(0x13, color_value); // set red/white
+  _initial_write = false; // initial full screen buffer clean done
+}
+
+void GxEPD2_750c_GDEY075Z08::_writeScreenBuffer(uint8_t command, uint8_t value)
+{
+  //_writeCommand(0x91); // partial in
+  _setPartialRamArea(0, 0, WIDTH, HEIGHT);
+  _writeCommand(command);
+  _startTransfer();
+  for (uint32_t i = 0; i < uint32_t(WIDTH) * uint32_t(HEIGHT) / 8; i++)
+  {
+    _transfer(value);
+  }
+  _endTransfer();
+  //_writeCommand(0x92); // partial out
+}
+
+void GxEPD2_750c_GDEY075Z08::writeImage(const uint8_t bitmap[], int16_t x, int16_t y, int16_t w, int16_t h, bool invert, bool mirror_y, bool pgm)
+{
+  _writeScreenBuffer(0x13, 0xFF); // set red/white
+  _writeImage(0x10, bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEY075Z08::_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
+  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();
+  _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 = 0xFF;
+      // 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_750c_GDEY075Z08::writeImageToPrevious(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_750c_GDEY075Z08::writeImageToCurrent(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);
+}
+
+void GxEPD2_750c_GDEY075Z08::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(0x10, bitmap, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEY075Z08::_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;
+  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();
+  _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!
+      uint32_t idx = mirror_y ? x_part / 8 + j + dx / 8 + uint32_t((h_bitmap - 1 - (y_part + i + dy))) * wb_bitmap : x_part / 8 + j + dx / 8 + uint32_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_750c_GDEY075Z08::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(0x10, black, x, y, w, h, invert, mirror_y, pgm);
+  if (color) _writeImage(0x13, color, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEY075Z08::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(0x10, black, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+  if (color) _writeImagePart(0x13, color, x_part, y_part, w_bitmap, h_bitmap, x, y, w, h, invert, mirror_y, pgm);
+}
+
+void GxEPD2_750c_GDEY075Z08::writeImagePartToPrevious(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_750c_GDEY075Z08::writeImagePartToCurrent(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);
+}
+
+void GxEPD2_750c_GDEY075Z08::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_750c_GDEY075Z08::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_750c_GDEY075Z08::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_750c_GDEY075Z08::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_750c_GDEY075Z08::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_750c_GDEY075Z08::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_750c_GDEY075Z08::refresh(bool partial_update_mode)
+{
+  if (partial_update_mode) refresh(0, 0, WIDTH, HEIGHT);
+  else _Update_Full();
+}
+
+void GxEPD2_750c_GDEY075Z08::refresh(int16_t x, int16_t y, int16_t w, int16_t h)
+{
+  // 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 (usePartialUpdate) _writeCommand(0x91); // partial in
+  _setPartialRamArea(x1, y1, w1, h1);
+  _Update_Part();
+  if (usePartialUpdate) _writeCommand(0x92); // partial out
+}
+
+void GxEPD2_750c_GDEY075Z08::powerOff()
+{
+  _PowerOff();
+}
+
+void GxEPD2_750c_GDEY075Z08::hibernate()
+{
+  _PowerOff();
+  if (_rst >= 0)
+  {
+    _writeCommand(0x07); // deep sleep
+    _writeData(0xA5);    // check code
+    _hibernating = true;
+    _init_display_done = false;
+  }
+}
+
+void GxEPD2_750c_GDEY075Z08::_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
+  xe |= 0x0007; // byte boundary
+  _writeCommand(0x90); // partial window
+  _writeData(x / 256);
+  _writeData(x % 256);
+  _writeData(xe / 256);
+  _writeData(xe % 256);
+  _writeData(y / 256);
+  _writeData(y % 256);
+  _writeData(ye / 256);
+  _writeData(ye % 256);
+  _writeData(0x00);
+}
+
+void GxEPD2_750c_GDEY075Z08::_PowerOn()
+{
+  if (!_power_is_on)
+  {
+    _writeCommand(0x04);
+    _waitWhileBusy("_PowerOn", power_on_time);
+  }
+  _power_is_on = true;
+}
+
+void GxEPD2_750c_GDEY075Z08::_PowerOff()
+{
+  if (_power_is_on)
+  {
+    _writeCommand(0x02); // power off
+    _waitWhileBusy("_PowerOff", power_off_time);
+    _power_is_on = false;
+  }
+}
+
+void GxEPD2_750c_GDEY075Z08::_InitDisplay()
+{
+  if (_hibernating) _reset();
+  _writeCommand(0x01); // POWER SETTING
+  _writeData (0x07);
+  _writeData (0x07);   // VGH=20V,VGL=-20V
+  _writeData (0x3f);   // VDH=15V
+  _writeData (0x3f);   // VDL=-15V
+  _writeCommand(0x06); // Booster Soft Start
+  _writeData (0x17);
+  _writeData (0x17);
+  _writeData (0x28);
+  _writeData (0x17);
+  _writeCommand(0x00); // PANEL SETTING
+  _writeData(0x0f);    // KW: 3f, KWR: 2f, BWROTP: 0f, BWOTP: 1f
+  _writeCommand(0x61); //resolution setting
+  _writeData (WIDTH / 256); //source 800
+  _writeData (WIDTH % 256);
+  _writeData (HEIGHT / 256); //gate 480
+  _writeData (HEIGHT % 256);
+  _writeCommand(0x15);
+  _writeData(0x00);
+  _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+  _writeData(0x13);    // 0xFF white for black, 0xFF white for red
+  _writeData(0x07);
+  _writeCommand(0x60); // TCON SETTING
+  _writeData(0x22);
+  _init_display_done = true;
+}
+
+void GxEPD2_750c_GDEY075Z08::_Update_Full()
+{
+  _writeCommand(0x00); // PANEL SETTING
+  _writeData(0x0f);    // KW: 3f, KWR: 2F, BWROTP: 0f, BWOTP: 1f
+  _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+  _writeData(0x13);    // 0xFF white for black, 0xFF white for red
+  _writeData(0x07);
+  if (_use_fast_full_update)
+  {
+    _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
+  }
+  _PowerOn();
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("_Update_Full", full_refresh_time);
+  _PowerOff();
+}
+
+void GxEPD2_750c_GDEY075Z08::_Update_Part()
+{
+  _writeCommand(0x00); // PANEL SETTING
+  _writeData(0x0f);    // KW: 3f, KWR: 2F, BWROTP: 0f, BWOTP: 1f
+  _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+  _writeData(0x93);    // 0xFF white for black, 0xFF white for red, floating border
+  _writeData(0x07);
+  if (_use_fast_full_update)
+  {
+    _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
+  }
+  _PowerOn();
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("_Update_Part", partial_refresh_time);
+  _PowerOff();
+}
+
+const unsigned char GxEPD2_750c_GDEY075Z08::lut_20_LUTC_partial[] PROGMEM =
+{
+  // original values copied from OTP
+  0x0, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEY075Z08::lut_21_LUTWW_partial[] PROGMEM =
+{ // 10 w
+  // original values copied from OTP, faulty
+  //  0x20, 0x3, 0x5, 0x0, 0x0, 0x2,
+  //  0x20, 0x5, 0x5, 0x0, 0x0, 0x1,
+  //  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  //  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  //  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  //  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  //  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  // values copied from OTP, modified
+  0x0, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEY075Z08::lut_22_LUTKW_partial[] PROGMEM =
+{ // 10 w
+  // original values copied from OTP
+  0x20, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x20, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x20, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEY075Z08::lut_23_LUTWK_partial[] PROGMEM =
+{ // 01 b
+  // original values copied from OTP
+  0x40, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x40, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x40, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEY075Z08::lut_24_LUTKK_partial[] PROGMEM =
+{ // 01 b
+  // original values copied from OTP, faulty
+  //  0x40, 0x3, 0x5, 0x0, 0x0, 0x2,
+  //  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  //  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  //  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  //  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  //  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  //  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  // values copied from OTP, modified
+  0x0, 0x3, 0x5, 0x0, 0x0, 0x2,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x1,
+  0x0, 0x5, 0x5, 0x0, 0x0, 0x3,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+  0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+};
+
+const unsigned char GxEPD2_750c_GDEY075Z08::lut_25_LUTBD_partial[] PROGMEM =
+{
+  //0x00, T_BW, T_WB, 0, 0, 1,
+};
+
+void GxEPD2_750c_GDEY075Z08::refresh_bw(int16_t x, int16_t y, int16_t w, int16_t h)
+{
+  x -= x % 8; // byte boundary
+  w -= w % 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
+  w1 -= x1 - x;
+  h1 -= y1 - y;
+  _writeCommand(0x00); // PANEL SETTING
+  _writeData(0x1f);    // KW: 3f, KWR: 2F, BWROTP: 0f, BWOTP: 1f
+  if (!useFastBlackWhiteUpdateFromOTP)
+  {
+    _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(0xA0);    // floating border
+    _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));
+  }
+  else
+  {
+    _writeCommand(0xE0);
+    _writeData(0x02);
+    _writeCommand(0xE5);
+    _writeData(0x6E);
+    _writeCommand(0x50); // VCOM AND DATA INTERVAL SETTING
+    _writeData(0x80);    // floating border
+    _writeData(0x07);
+  }
+  _PowerOn();
+  _writeCommand(0x91); // partial in
+  _setPartialRamArea(x1, y1, w1, h1);
+  _writeCommand(0x12); //display refresh
+  _waitWhileBusy("refresh_bw", full_refresh_time);
+  _writeCommand(0x92); // partial out
+}

+ 97 - 0
src/gdey3c/GxEPD2_750c_GDEY075Z08.h

@@ -0,0 +1,97 @@
+// 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/companyfile/1391.html
+// Panel: GDEY075Z08 : https://www.good-display.com/product/394.html
+// Controller: UC8179 : https://v4.cecdn.yun300.cn/100001_1909185148/UC8179.pdf
+//
+// Author: Jean-Marc Zingg
+//
+// Version: see library.properties
+//
+// Library: https://github.com/ZinggJM/GxEPD2
+
+#ifndef _GxEPD2_750c_GDEY075Z08_H_
+#define _GxEPD2_750c_GDEY075Z08_H_
+
+#include "../GxEPD2_EPD.h"
+
+class GxEPD2_750c_GDEY075Z08 : 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::GDEY075Z08;
+    static const bool hasColor = true;
+    static const bool hasPartialUpdate = true;
+    static const bool usePartialUpdate = true; // set false to get better image (flashes full screen)
+    static const bool hasFastPartialUpdate = false; // 3-color mode
+    static const bool hasFastBlackWhiteUpdate = true; // b/w refresh mode
+    static const bool useFastFullUpdate = true; // set this false for panels that don't have this waveform in OTP
+    static const bool useFastBlackWhiteUpdateFromOTP = false; // set this false because the OTP waveform is faulty
+    static const uint16_t power_on_time = 150; // ms, e.g. 129000us
+    static const uint16_t power_off_time = 50; // ms, e.g. 40000us
+    static const uint16_t full_refresh_time = 27000; // ms, e.g. 26332000us / 16840001us
+    static const uint16_t partial_refresh_time = 27000; // ms, e.g. 26332000us / 16840001us
+    // constructor
+    GxEPD2_750c_GDEY075Z08(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 writeImageToPrevious(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 writeImageToCurrent(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* 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);
+    void writeImagePartToPrevious(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 writeImagePartToCurrent(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 refresh_bw(int16_t x, int16_t y, int16_t w, int16_t h); // screen refresh from controller memory, partial screen, bw differential
+    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 selectFastFullUpdate(bool);
+  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();
+  private:
+    bool _use_fast_full_update;
+    static const unsigned char lut_20_LUTC_partial[];
+    static const unsigned char lut_21_LUTWW_partial[];
+    static const unsigned char lut_22_LUTKW_partial[];
+    static const unsigned char lut_23_LUTWK_partial[];
+    static const unsigned char lut_24_LUTKK_partial[];
+    static const unsigned char lut_25_LUTBD_partial[];
+};
+
+#endif

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio