diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ff213c --- /dev/null +++ b/.gitignore @@ -0,0 +1,69 @@ +app/bin/ +app/pde.jar +build/macosx/work/ +arduino-core/bin/ +arduino-core/arduino-core.jar +hardware/arduino/bootloaders/caterina_LUFA/Descriptors.o +hardware/arduino/bootloaders/caterina_LUFA/Descriptors.lst +hardware/arduino/bootloaders/caterina_LUFA/Caterina.sym +hardware/arduino/bootloaders/caterina_LUFA/Caterina.o +hardware/arduino/bootloaders/caterina_LUFA/Caterina.map +hardware/arduino/bootloaders/caterina_LUFA/Caterina.lst +hardware/arduino/bootloaders/caterina_LUFA/Caterina.lss +hardware/arduino/bootloaders/caterina_LUFA/Caterina.elf +hardware/arduino/bootloaders/caterina_LUFA/Caterina.eep +hardware/arduino/bootloaders/caterina_LUFA/.dep/ +build/*.zip +build/*.tar.bz2 +build/windows/work/ +build/windows/*.zip +build/windows/*.tgz +build/windows/*.tar.bz2 +build/windows/libastylej* +build/windows/liblistSerials* +build/windows/arduino-*.zip +build/windows/dist/*.tar.gz +build/windows/dist/*.tar.bz2 +build/windows/launch4j-*.tgz +build/windows/launch4j-*.zip +build/windows/launcher/launch4j +build/windows/WinAVR-*.zip +build/macosx/arduino-*.zip +build/macosx/dist/*.tar.gz +build/macosx/dist/*.tar.bz2 +build/macosx/*.tar.bz2 +build/macosx/libastylej* +build/macosx/appbundler*.jar +build/macosx/appbundler*.zip +build/macosx/appbundler +build/macosx/appbundler-1.0ea-arduino? +build/macosx/appbundler-1.0ea-arduino*.zip +build/macosx/appbundler-1.0ea-upstream*.zip +build/linux/work/ +build/linux/dist/*.tar.gz +build/linux/dist/*.tar.bz2 +build/linux/*.tgz +build/linux/*.tar.xz +build/linux/*.tar.bz2 +build/linux/*.zip +build/linux/libastylej* +build/linux/liblistSerials* +build/shared/reference*.zip +build/shared/Edison*.zip +build/shared/Galileo*.zip +build/shared/WiFi101-Updater-ArduinoIDE-Plugin*.zip +test-bin +*.iml +.idea +.DS_Store +.directory +hardware/arduino/avr/libraries/Bridge/examples/XivelyClient/passwords.h +avr-toolchain-*.zip +/app/nbproject/private/ +/arduino-core/nbproject/private/ +/app/build/ +/arduino-core/build/ + +manifest.mf +nbbuild.xml +nbproject diff --git a/examples/Watchy_Basic/Watchy_Basic.ino b/examples/Watchy_Basic/Watchy_Basic.ino new file mode 100644 index 0000000..35506c3 --- /dev/null +++ b/examples/Watchy_Basic/Watchy_Basic.ino @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include "GxGDEH0154D67.h" +#include "DSEG7_Classic_Bold_48.h" + +DS3232RTC RTC(false); +GxIO_Class io(SPI, /*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16); // arbitrary selection of 17, 16 +GxEPD_Class display(io, /*RST=*/ 16, /*BUSY=*/ 4); // arbitrary selection of (16), 4 + + +void setup() +{ + esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,0); //enable deep sleep wake on RTC interrupt + RTC.begin(); + if(RTC.oscStopped(false)){ //check if RTC has been stopped + RTC.squareWave(SQWAVE_NONE); //disable square wave output + RTC.set(compileTime()); //set RTC time to compile time + RTC.setAlarm(ALM2_EVERY_MINUTE, 0, 0, 0, 1); //set alarm to every minute + RTC.alarmInterrupt(ALARM_2, true); //enable alarm interrupt + } + RTC.alarm(ALARM_2); //resets the alarm flag in the RTC + showTime(); + esp_deep_sleep_start(); +} + +void loop(){} + +void showTime() +{ + display.init(); + display.fillScreen(GxEPD_BLACK); + display.setTextColor(GxEPD_WHITE); + display.setFont(&DSEG7_Classic_Bold_48); + display.setCursor(15, 120); + + tmElements_t currentTime; + RTC.read(currentTime); + if(currentTime.Hour < 10){ + display.print('0'); + } + display.print(currentTime.Hour); + display.print(':'); + if(currentTime.Minute < 10){ + display.print('0'); + } + display.print(currentTime.Minute); + display.update(); + display.deepSleep(); +} + +time_t compileTime() +{ + const time_t FUDGE(10); //fudge factor to allow for upload time, etc. (seconds, YMMV) + const char *compDate = __DATE__, *compTime = __TIME__, *months = "JanFebMarAprMayJunJulAugSepOctNovDec"; + char compMon[3], *m; + + strncpy(compMon, compDate, 3); + compMon[3] = '\0'; + m = strstr(months, compMon); + + tmElements_t tm; + tm.Month = ((m - months) / 3 + 1); + tm.Day = atoi(compDate + 4); + tm.Year = atoi(compDate + 7) - 1970; + tm.Hour = atoi(compTime); + tm.Minute = atoi(compTime + 3); + tm.Second = atoi(compTime + 6); + + time_t t = makeTime(tm); + return t + FUDGE; //add fudge factor to allow for compile time +} diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..5e9dadb --- /dev/null +++ b/library.properties @@ -0,0 +1,8 @@ +name=Watchy +version=1.0.0 +author=SQFMI +maintainer=SQFMI +sentence=Watchy - An Open Source E-Ink SmartWatch by SQFMI +paragraph=This library contains code samples for Watchy +category=Other +url=https://github.com/sqfmi/Watchy \ No newline at end of file diff --git a/src/DSEG7_Classic_Bold_48.h b/src/DSEG7_Classic_Bold_48.h new file mode 100644 index 0000000..a53a97f --- /dev/null +++ b/src/DSEG7_Classic_Bold_48.h @@ -0,0 +1,199 @@ +// Created by http://oleddisplay.squix.ch/ Consider a donation +// In case of problems make sure that you are using the font file with the correct version! +const uint8_t DSEG7_Classic_Bold_48Bitmaps[] PROGMEM = { + + // Bitmap Data: + 0x00, // ' ' + 0x00, // '!' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '"' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '#' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '$' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '%' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '&' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // ''' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '(' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // ')' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '*' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '+' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // ',' + 0x1F,0xFF,0xF0,0x3F,0xFF,0xF8,0x7F,0xFF,0xFC,0x7F,0xFF,0xFC,0x3F,0xFF,0xF8,0x1F,0xFF,0xF0, // '-' + 0x79,0xFB,0xF7,0xEF,0xCF,0x00, // '.' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '/' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xE0,0x00,0x01,0xEF,0x00,0x00,0x03,0xB8,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xEF,0x80,0x00,0x07,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0xBF,0xFF,0xE7,0xBD,0xFF,0xFF,0xCE,0xEF,0xFF,0xFF,0x99,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // '0' + 0x00,0x18,0x71,0xE7,0xDF,0xBF,0x7E,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7E,0xFD,0xF9,0xF1,0xE1,0xC1,0x80,0x0E,0x3C,0xFB,0xF7,0xEF,0xDF,0xBF,0x7E,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x3E,0x3C,0x38,0x30,0x00, // '1' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xE6,0x07,0xFF,0xFF,0x38,0x0F,0xFF,0xF9,0xE0,0x00,0x00,0x0F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x00,0xF8,0x0F,0xFF,0xF9,0xE0,0x7F,0xFF,0xF3,0x83,0xFF,0xFF,0xE6,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0x0F,0xBF,0xFF,0xE0,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0x3D,0xFF,0xFF,0xC0,0xEF,0xFF,0xFF,0x81,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // '2' + 0x7F,0xFF,0xFF,0x0F,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xE6,0x1F,0xFF,0xFC,0xE0,0xFF,0xFF,0x9E,0x00,0x00,0x03,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x03,0xE0,0xFF,0xFF,0x9E,0x1F,0xFF,0xFC,0xE3,0xFF,0xFF,0xE6,0x3F,0xFF,0xFE,0x01,0xFF,0xFF,0xCE,0x0F,0xFF,0xF9,0xE0,0x00,0x00,0x3E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x7E,0x00,0x00,0x07,0xE0,0x00,0x00,0x3E,0x0F,0xFF,0xF9,0xE1,0xFF,0xFF,0xCE,0x3F,0xFF,0xFE,0x67,0xFF,0xFF,0xF0,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xF0, // '3' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0xFF,0xFF,0x9E,0xF7,0xFF,0xFF,0x3B,0xBF,0xFF,0xFE,0x60,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xCE,0x03,0xFF,0xFE,0x78,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xE0,0x00,0x00,0x01,0x80,0x00,0x00,0x00, // '4' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x03,0xEF,0xFF,0xF8,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xEF,0xFF,0xF8,0x0F,0x7F,0xFF,0xF0,0x3B,0xFF,0xFF,0xE0,0x0F,0xFF,0xFF,0x80,0x1F,0xFF,0xFC,0xE0,0x3F,0xFF,0xE7,0x80,0x00,0x00,0x3E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x3F,0xFF,0xE7,0x81,0xFF,0xFF,0xCE,0x0F,0xFF,0xFF,0x98,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // '5' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x03,0xEF,0xFF,0xF8,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xEF,0xFF,0xF8,0x0F,0x7F,0xFF,0xF0,0x3B,0xFF,0xFF,0xE0,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0xEF,0xBF,0xFF,0xE7,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0xBF,0xFF,0xE7,0xBD,0xFF,0xFF,0xCE,0xEF,0xFF,0xFF,0x99,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // '6' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xE0,0x00,0x01,0xEF,0x00,0x00,0x03,0xB8,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x3E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x0E,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00, // '7' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0xEF,0xBF,0xFF,0xE7,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0xBF,0xFF,0xE7,0xBD,0xFF,0xFF,0xCE,0xEF,0xFF,0xFF,0x99,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // '8' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0x0F,0xFF,0xFF,0x80,0x1F,0xFF,0xFC,0xE0,0x3F,0xFF,0xE7,0x80,0x00,0x00,0x3E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x3F,0xFF,0xE7,0x81,0xFF,0xFF,0xCE,0x0F,0xFF,0xFF,0x98,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // '9' + 0x79,0xF3,0xF7,0xEF,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x9F,0xBF,0x7E,0x78, // ':' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // ';' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '<' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '=' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '>' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '?' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '@' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0xEF,0xBF,0xFF,0xE7,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0x80,0x00,0x07,0xBC,0x00,0x00,0x0E,0xE0,0x00,0x00,0x19,0x00,0x00,0x00,0x00, // 'A' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3E,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0x03,0xBF,0xFF,0xFE,0x0E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'B' + 0x03,0xFF,0xFE,0x00,0x7F,0xFF,0xF0,0x0F,0xFF,0xFF,0x8E,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0x0F,0xBF,0xFF,0xE0,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0x5F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xC0, // 'C' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x0F,0x80,0xFF,0xFF,0x9E,0x07,0xFF,0xFF,0x38,0x3F,0xFF,0xFE,0x6E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'D' + 0x1F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFE,0x5F,0xFF,0xFF,0xCE,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0x0F,0xBF,0xFF,0xE0,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0xEF,0xFF,0xFF,0x8F,0x7F,0xFF,0xF0,0xFB,0xFF,0xFE,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFB,0xFF,0xFE,0x0F,0x7F,0xFF,0xF0,0xEF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFC, // 'E' + 0x1F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFE,0x5F,0xFF,0xFF,0xCE,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0x0F,0xBF,0xFF,0xE0,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0xEF,0xFF,0xFF,0x8F,0x7F,0xFF,0xF0,0xFB,0xFF,0xFE,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xF8,0x00,0x00,0x0F,0x00,0x00,0x00,0xE0,0x00,0x00,0x04,0x00,0x00,0x00, // 'F' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x03,0xEF,0xFF,0xF8,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xEF,0x80,0x00,0x07,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0xBF,0xFF,0xE7,0xBD,0xFF,0xFF,0xCE,0xEF,0xFF,0xFF,0x99,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // 'G' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3E,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0x03,0xBF,0xFF,0xFE,0x0E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xF8,0x00,0x00,0x7B,0xC0,0x00,0x00,0xEE,0x00,0x00,0x01,0x90,0x00,0x00,0x00, // 'H' + 0x1C,0x79,0xF7,0xEF,0xDF,0xBF,0x7E,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7E,0x7C,0x78,0x70,0x60,0x00, // 'I' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x0F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0x3C,0x00,0x00,0x0E,0xF8,0x00,0x00,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'J' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x03,0xEF,0xFF,0xF8,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xEF,0xFF,0xF8,0x0F,0x7F,0xFF,0xF0,0x3B,0xFF,0xFF,0xE0,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0xEF,0xBF,0xFF,0xE7,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0x80,0x00,0x07,0xBC,0x00,0x00,0x0E,0xE0,0x00,0x00,0x19,0x00,0x00,0x00,0x00, // 'K' + 0x40,0x00,0x00,0x0E,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x80,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0x80,0x00,0x00,0xF0,0x00,0x00,0x0E,0x00,0x00,0x00,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF8,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFB,0xFF,0xFE,0x0F,0x7F,0xFF,0xF0,0xEF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFC, // 'L' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xE0,0x00,0x01,0xEF,0x00,0x00,0x03,0xB8,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xEF,0x80,0x00,0x07,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0x80,0x00,0x07,0xBC,0x00,0x00,0x0E,0xE0,0x00,0x00,0x19,0x00,0x00,0x00,0x00, // 'M' + 0x03,0xFF,0xFE,0x00,0x1F,0xFF,0xFC,0x00,0xFF,0xFF,0xF8,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xE0,0x00,0x01,0xEF,0x00,0x00,0x03,0xB8,0x00,0x00,0x06,0x40,0x00,0x00,0x00, // 'N' + 0x03,0xFF,0xFE,0x00,0x1F,0xFF,0xFC,0x00,0xFF,0xFF,0xF8,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0x5F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFC,0x00, // 'O' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0x0F,0xBF,0xFF,0xE0,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0x80,0x00,0x00,0x3C,0x00,0x00,0x00,0xE0,0x00,0x00,0x01,0x00,0x00,0x00,0x00, // 'P' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0x0F,0xFF,0xFF,0x80,0x1F,0xFF,0xFC,0xE0,0x3F,0xFF,0xE7,0x80,0x00,0x00,0x3E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x0E,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00, // 'Q' + 0x03,0xFF,0xFE,0x00,0xFF,0xFF,0xE0,0x3F,0xFF,0xFE,0x77,0xFF,0xFF,0xCF,0x7F,0xFF,0xF1,0xF7,0xFF,0xFC,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF0,0x00,0x00,0x3C,0x00,0x00,0x07,0x00,0x00,0x00,0x40,0x00,0x00,0x00, // 'R' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3E,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0x03,0xBF,0xFF,0xFE,0x00,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xCE,0x03,0xFF,0xFE,0x78,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x03,0xFF,0xFE,0x78,0x1F,0xFF,0xFC,0xE0,0xFF,0xFF,0xF9,0x87,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'S' + 0x40,0x00,0x00,0x0E,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x80,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0xEF,0xFF,0xFF,0x8F,0x7F,0xFF,0xF0,0xFB,0xFF,0xFE,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFB,0xFF,0xFE,0x0F,0x7F,0xFF,0xF0,0xEF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFC, // 'T' + 0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xEF,0x80,0x00,0x07,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0xBF,0xFF,0xE7,0xBD,0xFF,0xFF,0xCE,0xEF,0xFF,0xFF,0x99,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // 'U' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0x00,0x00,0x1E,0xF0,0x00,0x00,0x3B,0x80,0x00,0x00,0x6E,0x00,0x00,0x00,0x3C,0x00,0x00,0x0E,0xF8,0x00,0x00,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'V' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0xFF,0xFF,0x9E,0xF7,0xFF,0xFF,0x3B,0xBF,0xFF,0xFE,0x6E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'W' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0xFF,0xFF,0x9E,0xF7,0xFF,0xFF,0x3B,0xBF,0xFF,0xFE,0x6E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xF8,0x00,0x00,0x7B,0xC0,0x00,0x00,0xEE,0x00,0x00,0x01,0x90,0x00,0x00,0x00, // 'X' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0xFF,0xFF,0x9E,0xF7,0xFF,0xFF,0x3B,0xBF,0xFF,0xFE,0x60,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xCE,0x03,0xFF,0xFE,0x78,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x03,0xFF,0xFE,0x78,0x1F,0xFF,0xFC,0xE0,0xFF,0xFF,0xF9,0x87,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'Y' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xE6,0x07,0xFF,0xFF,0x38,0x0F,0xFF,0xF9,0xE0,0x00,0x00,0x0F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x80,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0x3D,0xFF,0xFF,0xC0,0xEF,0xFF,0xFF,0x81,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // 'Z' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '[' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '\' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // ']' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '^' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '_' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '`' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0xEF,0xBF,0xFF,0xE7,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0x80,0x00,0x07,0xBC,0x00,0x00,0x0E,0xE0,0x00,0x00,0x19,0x00,0x00,0x00,0x00, // 'a' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3E,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0x03,0xBF,0xFF,0xFE,0x0E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'b' + 0x03,0xFF,0xFE,0x00,0x7F,0xFF,0xF0,0x0F,0xFF,0xFF,0x8E,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0x0F,0xBF,0xFF,0xE0,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0x5F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFE,0x1F,0xFF,0xFF,0xC0, // 'c' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x0F,0x80,0xFF,0xFF,0x9E,0x07,0xFF,0xFF,0x38,0x3F,0xFF,0xFE,0x6E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'd' + 0x1F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFE,0x5F,0xFF,0xFF,0xCE,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0x0F,0xBF,0xFF,0xE0,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0xEF,0xFF,0xFF,0x8F,0x7F,0xFF,0xF0,0xFB,0xFF,0xFE,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFB,0xFF,0xFE,0x0F,0x7F,0xFF,0xF0,0xEF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFC, // 'e' + 0x1F,0xFF,0xFF,0xC3,0xFF,0xFF,0xFE,0x5F,0xFF,0xFF,0xCE,0xFF,0xFF,0xF8,0xF7,0xFF,0xFF,0x0F,0xBF,0xFF,0xE0,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0xEF,0xFF,0xFF,0x8F,0x7F,0xFF,0xF0,0xFB,0xFF,0xFE,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xF8,0x00,0x00,0x0F,0x00,0x00,0x00,0xE0,0x00,0x00,0x04,0x00,0x00,0x00, // 'f' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x03,0xEF,0xFF,0xF8,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xEF,0x80,0x00,0x07,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0xBF,0xFF,0xE7,0xBD,0xFF,0xFF,0xCE,0xEF,0xFF,0xFF,0x99,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // 'g' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3E,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0x03,0xBF,0xFF,0xFE,0x0E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xF8,0x00,0x00,0x7B,0xC0,0x00,0x00,0xEE,0x00,0x00,0x01,0x90,0x00,0x00,0x00, // 'h' + 0x1C,0x79,0xF7,0xEF,0xDF,0xBF,0x7E,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7E,0x7C,0x78,0x70,0x60,0x00, // 'i' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x0F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x6E,0x00,0x00,0x00,0x3C,0x00,0x00,0x0E,0xF8,0x00,0x00,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'j' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x03,0xEF,0xFF,0xF8,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xEF,0xFF,0xF8,0x0F,0x7F,0xFF,0xF0,0x3B,0xFF,0xFF,0xE0,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0xEF,0xBF,0xFF,0xE7,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0x80,0x00,0x07,0xBC,0x00,0x00,0x0E,0xE0,0x00,0x00,0x19,0x00,0x00,0x00,0x00, // 'k' + 0x40,0x00,0x00,0x0E,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x80,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0x80,0x00,0x00,0xF0,0x00,0x00,0x0E,0x00,0x00,0x00,0xE0,0x00,0x00,0x0F,0x00,0x00,0x00,0xF8,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFB,0xFF,0xFE,0x0F,0x7F,0xFF,0xF0,0xEF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFC, // 'l' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xE0,0x00,0x01,0xEF,0x00,0x00,0x03,0xB8,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xEF,0x80,0x00,0x07,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0x80,0x00,0x07,0xBC,0x00,0x00,0x0E,0xE0,0x00,0x00,0x19,0x00,0x00,0x00,0x00, // 'm' + 0x03,0xFF,0xFE,0x00,0x1F,0xFF,0xFC,0x00,0xFF,0xFF,0xF8,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xE0,0x00,0x01,0xEF,0x00,0x00,0x03,0xB8,0x00,0x00,0x06,0x40,0x00,0x00,0x00, // 'n' + 0x03,0xFF,0xFE,0x00,0x1F,0xFF,0xFC,0x00,0xFF,0xFF,0xF8,0x3B,0xFF,0xFF,0xE0,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0x5F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFC,0x00, // 'o' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0xEF,0xFF,0xFF,0x83,0xDF,0xFF,0xFC,0x0F,0xBF,0xFF,0xE0,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0x80,0x00,0x00,0x3C,0x00,0x00,0x00,0xE0,0x00,0x00,0x01,0x00,0x00,0x00,0x00, // 'p' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3B,0xFF,0xFF,0xE6,0xF7,0xFF,0xFF,0x3B,0xEF,0xFF,0xF9,0xEF,0xC0,0x00,0x0F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x00,0xFB,0xEF,0xFF,0xF9,0xEF,0x7F,0xFF,0xF3,0xBB,0xFF,0xFF,0xE6,0x0F,0xFF,0xFF,0x80,0x1F,0xFF,0xFC,0xE0,0x3F,0xFF,0xE7,0x80,0x00,0x00,0x3E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x03,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x0E,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00, // 'q' + 0x03,0xFF,0xFE,0x00,0xFF,0xFF,0xE0,0x3F,0xFF,0xFE,0x77,0xFF,0xFF,0xCF,0x7F,0xFF,0xF1,0xF7,0xFF,0xFC,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF8,0x00,0x00,0x3F,0x00,0x00,0x07,0xE0,0x00,0x00,0xFC,0x00,0x00,0x1F,0x80,0x00,0x03,0xF0,0x00,0x00,0x7E,0x00,0x00,0x0F,0xC0,0x00,0x01,0xF0,0x00,0x00,0x3C,0x00,0x00,0x07,0x00,0x00,0x00,0x40,0x00,0x00,0x00, // 'r' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3E,0xFF,0xFF,0x80,0xF7,0xFF,0xFF,0x03,0xBF,0xFF,0xFE,0x00,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xCE,0x03,0xFF,0xFE,0x78,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x03,0xFF,0xFE,0x78,0x1F,0xFF,0xFC,0xE0,0xFF,0xFF,0xF9,0x87,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 's' + 0x40,0x00,0x00,0x0E,0x00,0x00,0x00,0xF0,0x00,0x00,0x0F,0x80,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0xF7,0xFF,0xFF,0x0E,0xFF,0xFF,0xF8,0xEF,0xFF,0xFF,0x8F,0x7F,0xFF,0xF0,0xFB,0xFF,0xFE,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFC,0x00,0x00,0x0F,0xC0,0x00,0x00,0xFB,0xFF,0xFE,0x0F,0x7F,0xFF,0xF0,0xEF,0xFF,0xFF,0x85,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xE1,0xFF,0xFF,0xFC, // 't' + 0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0xEF,0x80,0x00,0x07,0xBF,0x00,0x00,0x3E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x03,0xEF,0xBF,0xFF,0xE7,0xBD,0xFF,0xFF,0xCE,0xEF,0xFF,0xFF,0x99,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // 'u' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0x00,0x00,0x1E,0xF0,0x00,0x00,0x3B,0x80,0x00,0x00,0x6E,0x00,0x00,0x00,0x3C,0x00,0x00,0x0E,0xF8,0x00,0x00,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'v' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0xFF,0xFF,0x9E,0xF7,0xFF,0xFF,0x3B,0xBF,0xFF,0xFE,0x6E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xFB,0xFF,0xFE,0x7B,0xDF,0xFF,0xFC,0xEE,0xFF,0xFF,0xF9,0x97,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'w' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0xFF,0xFF,0x9E,0xF7,0xFF,0xFF,0x3B,0xBF,0xFF,0xFE,0x6E,0xFF,0xFF,0xF8,0x3D,0xFF,0xFF,0xCE,0xFB,0xFF,0xFE,0x7B,0xF0,0x00,0x03,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x3E,0xF8,0x00,0x00,0x7B,0xC0,0x00,0x00,0xEE,0x00,0x00,0x01,0x90,0x00,0x00,0x00, // 'x' + 0x40,0x00,0x00,0x03,0x80,0x00,0x00,0x6F,0x00,0x00,0x03,0xBE,0x00,0x00,0x1E,0xFC,0x00,0x00,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x1F,0xBF,0x00,0x00,0x7E,0xFC,0x00,0x01,0xFB,0xF0,0x00,0x07,0xEF,0xC0,0x00,0x0F,0xBE,0xFF,0xFF,0x9E,0xF7,0xFF,0xFF,0x3B,0xBF,0xFF,0xFE,0x60,0xFF,0xFF,0xF8,0x01,0xFF,0xFF,0xCE,0x03,0xFF,0xFE,0x78,0x00,0x00,0x03,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x3E,0x03,0xFF,0xFE,0x78,0x1F,0xFF,0xFC,0xE0,0xFF,0xFF,0xF9,0x87,0xFF,0xFF,0xF0,0x3F,0xFF,0xFF,0xE0,0x7F,0xFF,0xFF,0x00, // 'y' + 0x1F,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xE6,0x07,0xFF,0xFF,0x38,0x0F,0xFF,0xF9,0xE0,0x00,0x00,0x0F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x01,0xF8,0x00,0x00,0x07,0xE0,0x00,0x00,0x1F,0x80,0x00,0x00,0x7E,0x00,0x00,0x00,0xF8,0x00,0x00,0x01,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x06,0xE0,0x00,0x00,0x03,0xC0,0x00,0x00,0x0F,0x80,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0xFC,0x00,0x00,0x03,0xF0,0x00,0x00,0x0F,0xBF,0xFF,0xE0,0x3D,0xFF,0xFF,0xC0,0xEF,0xFF,0xFF,0x81,0x7F,0xFF,0xFF,0x03,0xFF,0xFF,0xFE,0x07,0xFF,0xFF,0xF0, // 'z' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '{' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE, // '|' + 0xFF,0xFB,0xFF,0xEC,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6C,0x01,0xB0,0x06,0xC0,0x1B,0x00,0x6F,0xFF,0xBF,0xFE // '}' +}; +const GFXglyph DSEG7_Classic_Bold_48Glyphs[] PROGMEM = { +// bitmapOffset, width, height, xAdvance, xOffset, yOffset + { 0, 1, 1, 11, 0, 0 }, // ' ' + { 1, 1, 1, 40, 0, 0 }, // '!' + { 2, 14, 32, 18, 2, -32 }, // '"' + { 58, 14, 32, 18, 2, -32 }, // '#' + { 114, 14, 32, 18, 2, -32 }, // '$' + { 170, 14, 32, 18, 2, -32 }, // '%' + { 226, 14, 32, 18, 2, -32 }, // '&' + { 282, 14, 32, 18, 2, -32 }, // ''' + { 338, 14, 32, 18, 2, -32 }, // '(' + { 394, 14, 32, 18, 2, -32 }, // ')' + { 450, 14, 32, 18, 2, -32 }, // '*' + { 506, 14, 32, 18, 2, -32 }, // '+' + { 562, 14, 32, 18, 2, -32 }, // ',' + { 618, 24, 6, 40, 8, -27 }, // '-' + { 636, 7, 6, 1, -3, -6 }, // '.' + { 642, 14, 32, 18, 2, -32 }, // '/' + { 698, 30, 48, 40, 5, -48 }, // '0' + { 878, 7, 44, 40, 28, -46 }, // '1' + { 917, 30, 48, 40, 5, -48 }, // '2' + { 1097, 28, 48, 40, 7, -48 }, // '3' + { 1265, 30, 44, 40, 5, -46 }, // '4' + { 1430, 30, 48, 40, 5, -48 }, // '5' + { 1610, 30, 48, 40, 5, -48 }, // '6' + { 1790, 30, 46, 40, 5, -48 }, // '7' + { 1963, 30, 48, 40, 5, -48 }, // '8' + { 2143, 30, 48, 40, 5, -48 }, // '9' + { 2323, 7, 25, 11, 2, -36 }, // ':' + { 2345, 14, 32, 18, 2, -32 }, // ';' + { 2401, 14, 32, 18, 2, -32 }, // '<' + { 2457, 14, 32, 18, 2, -32 }, // '=' + { 2513, 14, 32, 18, 2, -32 }, // '>' + { 2569, 14, 32, 18, 2, -32 }, // '?' + { 2625, 14, 32, 18, 2, -32 }, // '@' + { 2681, 30, 46, 40, 5, -48 }, // 'A' + { 2854, 30, 46, 40, 5, -46 }, // 'B' + { 3027, 28, 27, 40, 5, -27 }, // 'C' + { 3122, 30, 46, 40, 5, -46 }, // 'D' + { 3295, 28, 48, 40, 5, -48 }, // 'E' + { 3463, 28, 46, 40, 5, -48 }, // 'F' + { 3624, 30, 48, 40, 5, -48 }, // 'G' + { 3804, 30, 44, 40, 5, -46 }, // 'H' + { 3969, 7, 21, 40, 28, -23 }, // 'I' + { 3988, 30, 46, 40, 5, -46 }, // 'J' + { 4161, 30, 46, 40, 5, -48 }, // 'K' + { 4334, 28, 46, 40, 5, -46 }, // 'L' + { 4495, 30, 46, 40, 5, -48 }, // 'M' + { 4668, 30, 25, 40, 5, -27 }, // 'N' + { 4762, 30, 27, 40, 5, -27 }, // 'O' + { 4864, 30, 46, 40, 5, -48 }, // 'P' + { 5037, 30, 46, 40, 5, -48 }, // 'Q' + { 5210, 27, 25, 40, 5, -27 }, // 'R' + { 5295, 30, 46, 40, 5, -46 }, // 'S' + { 5468, 28, 46, 40, 5, -46 }, // 'T' + { 5629, 30, 24, 40, 5, -24 }, // 'U' + { 5719, 30, 46, 40, 5, -46 }, // 'V' + { 5892, 30, 46, 40, 5, -46 }, // 'W' + { 6065, 30, 44, 40, 5, -46 }, // 'X' + { 6230, 30, 46, 40, 5, -46 }, // 'Y' + { 6403, 30, 48, 40, 5, -48 }, // 'Z' + { 6583, 14, 32, 18, 2, -32 }, // '[' + { 6639, 14, 32, 18, 2, -32 }, // '\' + { 6695, 14, 32, 18, 2, -32 }, // ']' + { 6751, 14, 32, 18, 2, -32 }, // '^' + { 6807, 14, 32, 18, 2, -32 }, // '_' + { 6863, 14, 32, 18, 2, -32 }, // '`' + { 6919, 30, 46, 40, 5, -48 }, // 'a' + { 7092, 30, 46, 40, 5, -46 }, // 'b' + { 7265, 28, 27, 40, 5, -27 }, // 'c' + { 7360, 30, 46, 40, 5, -46 }, // 'd' + { 7533, 28, 48, 40, 5, -48 }, // 'e' + { 7701, 28, 46, 40, 5, -48 }, // 'f' + { 7862, 30, 48, 40, 5, -48 }, // 'g' + { 8042, 30, 44, 40, 5, -46 }, // 'h' + { 8207, 7, 21, 40, 28, -23 }, // 'i' + { 8226, 30, 46, 40, 5, -46 }, // 'j' + { 8399, 30, 46, 40, 5, -48 }, // 'k' + { 8572, 28, 46, 40, 5, -46 }, // 'l' + { 8733, 30, 46, 40, 5, -48 }, // 'm' + { 8906, 30, 25, 40, 5, -27 }, // 'n' + { 9000, 30, 27, 40, 5, -27 }, // 'o' + { 9102, 30, 46, 40, 5, -48 }, // 'p' + { 9275, 30, 46, 40, 5, -48 }, // 'q' + { 9448, 27, 25, 40, 5, -27 }, // 'r' + { 9533, 30, 46, 40, 5, -46 }, // 's' + { 9706, 28, 46, 40, 5, -46 }, // 't' + { 9867, 30, 24, 40, 5, -24 }, // 'u' + { 9957, 30, 46, 40, 5, -46 }, // 'v' + { 10130, 30, 46, 40, 5, -46 }, // 'w' + { 10303, 30, 44, 40, 5, -46 }, // 'x' + { 10468, 30, 46, 40, 5, -46 }, // 'y' + { 10641, 30, 48, 40, 5, -48 }, // 'z' + { 10821, 14, 32, 18, 2, -32 }, // '{' + { 10877, 14, 32, 18, 2, -32 }, // '|' + { 10933, 14, 32, 18, 2, -32 } // '}' +}; +const GFXfont DSEG7_Classic_Bold_48 PROGMEM = { +(uint8_t *)DSEG7_Classic_Bold_48Bitmaps,(GFXglyph *)DSEG7_Classic_Bold_48Glyphs,0x20, 0x7E, 53}; diff --git a/src/GxGDEH0154D67.cpp b/src/GxGDEH0154D67.cpp new file mode 100644 index 0000000..4751cc6 --- /dev/null +++ b/src/GxGDEH0154D67.cpp @@ -0,0 +1,875 @@ +// class GxGDEH0154D67 : Display class for GDEH0154D67 e-Paper from Dalian Good Display Co., Ltd.: www.good-display.com +// +// Author : SQFMI +// +// Version : see library.properties +// +// License: GNU GENERAL PUBLIC LICENSE V3, see LICENSE +// +// Library: https://github.com/sqfmi/GxEPD + +#include "GxGDEH0154D67.h" + +//#define DISABLE_DIAGNOSTIC_OUTPUT + +#if defined(ESP8266) || defined(ESP32) +#include +#else +#include +#endif + +// Partial Update Delay, may have an influence on degradation +#define GxGDEH0154D67_PU_DELAY 300 + +/*const uint8_t GxGDEH0154D67::LUTDefault_full[] = +{ + 0x32, // command + 0x50, 0xAA, 0x55, 0xAA, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t GxGDEH0154D67::LUTDefault_part[] = +{ + 0x32, // command + 0x10, 0x18, 0x18, 0x08, 0x18, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x14, 0x44, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const uint8_t GxGDEH0154D67::GDOControl[] = {0x01, (GxGDEH0154D67_Y_PIXELS - 1) % 256, (GxGDEH0154D67_Y_PIXELS - 1) / 256, 0x00}; //for 1.54inch +const uint8_t GxGDEH0154D67::softstart[] = {0x0c, 0xd7, 0xd6, 0x9d}; +const uint8_t GxGDEH0154D67::VCOMVol[] = {0x2c, 0x9b}; // VCOM 7c +const uint8_t GxGDEH0154D67::DummyLine[] = {0x3a, 0x1a}; // 4 dummy line per gate +const uint8_t GxGDEH0154D67::Gatetime[] = {0x3b, 0x08}; // 2us per line*/ + +GxGDEH0154D67::GxGDEH0154D67(GxIO& io, int8_t rst, int8_t busy) : + GxEPD(GxGDEH0154D67_WIDTH, GxGDEH0154D67_HEIGHT), IO(io), + _current_page(-1), _using_partial_mode(false), _diag_enabled(false), + _rst(rst), _busy(busy) +{ +} + +void GxGDEH0154D67::drawPixel(int16_t x, int16_t y, uint16_t color) +{ + if ((x < 0) || (x >= width()) || (y < 0) || (y >= height())) return; + + // check rotation, move pixel around if necessary + switch (getRotation()) + { + case 1: + swap(x, y); + x = GxGDEH0154D67_WIDTH - x - 1; + break; + case 2: + x = GxGDEH0154D67_WIDTH - x - 1; + y = GxGDEH0154D67_HEIGHT - y - 1; + break; + case 3: + swap(x, y); + y = GxGDEH0154D67_HEIGHT - y - 1; + break; + } + uint16_t i = x / 8 + y * GxGDEH0154D67_WIDTH / 8; + if (_current_page < 1) + { + if (i >= sizeof(_buffer)) return; + } + else + { + y -= _current_page * GxGDEH0154D67_PAGE_HEIGHT; + if ((y < 0) || (y >= GxGDEH0154D67_PAGE_HEIGHT)) return; + i = x / 8 + y * GxGDEH0154D67_WIDTH / 8; + } + + if (!color) + _buffer[i] = (_buffer[i] | (1 << (7 - x % 8))); + else + _buffer[i] = (_buffer[i] & (0xFF ^ (1 << (7 - x % 8)))); +} + +void GxGDEH0154D67::init(uint32_t serial_diag_bitrate) +{ + if (serial_diag_bitrate > 0) + { + Serial.begin(serial_diag_bitrate); + _diag_enabled = true; + } + IO.init(); + IO.setFrequency(4000000); // 4MHz + if (_rst >= 0) + { + digitalWrite(_rst, HIGH); + pinMode(_rst, OUTPUT); + } + if (_busy >= 0) pinMode(_busy, INPUT); + fillScreen(GxEPD_WHITE); + _current_page = -1; + _using_partial_mode = false; +} + +void GxGDEH0154D67::fillScreen(uint16_t color) +{ + uint8_t data = (color == GxEPD_BLACK) ? 0xFF : 0x00; + for (uint16_t x = 0; x < sizeof(_buffer); x++) + { + _buffer[x] = data; + } +} + +void GxGDEH0154D67::update(void) +{ + if (_current_page != -1) return; + _using_partial_mode = false; + _Init_Full(0x03); + _writeCommand(0x24); + for (uint16_t y = 0; y < GxGDEH0154D67_HEIGHT; y++) + { + for (uint16_t x = 0; x < GxGDEH0154D67_WIDTH / 8; x++) + { + uint16_t idx = y * (GxGDEH0154D67_WIDTH / 8) + x; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } + _Update_Full(); + _PowerOff(); +} + +void GxGDEH0154D67::drawBitmap(const uint8_t *bitmap, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color, int16_t mode) +{ + if (mode & bm_default) mode |= bm_flip_x | bm_invert; + drawBitmapBM(bitmap, x, y, w, h, color, mode); +} + +void GxGDEH0154D67::drawBitmap(const uint8_t *bitmap, uint32_t size, int16_t mode) +{ + if (_current_page != -1) return; + // example bitmaps are made for y-decrement, x-increment, for origin on opposite corner + // bm_flip_x for normal display (bm_flip_y would be rotated) + if (mode & bm_default) mode |= bm_flip_x; + uint8_t ram_entry_mode = 0x03; // y-increment, x-increment for normal mode + if ((mode & bm_flip_y) && (mode & bm_flip_x)) ram_entry_mode = 0x00; // y-decrement, x-decrement + else if (mode & bm_flip_y) ram_entry_mode = 0x01; // y-decrement, x-increment + else if (mode & bm_flip_x) ram_entry_mode = 0x02; // y-increment, x-decrement + if (mode & bm_partial_update) + { + _using_partial_mode = true; // remember + _Init_Part(ram_entry_mode); + _writeCommand(0x24); + for (uint32_t i = 0; i < GxGDEH0154D67_BUFFER_SIZE; i++) + { + uint8_t data = 0xFF; // white is 0xFF on device + if (i < size) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&bitmap[i]); +#else + data = bitmap[i]; +#endif + if (mode & bm_invert) data = ~data; + } + _writeData(data); + } + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + _writeCommand(0x24); + for (uint32_t i = 0; i < GxGDEH0154D67_BUFFER_SIZE; i++) + { + uint8_t data = 0xFF; // white is 0xFF on device + if (i < size) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&bitmap[i]); +#else + data = bitmap[i]; +#endif + if (mode & bm_invert) data = ~data; + } + _writeData(data); + } + delay(GxGDEH0154D67_PU_DELAY); + _PowerOff(); + } + else + { + _using_partial_mode = false; // remember + _Init_Full(ram_entry_mode); + _writeCommand(0x24); + for (uint32_t i = 0; i < GxGDEH0154D67_BUFFER_SIZE; i++) + { + uint8_t data = 0xFF; // white is 0xFF on device + if (i < size) + { +#if defined(__AVR) || defined(ESP8266) || defined(ESP32) + data = pgm_read_byte(&bitmap[i]); +#else + data = bitmap[i]; +#endif + if (mode & bm_invert) data = ~data; + } + _writeData(data); + } + _Update_Full(); + _PowerOff(); + } +} + +void GxGDEH0154D67::eraseDisplay(bool using_partial_update) +{ + if (_current_page != -1) return; + if (using_partial_update) + { + _using_partial_mode = true; // remember + _Init_Part(0x01); + _writeCommand(0x24); + for (uint32_t i = 0; i < GxGDEH0154D67_BUFFER_SIZE; i++) + { + _writeData(0xFF); + } + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + _writeCommand(0x24); + for (uint32_t i = 0; i < GxGDEH0154D67_BUFFER_SIZE; i++) + { + _writeData(0xFF); + } + delay(GxGDEH0154D67_PU_DELAY); + } + else + { + _using_partial_mode = false; // remember + _Init_Full(0x01); + _writeCommand(0x24); + for (uint32_t i = 0; i < GxGDEH0154D67_BUFFER_SIZE; i++) + { + _writeData(0xFF); + } + _Update_Full(); + _PowerOff(); + } +} + +void GxGDEH0154D67::updateWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h, bool using_rotation) +{ + if (_current_page != -1) return; + if (using_rotation) _rotate(x, y, w, h); + if (x >= GxGDEH0154D67_WIDTH) return; + if (y >= GxGDEH0154D67_HEIGHT) return; + uint16_t xe = gx_uint16_min(GxGDEH0154D67_WIDTH, x + w) - 1; + uint16_t ye = gx_uint16_min(GxGDEH0154D67_HEIGHT, y + h) - 1; + uint16_t xs_d8 = x / 8; + uint16_t xe_d8 = xe / 8; + _Init_Part(0x03); + _SetRamArea(xs_d8, xe_d8, y % 256, y / 256, ye % 256, ye / 256); // X-source area,Y-gate area + _SetRamPointer(xs_d8, y % 256, y / 256); // set ram + _waitWhileBusy(0, 100); // needed ? + _writeCommand(0x24); + for (int16_t y1 = y; y1 <= ye; y1++) + { + for (int16_t x1 = xs_d8; x1 <= xe_d8; x1++) + { + uint16_t idx = y1 * (GxGDEH0154D67_WIDTH / 8) + x1; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + _SetRamArea(xs_d8, xe_d8, y % 256, y / 256, ye % 256, ye / 256); // X-source area,Y-gate area + _SetRamPointer(xs_d8, y % 256, y / 256); // set ram + _waitWhileBusy(0, 100); // needed ? + _writeCommand(0x24); + for (int16_t y1 = y; y1 <= ye; y1++) + { + for (int16_t x1 = xs_d8; x1 <= xe_d8; x1++) + { + uint16_t idx = y1 * (GxGDEH0154D67_WIDTH / 8) + x1; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } + delay(GxGDEH0154D67_PU_DELAY); +} + +void GxGDEH0154D67::_writeToWindow(uint16_t xs, uint16_t ys, uint16_t xd, uint16_t yd, uint16_t w, uint16_t h) +{ + //Serial.printf("_writeToWindow(%d, %d, %d, %d, %d, %d)\n", xs, ys, xd, yd, w, h); + // the screen limits are the hard limits + if (xs >= GxGDEH0154D67_WIDTH) return; + if (ys >= GxGDEH0154D67_HEIGHT) return; + if (xd >= GxGDEH0154D67_WIDTH) return; + if (yd >= GxGDEH0154D67_HEIGHT) return; + w = gx_uint16_min(w, GxGDEH0154D67_WIDTH - xs); + w = gx_uint16_min(w, GxGDEH0154D67_WIDTH - xd); + h = gx_uint16_min(h, GxGDEH0154D67_HEIGHT - ys); + h = gx_uint16_min(h, GxGDEH0154D67_HEIGHT - yd); + uint16_t xds_d8 = xd / 8; + uint16_t xde_d8 = (xd + w - 1) / 8; + uint16_t yde = yd + h - 1; + // soft limits, must send as many bytes as set by _SetRamArea + uint16_t xse_d8 = xs / 8 + xde_d8 - xds_d8; + uint16_t yse = ys + h - 1; + _SetRamArea(xds_d8, xde_d8, yd % 256, yd / 256, yde % 256, yde / 256); // X-source area,Y-gate area + _SetRamPointer(xds_d8, yd % 256, yd / 256); // set ram + _waitWhileBusy(0, 100); // needed ? + _writeCommand(0x24); + for (int16_t y1 = ys; y1 <= yse; y1++) + { + for (int16_t x1 = xs / 8; x1 <= xse_d8; x1++) + { + uint16_t idx = y1 * (GxGDEH0154D67_WIDTH / 8) + x1; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } +} + +void GxGDEH0154D67::updateToWindow(uint16_t xs, uint16_t ys, uint16_t xd, uint16_t yd, uint16_t w, uint16_t h, bool using_rotation) +{ + if (using_rotation) + { + switch (getRotation()) + { + case 1: + swap(xs, ys); + swap(xd, yd); + swap(w, h); + xs = GxGDEH0154D67_WIDTH - xs - w - 1; + xd = GxGDEH0154D67_WIDTH - xd - w - 1; + break; + case 2: + xs = GxGDEH0154D67_WIDTH - xs - w - 1; + ys = GxGDEH0154D67_HEIGHT - ys - h - 1; + xd = GxGDEH0154D67_WIDTH - xd - w - 1; + yd = GxGDEH0154D67_HEIGHT - yd - h - 1; + break; + case 3: + swap(xs, ys); + swap(xd, yd); + swap(w, h); + ys = GxGDEH0154D67_HEIGHT - ys - h - 1; + yd = GxGDEH0154D67_HEIGHT - yd - h - 1; + break; + } + } + _Init_Part(0x03); + _writeToWindow(xs, ys, xd, yd, w, h); + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + _writeToWindow(xs, ys, xd, yd, w, h); + delay(GxGDEH0154D67_PU_DELAY); +} + +void GxGDEH0154D67::powerDown() +{ + _using_partial_mode = false; + _PowerOff(); +} + +void GxGDEH0154D67::deepSleep() +{ + _writeCommand(0x10); //enter deep sleep + _writeData(0x01); +} + +void GxGDEH0154D67::_writeCommand(uint8_t command) +{ + if ((_busy >= 0) && digitalRead(_busy)) + { + String str = String("command 0x") + String(command, HEX); + _waitWhileBusy(str.c_str(), 100); // needed? + } + IO.writeCommandTransaction(command); +} + +void GxGDEH0154D67::_writeData(uint8_t data) +{ + IO.writeDataTransaction(data); +} + +void GxGDEH0154D67::_writeCommandData(const uint8_t* pCommandData, uint8_t datalen) +{ + if ((_busy >= 0) && digitalRead(_busy)) + { + String str = String("command 0x") + String(pCommandData[0], HEX); + _waitWhileBusy(str.c_str(), 100); // needed? + } + IO.startTransaction(); + IO.writeCommand(*pCommandData++); + for (uint8_t i = 0; i < datalen - 1; i++) // sub the command + { + IO.writeData(*pCommandData++); + } + IO.endTransaction(); + +} + +void GxGDEH0154D67::_waitWhileBusy(const char* comment, uint16_t busy_time) +{ + if (_busy >= 0) + { + unsigned long start = micros(); + while (1) + { + if (!digitalRead(_busy)) break; + delay(1); + if (micros() - start > 10000000) + { + if (_diag_enabled) Serial.println("Busy Timeout!"); + break; + } + } + if (comment) + { +#if !defined(DISABLE_DIAGNOSTIC_OUTPUT) + if (_diag_enabled) + { + unsigned long elapsed = micros() - start; + Serial.print(comment); + Serial.print(" : "); + Serial.println(elapsed); + } +#endif + } + (void) start; + } + else delay(busy_time); +} + +void GxGDEH0154D67::_setRamDataEntryMode(uint8_t em) +{ + const uint16_t xPixelsPar = GxGDEH0154D67_X_PIXELS - 1; + const uint16_t yPixelsPar = GxGDEH0154D67_Y_PIXELS - 1; + em = gx_uint16_min(em, 0x03); + _writeCommand(0x11); + _writeData(em); + switch (em) + { + case 0x00: // x decrease, y decrease + _SetRamArea(xPixelsPar / 8, 0x00, yPixelsPar % 256, yPixelsPar / 256, 0x00, 0x00); // X-source area,Y-gate area + _SetRamPointer(xPixelsPar / 8, yPixelsPar % 256, yPixelsPar / 256); // set ram + break; + case 0x01: // x increase, y decrease : as in demo code + _SetRamArea(0x00, xPixelsPar / 8, yPixelsPar % 256, yPixelsPar / 256, 0x00, 0x00); // X-source area,Y-gate area + _SetRamPointer(0x00, yPixelsPar % 256, yPixelsPar / 256); // set ram + break; + case 0x02: // x decrease, y increase + _SetRamArea(xPixelsPar / 8, 0x00, 0x00, 0x00, yPixelsPar % 256, yPixelsPar / 256); // X-source area,Y-gate area + _SetRamPointer(xPixelsPar / 8, 0x00, 0x00); // set ram + break; + case 0x03: // x increase, y increase : normal mode + _SetRamArea(0x00, xPixelsPar / 8, 0x00, 0x00, yPixelsPar % 256, yPixelsPar / 256); // X-source area,Y-gate area + _SetRamPointer(0x00, 0x00, 0x00); // set ram + break; + } +} + +void GxGDEH0154D67::_SetRamArea(uint8_t Xstart, uint8_t Xend, uint8_t Ystart, uint8_t Ystart1, uint8_t Yend, uint8_t Yend1) +{ + _writeCommand(0x44); + _writeData(Xstart); + _writeData(Xend); + _writeCommand(0x45); + _writeData(Ystart); + _writeData(Ystart1); + _writeData(Yend); + _writeData(Yend1); +} + +void GxGDEH0154D67::_SetRamPointer(uint8_t addrX, uint8_t addrY, uint8_t addrY1) +{ + _writeCommand(0x4e); + _writeData(addrX); + _writeCommand(0x4f); + _writeData(addrY); + _writeData(addrY1); +} + +void GxGDEH0154D67::_PowerOn(void) +{ + _writeCommand(0x22); + _writeData(0xc0); + _writeCommand(0x20); + _waitWhileBusy("_PowerOn", power_on_time); +} + +void GxGDEH0154D67::_PowerOff(void) +{ + _writeCommand(0x22); + _writeData(0xc3); + _writeCommand(0x20); + _waitWhileBusy("_PowerOff", power_off_time); +} + +void GxGDEH0154D67::_InitDisplay(uint8_t em) +{ + _writeCommand(0x12); + _waitWhileBusy("_SWReset", power_on_time); + + _writeCommand(0x01); + _writeData(0xC7); + _writeData(0x00); + _writeData(0x00); + + _writeCommand(0x3C); + _writeData(0x05); + _writeCommand(0x18); + _writeData(0x80); + + /*_writeCommandData(GDOControl, sizeof(GDOControl)); // Pannel configuration, Gate selection + _writeCommandData(softstart, sizeof(softstart)); // X decrease, Y decrease + _writeCommandData(VCOMVol, sizeof(VCOMVol)); // VCOM setting + _writeCommandData(DummyLine, sizeof(DummyLine)); // dummy line per gate + _writeCommandData(Gatetime, sizeof(Gatetime)); // Gate time setting*/ + _setRamDataEntryMode(em); +} + +void GxGDEH0154D67::_Init_Full(uint8_t em) +{ + _InitDisplay(em); + //_writeCommandData(LUTDefault_full, sizeof(LUTDefault_full)); + _PowerOn(); +} + +void GxGDEH0154D67::_Init_Part(uint8_t em) +{ + _InitDisplay(em); + //_writeCommandData(LUTDefault_part, sizeof(LUTDefault_part)); + _PowerOn(); +} + +void GxGDEH0154D67::_Update_Full(void) +{ + _writeCommand(0x22); + _writeData(0xf7); + _writeCommand(0x20); + _waitWhileBusy("_Update_Full", full_refresh_time); + //_writeCommand(0xff); +} + +void GxGDEH0154D67::_Update_Part(void) +{ + _writeCommand(0x22); + _writeData(0xff); + _writeCommand(0x20); + _waitWhileBusy("_Update_Part", partial_refresh_time); + //_writeCommand(0xff); +} + +void GxGDEH0154D67::drawPaged(void (*drawCallback)(void)) +{ + if (_current_page != -1) return; + _using_partial_mode = false; + _Init_Full(0x03); + _writeCommand(0x24); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + fillScreen(GxEPD_WHITE); + drawCallback(); + for (int16_t y1 = 0; y1 < GxGDEH0154D67_PAGE_HEIGHT; y1++) + { + for (int16_t x1 = 0; x1 < GxGDEH0154D67_WIDTH / 8; x1++) + { + uint16_t idx = y1 * (GxGDEH0154D67_WIDTH / 8) + x1; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } + } + _current_page = -1; + _Update_Full(); + _PowerOff(); +} + +void GxGDEH0154D67::drawPaged(void (*drawCallback)(uint32_t), uint32_t p) +{ + if (_current_page != -1) return; + _using_partial_mode = false; + _Init_Full(0x03); + _writeCommand(0x24); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + fillScreen(GxEPD_WHITE); + drawCallback(p); + for (int16_t y1 = 0; y1 < GxGDEH0154D67_PAGE_HEIGHT; y1++) + { + for (int16_t x1 = 0; x1 < GxGDEH0154D67_WIDTH / 8; x1++) + { + uint16_t idx = y1 * (GxGDEH0154D67_WIDTH / 8) + x1; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } + } + _current_page = -1; + _Update_Full(); + _PowerOff(); +} + +void GxGDEH0154D67::drawPaged(void (*drawCallback)(const void*), const void* p) +{ + if (_current_page != -1) return; + _using_partial_mode = false; + _Init_Full(0x03); + _writeCommand(0x24); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + fillScreen(GxEPD_WHITE); + drawCallback(p); + for (int16_t y1 = 0; y1 < GxGDEH0154D67_PAGE_HEIGHT; y1++) + { + for (int16_t x1 = 0; x1 < GxGDEH0154D67_WIDTH / 8; x1++) + { + uint16_t idx = y1 * (GxGDEH0154D67_WIDTH / 8) + x1; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } + } + _current_page = -1; + _Update_Full(); + _PowerOff(); +} + +void GxGDEH0154D67::drawPaged(void (*drawCallback)(const void*, const void*), const void* p1, const void* p2) +{ + if (_current_page != -1) return; + _using_partial_mode = false; + _Init_Full(0x03); + _writeCommand(0x24); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + fillScreen(GxEPD_WHITE); + drawCallback(p1, p2); + for (int16_t y1 = 0; y1 < GxGDEH0154D67_PAGE_HEIGHT; y1++) + { + for (int16_t x1 = 0; x1 < GxGDEH0154D67_WIDTH / 8; x1++) + { + uint16_t idx = y1 * (GxGDEH0154D67_WIDTH / 8) + x1; + uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; + _writeData(~data); + } + } + } + _current_page = -1; + _Update_Full(); + _PowerOff(); +} + +void GxGDEH0154D67::_rotate(uint16_t& x, uint16_t& y, uint16_t& w, uint16_t& h) +{ + switch (getRotation()) + { + case 1: + swap(x, y); + swap(w, h); + x = GxGDEH0154D67_WIDTH - x - w - 1; + break; + case 2: + x = GxGDEH0154D67_WIDTH - x - w - 1; + y = GxGDEH0154D67_HEIGHT - y - h - 1; + break; + case 3: + swap(x, y); + swap(w, h); + y = GxGDEH0154D67_HEIGHT - y - h - 1; + break; + } +} + +void GxGDEH0154D67::drawPagedToWindow(void (*drawCallback)(void), uint16_t x, uint16_t y, uint16_t w, uint16_t h) +{ + if (_current_page != -1) return; + _rotate(x, y, w, h); + if (!_using_partial_mode) + { + eraseDisplay(false); + eraseDisplay(true); + } + _using_partial_mode = true; + _Init_Part(0x03); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + delay(GxGDEH0154D67_PU_DELAY); + _current_page = -1; + _PowerOff(); +} + +void GxGDEH0154D67::drawPagedToWindow(void (*drawCallback)(uint32_t), uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint32_t p) +{ + if (_current_page != -1) return; + _rotate(x, y, w, h); + if (!_using_partial_mode) + { + eraseDisplay(false); + eraseDisplay(true); + } + _using_partial_mode = true; + _Init_Part(0x03); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(p); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(p); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + delay(GxGDEH0154D67_PU_DELAY); + _current_page = -1; + _PowerOff(); +} + +void GxGDEH0154D67::drawPagedToWindow(void (*drawCallback)(const void*), uint16_t x, uint16_t y, uint16_t w, uint16_t h, const void* p) +{ + if (_current_page != -1) return; + _rotate(x, y, w, h); + if (!_using_partial_mode) + { + eraseDisplay(false); + eraseDisplay(true); + } + _using_partial_mode = true; + _Init_Part(0x03); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(p); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(p); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + delay(GxGDEH0154D67_PU_DELAY); + _current_page = -1; + _PowerOff(); +} + +void GxGDEH0154D67::drawPagedToWindow(void (*drawCallback)(const void*, const void*), uint16_t x, uint16_t y, uint16_t w, uint16_t h, const void* p1, const void* p2) +{ + if (_current_page != -1) return; + _rotate(x, y, w, h); + if (!_using_partial_mode) + { + eraseDisplay(false); + eraseDisplay(true); + } + _using_partial_mode = true; + _Init_Part(0x03); + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(p1, p2); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + _Update_Part(); + delay(GxGDEH0154D67_PU_DELAY); + // update erase buffer + for (_current_page = 0; _current_page < GxGDEH0154D67_PAGES; _current_page++) + { + uint16_t yds = gx_uint16_max(y, _current_page * GxGDEH0154D67_PAGE_HEIGHT); + uint16_t yde = gx_uint16_min(y + h, (_current_page + 1) * GxGDEH0154D67_PAGE_HEIGHT); + if (yde > yds) + { + fillScreen(GxEPD_WHITE); + drawCallback(p1, p2); + uint16_t ys = yds % GxGDEH0154D67_PAGE_HEIGHT; + _writeToWindow(x, ys, x, yds, w, yde - yds); + } + } + delay(GxGDEH0154D67_PU_DELAY); + _current_page = -1; + _PowerOff(); +} + +void GxGDEH0154D67::drawCornerTest(uint8_t em) +{ + if (_current_page != -1) return; + _Init_Full(em); + _writeCommand(0x24); + for (uint32_t y = 0; y < GxGDEH0154D67_HEIGHT; y++) + { + for (uint32_t x = 0; x < GxGDEH0154D67_WIDTH / 8; x++) + { + uint8_t data = 0xFF; + if ((x < 1) && (y < 8)) data = 0x00; + if ((x > GxGDEH0154D67_WIDTH / 8 - 3) && (y < 16)) data = 0x00; + if ((x > GxGDEH0154D67_WIDTH / 8 - 4) && (y > GxGDEH0154D67_HEIGHT - 25)) data = 0x00; + if ((x < 4) && (y > GxGDEH0154D67_HEIGHT - 33)) data = 0x00; + _writeData(data); + } + } + _Update_Full(); + _PowerOff(); +} + diff --git a/src/GxGDEH0154D67.h b/src/GxGDEH0154D67.h new file mode 100644 index 0000000..080a23c --- /dev/null +++ b/src/GxGDEH0154D67.h @@ -0,0 +1,135 @@ +// class GxGDEH0154D67 : Display class for GDEP015OC1 e-Paper from Dalian Good Display Co., Ltd.: www.good-display.com +// +// based on Demo Example from Good Display, available here: http://www.good-display.com/download_detail/downloadsId=515.html +// Controller : IL3829 : http://www.good-display.com/download_detail/downloadsId=534.html +// +// Author : J-M Zingg +// +// Version : see library.properties +// +// License: GNU GENERAL PUBLIC LICENSE V3, see LICENSE +// +// Library: https://github.com/ZinggJM/GxEPD + +#ifndef _GxGDEH0154D67_H_ +#define _GxGDEH0154D67_H_ + +#include +#include + +// the physical number of pixels (for controller parameter) +#define GxGDEH0154D67_X_PIXELS 200 +#define GxGDEH0154D67_Y_PIXELS 200 + +#define GxGDEH0154D67_WIDTH GxGDEH0154D67_X_PIXELS +#define GxGDEH0154D67_HEIGHT GxGDEH0154D67_Y_PIXELS + +#define GxGDEH0154D67_BUFFER_SIZE (uint32_t(GxGDEH0154D67_WIDTH) * uint32_t(GxGDEH0154D67_HEIGHT) / 8) + +// divisor for AVR, should be factor of GxGDEH0154D67_HEIGHT +#define GxGDEH0154D67_PAGES 5 + +#define GxGDEH0154D67_PAGE_HEIGHT (GxGDEH0154D67_HEIGHT / GxGDEH0154D67_PAGES) +#define GxGDEH0154D67_PAGE_SIZE (GxGDEH0154D67_BUFFER_SIZE / GxGDEH0154D67_PAGES) + +class GxGDEH0154D67 : public GxEPD +{ + public: +#if defined(ESP8266) + //GxGDEH0154D67(GxIO& io, int8_t rst = D4, int8_t busy = D2); + // use pin numbers, other ESP8266 than Wemos may not use Dx names + GxGDEH0154D67(GxIO& io, int8_t rst = 2, int8_t busy = 4); +#else + GxGDEH0154D67(GxIO& io, int8_t rst = 9, int8_t busy = 7); +#endif + void drawPixel(int16_t x, int16_t y, uint16_t color); + void init(uint32_t serial_diag_bitrate = 0); // = 0 : disabled + void fillScreen(uint16_t color); // 0x0 black, >0x0 white, to buffer + void update(void); + // to buffer, may be cropped, drawPixel() used, update needed + void drawBitmap(const uint8_t *bitmap, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color, int16_t mode = bm_normal); + // to full screen, filled with white if size is less, no update needed + void drawBitmap(const uint8_t *bitmap, uint32_t size, int16_t mode = bm_normal); // only bm_normal, bm_invert, bm_partial_update modes implemented + void eraseDisplay(bool using_partial_update = false); + // partial update of rectangle from buffer to screen, does not power off + void updateWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h, bool using_rotation = true); + // partial update of rectangle at (xs,ys) from buffer to screen at (xd,yd), does not power off + void updateToWindow(uint16_t xs, uint16_t ys, uint16_t xd, uint16_t yd, uint16_t w, uint16_t h, bool using_rotation = true); + // terminate cleanly updateWindow or updateToWindow before removing power or long delays + void powerDown(); + void deepSleep(); + // paged drawing, for limited RAM, drawCallback() is called GxGDEH0154D67_PAGES times + // each call of drawCallback() should draw the same + void drawPaged(void (*drawCallback)(void)); + void drawPaged(void (*drawCallback)(uint32_t), uint32_t); + void drawPaged(void (*drawCallback)(const void*), const void*); + void drawPaged(void (*drawCallback)(const void*, const void*), const void*, const void*); + // paged drawing to screen rectangle at (x,y) using partial update + void drawPagedToWindow(void (*drawCallback)(void), uint16_t x, uint16_t y, uint16_t w, uint16_t h); + void drawPagedToWindow(void (*drawCallback)(uint32_t), uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint32_t); + void drawPagedToWindow(void (*drawCallback)(const void*), uint16_t x, uint16_t y, uint16_t w, uint16_t h, const void*); + void drawPagedToWindow(void (*drawCallback)(const void*, const void*), uint16_t x, uint16_t y, uint16_t w, uint16_t h, const void*, const void*); + void drawCornerTest(uint8_t em = 0x01); + private: + template static inline void + swap(T& a, T& b) + { + T t = a; + a = b; + b = t; + } + void _writeToWindow(uint16_t xs, uint16_t ys, uint16_t xd, uint16_t yd, uint16_t w, uint16_t h); + void _writeData(uint8_t data); + void _writeCommand(uint8_t command); + void _writeCommandData(const uint8_t* pCommandData, uint8_t datalen); + void _SetRamPointer(uint8_t addrX, uint8_t addrY, uint8_t addrY1); + void _SetRamArea(uint8_t Xstart, uint8_t Xend, uint8_t Ystart, uint8_t Ystart1, uint8_t Yend, uint8_t Yend1); + void _PowerOn(void); + void _PowerOff(void); + void _waitWhileBusy(const char* comment, uint16_t busy_time); + void _setRamDataEntryMode(uint8_t em); + void _InitDisplay(uint8_t em); + void _Init_Full(uint8_t em); + void _Init_Part(uint8_t em); + void _Update_Full(void); + void _Update_Part(void); + void _rotate(uint16_t& x, uint16_t& y, uint16_t& w, uint16_t& h); + protected: +#if defined(__AVR) + uint8_t _buffer[GxGDEH0154D67_PAGE_SIZE]; +#else + uint8_t _buffer[GxGDEH0154D67_BUFFER_SIZE]; +#endif + private: + GxIO& IO; + int16_t _current_page; + bool _using_partial_mode; + bool _diag_enabled; + int8_t _rst; + int8_t _busy; + static const uint16_t power_on_time = 80; // ms, e.g. 73508us + static const uint16_t power_off_time = 80; // ms, e.g. 68982us + static const uint16_t full_refresh_time = 4200; // ms, e.g. 1113273us + static const uint16_t partial_refresh_time = 300; // ms, e.g. 290867us +#if defined(ESP8266) || defined(ESP32) + public: + // the compiler of these packages has a problem with signature matching to base classes + void drawBitmap(int16_t x, int16_t y, const uint8_t bitmap[], int16_t w, int16_t h, uint16_t color) + { + Adafruit_GFX::drawBitmap(x, y, bitmap, w, h, color); + }; +#endif +}; + +#ifndef GxEPD_Class +#define GxEPD_Class GxGDEH0154D67 +#define GxEPD_WIDTH GxGDEH0154D67_WIDTH +#define GxEPD_HEIGHT GxGDEH0154D67_HEIGHT +#define GxEPD_BitmapExamples +#define GxEPD_BitmapExamplesQ "GxGDEH0154D67/BitmapExamples.h" +#endif + +#endif + + +