diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..89f6be4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "files.associations": { + "array": "cpp", + "deque": "cpp", + "list": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "string_view": "cpp", + "initializer_list": "cpp", + "ranges": "cpp" + } +} \ No newline at end of file diff --git a/include/Dialogue.h b/include/Dialogue.h new file mode 100644 index 0000000..b27cac3 --- /dev/null +++ b/include/Dialogue.h @@ -0,0 +1,26 @@ +#include +#ifdef DIALOGUE + +#ifndef DIALOGUE_FILE_H +#define DIALOGUE_FILE_H + +#include + +/// @brief Setup function of module +void MySetup(); + +/// @brief Reset function of module +void ResetModule(); + +/// @brief Loop function of module +void MyLoop(); + +/// @brief Function called when a message is received +void Received(); + +/// @brief Function called when a message is send in close loop +void ServerSimulation(); + + +#endif // FILE_H +#endif // DIALOGUE \ No newline at end of file diff --git a/include/common.h b/include/common.h index 089bcdd..a7d78a9 100644 --- a/include/common.h +++ b/include/common.h @@ -15,8 +15,9 @@ // Define witch module is used (ONLY ONE) //#define MODEL //#define BREACH +#define DIALOGUE //#define ELECTRICITY -#define ENERGY +//#define ENERGY //#define ENGINE //#define EXTINGUISHER //#define FIRE @@ -55,6 +56,8 @@ #define TYPE "SHI" #elif defined(TORPEDO) #define TYPE "TRP" +#elif defined(DIALOGUE) +#define TYPE "DLG" #else #error "No module selected!" #endif diff --git a/lib/LOLIN_EPD/.gitignore b/lib/LOLIN_EPD/.gitignore new file mode 100644 index 0000000..8c723fd --- /dev/null +++ b/lib/LOLIN_EPD/.gitignore @@ -0,0 +1,2 @@ +.vscode +.build \ No newline at end of file diff --git a/lib/LOLIN_EPD/README.md b/lib/LOLIN_EPD/README.md new file mode 100644 index 0000000..2e6809b --- /dev/null +++ b/lib/LOLIN_EPD/README.md @@ -0,0 +1,4 @@ +# Arduino library for the LOLIN EPD shield +### Installation +- Clone this repository or download&unzip [zip file](https://github.com/wemos/LOLIN_EPD_Library/archive/master.zip) into Arduino/libraries + diff --git a/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_212x104_TRI-COLOR/graphicstest_2_13_inch__212x104_TRI-COLOR.ino b/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_212x104_TRI-COLOR/graphicstest_2_13_inch__212x104_TRI-COLOR.ino new file mode 100644 index 0000000..8849ca6 --- /dev/null +++ b/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_212x104_TRI-COLOR/graphicstest_2_13_inch__212x104_TRI-COLOR.ino @@ -0,0 +1,281 @@ +#include +#include + +float p = 3.1415926; + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_UC8151D EPD(212, 104, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_UC8151D EPD(212, 104, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + +void setup(void) +{ + Serial.begin(115200); + Serial.print("Hello! EPD Test"); + + EPD.begin(); + + Serial.println("Initialized"); + + // large block of text + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", EPD_BLACK); + + delay(5000); + // epd print function! + epdPrintTest(); + delay(5000); + // a single pixel + EPD.clearBuffer(); + EPD.drawPixel(EPD.width() / 2, EPD.height() / 2, EPD_BLACK); + + testtriangles(); + delay(5000); + // line draw test + testlines(EPD_BLACK); + delay(5000); + // optimized lines + testfastlines(EPD_BLACK, EPD_RED); + delay(5000); + testdrawrects(EPD_RED); + delay(5000); + testfillrects(EPD_BLACK, EPD_RED); + delay(5000); + EPD.fillScreen(EPD_WHITE); + testfillcircles(10, EPD_RED); + testdrawcircles(10, EPD_BLACK); + delay(5000); + testroundrects(); + delay(5000); + mediabuttons(); + delay(5000); + Serial.println("done"); +} + +void loop() +{ + delay(500); +} + +void testlines(uint16_t color) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(0, 0, x, EPD.height() - 1, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(0, 0, EPD.width() - 1, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(EPD.width() - 1, 0, x, EPD.height() - 1, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(EPD.width() - 1, 0, 0, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(0, EPD.height() - 1, x, 0, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(0, EPD.height() - 1, EPD.width() - 1, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(EPD.width() - 1, EPD.height() - 1, x, 0, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(EPD.width() - 1, EPD.height() - 1, 0, y, color); + } + EPD.display(); +} + +void testdrawtext(char *text, uint16_t color) +{ + EPD.clearBuffer(); + EPD.setCursor(0, 0); + EPD.setTextColor(color); + EPD.setTextWrap(true); + EPD.print(text); + EPD.display(); +} + +void testfastlines(uint16_t color1, uint16_t color2) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t y = 0; y < EPD.height(); y += 5) + { + EPD.drawFastHLine(0, y, EPD.width(), color1); + } + for (int16_t x = 0; x < EPD.width(); x += 5) + { + EPD.drawFastVLine(x, 0, EPD.height(), color2); + } + EPD.display(); +} + +void testdrawrects(uint16_t color) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawRect(EPD.width() / 2 - x / 2, EPD.height() / 2 - x / 2, x, x, color); + } + EPD.display(); +} + +void testfillrects(uint16_t color1, uint16_t color2) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x = EPD.width() - 1; x > 6; x -= 6) + { + EPD.fillRect(EPD.width() / 2 - x / 2, EPD.height() / 2 - x / 2, x, x, color1); + EPD.drawRect(EPD.width() / 2 - x / 2, EPD.height() / 2 - x / 2, x, x, color2); + } + EPD.display(); +} + +void testfillcircles(uint8_t radius, uint16_t color) +{ + EPD.clearBuffer(); + for (int16_t x = radius; x < EPD.width(); x += radius * 2) + { + for (int16_t y = radius; y < EPD.height(); y += radius * 2) + { + EPD.fillCircle(x, y, radius, color); + } + } + EPD.display(); +} + +void testdrawcircles(uint8_t radius, uint16_t color) +{ + EPD.clearBuffer(); + for (int16_t x = 0; x < EPD.width() + radius; x += radius * 2) + { + for (int16_t y = 0; y < EPD.height() + radius; y += radius * 2) + { + EPD.drawCircle(x, y, radius, color); + } + } + EPD.display(); +} + +void testtriangles() +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + int color = EPD_BLACK; + int t; + int w = EPD.width() / 2; + int x = EPD.height() - 1; + int y = 0; + int z = EPD.width(); + for (t = 0; t <= 15; t++) + { + EPD.drawTriangle(w, y, y, x, z, x, color); + x -= 4; + y += 4; + z -= 4; + if (t == 8) + color = EPD_RED; + } + EPD.display(); +} + +void testroundrects() +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + int color = EPD_BLACK; + int i; + int t; + for (t = 0; t <= 4; t += 1) + { + int x = 0; + int y = 0; + int w = EPD.width() - 2; + int h = EPD.height() - 2; + for (i = 0; i <= 16; i += 1) + { + EPD.drawRoundRect(x, y, w, h, 5, color); + x += 2; + y += 3; + w -= 4; + h -= 6; + if (i == 7) + color = EPD_RED; + } + color = EPD_BLACK; + } + EPD.display(); +} + +void epdPrintTest() +{ + EPD.clearBuffer(); + EPD.setCursor(2, 0); + EPD.fillScreen(EPD_WHITE); + EPD.setTextColor(EPD_BLACK); + EPD.setTextSize(2); + EPD.println("Hello World!"); + EPD.setTextSize(1); + EPD.setTextColor(EPD_RED); + EPD.print(p, 6); + EPD.println(" Want pi?"); + EPD.println(" "); + EPD.print(8675309, HEX); // print 8,675,309 out in HEX! + EPD.println(" Print HEX!"); + EPD.println(" "); + EPD.setTextColor(EPD_BLACK); + EPD.println("Sketch has been"); + EPD.println("running for: "); + EPD.setTextColor(EPD_RED); + EPD.print(millis() / 1000); + EPD.setTextColor(EPD_BLACK); + EPD.print(" seconds."); + EPD.display(); +} + +void mediabuttons() +{ + EPD.clearBuffer(); + // play + EPD.fillScreen(EPD_WHITE); + EPD.fillRoundRect(25, 10, 78, 60, 8, EPD_BLACK); + EPD.fillTriangle(42, 20, 42, 60, 90, 40, EPD_RED); + // pause + EPD.fillRoundRect(25, 90, 78, 60, 8, EPD_BLACK); + EPD.fillRoundRect(39, 98, 20, 45, 5, EPD_RED); + EPD.fillRoundRect(69, 98, 20, 45, 5, EPD_RED); + EPD.display(); +} diff --git a/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_250x122/graphicstest_2_13_inch_250x122.ino b/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_250x122/graphicstest_2_13_inch_250x122.ino new file mode 100644 index 0000000..2db1980 --- /dev/null +++ b/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_250x122/graphicstest_2_13_inch_250x122.ino @@ -0,0 +1,248 @@ +#include +#include + +float p = 3.1415926; + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_IL3897 EPD(250, 122, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_IL3897 EPD(250,122, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + + + +void setup(void) { + Serial.begin(115200); + Serial.print("Hello! EPD Test"); + + EPD.begin(); + + Serial.println("Initialized"); + + // large block of text + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", EPD_BLACK); + + // epd print function! + epdPrintTest(); + + // a single pixel + EPD.clearBuffer(); + EPD.drawPixel(EPD.width()/2, EPD.height()/2, EPD_BLACK); + + testtriangles(); + + // line draw test + testlines(EPD_BLACK); + + // optimized lines + testfastlines(EPD_BLACK, EPD_RED); + + testdrawrects(EPD_RED); + + testfillrects(EPD_BLACK, EPD_RED); + + EPD.fillScreen(EPD_WHITE); + testfillcircles(10, EPD_RED); + testdrawcircles(10, EPD_BLACK); + + testroundrects(); + + mediabuttons(); + + Serial.println("done"); +} + +void loop() { + delay(500); +} + +void testlines(uint16_t color) { + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x=0; x < EPD.width(); x+=6) { + EPD.drawLine(0, 0, x, EPD.height()-1, color); + } + for (int16_t y=0; y < EPD.height(); y+=6) { + EPD.drawLine(0, 0, EPD.width()-1, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x=0; x < EPD.width(); x+=6) { + EPD.drawLine(EPD.width()-1, 0, x, EPD.height()-1, color); + } + for (int16_t y=0; y < EPD.height(); y+=6) { + EPD.drawLine(EPD.width()-1, 0, 0, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x=0; x < EPD.width(); x+=6) { + EPD.drawLine(0, EPD.height()-1, x, 0, color); + } + for (int16_t y=0; y < EPD.height(); y+=6) { + EPD.drawLine(0, EPD.height()-1, EPD.width()-1, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x=0; x < EPD.width(); x+=6) { + EPD.drawLine(EPD.width()-1, EPD.height()-1, x, 0, color); + } + for (int16_t y=0; y < EPD.height(); y+=6) { + EPD.drawLine(EPD.width()-1, EPD.height()-1, 0, y, color); + } + EPD.display(); +} + +void testdrawtext(char *text, uint16_t color) { + EPD.clearBuffer(); + EPD.setCursor(0, 0); + EPD.setTextColor(color); + EPD.setTextWrap(true); + EPD.print(text); + EPD.display(); +} + +void testfastlines(uint16_t color1, uint16_t color2) { + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t y=0; y < EPD.height(); y+=5) { + EPD.drawFastHLine(0, y, EPD.width(), color1); + } + for (int16_t x=0; x < EPD.width(); x+=5) { + EPD.drawFastVLine(x, 0, EPD.height(), color2); + } + EPD.display(); +} + +void testdrawrects(uint16_t color) { + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x=0; x < EPD.width(); x+=6) { + EPD.drawRect(EPD.width()/2 -x/2, EPD.height()/2 -x/2 , x, x, color); + } + EPD.display(); +} + +void testfillrects(uint16_t color1, uint16_t color2) { + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x=EPD.width()-1; x > 6; x-=6) { + EPD.fillRect(EPD.width()/2 -x/2, EPD.height()/2 -x/2 , x, x, color1); + EPD.drawRect(EPD.width()/2 -x/2, EPD.height()/2 -x/2 , x, x, color2); + } + EPD.display(); +} + +void testfillcircles(uint8_t radius, uint16_t color) { + EPD.clearBuffer(); + for (int16_t x=radius; x < EPD.width(); x+=radius*2) { + for (int16_t y=radius; y < EPD.height(); y+=radius*2) { + EPD.fillCircle(x, y, radius, color); + } + } + EPD.display(); +} + +void testdrawcircles(uint8_t radius, uint16_t color) { + EPD.clearBuffer(); + for (int16_t x=0; x < EPD.width()+radius; x+=radius*2) { + for (int16_t y=0; y < EPD.height()+radius; y+=radius*2) { + EPD.drawCircle(x, y, radius, color); + } + } + EPD.display(); +} + +void testtriangles() { + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + int color = EPD_BLACK; + int t; + int w = EPD.width()/2; + int x = EPD.height()-1; + int y = 0; + int z = EPD.width(); + for(t = 0 ; t <= 15; t++) { + EPD.drawTriangle(w, y, y, x, z, x, color); + x-=4; + y+=4; + z-=4; + if(t == 8) color = EPD_RED; + } + EPD.display(); +} + +void testroundrects() { + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + int color = EPD_BLACK; + int i; + int t; + for(t = 0 ; t <= 4; t+=1) { + int x = 0; + int y = 0; + int w = EPD.width()-2; + int h = EPD.height()-2; + for(i = 0 ; i <= 16; i+=1) { + EPD.drawRoundRect(x, y, w, h, 5, color); + x+=2; + y+=3; + w-=4; + h-=6; + if(i == 7) color = EPD_RED; + } + color = EPD_BLACK; + } + EPD.display(); +} + +void epdPrintTest() { + EPD.clearBuffer(); + EPD.setCursor(2, 0); + EPD.fillScreen(EPD_WHITE); + EPD.setTextColor(EPD_BLACK); + EPD.setTextSize(2); + EPD.println("Hello World!"); + EPD.setTextSize(1); + EPD.setTextColor(EPD_RED); + EPD.print(p, 6); + EPD.println(" Want pi?"); + EPD.println(" "); + EPD.print(8675309, HEX); // print 8,675,309 out in HEX! + EPD.println(" Print HEX!"); + EPD.println(" "); + EPD.setTextColor(EPD_BLACK); + EPD.println("Sketch has been"); + EPD.println("running for: "); + EPD.setTextColor(EPD_RED); + EPD.print(millis() / 1000); + EPD.setTextColor(EPD_BLACK); + EPD.print(" seconds."); + EPD.display(); +} + +void mediabuttons() { + EPD.clearBuffer(); + // play + EPD.fillScreen(EPD_WHITE); + EPD.fillRoundRect(25, 10, 78, 60, 8, EPD_BLACK); + EPD.fillTriangle(42, 20, 42, 60, 90, 40, EPD_RED); + // pause + EPD.fillRoundRect(25, 90, 78, 60, 8, EPD_BLACK); + EPD.fillRoundRect(39, 98, 20, 45, 5, EPD_RED); + EPD.fillRoundRect(69, 98, 20, 45, 5, EPD_RED); + EPD.display(); +} diff --git a/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_250x122_TRI-COLOR_SSD1680/graphicstest_2_13_inch_250x122_TRI-COLOR_SSD1680.ino b/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_250x122_TRI-COLOR_SSD1680/graphicstest_2_13_inch_250x122_TRI-COLOR_SSD1680.ino new file mode 100644 index 0000000..0d1bcb8 --- /dev/null +++ b/lib/LOLIN_EPD/examples/graphicstest_2_13_inch_250x122_TRI-COLOR_SSD1680/graphicstest_2_13_inch_250x122_TRI-COLOR_SSD1680.ino @@ -0,0 +1,281 @@ +#include +#include + +float p = 3.1415926; + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_SSD1680 EPD(250, 122, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_SSD1680 EPD(250, 122, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + +void setup(void) +{ + Serial.begin(115200); + Serial.print("Hello! EPD Test"); + + EPD.begin(); + + Serial.println("Initialized"); + + // large block of text + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", EPD_BLACK); + + delay(5000); + // epd print function! + epdPrintTest(); + delay(5000); + // a single pixel + EPD.clearBuffer(); + EPD.drawPixel(EPD.width() / 2, EPD.height() / 2, EPD_BLACK); + + testtriangles(); + delay(5000); + // line draw test + testlines(EPD_BLACK); + delay(5000); + // optimized lines + testfastlines(EPD_BLACK, EPD_RED); + delay(5000); + testdrawrects(EPD_RED); + delay(5000); + testfillrects(EPD_BLACK, EPD_RED); + delay(5000); + EPD.fillScreen(EPD_WHITE); + testfillcircles(10, EPD_RED); + testdrawcircles(10, EPD_BLACK); + delay(5000); + testroundrects(); + delay(5000); + mediabuttons(); + delay(5000); + Serial.println("done"); +} + +void loop() +{ + delay(500); +} + +void testlines(uint16_t color) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(0, 0, x, EPD.height() - 1, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(0, 0, EPD.width() - 1, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(EPD.width() - 1, 0, x, EPD.height() - 1, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(EPD.width() - 1, 0, 0, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(0, EPD.height() - 1, x, 0, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(0, EPD.height() - 1, EPD.width() - 1, y, color); + } + + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawLine(EPD.width() - 1, EPD.height() - 1, x, 0, color); + } + for (int16_t y = 0; y < EPD.height(); y += 6) + { + EPD.drawLine(EPD.width() - 1, EPD.height() - 1, 0, y, color); + } + EPD.display(); +} + +void testdrawtext(char *text, uint16_t color) +{ + EPD.clearBuffer(); + EPD.setCursor(0, 0); + EPD.setTextColor(color); + EPD.setTextWrap(true); + EPD.print(text); + EPD.display(); +} + +void testfastlines(uint16_t color1, uint16_t color2) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t y = 0; y < EPD.height(); y += 5) + { + EPD.drawFastHLine(0, y, EPD.width(), color1); + } + for (int16_t x = 0; x < EPD.width(); x += 5) + { + EPD.drawFastVLine(x, 0, EPD.height(), color2); + } + EPD.display(); +} + +void testdrawrects(uint16_t color) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x = 0; x < EPD.width(); x += 6) + { + EPD.drawRect(EPD.width() / 2 - x / 2, EPD.height() / 2 - x / 2, x, x, color); + } + EPD.display(); +} + +void testfillrects(uint16_t color1, uint16_t color2) +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + for (int16_t x = EPD.width() - 1; x > 6; x -= 6) + { + EPD.fillRect(EPD.width() / 2 - x / 2, EPD.height() / 2 - x / 2, x, x, color1); + EPD.drawRect(EPD.width() / 2 - x / 2, EPD.height() / 2 - x / 2, x, x, color2); + } + EPD.display(); +} + +void testfillcircles(uint8_t radius, uint16_t color) +{ + EPD.clearBuffer(); + for (int16_t x = radius; x < EPD.width(); x += radius * 2) + { + for (int16_t y = radius; y < EPD.height(); y += radius * 2) + { + EPD.fillCircle(x, y, radius, color); + } + } + EPD.display(); +} + +void testdrawcircles(uint8_t radius, uint16_t color) +{ + EPD.clearBuffer(); + for (int16_t x = 0; x < EPD.width() + radius; x += radius * 2) + { + for (int16_t y = 0; y < EPD.height() + radius; y += radius * 2) + { + EPD.drawCircle(x, y, radius, color); + } + } + EPD.display(); +} + +void testtriangles() +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + int color = EPD_BLACK; + int t; + int w = EPD.width() / 2; + int x = EPD.height() - 1; + int y = 0; + int z = EPD.width(); + for (t = 0; t <= 15; t++) + { + EPD.drawTriangle(w, y, y, x, z, x, color); + x -= 4; + y += 4; + z -= 4; + if (t == 8) + color = EPD_RED; + } + EPD.display(); +} + +void testroundrects() +{ + EPD.clearBuffer(); + EPD.fillScreen(EPD_WHITE); + int color = EPD_BLACK; + int i; + int t; + for (t = 0; t <= 4; t += 1) + { + int x = 0; + int y = 0; + int w = EPD.width() - 2; + int h = EPD.height() - 2; + for (i = 0; i <= 16; i += 1) + { + EPD.drawRoundRect(x, y, w, h, 5, color); + x += 2; + y += 3; + w -= 4; + h -= 6; + if (i == 7) + color = EPD_RED; + } + color = EPD_BLACK; + } + EPD.display(); +} + +void epdPrintTest() +{ + EPD.clearBuffer(); + EPD.setCursor(2, 0); + EPD.fillScreen(EPD_WHITE); + EPD.setTextColor(EPD_BLACK); + EPD.setTextSize(2); + EPD.println("Hello World!"); + EPD.setTextSize(1); + EPD.setTextColor(EPD_RED); + EPD.print(p, 6); + EPD.println(" Want pi?"); + EPD.println(" "); + EPD.print(8675309, HEX); // print 8,675,309 out in HEX! + EPD.println(" Print HEX!"); + EPD.println(" "); + EPD.setTextColor(EPD_BLACK); + EPD.println("Sketch has been"); + EPD.println("running for: "); + EPD.setTextColor(EPD_RED); + EPD.print(millis() / 1000); + EPD.setTextColor(EPD_BLACK); + EPD.print(" seconds."); + EPD.display(); +} + +void mediabuttons() +{ + EPD.clearBuffer(); + // play + EPD.fillScreen(EPD_WHITE); + EPD.fillRoundRect(25, 10, 78, 60, 8, EPD_BLACK); + EPD.fillTriangle(42, 20, 42, 60, 90, 40, EPD_RED); + // pause + EPD.fillRoundRect(25, 90, 78, 60, 8, EPD_BLACK); + EPD.fillRoundRect(39, 98, 20, 45, 5, EPD_RED); + EPD.fillRoundRect(69, 98, 20, 45, 5, EPD_RED); + EPD.display(); +} diff --git a/lib/LOLIN_EPD/examples/simple_2_13_inch_212x104_TRI-COLOR/simple_2_13_inch_212x104_TRI-COLOR.ino b/lib/LOLIN_EPD/examples/simple_2_13_inch_212x104_TRI-COLOR/simple_2_13_inch_212x104_TRI-COLOR.ino new file mode 100644 index 0000000..6098053 --- /dev/null +++ b/lib/LOLIN_EPD/examples/simple_2_13_inch_212x104_TRI-COLOR/simple_2_13_inch_212x104_TRI-COLOR.ino @@ -0,0 +1,53 @@ +#include +#include + + + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_UC8151D EPD(212, 104, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_UC8151D EPD(212,104, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + +void setup() +{ + + + +} + +void loop() +{ + for (uint8_t i = 0; i < 4; i++) + { + EPD.begin(); + + EPD.setRotation(i); + EPD.clearBuffer(); + EPD.setTextSize(1); + EPD.setTextColor(EPD_BLACK); + EPD.setCursor(0,0); + EPD.println("hello world! Welcome to wemos.cc, this is test for long text."); + + EPD.setTextColor(EPD_RED); + EPD.setTextSize(2); + EPD.println("I'm red!"); + EPD.display(); + + EPD.deepSleep(); + + delay(2000); + } +} diff --git a/lib/LOLIN_EPD/examples/simple_2_13_inch_250x122/simple_2_13_inch_250x122.ino b/lib/LOLIN_EPD/examples/simple_2_13_inch_250x122/simple_2_13_inch_250x122.ino new file mode 100644 index 0000000..d4ba125 --- /dev/null +++ b/lib/LOLIN_EPD/examples/simple_2_13_inch_250x122/simple_2_13_inch_250x122.ino @@ -0,0 +1,315 @@ +#include +#include + +const unsigned char gImage_num1[128] PROGMEM = { + /* 0X02,0X01,0X20,0X00,0X20,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, + 0xDF, + 0xFF, + 0xF7, + 0xFF, + 0xDF, + 0xFF, + 0xF7, + 0xFF, + 0xDF, + 0xFF, + 0xF7, + 0xFF, + 0xDF, + 0xFF, + 0xE7, + 0xFF, + 0x80, + 0x00, + 0x07, + 0xFF, + 0x00, + 0x00, + 0x07, + 0xFF, + 0x00, + 0x00, + 0x07, + 0xFF, + 0xFF, + 0xFF, + 0xE7, + 0xFF, + 0xFF, + 0xFF, + 0xF7, + 0xFF, + 0xFF, + 0xFF, + 0xF7, + 0xFF, + 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, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xFF, +}; + +const unsigned char gImage_num2[128] PROGMEM = { + /* 0X02,0X01,0X20,0X00,0X20,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, + 0xE1, + 0xFF, + 0xC7, + 0xFF, + 0xC1, + 0xFF, + 0x87, + 0xFF, + 0x99, + 0xFF, + 0x27, + 0xFF, + 0x3F, + 0xFE, + 0x67, + 0xFF, + 0x7F, + 0xFC, + 0xE7, + 0xFF, + 0x7F, + 0xF9, + 0xE7, + 0xFF, + 0x7F, + 0xF3, + 0xE7, + 0xFF, + 0x7F, + 0xE7, + 0xE7, + 0xFF, + 0x3F, + 0xCF, + 0xE7, + 0xFF, + 0x1F, + 0x1F, + 0xE7, + 0xFF, + 0x80, + 0x3F, + 0xC7, + 0xFF, + 0x80, + 0x7E, + 0x07, + 0xFF, + 0xE0, + 0xFE, + 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, +}; + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_IL3897 EPD(250, 122, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_IL3897 EPD(250,122, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + +void setup() +{ + EPD.begin(); + EPD.clearBuffer(); + EPD.setTextColor(EPD_BLACK); + EPD.println("hello world!"); + // EPD.display(); + // delay(2000); + EPD.partInit(); + delay(100); +} + +void loop() +{ + // for (uint8_t i = 0; i < 4; i++) + // { + // EPD.setRotation(i); + // EPD.clearBuffer(); + + // EPD.setCursor(0,0); + // EPD.println("hello world!"); + // EPD.println(EPD.getRotation()); + // EPD.display(); + // delay(2000); + // } + + EPD.partDisplay(0, 32, gImage_num1, 32, 32); + EPD.partDisplay(0, 32, gImage_num2, 32, 32); + delay(2000); +} diff --git a/lib/LOLIN_EPD/examples/simple_2_13_inch_250x122_TRI-COLOR_SSD1680/simple_2_13_inch_250x122_TRI-COLOR_SSD1680.ino b/lib/LOLIN_EPD/examples/simple_2_13_inch_250x122_TRI-COLOR_SSD1680/simple_2_13_inch_250x122_TRI-COLOR_SSD1680.ino new file mode 100644 index 0000000..b239f50 --- /dev/null +++ b/lib/LOLIN_EPD/examples/simple_2_13_inch_250x122_TRI-COLOR_SSD1680/simple_2_13_inch_250x122_TRI-COLOR_SSD1680.ino @@ -0,0 +1,51 @@ +#include +#include + + + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_SSD1680 EPD(250, 122, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_SSD1680 EPD(250,122, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + +void setup() +{ + + EPD.begin(); + + EPD.setRotation(0); + EPD.clearBuffer(); + EPD.setTextSize(1); + EPD.setTextColor(EPD_BLACK); + EPD.setCursor(0,0); + EPD.println("hello world! Welcome to wemos.cc, this is test for long text."); + + EPD.setTextColor(EPD_RED); + EPD.setTextSize(2); + EPD.println("I'm red!"); + + EPD.display(); + + EPD.deepSleep(); + +} + +void loop() +{ + + + +} diff --git a/lib/LOLIN_EPD/examples/test_2_13_inch_212x104_TRI-COLOR/image.h b/lib/LOLIN_EPD/examples/test_2_13_inch_212x104_TRI-COLOR/image.h new file mode 100644 index 0000000..13b264e --- /dev/null +++ b/lib/LOLIN_EPD/examples/test_2_13_inch_212x104_TRI-COLOR/image.h @@ -0,0 +1,350 @@ +const unsigned char gImage_black[2756] PROGMEM = { /* 0X81,0X01,0XD4,0X00,0X68,0X00, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF8,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X03,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X03,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0, +0X00,0X01,0XFF,0XFF,0XC7,0XF9,0XFF,0XFF,0XCF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF, +0XFF,0XCF,0XF8,0XFF,0XFF,0XCF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XCF,0XF8, +0XFF,0X80,0X01,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XCF,0XF8,0XFF,0X80,0X01, +0XFF,0XFF,0XFF,0XFF,0XFF,0X03,0XFF,0XFF,0XCF,0XF8,0XFF,0X87,0XCF,0XFF,0XFF,0XFF, +0XFF,0XFC,0X0F,0XFF,0XFF,0XC0,0X00,0XFF,0XE3,0XCF,0XFF,0XFF,0XFF,0XFF,0XF8,0X1F, +0XFF,0XFF,0XC0,0X00,0XFF,0XF0,0XCF,0XFF,0XFF,0XFF,0XFF,0XE0,0X7F,0XFF,0XFF,0XC0, +0X00,0XFF,0XFC,0X4F,0XFF,0XFF,0XFF,0XFF,0X80,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE, +0X0F,0XFF,0XFF,0XFF,0XFF,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XFF,0XFF, +0XFF,0XFC,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCF,0XFF,0XFF,0XFF,0XF8,0X1F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X3F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF0,0X1F,0XFF,0XFF,0XFF,0XE0,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XC0,0X07,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0X80,0X00,0XFF,0X80,0X03,0XFF, +0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0X80,0X00,0XFF,0X8F,0XF1,0XFF,0XFF,0XFF,0XE0, +0X00,0X01,0XFF,0XFF,0XC0,0X00,0XFF,0X1F,0XF9,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF, +0XFF,0XC7,0XFF,0XFF,0X1F,0XF9,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF, +0XFF,0X9F,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0X80,0X01, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X03,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X0F,0XFF,0XFF,0XFF,0XE0,0X00,0X01, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XCF,0X03,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XCF,0X01,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XCE,0X10,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XCE,0X3C,0XFF,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XCE,0X7C,0XFF,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X7C,0XFF, +0X80,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XC0,0X7C,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XC0,0X7C,0XFF,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF9,0XFF,0XFF,0XFF, +0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XE1,0XFF,0XFF,0XFF,0XE0,0X00,0X01, +0XFF,0XFF,0X80,0X00,0XFF,0XF8,0X01,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0X80, +0X00,0XFF,0XFE,0X07,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XC0,0X00,0XFF,0XFF, +0X0F,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XC7,0XFF,0XFF,0XFC,0X07,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XF8,0X01,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XF8,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF9,0XF9,0XFF,0XFF,0XFF,0XFF,0X80,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF8,0X00,0X0F,0XFF,0XFF,0XFF,0XC3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0, +0X00,0X07,0XFF,0XFF,0XE1,0X81,0XFF,0XC1,0XF1,0XFF,0XFF,0XFF,0XF0,0X0C,0X03,0XFF, +0XFF,0XC0,0X80,0XFF,0X80,0X71,0XFF,0XFF,0XFF,0XE0,0XFF,0X83,0XFF,0XFF,0XCE,0X38, +0XFF,0X80,0X71,0XFF,0XFF,0XFF,0XE1,0XFF,0XC1,0XFF,0XFF,0X8E,0X3C,0XFF,0X1E,0X31, +0XFF,0XFF,0XFF,0XC3,0XFF,0XE1,0XFF,0XFF,0X8E,0X3C,0XFF,0X1F,0X11,0XFF,0XFF,0XFF, +0XC3,0XFF,0XE1,0XFF,0XFF,0XCE,0X3C,0XFF,0X9F,0X81,0XFF,0XFF,0XFF,0XC3,0XFF,0XF1, +0XFF,0XFF,0XC0,0X00,0XFF,0X9F,0X81,0XFF,0XFF,0XFF,0XC3,0XFF,0XF1,0XFF,0XFF,0XE0, +0X81,0XFF,0X8F,0XC1,0XFF,0XFF,0XFF,0XC3,0XFF,0XE1,0XFF,0XFF,0XF3,0XC3,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XE1,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XE1,0XFF,0XC1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X7F, +0X83,0XFF,0XFF,0XCF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X03,0XFF,0XFF, +0XCF,0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XFF,0X8F,0XFC,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0X8F,0XFC,0XFF,0X00,0X01,0XFF, +0XFF,0XFF,0XFE,0X00,0X1F,0XFF,0XFF,0X8F,0XFC,0XFF,0X00,0X01,0XFF,0XFF,0XFF,0XFF, +0XC0,0XFF,0XFF,0XFF,0XCF,0XF8,0XFF,0X80,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XC7,0XF8,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XE0, +0XFF,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XE0,0X01,0XFF,0XC7,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XF0,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE1,0XFF,0XFF,0XFC,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XFF,0XFF,0XFF,0XC1, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFF,0XFF,0XC0,0X07,0XFF,0X80,0X71,0XFF,0XFF, +0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XC0,0X01,0XFF,0X80,0X71,0XFF,0XFF,0XFF,0XE0,0X00, +0X01,0XFF,0XFF,0XC0,0X00,0XFF,0X1E,0X31,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF, +0XFF,0XF8,0XFF,0X1F,0X11,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XF8,0XFF, +0X9F,0X81,0XFF,0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFC,0XFF,0X9F,0X81,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0XFF,0X8F,0XC1,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X01, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,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,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,}; + + +const unsigned char gImage_red[2756] PROGMEM= { /* 0X81,0X01,0XD4,0X00,0X68,0X00, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X47, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XF0,0X7F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XE0,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80, +0X01,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X1F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0, +0X00,0X00,0X00,0X00,0X17,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X20,0X00, +0X00,0X0B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X40,0X01,0X40,0XC0,0X00,0X05,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X08,0X00,0X01,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE, +0X00,0X00,0X00,0X0A,0X00,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00, +0X00,0X40,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00, +0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X20,0X00,0X01,0X00,0X00,0X0F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X80, +0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X40,0X00,0X00,0X00, +0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X40,0X00,0X00,0X00,0X00,0X00,0X7F, +0XFF,0XFF,0XFF,0XFF,0XFC,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF, +0XFF,0XFC,0X01,0X40,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFC,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X20,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF, +0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XF8, +0X00,0X00,0X00,0X40,0X01,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0XC0,0X00,0X00, +0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X60,0X00,0X00,0X01,0X00,0X7F, +0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X80,0X00,0X00,0X04,0X00,0X3F,0XFF,0XFF,0XFF, +0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X80,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X40,0X0F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X10,0X00, +0X00,0X00,0X00,0X07,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X22,0X00,0X00,0X00,0X08, +0X03,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X80,0X00,0X00,0X10,0X01,0XFF,0XFF, +0XFF,0XFF,0X80,0X40,0X00,0X00,0X40,0X00,0X00,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XC1, +0X20,0X00,0X00,0X50,0X00,0X00,0X10,0X80,0X3F,0XFF,0XFF,0XFF,0XE0,0X38,0X00,0X00, +0X80,0X00,0X00,0X04,0X00,0X0B,0XFF,0XFF,0XFF,0XE0,0X1A,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X7F,0XFF,0XFF,0XF0,0X08,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X2F,0XFF,0XFF,0XF8,0X06,0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X00,0X03,0XFF,0XFF, +0XFE,0X30,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X21,0XFF,0XFF,0XFF,0X08,0X00, +0X00,0X10,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X0A,0X00, +0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X0B,0X00,0X00,0X00,0X00, +0X00,0X0F,0XFF,0XFF,0XFF,0XD0,0X00,0X00,0X03,0X40,0X00,0X00,0X00,0X00,0X03,0XFF, +0XFF,0XFF,0XC0,0X00,0X00,0X03,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF,0XFF,0XC1, +0X20,0X00,0X01,0XA2,0X00,0X00,0X00,0X00,0X00,0XEF,0XFF,0XFF,0X82,0X00,0X00,0X00, +0X0C,0X00,0X00,0X00,0X04,0X00,0X1F,0XFF,0XFF,0X00,0X28,0X00,0X00,0X00,0X20,0X00, +0X00,0X00,0X00,0X07,0XFF,0XFE,0X00,0X00,0X00,0X00,0X09,0X80,0X00,0X00,0X00,0X00, +0X1F,0XFF,0XFE,0X02,0X80,0X00,0X00,0X01,0X90,0X20,0X00,0X00,0X01,0XFF,0XFF,0XFE, +0X05,0X00,0X00,0X00,0X2B,0X20,0X40,0X00,0X00,0X1F,0XFF,0XFF,0XFC,0X2C,0X80,0X00, +0X00,0X5E,0X40,0X40,0X00,0X01,0XFF,0XFF,0XFF,0XF8,0X59,0X00,0X00,0X02,0X8E,0X80, +0X00,0X06,0X0F,0XFF,0XFF,0XFF,0XF8,0X50,0X00,0X00,0X00,0X24,0X00,0X00,0X0C,0X1F, +0XFF,0XFF,0XFF,0XF0,0XB2,0X00,0X00,0X01,0X7A,0X00,0X00,0X10,0X7F,0XFF,0XFF,0XFF, +0XF0,0XA8,0X00,0X00,0X00,0X24,0X20,0X00,0X20,0XFF,0XFF,0XFF,0XFF,0XF1,0XE0,0X00, +0X00,0X00,0X88,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XE1,0X50,0X00,0X00,0X03,0X00, +0X90,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XF1,0X4C,0X00,0X00,0X01,0X20,0X00,0X00,0X07, +0XFF,0XFF,0XFF,0XFF,0XEB,0X80,0X00,0X00,0X00,0X40,0X00,0X07,0X0F,0XFF,0XFF,0XFF, +0XFF,0XEA,0X90,0X00,0X80,0X00,0X90,0X00,0X0E,0X1F,0XFF,0XFF,0XFF,0XFF,0XE2,0X80, +0X00,0X00,0X01,0X00,0X00,0X18,0X3F,0XFF,0XFF,0XFF,0XFF,0XE6,0X40,0X01,0X00,0X00, +0X00,0X00,0X20,0X7F,0XFF,0XFF,0XFF,0XFF,0XC6,0X20,0X00,0X0A,0X80,0X00,0X00,0X24, +0X7F,0XFF,0XFF,0XFF,0XFF,0XC6,0X20,0X00,0X01,0X80,0X00,0X00,0X40,0XFF,0XFF,0XFF, +0XFF,0XFF,0X86,0X00,0X00,0X17,0X00,0X00,0X00,0X41,0XFF,0XFF,0XFF,0XFF,0XFF,0X86, +0X00,0X00,0X02,0X20,0X00,0X00,0X43,0XFF,0XFF,0XFF,0XFF,0XFF,0XC2,0X00,0X00,0X08, +0X40,0X00,0X01,0X87,0XFF,0XFF,0XFF,0XFF,0XFF,0XDA,0X80,0X00,0X00,0X80,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XDC,0X00,0X04,0X00,0X00,0X00,0X07,0X0F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XDC,0X00,0X00,0X00,0X00,0X00,0X06,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XD8,0X00,0X00,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XF4,0X00,0X00, +0X00,0X00,0X00,0X0C,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00, +0X10,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XEC,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFD,0X00,0X00,0X00,0X00,0X00,0X20,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X41,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0X80, +0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XC0,0X00,0X00,0X00, +0X00,0X43,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0X00,0X00,0X00,0X00,0X04,0X87,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0X80,0X00,0X00,0X00,0X08,0X07,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFE,0X20,0X00,0X00,0X00,0X10,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X34,0X00,0X00,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00, +0X00,0XE0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF2,0X00,0X00,0X01,0XA0,0X7F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0X00,0X00,0X02,0X00,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF8,0X4A,0X00,0X1A,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFC,0X11,0XE6,0XD8,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X82, +0X1F,0X82,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X10,0X70,0X3F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X70,0X30,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,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,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,}; diff --git a/lib/LOLIN_EPD/examples/test_2_13_inch_212x104_TRI-COLOR/test_2_13_inch_212x104_TRI-COLOR.ino b/lib/LOLIN_EPD/examples/test_2_13_inch_212x104_TRI-COLOR/test_2_13_inch_212x104_TRI-COLOR.ino new file mode 100644 index 0000000..ff5583d --- /dev/null +++ b/lib/LOLIN_EPD/examples/test_2_13_inch_212x104_TRI-COLOR/test_2_13_inch_212x104_TRI-COLOR.ino @@ -0,0 +1,38 @@ +#include +#include + +#include "image.h" + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_UC8151D EPD(212, 104, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_UC8151D EPD(212,104, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + +void setup() +{ + + EPD.begin(); + + EPD.clearBuffer(); + EPD.fillbuffer(gImage_black, gImage_red); + EPD.display(); + + EPD.deepSleep(); +} + +void loop() +{ +} diff --git a/lib/LOLIN_EPD/examples/test_2_13_inch_250x122_TRI-COLOR_SSD1680/image.h b/lib/LOLIN_EPD/examples/test_2_13_inch_250x122_TRI-COLOR_SSD1680/image.h new file mode 100644 index 0000000..b3be6df --- /dev/null +++ b/lib/LOLIN_EPD/examples/test_2_13_inch_250x122_TRI-COLOR_SSD1680/image.h @@ -0,0 +1,506 @@ +const unsigned char gImage_black[4000] PROGMEM = { /* 0X01,0X01,0XFA,0X00,0X7A,0X00, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0X1F,0XFE,0X07,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF8,0XFC,0X1F,0XFC,0X07,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF9,0XF8,0X1F,0XFC,0XC3,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF9,0XF8,0X1F,0XF8,0XE3,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF1,0XF1,0X1F,0XF8,0XE1,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XF1,0XE3,0X1F,0XF8,0XF0,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XF8,0X07,0X1F,0XFC,0XF0,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XF8,0X07,0X1F,0XFC,0XF8,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFC,0X1F,0X1F,0XFF,0XFE,0X7F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFE,0X07,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X07,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X0F,0X9F,0XFC,0XC3,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFC,0X0F,0XFF,0XFF,0XF8,0X0F,0X9F,0XF8,0XE3,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XE0,0X01,0XFF,0XFF,0XF8,0X0F,0X9F,0XF8,0XE1,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XC0,0X00,0XFF,0XFF,0XF9,0XCF,0X9F,0XF8,0XF0,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XF9,0XC7,0X9F,0XFC,0XF0,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0X00,0X00,0X3F,0XFF,0XF9,0XC2,0X1F,0XFC,0XF8,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X07,0XF8,0X3F,0XFF,0XF9,0XE0,0X3F,0XFF,0XFE,0X7F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X1F,0XFC,0X1F,0XFF,0XF9,0XE0,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X1F,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFC,0X3F,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFC,0X3F,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFC,0X3F,0XFF,0X1F,0XFF,0XFF,0X00,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFC,0X3F,0XFE,0X1F,0XFF,0XFC,0X00,0X3F,0XFC,0XFF,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFC,0X3F,0XFE,0X1F,0XFF,0XF8,0X00,0X1F,0XFC,0XFF,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X1F,0XFC,0X1F,0XFF,0XF9,0XFF,0X1F,0XFC,0XFF,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X0F,0XF8,0X3F,0XFF,0XF1,0XFF,0X9F,0XFC,0XFF,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0X00,0XC0,0X3F,0XFF,0XF1,0XFF,0X9F,0XFC,0X7F,0X9F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0X00,0X00,0X7F,0XFF,0XF8,0XFF,0X1F,0XFC,0X3E,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0X80,0X00,0XFF,0XFF,0XF8,0X00,0X3F,0XFE,0X00,0X3F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XE0,0X01,0XFF,0XFF,0XFC,0X00,0X7F,0XFF,0X00,0X3F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XF8,0X0F,0XFF,0XFF,0XFF,0X01,0XFF,0XFF,0X80,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9F,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0X8F,0X1F,0XFE,0X3F,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0X80,0X1F,0XFE,0X3F,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XC0,0X7F,0XFC,0X7F,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XF0,0XFF,0XFC,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XE0,0X7F,0XF8,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0X80,0X1F,0XF8,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0X8E,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0X9F,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFE,0X1F,0XFF,0XFC,0X7F,0XFF,0XFF,0XC0,0X7F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X7F,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XFE,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X1F,0XFC,0X33,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF0,0X00,0X1F,0XFC,0XE7,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF0,0X00,0X1F,0XF8,0XE7,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0XE7,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XF8,0XE0,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFC,0XF0,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X7F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFC,0X1F,0XFF,0X3C,0X3F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF9,0XF8,0X1F,0XFE,0X08,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF9,0XF8,0X1F,0XFC,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF1,0XF1,0X1F,0XFC,0XE3,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF1,0XE3,0X1F,0XF8,0XE3,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X07,0XFF,0XFF,0XFF,0XF8,0X07,0X1F,0XF8,0XE3,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X03,0XFF,0XFF,0XFF,0XF8,0X07,0X1F,0XFC,0XE3,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0X81,0XFF,0XFF,0XFF,0XFC,0X1F,0X1F,0XFC,0X08,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XC0,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X18,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XF0,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X3F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XF8,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFE,0X07,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0X81,0XFF,0XFF,0XF8,0XFC,0X1F,0XFF,0X80,0X7F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XC0,0XFF,0XFF,0XF9,0XF8,0X1F,0XFE,0X00,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XF0,0X3F,0XFF,0XF9,0XF8,0X1F,0XFC,0X00,0X0F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF1,0XF1,0X1F,0XFC,0XFF,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF1,0XE3,0X1F,0XF8,0XFF,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF8,0X07,0X1F,0XF8,0XFF,0XCF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFE,0X00,0X00,0X1F,0XFF,0XF8,0X07,0X1F,0XFC,0X7F,0X8F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X1F,0X1F,0XFC,0X00,0X1F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X3F,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0, +}; + + +const unsigned char gImage_red[4000] PROGMEM= { /* 0X01,0X01,0XFA,0X00,0X7A,0X00, */ +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X3F,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X01,0X8F,0XCF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X1F,0XEF,0X8F,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X7D,0XE0,0X7D,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X03,0XEE,0X19,0X27,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X07,0XB5,0XFF,0XE5,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X1E,0XFF,0XFF,0XFD,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X0D,0XFF,0XFF,0XFE,0X5F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0XFF,0XFF,0XFF,0XFF,0X1F,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0XCB,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X01,0XDF,0XFF,0XFF,0XFF,0XEF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X06,0X7F,0XFF,0XFF,0XFF,0XF7,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X04,0XFF,0XFF,0XFF,0XFF,0XFB,0X78,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X02,0X3F,0XFF,0XFF,0XFF,0XFF,0XBC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X02,0X7F,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X02,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X13,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X0B,0XFF,0XFF,0XFF,0XFF,0XFF,0XF3,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X27,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X23,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X23,0XFF,0XFB,0XFF,0XFF,0XFF,0XF8,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X25,0X7F,0XFF,0XFF,0X7F,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X3D,0XFF,0XFF,0XF7,0XBF,0XFF,0XFE,0X78,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X79,0XFF,0XFF,0XFD,0XDF,0XFF,0XFF,0XBC,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X79,0XFF,0XFF,0XE8,0XFF,0XFF,0XFF,0XBE,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X39,0XDF,0XFF,0XFE,0X7F,0XFF,0XFF,0XBF,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X39,0XDF,0XFF,0XF5,0X7F,0XFF,0XFF,0XDB,0X80,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X19,0XBF,0XFE,0XFF,0XFF,0XFF,0XFF,0XDF,0X80,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X1D,0X7F,0XFF,0XFF,0XFE,0XFF,0XFF,0XE7,0XC0,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X15,0X6F,0XFF,0X7F,0XFF,0X6F,0XFF,0XF1,0XE0,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X14,0X7F,0XFF,0XFF,0XFF,0XBF,0XFF,0XF8,0XF0,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X0E,0XB3,0XFF,0XFF,0XFE,0XDF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X1E,0XAF,0XFF,0XFF,0XFC,0XFF,0X6F,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X0E,0X1F,0XFF,0XFF,0XFF,0X77,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X0F,0X57,0XFF,0XFF,0XFF,0XDB,0XDF,0XFF,0XDF,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X0F,0X4D,0XFF,0XFF,0XFE,0X85,0XFF,0XFF,0XEF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X07,0XAF,0XFF,0XFF,0XFF,0XDB,0XFF,0XFF,0XF3,0XE0,0X00,0X00,0X00,0X00,0X00, +0X00,0X07,0XA6,0XFF,0XFF,0XFD,0X71,0X7F,0XFF,0XF9,0XF0,0X00,0X00,0X00,0X00,0X00, +0X00,0X03,0XD3,0X7F,0XFF,0XFF,0XA1,0XBF,0XBF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00, +0X00,0X01,0XFA,0XFF,0XFF,0XFF,0XD4,0XDF,0XBF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00, +0X00,0X01,0XFD,0X7F,0XFF,0XFF,0XFE,0X6F,0XDF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00, +0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XF6,0X7F,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00, +0X00,0X00,0XFF,0XD7,0XFF,0XFF,0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00, +0X00,0X00,0X7D,0XFF,0XFF,0XFF,0XF3,0XFF,0XFF,0XFF,0XFB,0XFF,0XE0,0X00,0X00,0X00, +0X00,0X00,0X3E,0XDF,0XFF,0XFE,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0X10,0X00,0X00,0X00, +0X00,0X00,0X3F,0XFF,0XFF,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00, +0X00,0X00,0X2F,0XFF,0XFF,0XFC,0XBF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00, +0X00,0X00,0X1F,0XFF,0XFF,0XF4,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00, +0X00,0X00,0X7F,0XFF,0XFF,0XF5,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00, +0X00,0X00,0XF7,0XFF,0XFF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00, +0X00,0X01,0XCF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0X00,0X00,0X00,0X00, +0X00,0X07,0XF9,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0XFF,0XFC,0X00,0X00,0X00,0X00, +0X00,0X0F,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD0,0X00,0X00,0X00,0X00, +0X00,0X1F,0XE5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00, +0X00,0X1F,0XC7,0XFF,0XFF,0X7F,0XFF,0XFF,0XFB,0XFF,0XF4,0X00,0X00,0X00,0X00,0X00, +0X00,0X3E,0XDF,0XFF,0XFF,0XAF,0XFF,0XFF,0XEF,0X7F,0XC0,0X00,0X00,0X00,0X00,0X00, +0X00,0X7F,0XBF,0XFF,0XFF,0XBF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0X7F,0XFF,0XFF,0XEF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00, +0X01,0XFF,0XFF,0XFF,0XDD,0XFF,0XFF,0XFF,0XF7,0XFC,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0XEF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,0XE0,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0X7F,0XFF,0XFF,0XFB,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0X9F,0XFF,0XFF,0XFE,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XBF,0XFE,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XDF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFE,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X03,0XFF,0XDF,0XFF,0XFE,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0XFF,0XFF,0XFF,0XFF,0XBF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X01,0XFF,0XFF,0XFF,0XF5,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X7F,0XFF,0XFF,0XF7,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0XBF,0XFE,0XBF,0X3F,0XFF,0XFA,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X7F,0XFF,0XDF,0XFF,0XFF,0XF4,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XE8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X07,0XFF,0XFF,0XFF,0XFF,0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X03,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X01,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X7F,0XFE,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X1F,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X1F,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X07,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X02,0X0F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0XB8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, +}; diff --git a/lib/LOLIN_EPD/examples/test_2_13_inch_250x122_TRI-COLOR_SSD1680/test_2_13_inch_250x122_TRI-COLOR_SSD1680.ino b/lib/LOLIN_EPD/examples/test_2_13_inch_250x122_TRI-COLOR_SSD1680/test_2_13_inch_250x122_TRI-COLOR_SSD1680.ino new file mode 100644 index 0000000..369d493 --- /dev/null +++ b/lib/LOLIN_EPD/examples/test_2_13_inch_250x122_TRI-COLOR_SSD1680/test_2_13_inch_250x122_TRI-COLOR_SSD1680.ino @@ -0,0 +1,38 @@ +#include +#include + +#include "image.h" + +/*D1 mini*/ +#define EPD_CS D0 +#define EPD_DC D8 +#define EPD_RST -1 // can set to -1 and share with microcontroller Reset! +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +/*D32 Pro*/ +// #define EPD_CS 14 +// #define EPD_DC 27 +// #define EPD_RST 33 // can set to -1 and share with microcontroller Reset! +// #define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) + +LOLIN_SSD1680 EPD(250, 122, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //hardware SPI + +// #define EPD_MOSI D7 +// #define EPD_CLK D5 +// LOLIN_SSD1680 EPD(250,122, EPD_MOSI, EPD_CLK, EPD_DC, EPD_RST, EPD_CS, EPD_BUSY); //IO + +void setup() +{ + + EPD.begin(); + + EPD.clearBuffer(); + EPD.fillbuffer(gImage_black, gImage_red); + EPD.display(); + + EPD.deepSleep(); +} + +void loop() +{ +} diff --git a/lib/LOLIN_EPD/keywords.txt b/lib/LOLIN_EPD/keywords.txt new file mode 100644 index 0000000..7dcf687 --- /dev/null +++ b/lib/LOLIN_EPD/keywords.txt @@ -0,0 +1,31 @@ +####################################### +# Syntax Coloring Map For LOLIN EPD +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +LOLIN_IL3897 KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +clearBuffer KEYWORD2 +drawPixel KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### + +EPD_BLACK LITERAL1 +EPD_WHITE LITERAL1 +EPD_INVERSE LITERAL1 +EPD_RED LITERAL1 +EPD_DARK LITERAL1 +EPD_LIGHT LITERAL1 + + + diff --git a/lib/LOLIN_EPD/library.properties b/lib/LOLIN_EPD/library.properties new file mode 100644 index 0000000..a3addac --- /dev/null +++ b/lib/LOLIN_EPD/library.properties @@ -0,0 +1,9 @@ +name=LOLIN_EPD +version=1.0.0 +author=WEMOS.CC +maintainer=WEMOS.CC +sentence=Library for the EPD Shield.. +paragraph=LOLIN EPD +category=Device Control +url=https://github.com/wemos/LOLIN_EPD_Library +architectures=* diff --git a/lib/LOLIN_EPD/src/LOLIN_EPD.cpp b/lib/LOLIN_EPD/src/LOLIN_EPD.cpp new file mode 100644 index 0000000..3a95e4c --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_EPD.cpp @@ -0,0 +1,264 @@ +#ifdef __AVR__ +#include +#elif defined(ESP8266) || defined(ESP32) +#include +#else +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) ///< read bytes from program memory +#endif + +#if !defined(__ARM_ARCH) && !defined(ENERGIA) && !defined(ESP8266) && !defined(ESP32) && !defined(__arc__) +#include +#endif + +#include + +#include +#include "Adafruit_GFX.h" +#include "LOLIN_EPD.h" + +LOLIN_EPD::LOLIN_EPD(int width, int height, int8_t spi_mosi, int8_t spi_clock, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY):Adafruit_GFX(width, height) +{ + cs = CS; + rst = RST; + dc = DC; + sclk = spi_clock; + sid = spi_mosi; + busy = BUSY; + hwSPI = false; + singleByteTxns = false; +} + +LOLIN_EPD::LOLIN_EPD(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY):Adafruit_GFX(width, height) +{ + + dc = DC; + rst = RST; + cs = CS; + busy = BUSY; + hwSPI = true; + singleByteTxns = false; +} + +/**************************************************************************/ +/*! + @brief default destructor +*/ +/**************************************************************************/ +LOLIN_EPD::~LOLIN_EPD() +{ + + free(bw_buf); + free(red_buf); +} + +/**************************************************************************/ +/*! + @brief begin communication with and set up the display. + @param reset if true the reset pin will be toggled. +*/ +/**************************************************************************/ +void LOLIN_EPD::begin(bool reset) +{ + blackInverted = true; + redInverted = false; + + // set pin directions + pinMode(dc, OUTPUT); + pinMode(cs, OUTPUT); +#ifdef HAVE_PORTREG + csport = portOutputRegister(digitalPinToPort(cs)); + cspinmask = digitalPinToBitMask(cs); + dcport = portOutputRegister(digitalPinToPort(dc)); + dcpinmask = digitalPinToBitMask(dc); +#endif + + csHigh(); + + if (!hwSPI) + { + // set pins for software-SPI + pinMode(sid, OUTPUT); + pinMode(sclk, OUTPUT); +#ifdef HAVE_PORTREG + clkport = portOutputRegister(digitalPinToPort(sclk)); + clkpinmask = digitalPinToBitMask(sclk); + mosiport = portOutputRegister(digitalPinToPort(sid)); + mosipinmask = digitalPinToBitMask(sid); +#endif + } + else + { + SPI.begin(); +#ifndef SPI_HAS_TRANSACTION + SPI.setClockDivider(4); +#endif + } + + if ((reset) && (rst >= 0)) + { + // Setup reset pin direction + pinMode(rst, OUTPUT); + // VDD (3.3V) goes high at start, lets just chill for a ms + digitalWrite(rst, HIGH); + delay(1); + // bring reset low + digitalWrite(rst, LOW); + // wait 10ms + delay(10); + // bring out of reset + digitalWrite(rst, HIGH); + } + + if (busy >= 0) + { + pinMode(busy, INPUT); + } +} + +/**************************************************************************/ +/*! + @brief send an EPD command with no data + @param c the command to send + @param end if true the cs pin will be pulled high following the transaction. If false the cs pin will remain low. + @returns the data byte read over the SPI bus +*/ +/**************************************************************************/ +void LOLIN_EPD::sendCmd(uint8_t c) +{ + // SPI + csHigh(); + dcLow(); + csLow(); + + uint8_t data = fastSPIwrite(c); + + csHigh(); +} + +/**************************************************************************/ +/*! + @brief send data to the display + @param buf the data buffer to send + @param len the length of the data buffer +*/ +/**************************************************************************/ +void LOLIN_EPD::sendData(uint8_t data) +{ + // SPI + csHigh(); + dcHigh(); + csLow(); + + fastSPIwrite(data); + + csHigh(); +} + +/**************************************************************************/ +/*! + @brief transfer a single byte over SPI. + @param d the data to send + @returns the data byte read +*/ +/**************************************************************************/ +uint8_t LOLIN_EPD::fastSPIwrite(uint8_t d) +{ + if (hwSPI) + { + if (singleByteTxns) + { + uint8_t b; + csLow(); + b = SPI.transfer(d); + csHigh(); + return b; + } + else + return SPI.transfer(d); + } + else + { + //TODO: return read data for software SPI + for (uint8_t bit = 0x80; bit; bit >>= 1) + { +#ifdef HAVE_PORTREG + *clkport &= ~clkpinmask; + if (d & bit) + *mosiport |= mosipinmask; + else + *mosiport &= ~mosipinmask; + *clkport |= clkpinmask; +#else + digitalWrite(sclk, LOW); + if (d & bit) + digitalWrite(sid, HIGH); + else + digitalWrite(sid, LOW); + digitalWrite(sclk, HIGH); +#endif + } + return 0; + } +} + +/**************************************************************************/ +/*! + @brief set chip select pin high +*/ +/**************************************************************************/ +void LOLIN_EPD::csHigh() +{ +#ifdef SPI_HAS_TRANSACTION + SPI.endTransaction(); +#endif +#ifdef HAVE_PORTREG + *csport |= cspinmask; +#else + digitalWrite(cs, HIGH); +#endif +} + +/**************************************************************************/ +/*! + @brief set chip select pin low +*/ +/**************************************************************************/ +void LOLIN_EPD::csLow() +{ +#ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); +#endif +#ifdef HAVE_PORTREG + *csport &= ~cspinmask; +#else + digitalWrite(cs, LOW); +#endif +} + +/**************************************************************************/ +/*! + @brief set data/command pin high +*/ +/**************************************************************************/ +void LOLIN_EPD::dcHigh() +{ +#ifdef HAVE_PORTREG + *dcport |= dcpinmask; +#else + digitalWrite(dc, HIGH); +#endif +} + +/**************************************************************************/ +/*! + @brief set data/command pin low +*/ +/**************************************************************************/ +void LOLIN_EPD::dcLow() +{ +#ifdef HAVE_PORTREG + *dcport &= ~dcpinmask; +#else + digitalWrite(dc, LOW); +#endif +} \ No newline at end of file diff --git a/lib/LOLIN_EPD/src/LOLIN_EPD.h b/lib/LOLIN_EPD/src/LOLIN_EPD.h new file mode 100644 index 0000000..9342efb --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_EPD.h @@ -0,0 +1,113 @@ +#ifndef __LOLIN_EPD_H +#define __LOLIN_EPD_H + +#if ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +#if defined(__SAM3X8E__) +typedef volatile RwReg PortReg; ///< a port register for fast access +typedef uint32_t PortMask; ///< a port register mask for your pin +#define HAVE_PORTREG +#elif defined(ARDUINO_ARCH_SAMD) +// not supported +#elif defined(ESP8266) || defined(ESP32) || defined(ARDUINO_STM32_FEATHER) || defined(__arc__) +typedef volatile uint32_t PortReg; ///< a port register for fast access +typedef uint32_t PortMask; ///< a port register mask for your pin +#elif defined(__AVR__) +typedef volatile uint8_t PortReg; ///< a port register for fast access +typedef uint8_t PortMask; ///< a port register mask for your pin +#define HAVE_PORTREG +#else +// chances are its 32 bit so assume that +typedef volatile uint32_t PortReg; ///< a port register for fast access +typedef uint32_t PortMask; ///< a port register mask for your pin +#endif + +#include +#include + +/**************************************************************************/ +/*! + available EPD colors +*/ +/**************************************************************************/ +enum +{ + EPD_BLACK, ///< black color + EPD_WHITE, ///< white color + EPD_INVERSE, ///< invert color + EPD_RED, ///< red color + EPD_DARK, ///< darker color + EPD_LIGHT, ///< lighter color +}; + +#define EPD_swap(a, b) \ + { \ + int16_t t = a; \ + a = b; \ + b = t; \ + } ///< simple swap function + +/**************************************************************************/ +/*! + Class for interfacing with LOLIN EPD display breakouts. +*/ +/**************************************************************************/ + +class LOLIN_EPD: public Adafruit_GFX +{ +public: + LOLIN_EPD(int width, int height, int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + LOLIN_EPD(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + + ~LOLIN_EPD(); + void begin(bool reset = true); + +protected: + int8_t sid, ///< sid pin + sclk, ///< serial clock pin + dc, ///< data/command pin + rst, ///< reset pin + cs, ///< chip select pin + busy; ///< busy pin + + bool blackInverted, ///< is black channel inverted + redInverted; ///< is red channel inverted + int bw_bufsize, ///< size of the black and white buffer + red_bufsize; ///< size of the red buffer + bool singleByteTxns; ///< if true CS will go high after every data byte transferred + + uint8_t *bw_buf; ///< the pointer to the black and white buffer if using on-chip ram + uint8_t *red_buf; ///< the pointer to the red buffer if using on-chip ram + + void sendCmd(uint8_t c); + void sendData(uint8_t data); + uint8_t fastSPIwrite(uint8_t c); + + boolean hwSPI; ///< true if using hardware SPI +#ifdef HAVE_PORTREG + PortReg *mosiport, ///< mosi port register + *clkport, ///< serial clock port register + *csport, ///< chip select port register + *dcport; ///< data/command port register + PortMask mosipinmask, ///< mosi pin mask + clkpinmask, ///< serial clock pin mask + cspinmask, ///< chip select pin mask + dcpinmask; ///< data / command pin mask +#endif + void csLow(); + void csHigh(); + void dcHigh(); + void dcLow(); + +private: +}; + +#include "LOLIN_IL3897.h" +#include "LOLIN_UC8151D.h" +#include "LOLIN_SSD1680.h" + +#endif diff --git a/lib/LOLIN_EPD/src/LOLIN_IL3897.cpp b/lib/LOLIN_EPD/src/LOLIN_IL3897.cpp new file mode 100644 index 0000000..1ecbefc --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_IL3897.cpp @@ -0,0 +1,524 @@ +#include "LOLIN_EPD.h" +#include "LOLIN_IL3897.h" + +#define ALLSCREEN_GRAGHBYTES 4000 + +/////////////////////////////////////////////////// + + +/////////////////EPD settings Functions///////////////////// + +/////////////////////////////////////LUT////////////////////////////////////////////// +const unsigned char LUT_DATA[] PROGMEM = { + 0x80, + 0x60, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, //LUT0: BB: VS 0 ~7 + 0x10, + 0x60, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, //LUT1: BW: VS 0 ~7 + 0x80, + 0x60, + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, //LUT2: WB: VS 0 ~7 + 0x10, + 0x60, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, //LUT3: WW: VS 0 ~7 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, //LUT4: VCOM: VS 0 ~7 + + 0x03, + 0x03, + 0x00, + 0x00, + 0x02, // TP0 A~D RP0 + 0x09, + 0x09, + 0x00, + 0x00, + 0x02, // TP1 A~D RP1 + 0x03, + 0x03, + 0x00, + 0x00, + 0x02, // TP2 A~D RP2 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP3 A~D RP3 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP4 A~D RP4 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP5 A~D RP5 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP6 A~D RP6 + + 0x15, + 0x41, + 0xA8, + 0x32, + 0x30, + 0x0A, +}; +const unsigned char LUT_DATA_part[] PROGMEM = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, //LUT0: BB: VS 0 ~7 + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, //LUT1: BW: VS 0 ~7 + 0x40, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, //LUT2: WB: VS 0 ~7 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, //LUT3: WW: VS 0 ~7 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, //LUT4: VCOM: VS 0 ~7 + + 0x0A, + 0x00, + 0x00, + 0x00, + 0x00, // TP0 A~D RP0 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP1 A~D RP1 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP2 A~D RP2 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP3 A~D RP3 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP4 A~D RP4 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP5 A~D RP5 + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, // TP6 A~D RP6 + + 0x15, + 0x41, + 0xA8, + 0x32, + 0x30, + 0x0A, +}; + +#define BUSY_WAIT 1000 + +/*! + @brief constructor if using on-chip RAM and software SPI + @param width the width of the display in pixels + @param height the height of the display in pixels + @param SID the SID pin to use + @param SCLK the SCLK pin to use + @param DC the data/command pin to use + @param RST the reset pin to use + @param CS the chip select pin to use + @param BUSY the busy pin to use +*/ +/**************************************************************************/ +LOLIN_IL3897::LOLIN_IL3897(int width, int height, int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY) : LOLIN_EPD(width, height, SID, SCLK, DC, RST, CS, BUSY) +{ + + if ((height % 8) > 0) + { + _height_8bit = (height / 8 + 1) * 8; + } + else + { + _height_8bit = height; + } + + bw_buf = (uint8_t *)malloc(width * _height_8bit / 8); + red_buf = (uint8_t *)malloc(width * _height_8bit / 8); + bw_bufsize = width * _height_8bit / 8; + red_bufsize = bw_bufsize; +} + +LOLIN_IL3897::LOLIN_IL3897(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY) : LOLIN_EPD(width, height, DC, RST, CS, BUSY) +{ + + if ((height % 8) > 0) + { + _height_8bit = (height / 8 + 1) * 8; + } + else + { + _height_8bit = height; + } + + bw_buf = (uint8_t *)malloc(width * _height_8bit / 8); + red_buf = (uint8_t *)malloc(width * _height_8bit / 8); + bw_bufsize = width * _height_8bit / 8; + red_bufsize = bw_bufsize; +} + +/**************************************************************************/ +/*! + @brief begin communication with and set up the display. + @param reset if true the reset pin will be toggled. +*/ +/**************************************************************************/ +void LOLIN_IL3897::begin(bool reset) +{ + uint8_t buf[5]; + LOLIN_EPD::begin(reset); + + readBusy(); + sendCmd(0x12); // soft reset + readBusy(); + + sendCmd(0x74); //set analog block control + sendData(0x54); + sendCmd(0x7E); //set digital block control + sendData(0x3B); + + sendCmd(0x01); //Driver output control + sendData(0xF9); + sendData(0x00); + sendData(0x00); + + sendCmd(0x11); //data entry mode + sendData(0x01); + + sendCmd(0x44); //set Ram-X address start/end position + sendData(0x00); + sendData(0x0F); //0x0C-->(15+1)*8=128 + + sendCmd(0x45); //set Ram-Y address start/end position + sendData(0xF9); //0xF9-->(249+1)=250 + sendData(0x00); + sendData(0x00); + sendData(0x00); + + sendCmd(0x3C); //BorderWavefrom + sendData(0x03); + + sendCmd(0x2C); //VCOM Voltage + sendData(0x55); // + + sendCmd(0x03); // + sendData(LUT_DATA[70]); + + sendCmd(0x04); // + sendData(LUT_DATA[71]); + sendData(LUT_DATA[72]); + sendData(LUT_DATA[73]); + + sendCmd(0x3A); //Dummy Line + sendData(LUT_DATA[74]); + sendCmd(0x3B); //Gate time + sendData(LUT_DATA[75]); + + selectLUT((unsigned char *)LUT_DATA); //LUT + + sendCmd(0x4E); // set RAM x address count to 0; + sendData(0x00); + sendCmd(0x4F); // set RAM y address count to 0X127; + sendData(0xF9); + sendData(0x00); + readBusy(); +} + +void LOLIN_IL3897::display() +{ + + sendCmd(0x24); //write RAM for black(0)/white (1) + + for (uint16_t i = 0; i < bw_bufsize; i++) + { + sendData(bw_buf[i]); + } + + update(); +} +void LOLIN_IL3897::update() +{ + sendCmd(0x22); + sendData(0xC7); + sendCmd(0x20); + readBusy(); +} + +/**************************************************************************/ +/*! + @brief draw a single pixel on the screen + @param x the x axis position + @param y the y axis position + @param color the color of the pixel +*/ +/**************************************************************************/ +void LOLIN_IL3897::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) + return; + + uint8_t *pBuf; + + // check rotation, move pixel around if necessary + switch (getRotation()) + { + case 1: + EPD_swap(x, y); + x = WIDTH - x - 1; + break; + case 2: + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + break; + case 3: + EPD_swap(x, y); + + y = HEIGHT - y - 1; + break; + } + //make our buffer happy + x = (x == 0 ? 1 : x); + + // uint16_t addr = (x * height() + y) / 8; + uint16_t addr = (x * _height_8bit + y) / 8; + + if (color == EPD_RED) + { + pBuf = red_buf + addr; + } + else + { + pBuf = bw_buf + addr; + } + + // x is which column + switch (color) + { + case EPD_WHITE: + *pBuf |= (1 << (7 - y % 8)); + break; + case EPD_RED: + case EPD_BLACK: + *pBuf &= ~(1 << (7 - y % 8)); + break; + case EPD_INVERSE: + *pBuf ^= (1 << (7 - y % 8)); + break; + } +} + +/**************************************************************************/ +/*! + @brief clear all data buffers +*/ +/**************************************************************************/ +void LOLIN_IL3897::clearBuffer() +{ + memset(bw_buf, 0xFF, bw_bufsize); +} + +/**************************************************************************/ +/*! + @brief clear the display twice to remove any spooky ghost images +*/ +/**************************************************************************/ +void LOLIN_IL3897::clearDisplay() +{ + clearBuffer(); + display(); + delay(100); + display(); +} + +void LOLIN_IL3897::readBusy() +{ + if (busy >= 0) + { + while (1) + { + if (digitalRead(busy) == 0) + break; + } + } + else + { + delay(BUSY_WAIT); + } +} + +void LOLIN_IL3897::selectLUT(uint8_t *wave_data) +{ + uint8_t count; + sendCmd(0x32); + for (count = 0; count < 70; count++) + sendData(pgm_read_byte(&wave_data[count])); +} + +void LOLIN_IL3897::deepSleep() +{ + sendCmd(0x10); //enter deep sleep + sendData(0x01); + delay(100); +} + +void LOLIN_IL3897::partInit() +{ + partBaseImg(); + + sendCmd(0x2C); //VCOM Voltage + sendData(0x26); + + readBusy(); + selectLUT((unsigned char *)LUT_DATA_part); + sendCmd(0x37); + sendData(0x00); + sendData(0x00); + sendData(0x00); + sendData(0x00); + sendData(0x40); + sendData(0x00); + sendData(0x00); + + sendCmd(0x22); + sendData(0xC0); + sendCmd(0x20); + readBusy(); + + sendCmd(0x3C); //BorderWavefrom + sendData(0x01); +} + +void LOLIN_IL3897::partBaseImg() +{ + sendCmd(0x24); ////Write Black and White image to RAM + + for (uint16_t i = 0; i < bw_bufsize; i++) + { + sendData(bw_buf[i]); + } + + sendCmd(0x26); ////Write Black and White image to RAM + + for (uint16_t i = 0; i < bw_bufsize; i++) + { + sendData(bw_buf[i]); + } + + update(); +} + +void LOLIN_IL3897::partUpdate() +{ + sendCmd(0x22); + sendData(0x0C); + sendCmd(0x20); + readBusy(); +} + +void LOLIN_IL3897::partDisplay(int16_t x_start, int16_t y_start, const unsigned char *datas, int16_t PART_COLUMN, int16_t PART_LINE) +{ + int16_t i; + int16_t x_end, y_start1, y_start2, y_end1, y_end2; + x_start = x_start / 8; // + x_end = x_start + PART_LINE / 8 - 1; + + y_start1 = 0; + y_start2 = y_start; + if (y_start >= 256) + { + y_start1 = y_start2 / 256; + y_start2 = y_start2 % 256; + } + y_end1 = 0; + y_end2 = y_start + PART_COLUMN - 1; + if (y_end2 >= 256) + { + y_end1 = y_end2 / 256; + y_end2 = y_end2 % 256; + } + + sendCmd(0x44); // set RAM x address start/end, in page 35 + sendData(x_start); // RAM x address start at 00h; + sendData(x_end); // RAM x address end at 0fh(15+1)*8->128 + sendCmd(0x45); // set RAM y address start/end, in page 35 + sendData(y_start2); // RAM y address start at 0127h; + sendData(y_start1); // RAM y address start at 0127h; + sendData(y_end2); // RAM y address end at 00h; + sendData(y_end1); // ????=0 + + sendCmd(0x4E); // set RAM x address count to 0; + sendData(x_start); + sendCmd(0x4F); // set RAM y address count to 0X127; + sendData(y_start2); + sendData(y_start1); + + sendCmd(0x24); //Write Black and White image to RAM + for (i = 0; i < PART_COLUMN * PART_LINE / 8; i++) + { + sendData(pgm_read_byte(&datas[i])); + } + partUpdate(); +} diff --git a/lib/LOLIN_EPD/src/LOLIN_IL3897.h b/lib/LOLIN_EPD/src/LOLIN_IL3897.h new file mode 100644 index 0000000..0c87600 --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_IL3897.h @@ -0,0 +1,49 @@ +#ifndef __LOLIN_IL3897_H +#define __LOLIN_IL3897_H + +#ifdef __AVR__ + #include +#elif defined(ESP8266) || defined(ESP32) + #include +#else + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) ///< read bytes from program memory +#endif + +#include "LOLIN_EPD.h" + + +/**************************************************************************/ +/*! + @brief Class for interfacing with IL3897 EPD drivers +*/ +/**************************************************************************/ +class LOLIN_IL3897 : public LOLIN_EPD { + public: + + LOLIN_IL3897(int width, int height, int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + LOLIN_IL3897(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + + void begin(bool reset=true); + + void drawPixel(int16_t x, int16_t y, uint16_t color); + + void display(); + void update(); + + void clearBuffer(); + void clearDisplay(); + + void deepSleep(); + + void partBaseImg(); + void partInit(); + void partDisplay(int16_t x_start, int16_t y_start, const unsigned char *datas, int16_t PART_COLUMN, int16_t PART_LINE); + void partUpdate(); + +protected: + void readBusy(); + void selectLUT(uint8_t * wave_data); + int _height_8bit;// height 8-bit alignment +}; + +#endif \ No newline at end of file diff --git a/lib/LOLIN_EPD/src/LOLIN_SSD1680.cpp b/lib/LOLIN_EPD/src/LOLIN_SSD1680.cpp new file mode 100644 index 0000000..f51bdf3 --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_SSD1680.cpp @@ -0,0 +1,270 @@ +#include "LOLIN_EPD.h" +#include "LOLIN_SSD1680.h" + +#define ALLSCREEN_GRAGHBYTES 4000 + +/////////////////////////////////////////////////// + +/////////////////EPD settings Functions///////////////////// + +#define BUSY_WAIT 500 + +/*! + @brief constructor if using on-chip RAM and software SPI + @param width the width of the display in pixels + @param height the height of the display in pixels + @param SID the SID pin to use + @param SCLK the SCLK pin to use + @param DC the data/command pin to use + @param RST the reset pin to use + @param CS the chip select pin to use + @param BUSY the busy pin to use +*/ +/**************************************************************************/ +LOLIN_SSD1680::LOLIN_SSD1680(int width, int height, int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY) : LOLIN_EPD(width, height, SID, SCLK, DC, RST, CS, BUSY) +{ + + if ((height % 8) > 0) + { + _height_8bit = (height / 8 + 1) * 8; + } + else + { + _height_8bit = height; + } + + bw_buf = (uint8_t *)malloc(width * _height_8bit / 8); + red_buf = (uint8_t *)malloc(width * _height_8bit / 8); + bw_bufsize = width * _height_8bit / 8; + red_bufsize = bw_bufsize; +} + +LOLIN_SSD1680::LOLIN_SSD1680(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY) : LOLIN_EPD(width, height, DC, RST, CS, BUSY) +{ + + if ((height % 8) > 0) + { + _height_8bit = (height / 8 + 1) * 8; + } + else + { + _height_8bit = height; + } + + bw_buf = (uint8_t *)malloc(width * _height_8bit / 8); + red_buf = (uint8_t *)malloc(width * _height_8bit / 8); + bw_bufsize = width * _height_8bit / 8; + red_bufsize = bw_bufsize; +} + +/**************************************************************************/ +/*! + @brief begin communication with and set up the display. + @param reset if true the reset pin will be toggled. +*/ +/**************************************************************************/ +void LOLIN_SSD1680::begin(bool reset) +{ + // uint8_t HRES = 0x68; //104 + // uint8_t VRES_byte1 = 0x00; //212 + // uint8_t VRES_byte2 = 0xd4; + + // uint8_t buf[5]; + LOLIN_EPD::begin(reset); + + readBusy(); + sendCmd(0x12); //SWRESET + readBusy(); + + sendCmd(0x01); //Driver output control + sendData(0xF9); + sendData(0x00); + sendData(0x00); + + sendCmd(0x11); //data entry mode + sendData(0x01); + + sendCmd(0x44); //set Ram-X address start/end position + sendData(0x00); + sendData(0x0F); //0x0F-->(15+1)*8=128 + + sendCmd(0x45); //set Ram-Y address start/end position + sendData(0xF9); //0xF9-->(249+1)=250 + sendData(0x00); + sendData(0x00); + sendData(0x00); + + sendCmd(0x3C); //BorderWavefrom + sendData(0x05); + + sendCmd(0x18); //Read built-in temperature sensor + sendData(0x80); + + sendCmd(0x21); // Display update control + sendData(0x00); + sendData(0x80); + + sendCmd(0x4E); // set RAM x address count to 0; + sendData(0x00); + sendCmd(0x4F); // set RAM y address count to 0X199; + sendData(0xF9); + sendData(0x00); + readBusy(); + + // sendData(HEIGHT); + // sendData((WIDTH >> 8) & 0xff); + // sendData(WIDTH & 0xff); +} + +void LOLIN_SSD1680::display() +{ + + sendCmd(0x24); //write RAM for black(0)/white (1) + + for (uint16_t i = 0; i < bw_bufsize; i++) + { + sendData(bw_buf[i]); + } + + sendCmd(0x26); //write RAM for red(1)/white (0) + + for (uint16_t i = 0; i < red_bufsize; i++) + { + sendData(red_buf[i]); + } + + update(); +} +void LOLIN_SSD1680::update() +{ + sendCmd(0x22); //Display Update Control + sendData(0xF7); + sendCmd(0x20); //Activate Display Update Sequence + readBusy(); +} + +/**************************************************************************/ +/*! + @brief draw a single pixel on the screen + @param x the x axis position + @param y the y axis position + @param color the color of the pixel +*/ +/**************************************************************************/ +void LOLIN_SSD1680::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) + return; + + uint8_t *pBuf; + + // check rotation, move pixel around if necessary + switch (getRotation()) + { + + case 1: + EPD_swap(x, y); + x = WIDTH - x - 1; + break; + case 2: + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + break; + case 3: + EPD_swap(x, y); + y = HEIGHT - y - 1; + break; + } + //make our buffer happy + x = (x == 0 ? 1 : x); + + // uint16_t addr = (x * height() + y) / 8; + uint16_t addr = (x * _height_8bit + y) / 8; + + if (color == EPD_RED) + { + pBuf = red_buf + addr; + } + else + { + pBuf = bw_buf + addr; + } + + // x is which column + switch (color) + { + case EPD_WHITE: + *pBuf |= (1 << (7 - y % 8)); + break; + case EPD_RED: + *pBuf |= (1 << (7 - y % 8)); + break; + case EPD_BLACK: + *pBuf &= ~(1 << (7 - y % 8)); + break; + case EPD_INVERSE: + *pBuf ^= (1 << (7 - y % 8)); + break; + } +} + +/**************************************************************************/ +/*! + @brief clear all data buffers +*/ +/**************************************************************************/ +void LOLIN_SSD1680::clearBuffer() +{ + memset(bw_buf, 0xFF, bw_bufsize); + memset(red_buf, 0x00, red_bufsize); +} + +/**************************************************************************/ +/*! + @brief clear the display twice to remove any spooky ghost images +*/ +/**************************************************************************/ +void LOLIN_SSD1680::clearDisplay() +{ + clearBuffer(); + display(); + delay(100); + display(); +} + +void LOLIN_SSD1680::readBusy() +{ + if (busy >= 0) + { + while (1) + { + if (digitalRead(busy) == 0) + break; + } + } + else + { + delay(BUSY_WAIT); + } +} + +void LOLIN_SSD1680::deepSleep() +{ + + sendCmd(0x10); //enter deep sleep + sendData(0x01); + delay(100); +} + +void LOLIN_SSD1680::fillbuffer(const unsigned char *black_image, const unsigned char *red_image) +{ + for (int i = 0; i < bw_bufsize; i++) + { + bw_buf[i] = pgm_read_byte(&black_image[i]); + } + + for (int i = 0; i < red_bufsize; i++) + { + red_buf[i] = pgm_read_byte(&red_image[i]); + } +} diff --git a/lib/LOLIN_EPD/src/LOLIN_SSD1680.h b/lib/LOLIN_EPD/src/LOLIN_SSD1680.h new file mode 100644 index 0000000..fbf3828 --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_SSD1680.h @@ -0,0 +1,44 @@ +#ifndef __LOLIN_SSD1680_H +#define __LOLIN_SSD1680_H + +#ifdef __AVR__ +#include +#elif defined(ESP8266) || defined(ESP32) +#include +#else +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) ///< read bytes from program memory +#endif + +#include "LOLIN_EPD.h" + +/**************************************************************************/ +/*! + @brief Class for interfacing with IL3897 EPD drivers +*/ +/**************************************************************************/ +class LOLIN_SSD1680 : public LOLIN_EPD +{ +public: + LOLIN_SSD1680(int width, int height, int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + LOLIN_SSD1680(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + + void begin(bool reset = true); + + void drawPixel(int16_t x, int16_t y, uint16_t color); + + void display(); + void update(); + + void clearBuffer(); + void clearDisplay(); + + void deepSleep(); + + void fillbuffer(const unsigned char *black_image, const unsigned char *red_image); + +protected: + void readBusy(); + int _height_8bit; // height 8-bit alignment +}; + +#endif \ No newline at end of file diff --git a/lib/LOLIN_EPD/src/LOLIN_UC8151D.cpp b/lib/LOLIN_EPD/src/LOLIN_UC8151D.cpp new file mode 100644 index 0000000..737a22e --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_UC8151D.cpp @@ -0,0 +1,244 @@ +#include "LOLIN_EPD.h" +#include "LOLIN_UC8151D.h" + +#define ALLSCREEN_GRAGHBYTES 4000 + +/////////////////////////////////////////////////// + +/////////////////EPD settings Functions///////////////////// + +#define BUSY_WAIT 500 + +/*! + @brief constructor if using on-chip RAM and software SPI + @param width the width of the display in pixels + @param height the height of the display in pixels + @param SID the SID pin to use + @param SCLK the SCLK pin to use + @param DC the data/command pin to use + @param RST the reset pin to use + @param CS the chip select pin to use + @param BUSY the busy pin to use +*/ +/**************************************************************************/ +LOLIN_UC8151D::LOLIN_UC8151D(int width, int height, int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY) : LOLIN_EPD(width, height, SID, SCLK, DC, RST, CS, BUSY) +{ + + if ((height % 8) > 0) + { + _height_8bit = (height / 8 + 1) * 8; + } + else + { + _height_8bit = height; + } + + bw_buf = (uint8_t *)malloc(width * _height_8bit / 8); + red_buf = (uint8_t *)malloc(width * _height_8bit / 8); + bw_bufsize = width * _height_8bit / 8; + red_bufsize = bw_bufsize; +} + +LOLIN_UC8151D::LOLIN_UC8151D(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY) : LOLIN_EPD(width, height, DC, RST, CS, BUSY) +{ + + if ((height % 8) > 0) + { + _height_8bit = (height / 8 + 1) * 8; + } + else + { + _height_8bit = height; + } + + bw_buf = (uint8_t *)malloc(width * _height_8bit / 8); + red_buf = (uint8_t *)malloc(width * _height_8bit / 8); + bw_bufsize = width * _height_8bit / 8; + red_bufsize = bw_bufsize; +} + +/**************************************************************************/ +/*! + @brief begin communication with and set up the display. + @param reset if true the reset pin will be toggled. +*/ +/**************************************************************************/ +void LOLIN_UC8151D::begin(bool reset) +{ + // uint8_t HRES = 0x68; //104 + // uint8_t VRES_byte1 = 0x00; //212 + // uint8_t VRES_byte2 = 0xd4; + + // uint8_t buf[5]; + LOLIN_EPD::begin(reset); + + sendCmd(0x04); + readBusy(); //waiting for the electronic paper IC to release the idle signal + + sendCmd(0x00); //panel setting + sendData(0x0f); //LUT from OTP£¬128x296 + sendData(0x89); //Temperature sensor, boost and other related timing settings + + sendCmd(0x61); //resolution setting + sendData(HEIGHT); + sendData((WIDTH >> 8) & 0xff); + sendData(WIDTH & 0xff); + + sendCmd(0X50); //VCOM AND DATA INTERVAL SETTING + sendData(0x77); //WBmode:VBDF 17|D7 VBDW 97 VBDB 57 WBRmode:VBDF F7 VBDW 77 VBDB 37 VBDR B7 +} + +void LOLIN_UC8151D::display() +{ + + sendCmd(0x10); //write RAM for black(0)/white (1) + + for (uint16_t i = 0; i < bw_bufsize; i++) + { + sendData(bw_buf[i]); + } + + sendCmd(0x13); //write RAM for red(0)/white (1) + + for (uint16_t i = 0; i < red_bufsize; i++) + { + sendData(red_buf[i]); + } + + update(); +} +void LOLIN_UC8151D::update() +{ + sendCmd(0x12); + delay(100); + readBusy(); +} + +/**************************************************************************/ +/*! + @brief draw a single pixel on the screen + @param x the x axis position + @param y the y axis position + @param color the color of the pixel +*/ +/**************************************************************************/ +void LOLIN_UC8151D::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) + return; + + uint8_t *pBuf; + + // check rotation, move pixel around if necessary + switch (getRotation()) + { + case 0: + x = WIDTH - x - 1; + break; + case 1: + EPD_swap(x, y); + break; + case 2: + y = HEIGHT - y - 1; + break; + case 3: + EPD_swap(x, y); + x = WIDTH - x - 1; + y = HEIGHT - y - 1; + break; + } + //make our buffer happy + x = (x == 0 ? 1 : x); + + // uint16_t addr = (x * height() + y) / 8; + uint16_t addr = (x * _height_8bit + y) / 8; + + if (color == EPD_RED) + { + pBuf = red_buf + addr; + } + else + { + pBuf = bw_buf + addr; + } + + // x is which column + switch (color) + { + case EPD_WHITE: + *pBuf |= (1 << (7 - y % 8)); + break; + case EPD_RED: + case EPD_BLACK: + *pBuf &= ~(1 << (7 - y % 8)); + break; + case EPD_INVERSE: + *pBuf ^= (1 << (7 - y % 8)); + break; + } +} + +/**************************************************************************/ +/*! + @brief clear all data buffers +*/ +/**************************************************************************/ +void LOLIN_UC8151D::clearBuffer() +{ + memset(bw_buf, 0xFF, bw_bufsize); + memset(red_buf, 0xFF, red_bufsize); +} + +/**************************************************************************/ +/*! + @brief clear the display twice to remove any spooky ghost images +*/ +/**************************************************************************/ +void LOLIN_UC8151D::clearDisplay() +{ + clearBuffer(); + display(); + delay(100); + display(); +} + +void LOLIN_UC8151D::readBusy() +{ + if (busy >= 0) + { + while (1) + { + if (digitalRead(busy) == 0) + break; + } + } + else + { + delay(BUSY_WAIT); + } +} + +void LOLIN_UC8151D::deepSleep() +{ + sendCmd(0X50); //VCOM AND DATA INTERVAL SETTING + sendData(0xf7); + + sendCmd(0X02); //power off + readBusy(); + + sendCmd(0X07); //deep sleep + sendData(0xA5); +} + +void LOLIN_UC8151D::fillbuffer(const unsigned char *black_image, const unsigned char *red_image) +{ + for (int i = 0; i < bw_bufsize; i++) + { + bw_buf[i] = pgm_read_byte(&black_image[i]); + } + + for (int i = 0; i < red_bufsize; i++) + { + red_buf[i] = pgm_read_byte(&red_image[i]); + } +} diff --git a/lib/LOLIN_EPD/src/LOLIN_UC8151D.h b/lib/LOLIN_EPD/src/LOLIN_UC8151D.h new file mode 100644 index 0000000..fe1fa11 --- /dev/null +++ b/lib/LOLIN_EPD/src/LOLIN_UC8151D.h @@ -0,0 +1,44 @@ +#ifndef __LOLIN_UC8151D_H +#define __LOLIN_UC8151D_H + +#ifdef __AVR__ +#include +#elif defined(ESP8266) || defined(ESP32) +#include +#else +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) ///< read bytes from program memory +#endif + +#include "LOLIN_EPD.h" + +/**************************************************************************/ +/*! + @brief Class for interfacing with IL3897 EPD drivers +*/ +/**************************************************************************/ +class LOLIN_UC8151D : public LOLIN_EPD +{ +public: + LOLIN_UC8151D(int width, int height, int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + LOLIN_UC8151D(int width, int height, int8_t DC, int8_t RST, int8_t CS, int8_t BUSY = -1); + + void begin(bool reset = true); + + void drawPixel(int16_t x, int16_t y, uint16_t color); + + void display(); + void update(); + + void clearBuffer(); + void clearDisplay(); + + void deepSleep(); + + void fillbuffer(const unsigned char *black_image, const unsigned char *red_image); + +protected: + void readBusy(); + int _height_8bit; // height 8-bit alignment +}; + +#endif \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 95f55dd..609fa20 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,7 +9,7 @@ ; https://docs.platformio.org/page/projectconf.html [platformio] -default_envs = s2_mini ; Select from - d1_mini_pro - d1_mini - s2_mini - lolin_d32 +default_envs = d1_mini_pro [env:d1_mini_pro] platform = espressif8266 @@ -29,6 +29,7 @@ lib_deps = thomasfredericks/Bounce2@^2.71 fastled/FastLED@^3.5.0 miguelbalboa/MFRC522@^1.4.10 + adafruit/Adafruit MCP23017 Arduino Library@^2.3.0 [env:d1_mini] platform = espressif8266 @@ -48,6 +49,7 @@ lib_deps = thomasfredericks/Bounce2@^2.71 fastled/FastLED@^3.5.0 miguelbalboa/MFRC522@^1.4.10 + adafruit/Adafruit MCP23017 Arduino Library@^2.3.0 [env:s2_mini] platform = espressif32 @@ -67,6 +69,7 @@ lib_deps = thomasfredericks/Bounce2@^2.71 fastled/FastLED@^3.5.0 miguelbalboa/MFRC522@^1.4.10 + adafruit/Adafruit MCP23017 Arduino Library@^2.3.0 [env:lolin_d32] platform = espressif32 @@ -87,3 +90,4 @@ lib_deps = fastled/FastLED@^3.5.0 miguelbalboa/MFRC522@^1.4.10 sstaub/Ticker@^4.4.0 + adafruit/Adafruit MCP23017 Arduino Library@^2.3.0 diff --git a/src/Dialogue.cpp b/src/Dialogue.cpp new file mode 100644 index 0000000..308e303 --- /dev/null +++ b/src/Dialogue.cpp @@ -0,0 +1,224 @@ +#include +#ifdef DIALOGUE + +#include + +//////// Add new include library +#include +#include +#include +#include + +//////// Define global constantes (ALWAYS IN MAJ, use pin number and not name) + +/// MCP23017 setup/// + +// MCP23017 I2C Adresses +#define MCP23017_ADDRESS1 0x20 +#define MCP23017_ADDRESS2 0x21 +#define MCP23017_ADDRESS3 0x22 +#define MCP23017_ADDRESS4 0x23 + +Adafruit_MCP23X17 mcp1; +Adafruit_MCP23X17 mcp2; +Adafruit_MCP23X17 mcp3; +Adafruit_MCP23X17 mcp4; + +/// button setup/// + +// Create Bounce objects for each button +Bounce button1 = Bounce(); +Bounce button2 = Bounce(); +Bounce button3 = Bounce(); +Bounce button4 = Bounce(); + +#define BUTTON_SKIP D5 +Bounce buttonSKIP = Bounce(); + +/// NeoPixels setup +#define LED_DATA D3 +#define BRIGHTNESS 200 +Adafruit_NeoPixel pixels = Adafruit_NeoPixel(6, LED_DATA, NEO_GRB + NEO_KHZ800); + +//////// Define global variables + +bool choice_made; // for reading button while no choice has been made + +///////////////////////////////////////////////////////////////////////////////////////////// +// User function // +///////////////////////////////////////////////////////////////////////////////////////////// + +/// @brief Si je tape ///, il me propose de mettre des commentaires à la fonction +void my_function() +{ + // ... +} + +/// @brief Read interrupts and send comm to server +void interrupts_read() +{ + if (choice_made == false) + { + + button1.update(); + button2.update(); + button3.update(); + button4.update(); + buttonSKIP.update(); + + if (button1.fell()) + { + comm.send("BTN;0;1"); + choice_made = true; + } + + if (button2.fell()) + { + comm.send("BTN;1;1"); + choice_made = true; + } + + if (button3.fell()) + { + comm.send("BTN;2;1"); + choice_made = true; + } + + if (button4.fell()) + { + comm.send("BTN;3;1"); + choice_made = true; + } + + if (buttonSKIP.fell()) + { + comm.send("BTN;4;1"); + choice_made = true; + } + } +} + +///////////////////////////////////////////////////////////////////////////////////////////// +// Setup and reset // +///////////////////////////////////////////////////////////////////////////////////////////// + +/// @brief Setup function for the module +void MySetup() +{ +// Suround every "Serial" order between "#ifdef LOG" and "#endif" +#ifdef LOG + Serial.println("--- Model ---"); +#endif + + // Initialize I2C communication + Wire.begin(); + + // Initialize MCP23017s + mcp1.begin_I2C(MCP23017_ADDRESS1); + mcp2.begin_I2C(MCP23017_ADDRESS2); + mcp3.begin_I2C(MCP23017_ADDRESS3); + mcp4.begin_I2C(MCP23017_ADDRESS4); + + // Configure GPA0 pins of MCP23017s as inputs + mcp1.pinMode(0, INPUT); + mcp2.pinMode(0, INPUT); + mcp3.pinMode(0, INPUT); + mcp4.pinMode(0, INPUT); + + button1.attach(mcp1.readGPIOAB(), 0); + button1.interval(5); + button2.attach(mcp2.readGPIOAB(), 0); + button2.interval(5); + button3.attach(mcp3.readGPIOAB(), 0); + button3.interval(5); + button4.attach(mcp4.readGPIOAB(), 0); + button4.interval(5); + + // initialise SKIP button + pinMode(BUTTON_SKIP, INPUT); // or pinMode(BUTTON_SKIP, INPUT_PULLUP); if there isn't any pullup inside button + buttonSKIP.attach(BUTTON_SKIP); + buttonSKIP.interval(5); + + // Neo pixels + pixels.begin(); + pixels.setBrightness(BRIGHTNESS); + pixels.clear(); + pixels.show(); +} + +/////////////////////////////// Reset all proprety of module //////////////////////////////// + +/// @brief Call after the config and when the module reset by the app +void ResetModule() +{ +} + +///////////////////////////////// Write here the loop code ///////////////////////////////// + +/// @brief Call at the end of the main loop function +void MyLoop() +{ +} + +///////////////////////////////////////////////////////////////////////////////////////////// +// Communication // +///////////////////////////////////////////////////////////////////////////////////////////// + +/// @brief Call when a message is received from server (or serial) +void Received() +{ + + // If you want debug the received string, you can write this commande: + comm.Info_Received(); + + // The get the received code, use the function GetCode() + if (comm.GetCode() == "TST") + { + // If you need to check the number of parameter available, use the function comm.GetSize() + Serial.println("Number of received parameter :"); + Serial.println(comm.GetSize()); + + // If you want to read one parameter, you can use the function comm.GetParameter(x) + Serial.println("Value of parameter 1 :"); + Serial.println(comm.GetParameter(1)); + } + + if (comm.GetCode() == "TXT") + { + choice_made == 0; + + if (choice_made == 0) + { + // LCD1.println(comm.GetParameter(1)) //print first parameter on LCD1 + // pixels.setPixelColor(1, pixels.Color(comm.GetParameter(2);)); //change color of button LED + // change LCD1 color with GetParameter(2) + + //[...] do the same for the 4 LCD, 5 buttons and 4 LCD colors + // pixels.setPixelColor(5, pixels.Color(comm.GetParameter(9);)); //change color of SKIPbutton LED + + pixels.show(); + interrupts_read(); + } + + if (choice_made == 1) + { + pixels.clear(); // turn of leds + pixels.show(); + + // turn of LCD + } + } +} + +/// @brief When a message is send without server, the message will be received here. You can close the loop to test the module +void ServerSimulation() +{ + // Update navigation status + if (comm.GetCode() == "NVC") + { + // DO something + Serial.println("WOOW, j'ai reçu un NVC en local !"); + } +} + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 1fa7a73..c355ffc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ // Define all system - The used must me define in common.h #include +#include #include #include #include