From 125756ed8db67dafb61a97e6cf1a5f61da4ddaf8 Mon Sep 17 00:00:00 2001 From: Flx12 Date: Fri, 24 Nov 2023 13:05:31 +0100 Subject: [PATCH 01/36] preparations for ISR --- voting_device/button_interrupts.cpp | 10 ++++++++++ voting_device/button_interrupts.h | 9 +++++++++ voting_device/config.h | 15 +++++++++++++-- voting_device/voting_device.ino | 4 ++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 voting_device/button_interrupts.cpp create mode 100644 voting_device/button_interrupts.h diff --git a/voting_device/button_interrupts.cpp b/voting_device/button_interrupts.cpp new file mode 100644 index 0000000..bc9cf15 --- /dev/null +++ b/voting_device/button_interrupts.cpp @@ -0,0 +1,10 @@ +#include "button_interrupts.h" +ICACHE_RAM_ATTR void Isr_Btn_1(void){ +//todo send stuff if button 1 is pressed +} +ICACHE_RAM_ATTR void Isr_Btn_2(void){ +//todo send stuff if button 2 is pressed +} +ICACHE_RAM_ATTR void Isr_Btn_3(void){ +//todo send stuff if button 3 is pressed +} \ No newline at end of file diff --git a/voting_device/button_interrupts.h b/voting_device/button_interrupts.h new file mode 100644 index 0000000..e0b8a99 --- /dev/null +++ b/voting_device/button_interrupts.h @@ -0,0 +1,9 @@ +#ifndef BUTTON_ISR +#define BUTTON_ISR +#include + +ICACHE_RAM_ATTR void Isr_Btn_1(void); +ICACHE_RAM_ATTR void Isr_Btn_2(void); +ICACHE_RAM_ATTR void Isr_Btn_3(void); + +#endif \ No newline at end of file diff --git a/voting_device/config.h b/voting_device/config.h index 1c4b8cc..b0b4f80 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -1,4 +1,3 @@ - #include #include // default wifi library #include //Mqtt library by Nick O'Leary @@ -9,6 +8,9 @@ #define BUTTON_PIN_2 4 // GPIO 4 (entspricht D2) für Taster 2 #define BUTTON_PIN_3 16 // GPIO 16 (entspricht D0) für Taster 3 + + + // WLAN-Settings const char* ssid = "RasPi-Netzwerk"; const char* password = ""; @@ -25,7 +27,7 @@ const char* mqtt_password = ""; #define STATUS_LEDS //#define E_PAPER #define DEBUG - +#define ISRS_FOR_BUTTONS //Includes according to config @@ -41,4 +43,13 @@ const char* mqtt_password = ""; #ifdef E_PAPER #include //todo find epaper library +#endif + +#ifdef ISRS_FOR_BUTTONS +#include "button_interrupts.h" +void attachISR(void){ +attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); +attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); +attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); +} #endif \ No newline at end of file diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index fe152da..b016f44 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -25,6 +25,10 @@ void setup() { pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand +#ifdef ISRS_FOR_BUTTONS + attachISR(); +#endif + #ifdef STATUS_LEDS pinMode(LED_PIN_1, OUTPUT); // LED 1 als Ausgang pinMode(LED_PIN_2, OUTPUT); // LED 2 als Ausgang From 942856287238dc03f46a3ad2d6f8e0f75e632102 Mon Sep 17 00:00:00 2001 From: Flx12 Date: Wed, 6 Dec 2023 10:51:08 +0100 Subject: [PATCH 02/36] Altered mqtt to comply with spec --- voting_device/config.h | 10 ++++++++++ voting_device/voting_device.ino | 6 ++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index b0b4f80..1cc6a00 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -20,7 +20,17 @@ const char* mqtt_server = "10.42.0.1"; const int mqtt_port = 1883; const char* mqtt_user = ""; const char* mqtt_password = ""; +#define MQTTpubQos 1 +#define MQTTsubQos 1 +// MQTT topics to subscribe + +const char* subInit = ("/registration/esp/"+WiFi.macAddress()).c_str(); +const char* subVoteSetup = "/setupVote/Setup"; +const char* subResync = "/setupVote/Resync"; +//Mqtt topics to publish +const char* pubInit = ("/registration/Server/"+WiFi.macAddress()).c_str(); +const char* pubPubVote = "/vote/VotingID"; //configuration of functionality //#define ENCRYPTION diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index b016f44..301eb05 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -59,7 +59,9 @@ void setup() { // Verbindung zum MQTT-Server herstellen mqttClient.setServer(mqtt_server, mqtt_port); mqttClient.setCallback(callback); - mqttClient.subscribe("#"); + mqttClient.subscribe(subInit, MQTTsubQos); + mqttClient.subscribe(subResync, MQTTsubQos); + mqttClient.subscribe(subVoteSetup, MQTTsubQos); while (!mqttClient.connected()) { #ifdef DEBUG @@ -77,7 +79,7 @@ void loop() { if (digitalRead(BUTTON_PIN_1) == LOW) { digitalWrite(LED_PIN_1, HIGH); // Wenn Taster 1 gedrückt wird, schalte LED 1 ein if (message_count == 0) { - mqttClient.publish("send", "Taster 1!"); + mqttClient.publish(pubInit, (const uint8_t*)"{'VotingID':'Unique voting id'}", MQTTpubQos, false); message_count++; } } else { From 01ded99f130b08108dcd1124d48bf1f375e221fe Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Tue, 2 Jan 2024 14:16:05 +0200 Subject: [PATCH 03/36] creating function for processing question --- Display_code/.idea/.gitignore | 8 + Display_code/.idea/Display_code.iml | 8 + Display_code/.idea/modules.xml | 8 + Display_code/.idea/vcs.xml | 6 + Display_code/epd1in54_V2/epd1in54_V2.cpp | 576 +++++ Display_code/epd1in54_V2/epd1in54_V2.h | 92 + Display_code/epd1in54_V2/epd1in54_V2.ino | 164 ++ Display_code/epd1in54_V2/epdif.cpp | 68 + Display_code/epd1in54_V2/epdif.h | 52 + Display_code/epd1in54_V2/epdpaint.cpp | 319 +++ Display_code/epd1in54_V2/epdpaint.h | 75 + Display_code/epd1in54_V2/font12.c | 1385 ++++++++++++ Display_code/epd1in54_V2/font16.c | 1765 +++++++++++++++ Display_code/epd1in54_V2/font20.c | 2143 ++++++++++++++++++ Display_code/epd1in54_V2/font24.c | 2521 ++++++++++++++++++++++ Display_code/epd1in54_V2/font8.c | 1005 +++++++++ Display_code/epd1in54_V2/fonts.h | 75 + Display_code/epd1in54_V2/imagedata.cpp | 344 +++ Display_code/epd1in54_V2/imagedata.h | 30 + Display_code/epd1in54_V2/original.ino | 92 + Display_code/epd1in54_V2/testing.ino | 530 +++++ 21 files changed, 11266 insertions(+) create mode 100644 Display_code/.idea/.gitignore create mode 100644 Display_code/.idea/Display_code.iml create mode 100644 Display_code/.idea/modules.xml create mode 100644 Display_code/.idea/vcs.xml create mode 100644 Display_code/epd1in54_V2/epd1in54_V2.cpp create mode 100644 Display_code/epd1in54_V2/epd1in54_V2.h create mode 100644 Display_code/epd1in54_V2/epd1in54_V2.ino create mode 100644 Display_code/epd1in54_V2/epdif.cpp create mode 100644 Display_code/epd1in54_V2/epdif.h create mode 100644 Display_code/epd1in54_V2/epdpaint.cpp create mode 100644 Display_code/epd1in54_V2/epdpaint.h create mode 100644 Display_code/epd1in54_V2/font12.c create mode 100644 Display_code/epd1in54_V2/font16.c create mode 100644 Display_code/epd1in54_V2/font20.c create mode 100644 Display_code/epd1in54_V2/font24.c create mode 100644 Display_code/epd1in54_V2/font8.c create mode 100644 Display_code/epd1in54_V2/fonts.h create mode 100644 Display_code/epd1in54_V2/imagedata.cpp create mode 100644 Display_code/epd1in54_V2/imagedata.h create mode 100644 Display_code/epd1in54_V2/original.ino create mode 100644 Display_code/epd1in54_V2/testing.ino diff --git a/Display_code/.idea/.gitignore b/Display_code/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/Display_code/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Display_code/.idea/Display_code.iml b/Display_code/.idea/Display_code.iml new file mode 100644 index 0000000..bc2cd87 --- /dev/null +++ b/Display_code/.idea/Display_code.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Display_code/.idea/modules.xml b/Display_code/.idea/modules.xml new file mode 100644 index 0000000..ad21d56 --- /dev/null +++ b/Display_code/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Display_code/.idea/vcs.xml b/Display_code/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/Display_code/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Display_code/epd1in54_V2/epd1in54_V2.cpp b/Display_code/epd1in54_V2/epd1in54_V2.cpp new file mode 100644 index 0000000..7df047b --- /dev/null +++ b/Display_code/epd1in54_V2/epd1in54_V2.cpp @@ -0,0 +1,576 @@ +/***************************************************************************** +* | File : epd1in54_V2.cpp +* | Author : Waveshare team +* | Function : 1.54inch e-paper V2 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-24 +* | Info : +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include +#include "epd1in54_V2.h" + + +// waveform full refresh +unsigned char WF_Full_1IN54[159] = +{ +0x80, 0x48, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x80, 0x48, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x8, 0x1, 0x0, 0x8, 0x1, 0x0, 0x2, +0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, +0x22, 0x17, 0x41, 0x0, 0x32, 0x20 +}; + +// waveform partial refresh(fast) +unsigned char WF_PARTIAL_1IN54_0[159] = +{ +0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0xF,0x0,0x0,0x0,0x0,0x0,0x0, +0x1,0x1,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, +0x02,0x17,0x41,0xB0,0x32,0x28, +}; + +Epd::~Epd() +{ +}; + +Epd::Epd() +{ + reset_pin = RST_PIN; + dc_pin = DC_PIN; + cs_pin = CS_PIN; + busy_pin = BUSY_PIN; + width = EPD_WIDTH; + height = EPD_HEIGHT; +}; + +/** + * @brief: basic function for sending commands + */ +void Epd::SendCommand(unsigned char command) +{ + DigitalWrite(dc_pin, LOW); + SpiTransfer(command); +} + +/** + * @brief: basic function for sending data + */ +void Epd::SendData(unsigned char data) +{ + DigitalWrite(dc_pin, HIGH); + SpiTransfer(data); +} + +/** + * @brief: Wait until the busy_pin goes HIGH + */ +void Epd::WaitUntilIdle(void) +{ + while(DigitalRead(busy_pin) == 1) { //LOW: idle, HIGH: busy + DelayMs(100); + } + DelayMs(200); +} + +void Epd::Lut(unsigned char* lut) +{ + SendCommand(0x32); + for(unsigned char i=0; i<153; i++) + SendData(lut[i]); + WaitUntilIdle(); +} + +void Epd::SetLut(unsigned char* lut) +{ + Lut(lut); + + SendCommand(0x3f); + SendData(lut[153]); + + SendCommand(0x03); + SendData(lut[154]); + + SendCommand(0x04); + SendData(lut[155]); + SendData(lut[156]); + SendData(lut[157]); + + SendCommand(0x2c); + SendData(lut[158]); +} + +// High Direction +int Epd::HDirInit(void) +{ + /* this calls the peripheral hardware interface, see epdif */ + if (IfInit() != 0) { + return -1; + } + /* EPD hardware init start */ + Reset(); + + WaitUntilIdle(); + SendCommand(0x12); //SWRESET + WaitUntilIdle(); + + SendCommand(0x01); //Driver output control + SendData(0xC7); + SendData(0x00); + SendData(0x01); + + SendCommand(0x11); //data entry mode + SendData(0x01); + + SendCommand(0x44); //set Ram-X address start/end position + SendData(0x00); + SendData(0x18); //0x0C-->(18+1)*8=200 + + SendCommand(0x45); //set Ram-Y address start/end position + SendData(0xC7); //0xC7-->(199+1)=200 + SendData(0x00); + SendData(0x00); + SendData(0x00); + + SendCommand(0x3C); //BorderWavefrom + SendData(0x01); + + SendCommand(0x18); + SendData(0x80); + + SendCommand(0x22); // //Load Temperature and waveform setting. + SendData(0XB1); + SendCommand(0x20); + + SendCommand(0x4E); // set RAM x address count to 0; + SendData(0x00); + SendCommand(0x4F); // set RAM y address count to 0X199; + SendData(0xC7); + SendData(0x00); + WaitUntilIdle(); + + SetLut(WF_Full_1IN54); + /* EPD hardware init end */ + + return 0; +} + +// Low Direction +int Epd::LDirInit(void) +{ + /* this calls the peripheral hardware interface, see epdif */ + if (IfInit() != 0) { + return -1; + } + /* EPD hardware init start */ + Reset(); + + WaitUntilIdle(); + SendCommand(0x12); //SWRESET + WaitUntilIdle(); + + SendCommand(0x01); //Driver output control + SendData(0xC7); + SendData(0x00); + SendData(0x00); + + SendCommand(0x11); //data entry mode + SendData(0x03); + + SendCommand(0x44); + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + SendData((0 >> 3) & 0xFF); + SendData((199 >> 3) & 0xFF); + SendCommand(0x45); + SendData(0 & 0xFF); + SendData((0 >> 8) & 0xFF); + SendData(199 & 0xFF); + SendData((199 >> 8) & 0xFF); + + SendCommand(0x3C); //BorderWavefrom + SendData(0x01); + + SendCommand(0x18); + SendData(0x80); + + SendCommand(0x22); // //Load Temperature and waveform setting. + SendData(0XB1); + SendCommand(0x20); + + SendCommand(0x4E); // set RAM x address count to 0; + SendData(0x00); + SendCommand(0x4F); // set RAM y address count to 0X199; + SendData(0xC7); + SendData(0x00); + WaitUntilIdle(); + + SetLut(WF_Full_1IN54); + /* EPD hardware init end */ + + return 0; +} + + +/** + * @brief: module reset. + * often used to awaken the module in deep sleep, + * see Epd::Sleep(); + */ +void Epd::Reset(void) +{ + DigitalWrite(reset_pin, HIGH); + DelayMs(20); + DigitalWrite(reset_pin, LOW); //module reset + DelayMs(5); + DigitalWrite(reset_pin, HIGH); + DelayMs(20); +} + +void Epd::Clear(void) +{ + int w, h; + w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + h = EPD_HEIGHT; + + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + SendCommand(0x26); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + //DISPLAY REFRESH + DisplayFrame(); +} + +void Epd::Display(const unsigned char* frame_buffer) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + if (frame_buffer != NULL) { + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + } + + //DISPLAY REFRESH + DisplayFrame(); +} + +void Epd::DisplayPartBaseImage(const unsigned char* frame_buffer) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + if (frame_buffer != NULL) { + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + + SendCommand(0x26); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + } + + //DISPLAY REFRESH + DisplayFrame(); +} +void Epd::DisplayPartBaseWhiteImage(void) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + + SendCommand(0x26); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + + + //DISPLAY REFRESH + DisplayFrame(); +} + + +void Epd::DisplayPart(const unsigned char* frame_buffer) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + if (frame_buffer != NULL) { + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + } + + //DISPLAY REFRESH + DisplayPartFrame(); +} + + +/** + * @brief: private function to specify the memory area for data R/W + */ +void Epd::SetMemoryArea(int x_start, int y_start, int x_end, int y_end) +{ + SendCommand(0x44); + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + SendData((x_start >> 3) & 0xFF); + SendData((x_end >> 3) & 0xFF); + SendCommand(0x45); + SendData(y_start & 0xFF); + SendData((y_start >> 8) & 0xFF); + SendData(y_end & 0xFF); + SendData((y_end >> 8) & 0xFF); +} + +/** + * @brief: private function to specify the start point for data R/W + */ +void Epd::SetMemoryPointer(int x, int y) +{ + SendCommand(0x4e); + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + SendData((x >> 3) & 0xFF); + SendCommand(0x4F); + SendData(y & 0xFF); + SendData((y >> 8) & 0xFF); + WaitUntilIdle(); +} + + +/** + * @brief: update the display + * there are 2 memory areas embedded in the e-paper display + * but once this function is called, + * the the next action of SetFrameMemory or ClearFrame will + * set the other memory area. + */ +void Epd::DisplayFrame(void) +{ + //DISPLAY REFRESH + SendCommand(0x22); + SendData(0xc7); + SendCommand(0x20); + WaitUntilIdle(); +} + +void Epd::DisplayPartFrame(void) +{ + SendCommand(0x22); + SendData(0xcF); + SendCommand(0x20); + WaitUntilIdle(); +} + + +void Epd::SetFrameMemory( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height +) +{ + int x_end; + int y_end; + + DigitalWrite(reset_pin, LOW); //module reset + DelayMs(2); + DigitalWrite(reset_pin, HIGH); + DelayMs(2); + SendCommand(0x3c); + SendData(0x80); + + if ( + image_buffer == NULL || + x < 0 || image_width < 0 || + y < 0 || image_height < 0 + ) { + return; + } + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + x &= 0xF8; + image_width &= 0xF8; + if (x + image_width >= this->width) { + x_end = this->width - 1; + } else { + x_end = x + image_width - 1; + } + if (y + image_height >= this->height) { + y_end = this->height - 1; + } else { + y_end = y + image_height - 1; + } + SetMemoryArea(x, y, x_end, y_end); + SetMemoryPointer(x, y); + SendCommand(0x24); + /* send the image data */ + for (int j = 0; j < y_end - y + 1; j++) { + for (int i = 0; i < (x_end - x + 1) / 8; i++) { + SendData(image_buffer[i + j * (image_width / 8)]); + } + } +} + +void Epd::SetFrameMemoryPartial( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height +) +{ + int x_end; + int y_end; + + DigitalWrite(reset_pin, LOW); //module reset + DelayMs(2); + DigitalWrite(reset_pin, HIGH); + DelayMs(2); + + SetLut(WF_PARTIAL_1IN54_0); + SendCommand(0x37); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x40); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x00); + + SendCommand(0x3c); + SendData(0x80); + + SendCommand(0x22); + SendData(0xc0); + SendCommand(0x20); + WaitUntilIdle(); + + if ( + image_buffer == NULL || + x < 0 || image_width < 0 || + y < 0 || image_height < 0 + ) { + return; + } + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + x &= 0xF8; + image_width &= 0xF8; + if (x + image_width >= this->width) { + x_end = this->width - 1; + } else { + x_end = x + image_width - 1; + } + if (y + image_height >= this->height) { + y_end = this->height - 1; + } else { + y_end = y + image_height - 1; + } + SetMemoryArea(x, y, x_end, y_end); + SetMemoryPointer(x, y); + SendCommand(0x24); + /* send the image data */ + for (int j = 0; j < y_end - y + 1; j++) { + for (int i = 0; i < (x_end - x + 1) / 8; i++) { + SendData(image_buffer[i + j * (image_width / 8)]); + } + } +} + +/** + * @brief: After this command is transmitted, the chip would enter the + * deep-sleep mode to save power. + * The deep sleep mode would return to standby by hardware reset. + * The only one parameter is a check code, the command would be + * executed if check code = 0xA5. + * You can use Epd::Init() to awaken + */ +void Epd::Sleep() +{ + SendCommand(0x10); //enter deep sleep + SendData(0x01); + DelayMs(200); + + DigitalWrite(reset_pin, LOW); +} + +/* END OF FILE */ diff --git a/Display_code/epd1in54_V2/epd1in54_V2.h b/Display_code/epd1in54_V2/epd1in54_V2.h new file mode 100644 index 0000000..42682c1 --- /dev/null +++ b/Display_code/epd1in54_V2/epd1in54_V2.h @@ -0,0 +1,92 @@ +/***************************************************************************** +* | File : epd1in54_V2.h +* | Author : Waveshare team +* | Function : 1.54inch e-paper V2 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-24 +* | Info : +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ + +#ifndef epd1in54_V2_H +#define epd1in54_V2_H + +#include "epdif.h" + +// Display resolution +#define EPD_WIDTH 200 +#define EPD_HEIGHT 200 + +class Epd : EpdIf +{ +public: + unsigned long width; + unsigned long height; + + Epd(); + ~Epd(); + // int Init(void); + int LDirInit(void); + int HDirInit(void); + void SendCommand(unsigned char command); + void SendData(unsigned char data); + void WaitUntilIdle(void); + void Reset(void); + void Clear(void); + void Display(const unsigned char* frame_buffer); + void DisplayPartBaseImage(const unsigned char* frame_buffer); + void DisplayPartBaseWhiteImage(void); + void DisplayPart(const unsigned char* frame_buffer); + void SetFrameMemory( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height + ); + void SetFrameMemoryPartial( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height + ); + void DisplayFrame(void); + void DisplayPartFrame(void); + + void Sleep(void); +private: + unsigned int reset_pin; + unsigned int dc_pin; + unsigned int cs_pin; + unsigned int busy_pin; + + void Lut(unsigned char* lut); + void SetLut(unsigned char* lut); + void SetMemoryArea(int x_start, int y_start, int x_end, int y_end); + void SetMemoryPointer(int x, int y); +}; + +#endif /* EPD1IN54B_H */ + +/* END OF FILE */ diff --git a/Display_code/epd1in54_V2/epd1in54_V2.ino b/Display_code/epd1in54_V2/epd1in54_V2.ino new file mode 100644 index 0000000..2cbe063 --- /dev/null +++ b/Display_code/epd1in54_V2/epd1in54_V2.ino @@ -0,0 +1,164 @@ +#include +#include "epd1in54_V2.h" +#include "imagedata.h" +#include "epdpaint.h" +#include + +Epd epd; +unsigned char image[1024]; +Paint paint(image, 0, 0); + +unsigned long time_start_ms; +unsigned long time_now_s; +#define COLORED 0 +#define UNCOLORED 1 + +const unsigned char wifilogo[] PROGMEM = { +// 'imresizer-1702234655501', 35x35px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, +0xf0, 0x00, 0x07, 0xf0, 0x01, 0xfc, 0x00, 0x0f, 0x80, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x00, 0x1f, +0x00, 0x1c, 0x0f, 0xfe, 0x07, 0x00, 0x08, 0x3f, 0xff, 0x82, 0x00, 0x00, 0x7f, 0x9f, 0xc0, 0x00, +0x01, 0xf8, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x00, +0x07, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1c, +0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, +0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char batterylogo[] PROGMEM = { +// 'imresizer-1702234758351', 35x35px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, +0xfc, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, +0x00, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0xc0, +0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, +0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, +0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x3f, 0xff, 0xff, +0xfc, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + + +void drawImage(int x, int y, int width, int height, const unsigned char *image) { + int byteWidth = (width + 7) / 8; // Number of bytes in a row + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + if (pgm_read_byte(image + j * byteWidth + i / 8) & (128 >> (i % 8))) { + paint.DrawPixel(x + i, y + j, COLORED); + } else { + paint.DrawPixel(x + i, y + j, UNCOLORED); + } + } + } +} + +bool question_mark(const char *question) { + int question_len = strlen(question); + if (question[question_len-1] == '?') { + return true; + } + return false; +} + +void display_question(const char *question) { + paint.SetWidth(200); + paint.SetHeight(16); + + int position = 0; + if (!question_mark(question)) { + printf("ERROR: no question mark!"); + } + char string[16]; + strncpy(string, question, 15); + string[15] = '\0'; + int string_len = strlen(string); + while (string[string_len] != ' ') { + string_len--; + } + if (string_len >= 0) { + string[string_len] = '\0'; // Null-terminate at the space + postion = string_len; + } + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, 100, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate +} + +void setup() { + Serial.begin(115200); + + epd.LDirInit(); + epd.Clear(); // clears whole screen to white + paint.SetRotate(ROTATE_180); //rotate screen + + //wifilogo + paint.SetWidth(35); + paint.SetHeight(35); + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 40, (200-35), paint.GetWidth(), paint.GetHeight()); + + //battery logo + paint.SetWidth(35); + paint.SetHeight(35); + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, (200-35), paint.GetWidth(), paint.GetHeight()); + + //need to finish battery status bar position + paint.SetWidth(20); + paint.SetHeight(13); + //paint.Clear(COLORED); // paints the height and width with the given color + //paint.DrawFilledRectangle(0, 0, 20, 14, COLORED); + epd.SetFrameMemory(paint.GetImage(), 16, (200-23), paint.GetWidth(), paint.GetHeight()); + + //Bottom bar + paint.SetWidth(200); + paint.SetHeight(22); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(2, 7, "YES ABSTAIN NO", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + //paint.DrawStringAt(0, 2, "Yes Abstain No", &Font16, COLORED); + paint.DrawFilledRectangle(0, 0, 200, 3, COLORED); + paint.DrawFilledRectangle(48, 0, 50, 25, COLORED); + paint.DrawFilledRectangle(160, 0, 162, 25, COLORED); + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + //name + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(40, 2, "NAME", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt(41, 2, "NAME", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, 140, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + //vote question + char question[100] = "How many characters can E-paper fit across?"; + + display_question(question); + + //paint.SetWidth(200); + //paint.SetHeight(16); + //paint.Clear(UNCOLORED); //paints the height and width the given colour + //paint.DrawStringAt(15, 2, question, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + //epd.SetFrameMemory(paint.GetImage(), 0, 100, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + //paint.Clear(UNCOLORED); + //paint.DrawStringAt(15, 2, "characters can", &Font16, COLORED); + //epd.SetFrameMemory(paint.GetImage(), 0, (100-16), paint.GetWidth(), paint.GetHeight()); + //paint.Clear(UNCOLORED); + //paint.DrawStringAt(15, 2, "Epaper fit", &Font16, COLORED); + //epd.SetFrameMemory(paint.GetImage(), 0, (100-16-16), paint.GetWidth(), paint.GetHeight()); + //paint.Clear(UNCOLORED); + //paint.DrawStringAt(15, 2, "across? 13/14", &Font16, COLORED); + //epd.SetFrameMemory(paint.GetImage(), 0, (100-16-16-16), paint.GetWidth(), paint.GetHeight()); + + epd.DisplayFrame(); +} + + +void loop() +{ + +} \ No newline at end of file diff --git a/Display_code/epd1in54_V2/epdif.cpp b/Display_code/epd1in54_V2/epdif.cpp new file mode 100644 index 0000000..b1f89c9 --- /dev/null +++ b/Display_code/epd1in54_V2/epdif.cpp @@ -0,0 +1,68 @@ +/** + * @filename : epdif.cpp + * @brief : Implements EPD interface functions + * Users have to implement all the functions in epdif.cpp + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare August 10 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "epdif.h" +#include + +EpdIf::EpdIf() { +}; + +EpdIf::~EpdIf() { +}; + +void EpdIf::DigitalWrite(int pin, int value) { + digitalWrite(pin, value); +} + +int EpdIf::DigitalRead(int pin) { + return digitalRead(pin); +} + +void EpdIf::DelayMs(unsigned int delaytime) { + delay(delaytime); +} + +void EpdIf::SpiTransfer(unsigned char data) { + digitalWrite(CS_PIN, LOW); + SPI.transfer(data); + digitalWrite(CS_PIN, HIGH); +} + +int EpdIf::IfInit(void) { + pinMode(CS_PIN, OUTPUT); + pinMode(RST_PIN, OUTPUT); + pinMode(DC_PIN, OUTPUT); + pinMode(BUSY_PIN, INPUT); + + pinMode(PWR_PIN, OUTPUT); + DigitalWrite(PWR_PIN, 1); + + SPI.begin(); + SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); + return 0; +} + diff --git a/Display_code/epd1in54_V2/epdif.h b/Display_code/epd1in54_V2/epdif.h new file mode 100644 index 0000000..be06092 --- /dev/null +++ b/Display_code/epd1in54_V2/epdif.h @@ -0,0 +1,52 @@ +/** + * @filename : epdif.h + * @brief : Header file of epdif.cpp providing EPD interface functions + * Users have to implement all the functions in epdif.cpp + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare August 10 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef EPDIF_H +#define EPDIF_H + +#include + +// Pin definition +#define RST_PIN D2 +#define DC_PIN D0 +#define CS_PIN D8 +#define BUSY_PIN D7 +#define PWR_PIN D5 + +class EpdIf { +public: + EpdIf(void); + ~EpdIf(void); + + static int IfInit(void); + static void DigitalWrite(int pin, int value); + static int DigitalRead(int pin); + static void DelayMs(unsigned int delaytime); + static void SpiTransfer(unsigned char data); +}; + +#endif diff --git a/Display_code/epd1in54_V2/epdpaint.cpp b/Display_code/epd1in54_V2/epdpaint.cpp new file mode 100644 index 0000000..1dfe0d7 --- /dev/null +++ b/Display_code/epd1in54_V2/epdpaint.cpp @@ -0,0 +1,319 @@ +/** + * @filename : epdpaint.cpp + * @brief : Paint tools + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare September 9 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include "epdpaint.h" + +Paint::Paint(unsigned char* image, int width, int height) { + this->rotate = ROTATE_0; + this->image = image; + /* 1 byte = 8 pixels, so the width should be the multiple of 8 */ + this->width = width % 8 ? width + 8 - (width % 8) : width; + this->height = height; +} + +Paint::~Paint() { +} + +/** + * @brief: clear the image + */ +void Paint::Clear(int colored) { + for (int x = 0; x < this->width; x++) { + for (int y = 0; y < this->height; y++) { + DrawAbsolutePixel(x, y, colored); + } + } +} + +/** + * @brief: this draws a pixel by absolute coordinates. + * this function won't be affected by the rotate parameter. + */ +void Paint::DrawAbsolutePixel(int x, int y, int colored) { + if (x < 0 || x >= this->width || y < 0 || y >= this->height) { + return; + } + if (IF_INVERT_COLOR) { + if (colored) { + image[(x + y * this->width) / 8] |= 0x80 >> (x % 8); + } else { + image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8)); + } + } else { + if (colored) { + image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8)); + } else { + image[(x + y * this->width) / 8] |= 0x80 >> (x % 8); + } + } +} + +/** + * @brief: Getters and Setters + */ +unsigned char* Paint::GetImage(void) { + return this->image; +} + +int Paint::GetWidth(void) { + return this->width; +} + +void Paint::SetWidth(int width) { + this->width = width % 8 ? width + 8 - (width % 8) : width; +} + +int Paint::GetHeight(void) { + return this->height; +} + +void Paint::SetHeight(int height) { + this->height = height; +} + +int Paint::GetRotate(void) { + return this->rotate; +} + +void Paint::SetRotate(int rotate){ + this->rotate = rotate; +} + +/** + * @brief: this draws a pixel by the coordinates + */ +void Paint::DrawPixel(int x, int y, int colored) { + int point_temp; + if (this->rotate == ROTATE_0) { + if(x < 0 || x >= this->width || y < 0 || y >= this->height) { + return; + } + DrawAbsolutePixel(x, y, colored); + } else if (this->rotate == ROTATE_90) { + if(x < 0 || x >= this->height || y < 0 || y >= this->width) { + return; + } + point_temp = x; + x = this->width - y; + y = point_temp; + DrawAbsolutePixel(x, y, colored); + } else if (this->rotate == ROTATE_180) { + if(x < 0 || x >= this->width || y < 0 || y >= this->height) { + return; + } + x = this->width - x; + y = this->height - y; + DrawAbsolutePixel(x, y, colored); + } else if (this->rotate == ROTATE_270) { + if(x < 0 || x >= this->height || y < 0 || y >= this->width) { + return; + } + point_temp = x; + x = y; + y = this->height - point_temp; + DrawAbsolutePixel(x, y, colored); + } +} + +/** + * @brief: this draws a charactor on the frame buffer but not refresh + */ +void Paint::DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored) { + int i, j; + unsigned int char_offset = (ascii_char - ' ') * font->Height * (font->Width / 8 + (font->Width % 8 ? 1 : 0)); + const unsigned char* ptr = &font->table[char_offset]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (pgm_read_byte(ptr) & (0x80 >> (i % 8))) { + DrawPixel(x + i, y + j, colored); + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } +} + +/** +* @brief: this displays a string on the frame buffer but not refresh +*/ +void Paint::DrawStringAt(int x, int y, const char* text, sFONT* font, int colored) { + const char* p_text = text; + unsigned int counter = 0; + int refcolumn = x; + + /* Send the string character by character on EPD */ + while (*p_text != 0) { + /* Display one character on EPD */ + DrawCharAt(refcolumn, y, *p_text, font, colored); + /* Decrement the column position by 16 */ + refcolumn += font->Width; + /* Point on the next character */ + p_text++; + counter++; + } +} + +/** +* @brief: this draws a line on the frame buffer +*/ +void Paint::DrawLine(int x0, int y0, int x1, int y1, int colored) { + /* Bresenham algorithm */ + int dx = x1 - x0 >= 0 ? x1 - x0 : x0 - x1; + int sx = x0 < x1 ? 1 : -1; + int dy = y1 - y0 <= 0 ? y1 - y0 : y0 - y1; + int sy = y0 < y1 ? 1 : -1; + int err = dx + dy; + + while((x0 != x1) && (y0 != y1)) { + DrawPixel(x0, y0 , colored); + if (2 * err >= dy) { + err += dy; + x0 += sx; + } + if (2 * err <= dx) { + err += dx; + y0 += sy; + } + } +} + +/** +* @brief: this draws a horizontal line on the frame buffer +*/ +void Paint::DrawHorizontalLine(int x, int y, int line_width, int colored) { + int i; + for (i = x; i < x + line_width; i++) { + DrawPixel(i, y, colored); + } +} + +/** +* @brief: this draws a vertical line on the frame buffer +*/ +void Paint::DrawVerticalLine(int x, int y, int line_height, int colored) { + int i; + for (i = y; i < y + line_height; i++) { + DrawPixel(x, i, colored); + } +} + +/** +* @brief: this draws a rectangle +*/ +void Paint::DrawRectangle(int x0, int y0, int x1, int y1, int colored) { + int min_x, min_y, max_x, max_y; + min_x = x1 > x0 ? x0 : x1; + max_x = x1 > x0 ? x1 : x0; + min_y = y1 > y0 ? y0 : y1; + max_y = y1 > y0 ? y1 : y0; + + DrawHorizontalLine(min_x, min_y, max_x - min_x + 1, colored); + DrawHorizontalLine(min_x, max_y, max_x - min_x + 1, colored); + DrawVerticalLine(min_x, min_y, max_y - min_y + 1, colored); + DrawVerticalLine(max_x, min_y, max_y - min_y + 1, colored); +} + +/** +* @brief: this draws a filled rectangle +*/ +void Paint::DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored) { + int min_x, min_y, max_x, max_y; + int i; + min_x = x1 > x0 ? x0 : x1; + max_x = x1 > x0 ? x1 : x0; + min_y = y1 > y0 ? y0 : y1; + max_y = y1 > y0 ? y1 : y0; + + for (i = min_x; i <= max_x; i++) { + DrawVerticalLine(i, min_y, max_y - min_y + 1, colored); + } +} + +/** +* @brief: this draws a circle +*/ +void Paint::DrawCircle(int x, int y, int radius, int colored) { + /* Bresenham algorithm */ + int x_pos = -radius; + int y_pos = 0; + int err = 2 - 2 * radius; + int e2; + + do { + DrawPixel(x - x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y - y_pos, colored); + DrawPixel(x - x_pos, y - y_pos, colored); + e2 = err; + if (e2 <= y_pos) { + err += ++y_pos * 2 + 1; + if(-x_pos == y_pos && e2 <= x_pos) { + e2 = 0; + } + } + if (e2 > x_pos) { + err += ++x_pos * 2 + 1; + } + } while (x_pos <= 0); +} + +/** +* @brief: this draws a filled circle +*/ +void Paint::DrawFilledCircle(int x, int y, int radius, int colored) { + /* Bresenham algorithm */ + int x_pos = -radius; + int y_pos = 0; + int err = 2 - 2 * radius; + int e2; + + do { + DrawPixel(x - x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y - y_pos, colored); + DrawPixel(x - x_pos, y - y_pos, colored); + DrawHorizontalLine(x + x_pos, y + y_pos, 2 * (-x_pos) + 1, colored); + DrawHorizontalLine(x + x_pos, y - y_pos, 2 * (-x_pos) + 1, colored); + e2 = err; + if (e2 <= y_pos) { + err += ++y_pos * 2 + 1; + if(-x_pos == y_pos && e2 <= x_pos) { + e2 = 0; + } + } + if(e2 > x_pos) { + err += ++x_pos * 2 + 1; + } + } while(x_pos <= 0); +} + +/* END OF FILE */ diff --git a/Display_code/epd1in54_V2/epdpaint.h b/Display_code/epd1in54_V2/epdpaint.h new file mode 100644 index 0000000..17b366f --- /dev/null +++ b/Display_code/epd1in54_V2/epdpaint.h @@ -0,0 +1,75 @@ +/** + * @filename : epdpaint.h + * @brief : Header file for epdpaint.cpp + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare July 28 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef EPDPAINT_H +#define EPDPAINT_H + +// Display orientation +#define ROTATE_0 0 +#define ROTATE_90 1 +#define ROTATE_180 2 +#define ROTATE_270 3 + +// Color inverse. 1 or 0 = set or reset a bit if set a colored pixel +#define IF_INVERT_COLOR 1 + +#include "fonts.h" + +class Paint { +public: + Paint(unsigned char* image, int width, int height); + ~Paint(); + void Clear(int colored); + int GetWidth(void); + void SetWidth(int width); + int GetHeight(void); + void SetHeight(int height); + int GetRotate(void); + void SetRotate(int rotate); + unsigned char* GetImage(void); + void DrawAbsolutePixel(int x, int y, int colored); + void DrawPixel(int x, int y, int colored); + void DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored); + void DrawStringAt(int x, int y, const char* text, sFONT* font, int colored); + void DrawLine(int x0, int y0, int x1, int y1, int colored); + void DrawHorizontalLine(int x, int y, int width, int colored); + void DrawVerticalLine(int x, int y, int height, int colored); + void DrawRectangle(int x0, int y0, int x1, int y1, int colored); + void DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored); + void DrawCircle(int x, int y, int radius, int colored); + void DrawFilledCircle(int x, int y, int radius, int colored); + +private: + unsigned char* image; + int width; + int height; + int rotate; +}; + +#endif + +/* END OF FILE */ + diff --git a/Display_code/epd1in54_V2/font12.c b/Display_code/epd1in54_V2/font12.c new file mode 100644 index 0000000..9963fe3 --- /dev/null +++ b/Display_code/epd1in54_V2/font12.c @@ -0,0 +1,1385 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// +// Font data for Courier New 12pt +// + +const uint8_t Font12_Table[] PROGMEM = +{ + // @0 ' ' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @12 '!' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @24 '"' (7 pixels wide) + 0x00, // + 0x6C, // ## ## + 0x48, // # # + 0x48, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @36 '#' (7 pixels wide) + 0x00, // + 0x14, // # # + 0x14, // # # + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + + // @48 '$' (7 pixels wide) + 0x00, // + 0x10, // # + 0x38, // ### + 0x40, // # + 0x40, // # + 0x38, // ### + 0x48, // # # + 0x70, // ### + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @60 '%' (7 pixels wide) + 0x00, // + 0x20, // # + 0x50, // # # + 0x20, // # + 0x0C, // ## + 0x70, // ### + 0x08, // # + 0x14, // # # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + + // @72 '&' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x20, // # + 0x20, // # + 0x54, // # # # + 0x48, // # # + 0x34, // ## # + 0x00, // + 0x00, // + 0x00, // + + // @84 ''' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @96 '(' (7 pixels wide) + 0x00, // + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x00, // + + // @108 ')' (7 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @120 '*' (7 pixels wide) + 0x00, // + 0x10, // # + 0x7C, // ##### + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @132 '+' (7 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0xFE, // ####### + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @144 ',' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x10, // # + 0x30, // ## + 0x20, // # + 0x00, // + + // @156 '-' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @168 '.' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @180 '/' (7 pixels wide) + 0x00, // + 0x04, // # + 0x04, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @192 '0' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @204 '1' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @216 '2' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @228 '3' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x18, // ## + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @240 '4' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x14, // # # + 0x14, // # # + 0x24, // # # + 0x44, // # # + 0x7E, // ###### + 0x04, // # + 0x0E, // ### + 0x00, // + 0x00, // + 0x00, // + + // @252 '5' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x20, // # + 0x20, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @264 '6' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x40, // # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @276 '7' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @288 '8' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @300 '9' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x08, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @312 ':' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @324 ';' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x18, // ## + 0x00, // + 0x00, // + 0x18, // ## + 0x30, // ## + 0x20, // # + 0x00, // + 0x00, // + + // @336 '<' (7 pixels wide) + 0x00, // + 0x00, // + 0x0C, // ## + 0x10, // # + 0x60, // ## + 0x80, // # + 0x60, // ## + 0x10, // # + 0x0C, // ## + 0x00, // + 0x00, // + 0x00, // + + // @348 '=' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @360 '>' (7 pixels wide) + 0x00, // + 0x00, // + 0xC0, // ## + 0x20, // # + 0x18, // ## + 0x04, // # + 0x18, // ## + 0x20, // # + 0xC0, // ## + 0x00, // + 0x00, // + 0x00, // + + // @372 '?' (7 pixels wide) + 0x00, // + 0x00, // + 0x18, // ## + 0x24, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x00, // + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @384 '@' (7 pixels wide) + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @396 'A' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x7C, // ##### + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @408 'B' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @420 'C' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @432 'D' (7 pixels wide) + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + 0x00, // + + // @444 'E' (7 pixels wide) + 0x00, // + 0xFC, // ###### + 0x44, // # # + 0x50, // # # + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x44, // # # + 0xFC, // ###### + 0x00, // + 0x00, // + 0x00, // + + // @456 'F' (7 pixels wide) + 0x00, // + 0x7E, // ###### + 0x22, // # # + 0x28, // # # + 0x38, // ### + 0x28, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @468 'G' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x4E, // # ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @480 'H' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x7C, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @492 'I' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @504 'J' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @516 'K' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x48, // # # + 0x50, // # # + 0x70, // ### + 0x48, // # # + 0x44, // # # + 0xE6, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @528 'L' (7 pixels wide) + 0x00, // + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x24, // # # + 0x24, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @540 'M' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x6C, // ## ## + 0x6C, // ## ## + 0x54, // # # # + 0x54, // # # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @552 'N' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x64, // ## # + 0x64, // ## # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0xEC, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @564 'O' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @576 'P' (7 pixels wide) + 0x00, // + 0x78, // #### + 0x24, // # # + 0x24, // # # + 0x24, // # # + 0x38, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @588 'Q' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x1C, // ### + 0x00, // + 0x00, // + + // @600 'R' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x48, // # # + 0x44, // # # + 0xE2, // ### # + 0x00, // + 0x00, // + 0x00, // + + // @612 'S' (7 pixels wide) + 0x00, // + 0x34, // ## # + 0x4C, // # ## + 0x40, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x64, // ## # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + + // @624 'T' (7 pixels wide) + 0x00, // + 0xFE, // ####### + 0x92, // # # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @636 'U' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @648 'V' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @660 'W' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @672 'X' (7 pixels wide) + 0x00, // + 0xC6, // ## ## + 0x44, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0xC6, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @684 'Y' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @696 'Z' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @708 '[' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x38, // ### + 0x00, // + + // @720 '\' (7 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x00, // + 0x00, // + + // @732 ']' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x38, // ### + 0x00, // + + // @744 '^' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @756 '_' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xFE, // ####### + + // @768 '`' (7 pixels wide) + 0x00, // + 0x10, // # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @780 'a' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x3C, // #### + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @792 'b' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @804 'c' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @816 'd' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x04, // # + 0x34, // ## # + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @828 'e' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x7C, // ##### + 0x40, // # + 0x40, // # + 0x3C, // #### + 0x00, // + 0x00, // + 0x00, // + + // @840 'f' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @852 'g' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x38, // ### + 0x00, // + + // @864 'h' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @876 'i' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @888 'j' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x78, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x70, // ### + 0x00, // + + // @900 'k' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x5C, // # ### + 0x48, // # # + 0x70, // ### + 0x50, // # # + 0x48, // # # + 0xDC, // ## ### + 0x00, // + 0x00, // + 0x00, // + + // @912 'l' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @924 'm' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xE8, // ### # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0xFE, // ####### + 0x00, // + 0x00, // + 0x00, // + + // @936 'n' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @948 'o' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @960 'p' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x40, // # + 0xE0, // ### + 0x00, // + + // @972 'q' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x0E, // ### + 0x00, // + + // @984 'r' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x6C, // ## ## + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @996 's' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x38, // ### + 0x04, // # + 0x44, // # # + 0x78, // #### + 0x00, // + 0x00, // + 0x00, // + + // @1008 't' (7 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x22, // # # + 0x1C, // ### + 0x00, // + 0x00, // + 0x00, // + + // @1020 'u' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x36, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1032 'v' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @1044 'w' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @1056 'x' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0xCC, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1068 'y' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x24, // # # + 0x28, // # # + 0x18, // ## + 0x10, // # + 0x10, // # + 0x78, // #### + 0x00, // + + // @1080 'z' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @1092 '{' (7 pixels wide) + 0x00, // + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x00, // + + // @1104 '|' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @1116 '}' (7 pixels wide) + 0x00, // + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x00, // + + // @1128 '~' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x24, // # # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font12 = { + Font12_Table, + 7, /* Width */ + 12, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Display_code/epd1in54_V2/font16.c b/Display_code/epd1in54_V2/font16.c new file mode 100644 index 0000000..a36db6e --- /dev/null +++ b/Display_code/epd1in54_V2/font16.c @@ -0,0 +1,1765 @@ +/** + ****************************************************************************** + * @file font16.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// +// Font data for Courier New 12pt +// + +const uint8_t Font16_Table[] PROGMEM = +{ + // @0 ' ' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @32 '!' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @64 '"' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @96 '#' (11 pixels wide) + 0x00, 0x00, // + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @128 '$' (11 pixels wide) + 0x04, 0x00, // # + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1E, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '%' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x00, // # # + 0x24, 0x00, // # # + 0x18, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x1E, 0x00, // #### + 0x31, 0x80, // ## ## + 0x02, 0x40, // # # + 0x02, 0x40, // # # + 0x01, 0x80, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @192 '&' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x1D, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x33, 0x00, // ## ## + 0x1D, 0x80, // ### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @224 ''' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @256 '(' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0E, 0x00, // ### + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @288 ')' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '*' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x0F, 0x00, // #### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @352 '+' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x3F, 0x80, // ####### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @384 ',' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + + // @416 '-' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @448 '.' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 '/' (11 pixels wide) + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @512 '0' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @544 '1' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x3E, 0x00, // ##### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @576 '2' (11 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x19, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @608 '3' (11 pixels wide) + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x61, 0x80, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x61, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '4' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0F, 0x00, // #### + 0x0B, 0x00, // # ## + 0x1B, 0x00, // ## ## + 0x13, 0x00, // # ## + 0x33, 0x00, // ## ## + 0x3F, 0x80, // ####### + 0x03, 0x00, // ## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @672 '5' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x11, 0x80, // # ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x21, 0x80, // # ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @704 '6' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @736 '7' (11 pixels wide) + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x43, 0x00, // # ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @768 '8' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '9' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x3C, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @832 ':' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @864 ';' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @896 '<' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @928 '=' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '>' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @992 '?' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x01, 0x80, // ## + 0x07, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1024 '@' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x11, 0x00, // # # + 0x21, 0x00, // # # + 0x21, 0x00, // # # + 0x27, 0x00, // # ### + 0x29, 0x00, // # # # + 0x29, 0x00, // # # # + 0x27, 0x00, // # ### + 0x20, 0x00, // # + 0x11, 0x00, // # # + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1056 'A' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x0F, 0x00, // #### + 0x09, 0x00, // # # + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x79, 0xE0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1088 'B' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 'C' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x40, // ##### # + 0x30, 0xC0, // ## ## + 0x60, 0x40, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x40, // ## # + 0x30, 0x80, // ## # + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1152 'D' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1184 'E' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1216 'F' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x30, 0x40, // ## # + 0x30, 0x40, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1248 'G' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x67, 0xC0, // ## ##### + 0x61, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 'H' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x80, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1312 'I' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1344 'J' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1376 'K' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x33, 0x00, // ## ## + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x79, 0xC0, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1408 'L' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0x00, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'M' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xE0, 0xE0, // ### ### + 0x60, 0xC0, // ## ## + 0x71, 0xC0, // ### ### + 0x7B, 0xC0, // #### #### + 0x6A, 0xC0, // ## # # ## + 0x6E, 0xC0, // ## ### ## + 0x64, 0xC0, // ## # ## + 0x60, 0xC0, // ## ## + 0xFB, 0xE0, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1472 'N' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0xC0, // ### #### + 0x31, 0x80, // ## ## + 0x39, 0x80, // ### ## + 0x3D, 0x80, // #### ## + 0x35, 0x80, // ## # ## + 0x37, 0x80, // ## #### + 0x33, 0x80, // ## ### + 0x31, 0x80, // ## ## + 0x79, 0x80, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1504 'O' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1536 'P' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7E, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1568 'Q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x0C, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'R' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7C, 0xE0, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1632 'S' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1664 'T' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1696 'U' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1728 'V' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0A, 0x00, // # # + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'W' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xFB, 0xE0, // ##### ##### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x6E, 0xC0, // ## ### ## + 0x2A, 0x80, // # # # # + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1792 'X' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1824 'Y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1856 'Z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x23, 0x00, // # ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x18, 0x80, // ## # + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1888 '[' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 '\' (11 pixels wide) + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1952 ']' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1984 '^' (11 pixels wide) + 0x04, 0x00, // # + 0x0A, 0x00, // # # + 0x0A, 0x00, // # # + 0x11, 0x00, // # # + 0x20, 0x80, // # # + 0x20, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2016 '_' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xE0, // ########### + + // @2048 '`' (11 pixels wide) + 0x08, 0x00, // # + 0x04, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'a' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2112 'b' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x77, 0x00, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2144 'c' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x80, // ## # + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2176 'd' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1D, 0x80, // ### ## + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2208 'e' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x7F, 0xC0, // ######### + 0x60, 0x00, // ## + 0x30, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'f' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2272 'g' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2304 'h' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2336 'i' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2368 'j' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 'k' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3C, 0x00, // #### + 0x36, 0x00, // ## ## + 0x33, 0x00, // ## ## + 0x77, 0xC0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2432 'l' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2464 'm' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x76, 0xE0, // ### ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2496 'n' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2528 'o' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2560 'p' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2592 'q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2624 'r' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0x80, // #### ### + 0x1C, 0xC0, // ### ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2656 's' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x3C, 0x00, // #### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2688 't' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x80, // ## # + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'u' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2752 'v' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2784 'w' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xF1, 0xE0, // #### #### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2816 'x' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2848 'y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0B, 0x00, // # ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x03, 0x00, // ## + 0x0E, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2912 '{' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2944 '|' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2976 '}' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3008 '~' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x80, // # # # + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + +sFONT Font16 = { + Font16_Table, + 11, /* Width */ + 16, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Display_code/epd1in54_V2/font20.c b/Display_code/epd1in54_V2/font20.c new file mode 100644 index 0000000..49c8e14 --- /dev/null +++ b/Display_code/epd1in54_V2/font20.c @@ -0,0 +1,2143 @@ +/** + ****************************************************************************** + * @file font20.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// Character bitmaps for Courier New 15pt +const uint8_t Font20_Table[] PROGMEM = +{ + // @0 ' ' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @40 '!' (14 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @80 '"' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @120 '#' (14 pixels wide) + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '$' (14 pixels wide) + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0xE0, // ###### + 0x0F, 0xE0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x0F, 0xC0, // ###### + 0x00, 0xE0, // ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xC0, // ####### + 0x1F, 0x80, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @200 '%' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x1C, 0x60, // ### ## + 0x01, 0xE0, // #### + 0x0F, 0x80, // ##### + 0x3C, 0x00, // #### + 0x31, 0xC0, // ## ### + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @240 '&' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x0F, 0x30, // #### ## + 0x1F, 0xF0, // ######### + 0x19, 0xE0, // ## #### + 0x18, 0xC0, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @280 ''' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '(' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @360 ')' (14 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @400 '*' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1B, 0x60, // ## ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @440 '+' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 ',' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @520 '-' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @560 '.' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @600 '/' (14 pixels wide) + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '0' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @680 '1' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @720 '2' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @760 '3' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x3F, 0xC0, // ######## + 0x30, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0xE0, // ### + 0x07, 0xC0, // ##### + 0x07, 0xC0, // ##### + 0x00, 0xE0, // ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x60, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '4' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0xC0, // ## + 0x03, 0xE0, // ##### + 0x03, 0xE0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @840 '5' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x80, // ###### + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @880 '6' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x1E, 0x00, // #### + 0x18, 0x00, // ## + 0x38, 0x00, // ### + 0x37, 0x80, // ## #### + 0x3F, 0xC0, // ######## + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @920 '7' (14 pixels wide) + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '8' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1000 '9' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x1F, 0xC0, // ####### + 0x38, 0xC0, // ### ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xE0, // ######## + 0x0F, 0x60, // #### ## + 0x00, 0xE0, // ### + 0x00, 0xC0, // ## + 0x03, 0xC0, // #### + 0x3F, 0x80, // ####### + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1040 ':' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1080 ';' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 '<' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x30, // ## + 0x00, 0xF0, // #### + 0x03, 0xC0, // #### + 0x07, 0x00, // ### + 0x1C, 0x00, // ### + 0x78, 0x00, // #### + 0x1C, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0xC0, // #### + 0x00, 0xF0, // #### + 0x00, 0x30, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1160 '=' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1200 '>' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x30, 0x00, // ## + 0x3C, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x00, 0xE0, // ### + 0x00, 0x78, // #### + 0x00, 0xE0, // ### + 0x03, 0x80, // ### + 0x0F, 0x00, // #### + 0x3C, 0x00, // #### + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1240 '?' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x00, 0x60, // ## + 0x01, 0xC0, // ### + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 '@' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x0C, 0x80, // ## # + 0x08, 0x40, // # # + 0x10, 0x40, // # # + 0x10, 0x40, // # # + 0x11, 0xC0, // # ### + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x11, 0xC0, // # ### + 0x10, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x40, // # # + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1320 'A' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x03, 0x80, // ### + 0x06, 0xC0, // ## ## + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x30, 0x30, // ## ## + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1360 'B' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x3F, 0xC0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x1F, 0xE0, // ######## + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1400 'C' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x1C, 0x70, // ### ### + 0x38, 0x30, // ### ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1C, 0x70, // ### ### + 0x0F, 0xE0, // ####### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'D' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x7F, 0xC0, // ######### + 0x30, 0xE0, // ## ### + 0x30, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x70, // ## ### + 0x30, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1480 'E' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1520 'F' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1560 'G' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x31, 0xF8, // ## ###### + 0x31, 0xF8, // ## ###### + 0x30, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'H' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1640 'I' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1680 'J' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xF8, // ####### + 0x03, 0xF8, // ####### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1720 'K' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3E, 0xF8, // ##### ##### + 0x3E, 0xF8, // ##### ##### + 0x18, 0xE0, // ## ### + 0x19, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1F, 0x00, // ##### + 0x1D, 0x80, // ### ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0x60, // ## ## + 0x3E, 0x78, // ##### #### + 0x3E, 0x38, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'L' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1800 'M' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x38, 0x70, // ### ### + 0x3C, 0xF0, // #### #### + 0x34, 0xB0, // ## # # ## + 0x37, 0xB0, // ## #### ## + 0x37, 0xB0, // ## #### ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x30, 0x30, // ## ## + 0x7C, 0xF8, // ##### ##### + 0x7C, 0xF8, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1840 'N' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x39, 0xF0, // ### ##### + 0x3D, 0xF0, // #### ##### + 0x1C, 0x60, // ### ## + 0x1E, 0x60, // #### ## + 0x1E, 0x60, // #### ## + 0x1B, 0x60, // ## ## ## + 0x1B, 0x60, // ## ## ## + 0x19, 0xE0, // ## #### + 0x19, 0xE0, // ## #### + 0x18, 0xE0, // ## ### + 0x3E, 0xE0, // ##### ### + 0x3E, 0x60, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1880 'O' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 'P' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1960 'Q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x0C, 0xE0, // ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2000 'R' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x18, 0x60, // ## ## + 0x18, 0x70, // ## ### + 0x3E, 0x38, // ##### ### + 0x3E, 0x18, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2040 'S' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xB0, // ##### ## + 0x1F, 0xF0, // ######### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x80, // ###### + 0x07, 0xE0, // ###### + 0x00, 0x70, // ### + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x3F, 0xE0, // ######### + 0x37, 0xC0, // ## ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'T' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2120 'U' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2160 'V' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2200 'W' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7C, 0x7C, // ##### ##### + 0x7C, 0x7C, // ##### ##### + 0x30, 0x18, // ## ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x36, 0xD8, // ## ## ## ## + 0x16, 0xD0, // # ## ## # + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x18, 0x30, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'X' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2280 'Y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2320 'Z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2360 '[' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 '\' (14 pixels wide) + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2440 ']' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2480 '^' (14 pixels wide) + 0x00, 0x00, // + 0x02, 0x00, // # + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x20, 0x20, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2520 '_' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xFC, // ############## + 0xFF, 0xFC, // ############## + + // @2560 '`' (14 pixels wide) + 0x00, 0x00, // + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0x80, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2600 'a' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xC0, // ###### + 0x1F, 0xE0, // ######## + 0x00, 0x60, // ## + 0x0F, 0xE0, // ####### + 0x1F, 0xE0, // ######## + 0x38, 0x60, // ### ## + 0x30, 0xE0, // ## ### + 0x3F, 0xF0, // ########## + 0x1F, 0x70, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2640 'b' (14 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x3F, 0xE0, // ######### + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x7F, 0xE0, // ########## + 0x77, 0x80, // ### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2680 'c' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1F, 0xF0, // ######### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'd' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x70, // ### + 0x00, 0x70, // ### + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1F, 0xF8, // ########## + 0x07, 0xB8, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2760 'e' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x30, 0x00, // ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2800 'f' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xF0, // ###### + 0x07, 0xF0, // ####### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2840 'g' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x70, // ### + 0x0F, 0xE0, // ####### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'h' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xC0, // ## #### + 0x1F, 0xE0, // ######## + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2920 'i' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2960 'j' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0xC0, // ### + 0x3F, 0x80, // ####### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3000 'k' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xE0, // ## ##### + 0x1B, 0xE0, // ## ##### + 0x1B, 0x00, // ## ## + 0x1E, 0x00, // #### + 0x1E, 0x00, // #### + 0x1B, 0x00, // ## ## + 0x19, 0x80, // ## ## + 0x39, 0xF0, // ### ##### + 0x39, 0xF0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3040 'l' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3080 'm' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0xE0, // ###### ### + 0x7F, 0xF0, // ########### + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x7B, 0xB8, // #### ### ### + 0x7B, 0xB8, // #### ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3120 'n' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3B, 0xC0, // ### #### + 0x3F, 0xE0, // ######### + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3160 'o' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3200 'p' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x80, // ### #### + 0x7F, 0xE0, // ########## + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x3F, 0xE0, // ######### + 0x37, 0x80, // ## #### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3240 'q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x00, 0xF8, // ##### + 0x00, 0xF8, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3280 'r' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xE0, // #### ### + 0x3D, 0xF0, // #### ##### + 0x0F, 0x30, // #### ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3320 's' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x1E, 0x00, // #### + 0x0F, 0xC0, // ###### + 0x01, 0xE0, // #### + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3360 't' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0F, 0xF0, // ######## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3400 'u' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x38, 0xE0, // ### ### + 0x38, 0xE0, // ### ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xF0, // ######### + 0x0F, 0x70, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3440 'v' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3480 'w' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x32, 0x60, // ## # ## + 0x32, 0x60, // ## # ## + 0x37, 0xE0, // ## ###### + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3520 'x' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x07, 0x80, // #### + 0x0C, 0xC0, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3560 'y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0F, 0x80, // ##### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x7F, 0x00, // ####### + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3600 'z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3640 '{' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x0E, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3680 '|' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3720 '}' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x00, // ### + 0x03, 0x80, // ### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x1C, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3760 '~' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x3F, 0x30, // ###### ## + 0x33, 0xF0, // ## ###### + 0x01, 0xE0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + + +sFONT Font20 = { + Font20_Table, + 14, /* Width */ + 20, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Display_code/epd1in54_V2/font24.c b/Display_code/epd1in54_V2/font24.c new file mode 100644 index 0000000..735f487 --- /dev/null +++ b/Display_code/epd1in54_V2/font24.c @@ -0,0 +1,2521 @@ +/** + ****************************************************************************** + * @file font24.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +const uint8_t Font24_Table [] PROGMEM = +{ + // @0 ' ' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @72 '!' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @144 '"' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @216 '#' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @288 '$' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0xB0, 0x00, // #### ## + 0x0F, 0xF0, 0x00, // ######## + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x1C, 0x00, 0x00, // ### + 0x0F, 0x80, 0x00, // ##### + 0x07, 0xE0, 0x00, // ###### + 0x00, 0xF0, 0x00, // #### + 0x18, 0x30, 0x00, // ## ## + 0x1C, 0x30, 0x00, // ### ## + 0x1C, 0x70, 0x00, // ### ### + 0x1F, 0xE0, 0x00, // ######## + 0x1B, 0xC0, 0x00, // ## #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @360 '%' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x80, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x1C, 0xE0, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF0, 0x00, // ######### + 0x07, 0x38, 0x00, // ### ### + 0x06, 0x18, 0x00, // ## ## + 0x06, 0x18, 0x00, // ## ## + 0x07, 0x38, 0x00, // ### ### + 0x03, 0xF0, 0x00, // ###### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @432 '&' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xF0, 0x00, // ###### + 0x07, 0xF0, 0x00, // ####### + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x07, 0x00, 0x00, // ### + 0x0F, 0x9C, 0x00, // ##### ### + 0x1D, 0xFC, 0x00, // ### ####### + 0x18, 0xF0, 0x00, // ## #### + 0x18, 0x70, 0x00, // ## ### + 0x0F, 0xFC, 0x00, // ########## + 0x07, 0xDC, 0x00, // ##### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @504 ''' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @576 '(' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @648 ')' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x0F, 0x00, 0x00, // #### + 0x0E, 0x00, 0x00, // ### + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @720 '*' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1D, 0xB8, 0x00, // ### ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @792 '+' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @864 ',' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @936 '-' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1008 '.' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1080 '/' (17 pixels wide) + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1152 '0' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1224 '1' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x07, 0x80, 0x00, // #### + 0x1F, 0x80, 0x00, // ###### + 0x1D, 0x80, 0x00, // ### ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1296 '2' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1368 '3' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x70, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x70, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1440 '4' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x60, 0x00, // ## + 0x03, 0xF8, 0x00, // ####### + 0x03, 0xF8, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1512 '5' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x3F, 0xF0, 0x00, // ########## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1584 '6' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF8, 0x00, // ##### + 0x03, 0xF8, 0x00, // ####### + 0x07, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1656 '7' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1728 '8' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xE0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1800 '9' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xD8, 0x00, // #### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x1F, 0xC0, 0x00, // ####### + 0x1F, 0x00, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1872 ':' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1944 ';' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x02, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2016 '<' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x1C, 0x00, // ### + 0x00, 0x3C, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0xF0, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x3C, 0x00, // #### + 0x00, 0x1C, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2088 '=' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2160 '>' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x70, 0x00, 0x00, // ### + 0x78, 0x00, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x1E, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x70, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2232 '?' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xE0, 0x00, // ####### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x03, 0xC0, 0x00, // #### + 0x03, 0x80, 0x00, // ### + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2304 '@' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xE0, 0x00, // ##### + 0x07, 0xF0, 0x00, // ####### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x78, 0x00, // ## #### + 0x18, 0xF8, 0x00, // ## ##### + 0x19, 0xD8, 0x00, // ## ### ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x18, 0x00, // ### ## + 0x07, 0xF8, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2376 'A' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0xC0, 0x00, // ####### + 0x01, 0xC0, 0x00, // ### + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFC, 0x7F, 0x00, // ###### ####### + 0xFC, 0x7F, 0x00, // ###### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2448 'B' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x1C, 0x00, // ## ### + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF0, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2520 'C' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2592 'D' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xC0, 0x00, // ######### + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0xF0, 0x00, // ########### + 0x7F, 0xE0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2664 'E' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x19, 0x80, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2736 'F' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0xCC, 0x00, // ## ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0F, 0xC0, 0x00, // ###### + 0x0F, 0xC0, 0x00, // ###### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2808 'G' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xFC, 0x00, // ########## + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2880 'H' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2952 'I' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3024 'J' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xFE, 0x00, // ########## + 0x07, 0xFE, 0x00, // ########## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xE0, 0x00, // ######### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3096 'K' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x3E, 0x00, // ####### ##### + 0x7F, 0x3E, 0x00, // ####### ##### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1B, 0x80, 0x00, // ## ### + 0x1F, 0xC0, 0x00, // ####### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3168 'L' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x80, 0x00, // ######## + 0x7F, 0x80, 0x00, // ######## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3240 'M' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF0, 0x0F, 0x00, // #### #### + 0xF8, 0x1F, 0x00, // ##### ##### + 0x38, 0x1C, 0x00, // ### ### + 0x3C, 0x3C, 0x00, // #### #### + 0x3C, 0x3C, 0x00, // #### #### + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFE, 0x7F, 0x00, // ####### ####### + 0xFE, 0x7F, 0x00, // ####### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3312 'N' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0xFE, 0x00, // #### ####### + 0x78, 0xFE, 0x00, // #### ####### + 0x1C, 0x18, 0x00, // ### ## + 0x1E, 0x18, 0x00, // #### ## + 0x1F, 0x18, 0x00, // ##### ## + 0x1B, 0x18, 0x00, // ## ## ## + 0x1B, 0x98, 0x00, // ## ### ## + 0x19, 0xD8, 0x00, // ## ### ## + 0x18, 0xD8, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x18, 0x00, // ####### ## + 0x7F, 0x18, 0x00, // ####### ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3384 'O' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3456 'P' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0x1C, 0x00, // ## ### + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3528 'Q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xC0, 0x00, // ##### + 0x07, 0xCC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x0C, 0x38, 0x00, // ## ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3600 'R' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xC0, 0x00, // ####### + 0x18, 0xE0, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1E, 0x00, // ####### #### + 0x7F, 0x0E, 0x00, // ####### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3672 'S' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xD8, 0x00, // ##### ## + 0x0F, 0xF8, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1E, 0x00, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x78, 0x00, // #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x1F, 0xF0, 0x00, // ######### + 0x1B, 0xE0, 0x00, // ## ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3744 'T' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3816 'U' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3888 'V' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x7F, 0x00, // ####### ####### + 0x7F, 0x7F, 0x00, // ####### ####### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0x80, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3960 'W' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFE, 0x3F, 0x80, // ####### ####### + 0xFE, 0x3F, 0x80, // ####### ####### + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x86, 0x00, // ## # ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1E, 0x7C, 0x00, // #### ##### + 0x0E, 0x38, 0x00, // ### ### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4032 'X' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4104 'Y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x7E, 0x00, // ##### ###### + 0x7C, 0x7E, 0x00, // ##### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4176 'Z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4248 '[' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4320 '\' (17 pixels wide) + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4392 ']' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4464 '^' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x01, 0xC0, 0x00, // ### + 0x03, 0xE0, 0x00, // ##### + 0x07, 0x70, 0x00, // ### ### + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x10, 0x04, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4536 '_' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFF, 0xFF, 0x00, // ################ + 0xFF, 0xFF, 0x00, // ################ + + // @4608 '`' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x03, 0x00, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4680 'a' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0xC0, 0x00, // ###### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x07, 0xF0, 0x00, // ####### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x70, 0x00, // ## ### + 0x1F, 0xFC, 0x00, // ########### + 0x0F, 0xBC, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4752 'b' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF8, 0x00, // ########## + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x7F, 0xF8, 0x00, // ############ + 0x7B, 0xE0, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4824 'c' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x38, 0x0C, 0x00, // ### ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4896 'd' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x78, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x07, 0xD8, 0x00, // ##### ## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xFE, 0x00, // ############ + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4968 'e' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1F, 0xFC, 0x00, // ########### + 0x07, 0xF0, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5040 'f' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xFC, 0x00, // ####### + 0x03, 0xFC, 0x00, // ######## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5112 'g' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5184 'h' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5256 'i' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5328 'j' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x1F, 0xE0, 0x00, // ######## + 0x1F, 0x80, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5400 'k' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3C, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xC0, 0x00, // ## ## + 0x0D, 0x80, 0x00, // ## ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x00, 0x00, // #### + 0x0F, 0x80, 0x00, // ##### + 0x0D, 0xC0, 0x00, // ## ### + 0x0C, 0xE0, 0x00, // ## ### + 0x3C, 0x7C, 0x00, // #### ##### + 0x3C, 0x7C, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5472 'l' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5544 'm' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF7, 0x78, 0x00, // #### ### #### + 0xFF, 0xFC, 0x00, // ############## + 0x39, 0xCC, 0x00, // ### ### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0xFD, 0xEF, 0x00, // ###### #### #### + 0xFD, 0xEF, 0x00, // ###### #### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5616 'n' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF0, 0x00, // ########### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5688 'o' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5760 'p' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF8, 0x00, // ############ + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x1F, 0xF8, 0x00, // ########## + 0x1B, 0xE0, 0x00, // ## ##### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x7F, 0x00, 0x00, // ####### + 0x7F, 0x00, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5832 'q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0xFE, 0x00, // ####### + 0x00, 0xFE, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5904 'r' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x78, 0x00, // ##### #### + 0x3E, 0xFC, 0x00, // ##### ###### + 0x07, 0xCC, 0x00, // ##### ## + 0x07, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5976 's' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xF8, 0x00, // ######## + 0x0F, 0xF8, 0x00, // ######### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0xF8, 0x00, // ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6048 't' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x1C, 0x00, // ## ### + 0x07, 0xFC, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6120 'u' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x78, 0x00, // #### #### + 0x78, 0x78, 0x00, // #### #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x0F, 0xFE, 0x00, // ########### + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6192 'v' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x3E, 0x00, // ##### ##### + 0x7C, 0x3E, 0x00, // ##### ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6264 'w' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x3C, 0x00, // #### #### + 0x78, 0x3C, 0x00, // #### #### + 0x31, 0x18, 0x00, // ## # ## + 0x33, 0x98, 0x00, // ## ### ## + 0x33, 0x98, 0x00, // ## ### ## + 0x1A, 0xB0, 0x00, // ## # # ## + 0x1E, 0xF0, 0x00, // #### #### + 0x1E, 0xF0, 0x00, // #### #### + 0x1C, 0x60, 0x00, // ### ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6336 'x' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6408 'y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x1F, 0x00, // ###### ##### + 0x7E, 0x1F, 0x00, // ###### ##### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0xE0, 0x00, // ##### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6480 'z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6552 '{' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xE0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6624 '|' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6696 '}' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x80, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0x80, 0x00, // #### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6768 '~' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x00, 0x00, // ### + 0x1F, 0x18, 0x00, // ##### ## + 0x3B, 0xB8, 0x00, // ### ### ### + 0x31, 0xF0, 0x00, // ## ##### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // +}; + +sFONT Font24 = { + Font24_Table, + 17, /* Width */ + 24, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Display_code/epd1in54_V2/font8.c b/Display_code/epd1in54_V2/font8.c new file mode 100644 index 0000000..1b0d2ab --- /dev/null +++ b/Display_code/epd1in54_V2/font8.c @@ -0,0 +1,1005 @@ +/** + ****************************************************************************** + * @file Font8.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// +// Font data for Courier New 12pt +// + +const uint8_t Font8_Table[] PROGMEM = +{ + // @0 ' ' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @8 '!' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @16 '"' (5 pixels wide) + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @24 '#' (5 pixels wide) + 0x28, // # # + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xA0, // # # + 0x00, // + + // @32 '$' (5 pixels wide) + 0x20, // # + 0x30, // ## + 0x60, // ## + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x20, // # + 0x00, // + + // @40 '%' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x18, // ## + 0x60, // ## + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @48 '&' (5 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x60, // ## + 0x50, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @56 ''' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @64 '(' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @72 ')' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @80 '*' (5 pixels wide) + 0x20, // # + 0x70, // ### + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @88 '+' (5 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @96 ',' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @104 '-' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @112 '.' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @120 '/' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x40, // # + 0x80, // # + 0x00, // + + // @128 '0' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @136 '1' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @144 '2' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @152 '3' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @160 '4' (5 pixels wide) + 0x10, // # + 0x30, // ## + 0x50, // # # + 0x78, // #### + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + + // @168 '5' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x60, // ## + 0x10, // # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @176 '6' (5 pixels wide) + 0x30, // ## + 0x40, // # + 0x60, // ## + 0x50, // # # + 0x50, // # # + 0x60, // ## + 0x00, // + 0x00, // + + // @184 '7' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @192 '8' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @200 '9' (5 pixels wide) + 0x30, // ## + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @208 ':' (5 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @216 ';' (5 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x10, // # + 0x20, // # + 0x00, // + 0x00, // + + // @224 '<' (5 pixels wide) + 0x00, // + 0x10, // # + 0x20, // # + 0xC0, // ## + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + + // @232 '=' (5 pixels wide) + 0x00, // + 0x70, // ### + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @240 '>' (5 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x18, // ## + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @248 '?' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @256 '@' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x58, // # ## + 0x48, // # # + 0x40, // # + 0x38, // ### + 0x00, // + + // @264 'A' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x50, // # # + 0x70, // ### + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @272 'B' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @280 'C' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @288 'D' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @296 'E' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @304 'F' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @312 'G' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x40, // # + 0x58, // # ## + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @320 'H' (5 pixels wide) + 0xE8, // ### # + 0x48, // # # + 0x78, // #### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @328 'I' (5 pixels wide) + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @336 'J' (5 pixels wide) + 0x38, // ### + 0x10, // # + 0x10, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @344 'K' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x60, // ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @352 'L' (5 pixels wide) + 0xE0, // ### + 0x40, // # + 0x40, // # + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @360 'M' (5 pixels wide) + 0xD8, // ## ## + 0xD8, // ## ## + 0xD8, // ## ## + 0xA8, // # # # + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @368 'N' (5 pixels wide) + 0xD8, // ## ## + 0x68, // ## # + 0x68, // ## # + 0x58, // # ## + 0x58, // # ## + 0xE8, // ### # + 0x00, // + 0x00, // + + // @376 'O' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @384 'P' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @392 'Q' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x18, // ## + 0x00, // + + // @400 'R' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @408 'S' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x20, // # + 0x10, // # + 0x50, // # # + 0x70, // ### + 0x00, // + 0x00, // + + // @416 'T' (5 pixels wide) + 0xF8, // ##### + 0xA8, // # # # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @424 'U' (5 pixels wide) + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @432 'V' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x48, // # # + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @440 'W' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @448 'X' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x20, // # + 0x20, // # + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @456 'Y' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @464 'Z' (5 pixels wide) + 0x78, // #### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x48, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @472 '[' (5 pixels wide) + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x00, // + + // @480 '\' (5 pixels wide) + 0x80, // # + 0x40, // # + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @488 ']' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x00, // + + // @496 '^' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @504 '_' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xF8, // ##### + + // @512 '`' (5 pixels wide) + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @520 'a' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x10, // # + 0x70, // ### + 0x78, // #### + 0x00, // + 0x00, // + + // @528 'b' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @536 'c' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x40, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @544 'd' (5 pixels wide) + 0x18, // ## + 0x08, // # + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @552 'e' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x70, // ### + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @560 'f' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x70, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @568 'g' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x30, // ## + + // @576 'h' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @584 'i' (5 pixels wide) + 0x20, // # + 0x00, // + 0x60, // ## + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @592 'j' (5 pixels wide) + 0x20, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x70, // ### + + // @600 'k' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @608 'l' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @616 'm' (5 pixels wide) + 0x00, // + 0x00, // + 0xD0, // ## # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x00, // + 0x00, // + + // @624 'n' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0xC8, // ## # + 0x00, // + 0x00, // + + // @632 'o' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @640 'p' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + + // @648 'q' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x18, // ## + + // @656 'r' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @664 's' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @672 't' (5 pixels wide) + 0x00, // + 0x40, // # + 0xF0, // #### + 0x40, // # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @680 'u' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @688 'v' (5 pixels wide) + 0x00, // + 0x00, // + 0xC8, // ## # + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + + // @696 'w' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @704 'x' (5 pixels wide) + 0x00, // + 0x00, // + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0x00, // + 0x00, // + + // @712 'y' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x60, // ## + + // @720 'z' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x50, // # # + 0x28, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @728 '{' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @736 '|' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @744 '}' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @752 '~' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x28, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font8 = { + Font8_Table, + 5, /* Width */ + 8, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Display_code/epd1in54_V2/fonts.h b/Display_code/epd1in54_V2/fonts.h new file mode 100644 index 0000000..4530308 --- /dev/null +++ b/Display_code/epd1in54_V2/fonts.h @@ -0,0 +1,75 @@ +/** + ****************************************************************************** + * @file fonts.h + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief Header for fonts.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FONTS_H +#define __FONTS_H + +/* Max size of bitmap will based on a font24 (17x24) */ +#define MAX_HEIGHT_FONT 24 +#define MAX_WIDTH_FONT 17 +#define OFFSET_BITMAP 54 + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include + +typedef struct _tFont +{ + const uint8_t *table; + uint16_t Width; + uint16_t Height; + +} sFONT; + +extern sFONT Font24; +extern sFONT Font20; +extern sFONT Font16; +extern sFONT Font12; +extern sFONT Font8; + +#ifdef __cplusplus +} +#endif + +#endif /* __FONTS_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Display_code/epd1in54_V2/imagedata.cpp b/Display_code/epd1in54_V2/imagedata.cpp new file mode 100644 index 0000000..d5aef37 --- /dev/null +++ b/Display_code/epd1in54_V2/imagedata.cpp @@ -0,0 +1,344 @@ +/** + * @filename : imagedata.cpp + * @brief : data file for epd demo + * + * Copyright (C) Waveshare September 5 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "imagedata.h" +#include + +const unsigned char IMAGE_DATA[] PROGMEM = { +/* 0X00,0X01,0XC8,0X00,0XC8,0X00, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0X01,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XF8,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFF, +0X3F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XF0,0X00, +0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XF0,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE3,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XE1,0XE3,0X00,0X00,0X00,0X00,0X01, +0XFF,0XFF,0XE7,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XC3,0XF3,0X0F,0XFF,0XFF,0XFF,0XFC,0XFF,0XFF,0XE3,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC3,0X3B,0X0F,0XFF,0XFF, +0XFF,0XFE,0XFF,0XFF,0XE3,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XC3,0X0F,0X0F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XE1,0XFE,0X1F, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC3,0X0F,0X0F, +0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF0,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE3, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC3,0X87,0X0F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF0, +0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE0,0X7F,0XFF,0XFF,0XFF,0XFF,0XF1,0XC1, +0X03,0X0F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF8,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XE0,0X0F,0XFF,0XFF,0XFF,0XFF,0XF1,0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XFE,0XFF, +0XFF,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFC,0X03,0XFF,0XFF,0XFF,0XFF, +0XF1,0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0X80,0X7F,0XFF,0XFF,0XFF,0XF1,0XF0,0X00,0X3F,0XFF,0XFF,0XFF, +0X7E,0XFF,0XFF,0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XF0,0X1F,0XFF, +0XFF,0XFF,0XF1,0XF8,0X00,0X7F,0XFF,0XFF,0XFC,0X3E,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XFF,0XF1,0XFE,0X00,0XFF,0XFF, +0XFF,0XF0,0X3E,0XFF,0XFF,0XC6,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XF8,0X07, +0X8F,0XFF,0XFF,0XFF,0XF1,0XFE,0X87,0XFF,0XFF,0XFF,0XE0,0XCE,0XFF,0XFF,0XCE,0X7F, +0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE0,0X1F,0X8F,0XC0,0X07,0XFF,0XF1,0XFE,0XFF, +0XFF,0XFF,0XFF,0X81,0X86,0XFF,0XFF,0XCE,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XE0,0XFF,0XCF,0X80,0X07,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X02,0X06,0XFF,0XFF, +0XC6,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE3,0XFF,0XEF,0X00,0X07,0XFF,0XF1, +0XFE,0XFF,0XFF,0XFF,0XFE,0X0C,0X02,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFE,0X18,0X02, +0XFF,0XFF,0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF, +0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFE,0X20,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFE,0X01,0XFF,0X1F,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFE, +0XC0,0X02,0XFF,0XFF,0XFF,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XF0,0X01,0XFF, +0X9F,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X00,0X02,0XFF,0XFF,0XF8,0X00,0X7F, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE0,0X01,0XE0,0X80,0X0F,0XFF,0XF1,0XFE,0XFF,0XFF, +0XFF,0XFF,0X00,0X02,0XFF,0XFF,0XF0,0X00,0X3F,0XFF,0XE7,0XFF,0XFF,0X8F,0XFF,0XE0, +0X03,0XE0,0X00,0X07,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X80,0X06,0XFF,0XFF,0XE0, +0XCC,0X1F,0XFF,0XE0,0XFF,0XFF,0X8F,0XFF,0XE2,0X71,0XE0,0X00,0X07,0XFF,0XF1,0XFE, +0XFF,0XFF,0XFF,0XFF,0XC0,0X0E,0XFF,0XFF,0XE3,0XC7,0X1F,0XFF,0XE0,0X3F,0XFF,0X8F, +0XFF,0XE7,0X39,0XE0,0X00,0X0F,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XC0,0X0E,0XFF, +0XFF,0XE7,0XE7,0X8F,0XFF,0XF0,0X07,0XFF,0X8F,0XFF,0XE7,0X38,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X00,0X1E,0XFF,0XFF,0XE7,0XE7,0X8F,0XFF,0XFE,0X01, +0XFF,0X8F,0XFF,0XE3,0X10,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFC,0X00, +0X3E,0XFF,0XFF,0XE3,0XC7,0X8F,0XFF,0XFF,0XC0,0X7F,0X8F,0XFF,0XE3,0X01,0XFF,0X1F, +0XC7,0XFF,0XF1,0XFE,0XFF,0X83,0XFF,0XF0,0X00,0X7E,0XFF,0XFF,0XE0,0X07,0X1F,0XFF, +0XFF,0XF8,0X3F,0X8F,0XFF,0XF3,0X81,0XFF,0X1F,0XC7,0XFF,0XF1,0XFE,0XFC,0X01,0XFF, +0XE0,0X00,0XFE,0XFF,0XFF,0XF0,0X0F,0X1F,0XFF,0XFF,0XC0,0X1F,0X8F,0XFF,0XFF,0XC7, +0XFF,0X1F,0XC7,0XFF,0XF1,0XFE,0XF0,0X07,0XFF,0X80,0X01,0XFE,0XFF,0XFF,0XF8,0X1F, +0XBF,0XFF,0XFE,0X00,0X0F,0X8F,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XF1,0XFE,0XC0, +0X18,0XFE,0X00,0X03,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X07,0X87,0X8F,0XFF, +0XFF,0XFF,0XF8,0X00,0X0F,0XFF,0XF1,0XFE,0XC0,0XE0,0XF8,0X00,0X0F,0XFE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE0,0X1F,0XC7,0X8F,0XFF,0XFF,0XFF,0XF8,0X00,0X0F,0XFF,0XF1, +0XFE,0XC7,0X00,0XE0,0X00,0X1F,0XFE,0XFF,0XFF,0XFF,0XFF,0X9F,0XFF,0XE0,0XFF,0XC7, +0X8F,0XFE,0X00,0X01,0XFF,0X1E,0XFF,0XFF,0XF1,0XFE,0XDC,0X00,0XC0,0X00,0X3F,0XFE, +0XFF,0XFF,0XF8,0X3F,0X1F,0XFF,0XE3,0XFF,0XC7,0X8F,0XFE,0X00,0X01,0XFF,0X1F,0XFF, +0XFF,0XF1,0XFE,0XE0,0X00,0X00,0X00,0XFF,0XFE,0XFF,0XFF,0XF0,0X0F,0X1F,0XFF,0XFF, +0XFF,0XC7,0X8F,0XFE,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0XC0,0X00,0X00,0X03, +0XFF,0XFE,0XFF,0XFF,0XE0,0X03,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFE,0X03,0XFF,0XF8, +0X7F,0XFF,0XFF,0XF1,0XFE,0XE0,0X00,0X00,0X07,0XFF,0XFE,0XFF,0XFF,0XE3,0XC1,0X9F, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XC0,0X7F,0XF8,0X1F,0XFF,0XFF,0XF1,0XFE,0XE0,0X00, +0X00,0X1F,0XFF,0XFE,0XFF,0XFF,0XE7,0XE0,0X9F,0XFF,0XF8,0X00,0XFF,0X8F,0XFF,0XF8, +0X1F,0XF8,0X07,0XFF,0XFF,0XF1,0XFE,0XF0,0X00,0X00,0XFF,0XFF,0XFE,0XFF,0XFF,0XE7, +0XF8,0X1F,0XFF,0XF0,0X00,0XFF,0X8F,0XFF,0XFE,0X03,0XF8,0X01,0XFF,0XFF,0XF1,0XFE, +0XF8,0X00,0X03,0XFF,0XFF,0XFE,0XFF,0XFF,0XE7,0XFC,0X1F,0XFF,0XE0,0X00,0XFF,0X8F, +0XFF,0XFF,0X83,0XF8,0XC0,0X7F,0XFF,0XF1,0XFE,0XFC,0X00,0X3F,0XFF,0XFF,0XFE,0XFF, +0XFF,0XE3,0XFE,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFC,0X07,0XF8,0XF0,0X1F,0XFF, +0XF1,0XFE,0XFF,0XB7,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF1,0XFF,0X1F,0XFF,0XE3,0X31, +0XFF,0X8F,0XFF,0XE0,0X3F,0XF8,0XFC,0X07,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFE,0XFF,0XFF,0XF3,0XFF,0X9F,0XFF,0XE3,0X38,0XFF,0X8F,0XFF,0X00,0XFF,0XF8,0XFF, +0X03,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE3,0X38,0XFF,0X8F,0XFE,0X07,0XFF,0XF8,0XFF,0XC3,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0X18,0XFF,0X8F,0XFE,0X00,0X01, +0XF8,0XFF,0XF3,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XDF, +0XFF,0XFF,0XE3,0X00,0XFF,0X8F,0XFE,0X00,0X01,0XF8,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XE3,0X80,0XFF,0X8F,0XFE, +0X00,0X01,0XF8,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF, +0XFF,0X87,0XFF,0XFF,0XF1,0X81,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XC3,0XFF,0XFF,0XFF,0XC3,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE, +0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,0XFC,0XFF,0XFF,0XFF,0XF3,0XFF,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0X00,0X00,0X00,0X00, +0X00,0X01,0XFF,0XFF,0XFF,0XE3,0XFF,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF, +0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XFF,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X87,0XFF,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XE3,0XF1,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X1F,0XFF,0XFF,0XE3,0XF9,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XE3,0XF8, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XE3,0XF8,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X3F,0XFF,0XFF, +0XE1,0XF0,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XF0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F, +0XFF,0XFF,0XF0,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XFF,0XFF,0XF8,0X01,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X87,0XFF,0XFF,0XFE,0X07,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8, +0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XF0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X70,0X3F, +0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, +0XFF,0XFA,0XFF,0XFF,0XFF,0XFF,0XF0,0X20,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XC0,0X1F,0XFF,0XFF,0XFF,0XE0, +0X02,0X1F,0XFF,0XE3,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XFF,0XFF,0X00,0X0F,0XFF,0XFF,0XFF,0XE3,0X87,0X1F,0XFF,0XE3,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFE,0X00,0X07,0XFF,0XFF, +0XFF,0XE7,0X8F,0X8F,0XFF,0XE3,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFE,0X00,0X02,0X7F,0XFF,0XFF,0XE7,0XCF,0X8F,0XFF,0XF0,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFC,0X00,0X00, +0X7F,0XFF,0XFF,0XE7,0XCF,0X9F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0XFF,0XFF,0XFF,0XE3,0XFF,0X1F,0XFF, +0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF8, +0X30,0X00,0XFF,0XFF,0XFF,0XF3,0XFE,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF8,0X30,0X00,0XFF,0XFF,0XFF,0XF7,0XFF, +0X3F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XF0,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0X90,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0X10,0X00,0X00,0XFF, +0XFF,0XFF,0XF8,0X1F,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XFC,0X10,0X00,0X00,0XFF,0XFF,0XFF,0XF0,0X0F,0X1F,0XFF,0XE0, +0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF8,0X18,0X30, +0X00,0XFF,0XFF,0XFF,0XE0,0X03,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF8,0X08,0X38,0X00,0XFF,0XFF,0XFF,0XE3,0XC1,0X9F, +0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF0, +0X08,0X30,0X01,0XFF,0XFF,0XFF,0XE7,0XF0,0X9F,0XFF,0XFF,0XE1,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0X08,0X00,0X01,0XFF,0XFF,0XFF,0XE7, +0XF8,0X1F,0XFF,0XFF,0XF9,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XE0,0XE4,0X00,0X01,0XFF,0XFF,0XFF,0XE7,0XFC,0X1F,0XFF,0XFF,0XF8,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0XE2,0X00,0X03,0XFF,0XFF, +0XFF,0XE3,0XFE,0X1F,0XFF,0XFF,0XF8,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XC0,0XE2,0X00,0X07,0XFF,0XFF,0XFF,0XF1,0XFF,0X1F,0XFF,0XE0,0X00, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X41,0X00,0X0F, +0XFF,0XFF,0XFF,0XF3,0XFF,0X9F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00,0XC0,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE0,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00, +0X30,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X03,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00,0X07,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XC0,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00,0X00,0X7F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XC0,0X40,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0XE0,0X00,0X7F,0XFF, +0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFF,0X87,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XE0,0XE0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0X1E, +0X03,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0XE0,0X00, +0X7F,0XFF,0XFF,0XFE,0XFF,0XBF,0XCF,0XFE,0X3E,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0X00,0X00,0X3F,0XFF,0XFF,0XFE,0X3F,0XFF,0X8F, +0XFE,0X3C,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF0, +0X00,0X00,0X3F,0XFF,0XFF,0XFF,0X3C,0X0F,0X9F,0XFE,0X3C,0X30,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF8,0X00,0X01,0X1F,0XFF,0XFF,0XFF,0XF0, +0X03,0XFF,0XFE,0X3C,0X78,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XF8,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFE,0X38,0X78,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFC,0X00,0X07,0XFF,0XFF,0XFF, +0XFF,0XC0,0X00,0XFF,0XFE,0X18,0X78,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X7F,0XFE,0X00,0XF8, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0X80,0X3F,0XFF, +0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0X00,0XF8,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF, +0X01,0XF0,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0XC3,0XF1,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0X00,0X00, +0X31,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0X00,0X00,0X31,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X80,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X7F,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X01,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X78,0X03,0XDF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X3F, +0X1F,0X8F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X7F,0XFF,0XCF,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFE,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0X00,0X00, +0X00,0X01,0X7F,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFD,0X80,0X00,0X00,0X03,0X1F,0XFF,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF8, +0X80,0X00,0X00,0X02,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X40,0X00,0X00,0X04,0X0F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X60,0X00,0X00,0X0C,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X20,0X00,0X00,0X08,0X07, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X30,0X00,0X00,0X10,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X10,0X00,0X00, +0X30,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X18,0X00,0X00,0X20,0X07,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X08, +0X00,0X00,0X60,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X04,0X00,0X00,0X40,0X07,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X06,0X00,0X00,0X80,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X02,0X00,0X01,0X80,0X07,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X03,0X00,0X01,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X01,0X00,0X02,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF0,0X01,0X80,0X06,0X00,0X07,0XFF,0XFF,0XFF,0XFC,0X00,0X00, +0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X80, +0X04,0X00,0X07,0XFF,0XFF,0XFF,0XF0,0X00,0X38,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X40,0X08,0X00,0X07,0XFF,0XFF,0XFF,0XE0, +0X00,0XFE,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0, +0X00,0X40,0X08,0X00,0X07,0XFF,0XFF,0XFF,0XC0,0X03,0XFF,0X80,0X00,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X20,0X10,0X00,0X07,0XFF,0XFF, +0XFF,0X80,0X0F,0XFF,0XF8,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X00,0X30,0X30,0X00,0X07,0XFF,0XFF,0XFF,0X00,0X3F,0XFF,0XFC,0X00,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X10,0X20,0X00,0X07, +0XFF,0XFF,0XFE,0X00,0XFF,0XE7,0XFE,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X00,0X18,0X40,0X00,0X07,0XFF,0XFF,0XFC,0X01,0XFF,0X81,0XFF, +0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X08,0XC0, +0X00,0X07,0XFF,0XFF,0XFC,0X01,0XFF,0X00,0X7F,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X04,0X80,0X00,0X07,0XFF,0XFF,0XF8,0X01,0XFF, +0XC0,0X7F,0X80,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00, +0X05,0X00,0X00,0X07,0XFF,0XFF,0XF8,0X00,0XFF,0XF8,0X00,0X00,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X03,0X00,0X00,0X07,0XFF,0XFF,0XF0, +0X00,0X1F,0XFE,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X00,0X03,0X00,0X00,0X07,0XFF,0XFF,0XF0,0X00,0X07,0XFF,0X80,0X00,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X01,0X00,0X00,0X07,0XFF, +0XFF,0XF1,0XFF,0X81,0XFF,0X80,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X00,0X01,0X80,0X00,0X07,0XFF,0XFF,0XE0,0XFF,0X00,0X7F,0X80,0X00, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X47,0X80,0X80,0X00, +0X07,0XFF,0XFF,0XE0,0X7F,0XC1,0X3F,0X80,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF0,0X4F,0XC0,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X3F,0XF9,0X4F, +0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X4C,0X40, +0X40,0X00,0X07,0XFF,0XFF,0XE0,0X1F,0XFE,0X78,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X64,0XC0,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X0F, +0XFF,0X80,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0, +0X7F,0XC0,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X05,0XFF,0XF0,0X00,0X00,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X1F,0X00,0XC0,0X00,0X07,0XFF,0XFF, +0XE0,0X00,0X3F,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X00,0X00,0X80,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X0F,0XFF,0X00,0X00,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X01,0X00,0X00,0X07, +0XFF,0XFF,0XE0,0X00,0X03,0XFF,0X80,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X00,0X01,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X07,0XFF,0X80, +0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X02,0X00, +0X00,0X07,0XFF,0XFF,0XE0,0X00,0X3F,0XFF,0X00,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X06,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0XFF, +0XFC,0X00,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00, +0X05,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFF,0XE0,0X00,0X01,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X0D,0X80,0X00,0X07,0XFF,0XFF,0XE0, +0X01,0XFF,0X00,0X00,0X03,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X00,0X08,0X80,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFF,0X80,0X00,0X03,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X10,0X40,0X00,0X07,0XFF, +0XFF,0XE0,0X00,0XFF,0XF0,0X00,0X03,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X00,0X10,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X1F,0XFE,0X00,0X07, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X20,0X20,0X00, +0X07,0XFF,0XFF,0XE0,0X00,0X03,0XFF,0X80,0X07,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X60,0X30,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X07,0XFF, +0X80,0X0F,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X40, +0X10,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X3F,0XFF,0X80,0X1F,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0XC0,0X08,0X00,0X07,0XFF,0XFF,0XE0,0X01, +0XFF,0XFF,0X00,0X1F,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0, +0X00,0X80,0X0C,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFF,0XF8,0X00,0X3F,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X01,0X80,0X04,0X00,0X07,0XFF,0XFF, +0XE0,0X01,0XFF,0XE0,0X00,0X7F,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X01,0X00,0X02,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFE,0X00,0X00,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X02,0X00,0X03,0X00,0X07, +0XFF,0XFF,0XE0,0X01,0XF0,0X00,0X03,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X06,0X00,0X01,0X00,0X07,0XFF,0XFF,0XE0,0X01,0X80,0X00,0X07, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X04,0X00,0X01, +0X80,0X07,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X1F,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X0C,0X00,0X00,0X80,0X07,0XFF,0XFF,0XE0,0X00,0X00, +0X00,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X08, +0X00,0X00,0X40,0X07,0XFF,0XFF,0XE0,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X18,0X00,0X00,0X60,0X07,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X10,0X00,0X00,0X20,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X20,0X00,0X00,0X10,0X07,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X60,0X00,0X00,0X18,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X40,0X00,0X00,0X08, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF8,0XC0,0X00,0X00,0X04,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF8,0X80,0X00, +0X00,0X04,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0X00,0X00,0X00,0X02,0X3F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +}; diff --git a/Display_code/epd1in54_V2/imagedata.h b/Display_code/epd1in54_V2/imagedata.h new file mode 100644 index 0000000..2234ead --- /dev/null +++ b/Display_code/epd1in54_V2/imagedata.h @@ -0,0 +1,30 @@ +/** + * @filename : imagedata.h + * @brief : head file for imagedata.cpp + * + * Copyright (C) Waveshare September 5 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +extern const unsigned char IMAGE_DATA[]; + +/* FILE END */ + + diff --git a/Display_code/epd1in54_V2/original.ino b/Display_code/epd1in54_V2/original.ino new file mode 100644 index 0000000..6627719 --- /dev/null +++ b/Display_code/epd1in54_V2/original.ino @@ -0,0 +1,92 @@ +/* +#include +#include "epd1in54_V2.h" +#include "imagedata.h" +#include "epdpaint.h" +#include + +Epd epd; +unsigned char image[1024]; +Paint paint(image, 0, 0); + +unsigned long time_start_ms; +unsigned long time_now_s; +#define COLORED 0 +#define UNCOLORED 1 + +void setup() +{ + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println("e-Paper init and clear"); + epd.LDirInit(); + epd.Clear(); + + paint.SetWidth(200); + paint.SetHeight(24); + + Serial.println("e-Paper paint"); + paint.Clear(COLORED); + paint.DrawStringAt(30, 4, "Hello world!", &Font16, UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), 0, 10, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawStringAt(30, 4, "e-Paper Demo", &Font16, COLORED); + epd.SetFrameMemory(paint.GetImage(), 0, 30, paint.GetWidth(), paint.GetHeight()); + + paint.SetWidth(64); + paint.SetHeight(64); + + paint.Clear(UNCOLORED); + paint.DrawRectangle(0, 0, 40, 50, COLORED); + paint.DrawLine(0, 0, 40, 50, COLORED); + paint.DrawLine(40, 0, 0, 50, COLORED); + epd.SetFrameMemory(paint.GetImage(), 16, 60, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawCircle(32, 32, 30, COLORED); + epd.SetFrameMemory(paint.GetImage(), 120, 60, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawFilledRectangle(0, 0, 40, 50, COLORED); + epd.SetFrameMemory(paint.GetImage(), 16, 130, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawFilledCircle(32, 32, 30, COLORED); + epd.SetFrameMemory(paint.GetImage(), 120, 130, paint.GetWidth(), paint.GetHeight()); + epd.DisplayFrame(); + delay(2000); + + Serial.println("e-Paper show pic"); + epd.HDirInit(); + // epd.Display(IMAGE_DATA); + + //Part display + epd.HDirInit(); + epd.DisplayPartBaseImage(IMAGE_DATA); + + paint.SetWidth(50); + paint.SetHeight(60); + paint.Clear(UNCOLORED); + + char i = 0; + char str[10][10] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; + for (i = 0; i < 10; i++) { + paint.Clear(UNCOLORED); + paint.DrawStringAt(10, 10, str[i], &Font24, COLORED); + epd.SetFrameMemoryPartial(paint.GetImage(), 80, 70, paint.GetWidth(), paint.GetHeight()); + epd.DisplayPartFrame(); + delay(100); + } + + Serial.println("e-Paper clear and goto sleep"); + epd.HDirInit(); + epd.Clear(); + epd.Sleep(); +} + +void loop() +{ + +} +*/ \ No newline at end of file diff --git a/Display_code/epd1in54_V2/testing.ino b/Display_code/epd1in54_V2/testing.ino new file mode 100644 index 0000000..6dbf815 --- /dev/null +++ b/Display_code/epd1in54_V2/testing.ino @@ -0,0 +1,530 @@ +/* +#include +#include "epd1in54_V2.h" +#include "imagedata.h" +#include "epdpaint.h" +#include + +Epd epd; +unsigned char image[1024]; +Paint paint(image, 0, 0); + +unsigned long time_start_ms; +unsigned long time_now_s; +#define COLORED 0 +#define UNCOLORED 1 + +const unsigned char wifilogo[] PROGMEM = { +// 'imresizer-1702234655501', 35x35px +0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, +0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, +0xff, 0xff, 0xe0, 0xff, 0xf0, 0x01, 0xff, 0xe0, 0xff, 0x80, 0x00, 0x3f, 0xe0, 0xfe, 0x00, 0x00, +0x0f, 0xe0, 0xf8, 0x0f, 0xfe, 0x03, 0xe0, 0xf0, 0x7f, 0xff, 0xc1, 0xe0, 0xe0, 0xff, 0xff, 0xe0, +0xe0, 0xe3, 0xf0, 0x01, 0xf8, 0xe0, 0xf7, 0xc0, 0x00, 0x7d, 0xe0, 0xff, 0x80, 0x60, 0x3f, 0xe0, +0xfe, 0x07, 0xfe, 0x0f, 0xe0, 0xfe, 0x1f, 0xff, 0x0f, 0xe0, 0xfe, 0x7f, 0xff, 0xcf, 0xe0, 0xff, +0xf8, 0x03, 0xff, 0xe0, 0xff, 0xf0, 0x01, 0xff, 0xe0, 0xff, 0xe0, 0xe0, 0xff, 0xe0, 0xff, 0xe3, +0xf8, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0x1f, +0xff, 0xe0, 0xff, 0xfe, 0x0f, 0xff, 0xe0, 0xff, 0xfe, 0x0f, 0xff, 0xe0, 0xff, 0xff, 0x1f, 0xff, +0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, +0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xe0 +}; + +const unsigned char thankyoulogo[] PROGMEM = { +// 'imresizer-1702236559618', 200x200px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, +0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3e, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3c, 0x78, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xbf, 0xf3, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1f, 0xbf, 0xf0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x79, 0x7f, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xf0, +0x30, 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0xe0, 0x30, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, +0x8f, 0xc3, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x78, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x10, 0x90, 0x00, 0x00, 0x06, 0x78, 0x5f, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x01, 0x01, 0xff, 0xff, 0xe3, 0xf0, +0x60, 0x00, 0x00, 0x06, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x89, 0x05, 0x61, 0xff, 0xff, 0xe1, 0xe0, 0x30, 0x00, 0x00, 0x02, 0x78, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x05, 0x61, 0xff, 0xff, +0xe0, 0xc3, 0xf0, 0x00, 0x00, 0x06, 0x78, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xff, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x78, +0x6f, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0xff, 0xff, 0xe3, 0xf0, 0x10, 0x00, 0x00, 0x06, 0x20, 0x5b, 0x04, 0x20, 0xa0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, +0x06, 0x00, 0x5b, 0x04, 0x20, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x06, 0x00, 0x7f, 0x0a, 0xa2, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0f, 0xff, 0xe3, 0xe3, 0xf0, +0x00, 0x00, 0x07, 0x30, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x28, 0x0f, 0xff, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x07, 0x78, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xc0, 0xc2, 0x06, 0x28, 0x1f, 0xff, 0xe0, +0xc0, 0x10, 0x02, 0x30, 0xa2, 0x78, 0x3e, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x71, 0x51, 0x81, 0x66, 0x1c, 0x20, 0x1f, 0xff, 0xe1, 0x80, 0xf0, 0x92, 0x2a, 0x26, 0x79, 0x7f, +0x2a, 0xa9, 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x82, 0x42, 0x44, 0x12, 0x20, 0x3f, +0xff, 0xe3, 0xf0, 0x00, 0x92, 0x21, 0x24, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0xbb, 0x84, 0xc6, 0x04, 0x26, 0x1c, 0x3f, 0xff, 0xe3, 0xe0, 0xb0, 0x0a, 0x30, 0xa6, +0x78, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7f, 0x0c, 0xc4, 0x08, 0x66, +0x30, 0x38, 0x70, 0x60, 0x00, 0x00, 0x4a, 0x28, 0xa6, 0x31, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x53, 0x09, 0x84, 0x08, 0x5c, 0x30, 0x38, 0x70, 0x60, 0x30, 0x01, 0x4a, +0x28, 0x26, 0xf9, 0x7f, 0x00, 0x04, 0x48, 0x41, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xb3, 0x0e, 0x8c, +0x18, 0xf4, 0x50, 0x3f, 0xbf, 0xf0, 0xe1, 0xf0, 0x00, 0x00, 0x02, 0xf8, 0x3e, 0x38, 0x04, 0x40, +0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x32, 0x08, 0xd7, 0xef, 0xc6, 0xf0, 0x3f, 0xbf, 0xf3, 0xe0, +0x00, 0x00, 0x00, 0x06, 0x08, 0x01, 0x00, 0x04, 0xf0, 0x51, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x60, 0x00, 0x03, 0x00, 0x1f, 0xbf, 0xf3, 0xe0, 0x00, 0x00, 0x00, 0x36, 0x78, 0x6f, 0x1e, +0x24, 0x14, 0x62, 0x20, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, +0xe1, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x70, 0x7f, 0x25, 0x04, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, +0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0xe0, 0x72, 0x0c, 0x31, 0xc3, 0x20, 0x78, +0x3c, 0x09, 0x04, 0x91, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, +0x07, 0x8f, 0xc0, 0x02, 0xfc, 0x79, 0xc7, 0xa0, 0x79, 0xff, 0x19, 0x08, 0x91, 0x00, 0x40, 0x00, +0x00, 0x00, 0x01, 0x40, 0x31, 0x21, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x01, 0xc3, 0xe4, 0xca, 0x8c, +0xa0, 0x39, 0xff, 0x02, 0x11, 0x60, 0xb0, 0x80, 0x00, 0x00, 0x00, 0x03, 0x40, 0x20, 0x90, 0x1c, +0x01, 0x00, 0x3f, 0x00, 0x03, 0xe3, 0x24, 0xfa, 0x88, 0x20, 0x79, 0xff, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x30, 0xc0, 0x00, 0x11, 0x00, 0x3f, 0xf8, 0x02, 0x22, 0x64, +0xf2, 0x98, 0x64, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x30, +0x00, 0x00, 0x1f, 0xe0, 0x1f, 0xff, 0xe2, 0x32, 0x65, 0xc4, 0x98, 0x64, 0x78, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x30, 0x00, 0x00, 0x03, 0xe0, 0x3f, 0xff, 0xe3, +0xf2, 0x67, 0x7c, 0xe7, 0xb8, 0x01, 0x9b, 0x35, 0x54, 0xb0, 0xcc, 0xcd, 0x48, 0x00, 0x00, 0x03, +0x00, 0x31, 0xc0, 0xfc, 0x01, 0x00, 0x1f, 0xff, 0xe3, 0xf2, 0x00, 0x30, 0x43, 0x10, 0xf8, 0x22, +0x04, 0x64, 0x88, 0x82, 0x95, 0x78, 0x00, 0x00, 0x02, 0x00, 0x17, 0x07, 0xc6, 0x13, 0x00, 0x07, +0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x31, 0x26, 0x64, 0xb0, 0xc2, 0xdd, 0x48, 0x00, +0x00, 0x00, 0x00, 0x1c, 0x04, 0x02, 0x32, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x78, 0x20, 0x85, 0x50, 0x80, 0x92, 0x95, 0x48, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x32, +0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1b, 0x30, 0x43, 0x00, 0xc8, 0xc0, +0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x01, 0x1f, 0xe6, 0x1f, 0xff, 0xe3, 0xc6, 0x0c, 0x78, +0xc0, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x03, 0x02, 0x02, 0x3f, 0xff, 0xe3, 0xc4, 0x0c, 0x78, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x02, 0x3f, 0xff, 0xe0, 0x1f, +0x8c, 0x01, 0xf0, 0x80, 0x78, 0x27, 0x28, 0xeb, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x02, 0x02, 0x03, 0x1f, 0xff, 0x05, 0x89, 0x8c, 0xb5, 0x30, 0x80, 0xf9, 0xd5, 0x5a, +0x2b, 0xe4, 0x2a, 0x1a, 0x04, 0x50, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x02, 0x02, 0x1f, 0x80, +0x07, 0xd9, 0x0c, 0xfd, 0x10, 0x80, 0x78, 0xa9, 0x2b, 0xeb, 0xe0, 0x03, 0x51, 0x10, 0x80, 0x00, +0x00, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x02, 0x10, 0x00, 0x00, 0x0f, 0xbc, 0x01, 0xf5, 0xc0, 0x78, +0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x40, 0x38, 0x01, 0x8e, +0x00, 0x00, 0x00, 0x1f, 0xfe, 0x01, 0xff, 0xc0, 0x78, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0xe0, 0x00, 0xfc, 0x1f, 0xff, 0xe3, 0xd9, 0x8c, 0x79, 0x10, +0x8f, 0xf8, 0xfe, 0x3f, 0xf1, 0xef, 0x8f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1f, 0xff, 0xe0, 0x19, 0x0c, 0x01, 0x30, 0x8f, 0xf9, 0xff, 0x3f, 0xf1, 0xef, 0x9f, +0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x0f, 0xac, +0x01, 0xf4, 0x9f, 0xf9, 0xff, 0x3f, 0xf9, 0xef, 0xbf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe3, 0xc9, 0xac, 0x79, 0x14, 0x9f, 0xf9, 0xef, 0xbf, 0xf9, +0xef, 0xbe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, +0x19, 0xac, 0x01, 0x34, 0x9f, 0x79, 0xe7, 0x9e, 0xf9, 0xff, 0x3c, 0xf0, 0x00, 0x00, 0x08, 0x1f, +0x0f, 0x07, 0x01, 0x07, 0xe1, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, 0xac, 0x01, 0xf4, 0x9e, 0x78, 0x1f, +0x9e, 0xf9, 0xfe, 0x3f, 0xf0, 0x00, 0x00, 0x18, 0x1f, 0x0f, 0x1f, 0x81, 0x87, 0xe3, 0xf0, 0x18, +0x00, 0x03, 0xdf, 0x2c, 0x7b, 0xf6, 0x9e, 0x78, 0xff, 0x9e, 0x79, 0xfe, 0x3f, 0xf0, 0x00, 0x00, +0x1c, 0x19, 0x86, 0x19, 0xc1, 0x81, 0x87, 0x30, 0x1c, 0x00, 0x02, 0x43, 0xac, 0x48, 0x72, 0x9e, +0x79, 0xff, 0x9e, 0x79, 0xfe, 0x3f, 0xf0, 0x00, 0x00, 0x1c, 0x19, 0x86, 0x18, 0x03, 0xc1, 0x86, +0x19, 0xff, 0xff, 0xe2, 0x47, 0x8c, 0x48, 0xd0, 0x9e, 0x79, 0xff, 0x9e, 0xf9, 0xff, 0x3c, 0x00, +0x00, 0x00, 0x34, 0x1f, 0x86, 0x1b, 0xc3, 0xc1, 0x86, 0x19, 0xff, 0xff, 0xe2, 0x4d, 0x8c, 0x49, +0x90, 0x9f, 0x79, 0xef, 0x9e, 0xf9, 0xef, 0x3c, 0xf0, 0x00, 0x00, 0x36, 0x1f, 0x06, 0x1b, 0xc6, +0xc1, 0x86, 0x19, 0xff, 0xff, 0xe2, 0x59, 0x8c, 0x4b, 0x10, 0x9f, 0xf9, 0xff, 0xbe, 0x7b, 0xef, +0xbe, 0xf0, 0x00, 0x00, 0x7e, 0x1b, 0x06, 0x18, 0xc7, 0xe1, 0x87, 0x31, 0xff, 0xff, 0xe2, 0x71, +0x0c, 0x4e, 0x10, 0x9f, 0xfd, 0xff, 0xbe, 0x7b, 0xff, 0xbf, 0xf0, 0x00, 0x00, 0x7f, 0x1b, 0x8f, +0x1f, 0x87, 0xe1, 0x83, 0xf1, 0xff, 0xff, 0xe3, 0xc1, 0x8c, 0x78, 0x31, 0x8f, 0xfd, 0xff, 0xbe, +0x7b, 0xf7, 0x9f, 0xf0, 0x00, 0x00, 0x63, 0x19, 0x8f, 0x0f, 0x0c, 0x21, 0x81, 0xe1, 0xff, 0xff, +0xe2, 0x07, 0x38, 0x40, 0xe7, 0x0f, 0xfc, 0xf7, 0xbe, 0x7b, 0xe7, 0x8f, 0xc0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, +0x7e, 0x7f, 0x07, 0xfe, 0x07, 0xc3, 0xf3, 0xf0, 0xfc, 0x0f, 0x03, 0xc0, 0xfe, 0x07, 0xe3, 0xb1, +0xa0, 0x00, 0x40, 0x00, 0xba, 0x8a, 0xa9, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, +0xf9, 0xfc, 0x0f, 0xc7, 0xe3, 0xff, 0x87, 0xf3, 0xf9, 0xb6, 0xb6, 0xdb, 0x04, 0x80, 0x88, 0xb1, +0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xe7, 0xff, 0xc7, +0xf3, 0xf9, 0xb6, 0xb6, 0x5b, 0x00, 0x02, 0x90, 0x99, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, +0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xe7, 0xff, 0xc7, 0xf3, 0xf1, 0xb6, 0xb6, 0xdb, 0x00, 0x12, +0xa2, 0xa1, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xcf, +0xff, 0xc7, 0xf3, 0xf9, 0xb6, 0xb7, 0xfb, 0x03, 0xb2, 0xab, 0x11, 0xff, 0xfc, 0xfe, 0x7f, 0x07, +0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf8, 0x07, 0xcf, 0xcf, 0xef, 0xe7, 0xf3, 0xf0, 0x00, 0x05, 0x10, +0x04, 0x80, 0x00, 0x01, 0xff, 0xfc, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf0, 0x07, +0xef, 0xcf, 0xcf, 0xe7, 0xf3, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, +0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf0, 0x07, 0xef, 0xcf, 0xcf, 0xe7, 0xf3, 0xf8, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, +0xf0, 0x07, 0xef, 0xcf, 0xc7, 0xe7, 0xf3, 0xf9, 0xf9, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1f, +0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xfb, 0xf3, 0xff, 0xe0, 0x03, 0xef, 0x8f, 0xc7, 0xe7, 0xf3, +0xf8, 0x61, 0x84, 0x80, 0x00, 0x00, 0x01, 0x10, 0x9f, 0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xfb, +0xf3, 0xff, 0xe0, 0x03, 0xef, 0x8f, 0xcf, 0xe7, 0xf3, 0xf0, 0x41, 0x84, 0x80, 0x00, 0x00, 0x00, +0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x0f, 0xdf, 0x07, 0xfb, 0xf3, 0xff, 0xe0, 0x03, 0xff, 0x8f, 0xcf, +0xe7, 0xf3, 0xf8, 0x42, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0xdf, +0x07, 0xff, 0xf3, 0xff, 0xe0, 0x03, 0xff, 0x8f, 0xc7, 0xe7, 0xf3, 0xf0, 0x42, 0x46, 0x00, 0x00, +0x40, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0xdf, 0x87, 0xff, 0xf3, 0xff, 0xc0, 0x01, 0xff, +0x0f, 0xc7, 0xe7, 0xf3, 0xf8, 0x42, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, +0x0f, 0xdf, 0x87, 0xff, 0xf3, 0xff, 0xc0, 0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x43, 0xc6, +0x00, 0x00, 0x04, 0x00, 0x20, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xc0, +0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x67, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1f, 0xc0, +0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xe0, 0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, +0x44, 0x25, 0x00, 0x00, 0x00, 0x00, 0x24, 0x1f, 0xc0, 0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, +0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x44, 0x24, 0x80, 0x00, 0x40, 0x20, 0x04, +0x1f, 0xc0, 0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, +0xf3, 0xf8, 0x4c, 0x14, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0x9f, 0x87, +0xff, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x68, 0x14, 0x40, 0x00, 0x00, +0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0x9f, 0x87, 0xdf, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, +0xcf, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, +0xff, 0x87, 0xdf, 0xf3, 0xff, 0xf0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0xff, 0xc7, 0xdf, 0xf3, 0xff, 0xf0, 0x00, +0xfe, 0x0f, 0xc7, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, +0x7f, 0x1f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, 0xf0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf0, 0x22, +0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, +0xf8, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf0, 0x24, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1f, +0xc0, 0xfe, 0x7f, 0x3f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, +0xf0, 0x20, 0x00, 0x70, 0x38, 0x00, 0x00, 0x05, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x9f, 0xc7, 0xcf, +0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xef, 0xe7, 0xf3, 0xf0, 0x2c, 0xfc, 0xa0, 0x02, 0x22, 0x24, +0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xc7, 0xc7, 0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xff, +0xe7, 0xff, 0xf0, 0x30, 0x84, 0x20, 0x12, 0x26, 0x24, 0x20, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, +0xc7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, 0x07, 0xff, 0xc3, 0xff, 0xf0, 0x40, 0x04, 0xf0, 0x02, +0x24, 0x04, 0x20, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xe7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, +0x07, 0xff, 0xc3, 0xff, 0xe0, 0x80, 0x04, 0x42, 0x02, 0x24, 0x04, 0x44, 0x1f, 0xc0, 0xfe, 0x7f, +0x3f, 0x8f, 0xe7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, 0x03, 0xff, 0x81, 0xff, 0xe0, 0x80, 0x04, +0x02, 0x03, 0xe1, 0x14, 0xc2, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xe7, 0xc3, 0xf3, 0xf9, 0xfc, +0x00, 0xfe, 0x01, 0xff, 0x00, 0xff, 0xc0, 0x80, 0x18, 0x22, 0x12, 0x21, 0x04, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1e, 0x00, +0x7c, 0x20, 0x1c, 0x02, 0x2f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x28, 0x0c, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x80, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x02, 0x20, +0x04, 0x01, 0x1f, 0xf8, 0x60, 0x10, 0x67, 0xfc, 0x00, 0x07, 0x80, 0x03, 0xe6, 0x84, 0x22, 0x85, +0x51, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x60, 0x30, 0xc7, +0xfc, 0x00, 0x07, 0x80, 0x03, 0xe6, 0x94, 0xa2, 0xb5, 0x53, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x70, 0x30, 0x87, 0xfc, 0x00, 0x07, 0x80, 0x03, 0xe0, 0x00, +0x02, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xf0, +0x31, 0x82, 0x60, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xd0, 0x33, 0x03, 0xfc, 0x3e, 0xf7, 0x87, 0xe3, +0xe3, 0xf1, 0xe7, 0x00, 0x3d, 0xe1, 0xf0, 0xf7, 0x8f, 0xbc, 0x00, 0x01, 0x94, 0x28, 0x91, 0x91, +0x80, 0x90, 0x33, 0x03, 0xfc, 0x7e, 0xf7, 0x8f, 0xf3, 0xe7, 0xf9, 0xff, 0x80, 0x3f, 0xe7, 0xfc, +0xff, 0xcf, 0xbe, 0x00, 0x02, 0x14, 0x20, 0x09, 0x09, 0x80, 0x98, 0x36, 0x01, 0xdc, 0x7e, 0xf7, +0x9f, 0xfb, 0xef, 0xfd, 0xff, 0x80, 0x7f, 0xe7, 0xfc, 0xff, 0xcf, 0xbe, 0x00, 0x00, 0x14, 0x28, +0xf1, 0x09, 0x81, 0x88, 0x3c, 0x00, 0x00, 0x3c, 0xf7, 0xde, 0xfb, 0xef, 0x3d, 0xff, 0xc0, 0x7f, +0xe7, 0xbc, 0xff, 0xcf, 0xfc, 0x00, 0x04, 0x14, 0x21, 0x0d, 0x09, 0x81, 0x08, 0x38, 0x03, 0xfc, +0x3c, 0xf7, 0x9e, 0x7b, 0xef, 0x3c, 0xf7, 0xc0, 0x79, 0xe7, 0xbe, 0xfb, 0xcf, 0xfc, 0x00, 0x04, +0x14, 0x20, 0x05, 0x09, 0x81, 0x0c, 0x38, 0x07, 0xfe, 0x3e, 0xe7, 0x9f, 0xfb, 0xef, 0xfc, 0xf7, +0xc0, 0x79, 0xe0, 0x7e, 0xfb, 0xcf, 0xf8, 0x00, 0x04, 0x14, 0x22, 0x05, 0x09, 0x83, 0x0c, 0x38, +0x07, 0xfc, 0x1e, 0xe7, 0x9f, 0xfb, 0xef, 0xfc, 0xf7, 0xc0, 0x79, 0xe1, 0xfe, 0x7b, 0xcf, 0xf8, +0x00, 0x04, 0x14, 0x2a, 0x05, 0x09, 0x83, 0xfc, 0x3c, 0x02, 0x04, 0x1f, 0xe7, 0x9f, 0xfb, 0xef, +0xfc, 0xf7, 0xc0, 0x79, 0xe7, 0xfe, 0xfb, 0xcf, 0xf8, 0x00, 0x04, 0x14, 0x28, 0x05, 0x09, 0x82, +0x06, 0x36, 0x07, 0xff, 0x1f, 0xe7, 0x9e, 0x03, 0xef, 0x00, 0xf7, 0xc0, 0x79, 0xe7, 0xbc, 0x7b, +0xcf, 0xf8, 0x00, 0x00, 0x14, 0x20, 0x05, 0x09, 0x86, 0x06, 0x36, 0x07, 0xff, 0x1f, 0xc7, 0x9e, +0x7b, 0xef, 0x3c, 0xf7, 0xc0, 0x79, 0xef, 0xbe, 0x7b, 0xcf, 0xfc, 0x00, 0x02, 0x12, 0x29, 0x0d, +0x09, 0x86, 0x06, 0x33, 0x03, 0xfe, 0x0f, 0xc7, 0xde, 0xfb, 0xef, 0x3d, 0xf7, 0xc0, 0x7f, 0xef, +0xfe, 0xfb, 0xef, 0xbc, 0x00, 0x00, 0xf1, 0xa8, 0xf5, 0x09, 0x84, 0x02, 0x31, 0x80, 0x00, 0x0f, +0xc7, 0xdf, 0xfb, 0xef, 0xfd, 0xf7, 0xc0, 0x7f, 0xff, 0xfe, 0xfb, 0xef, 0xbe, 0x00, 0x00, 0x10, +0x08, 0x00, 0x01, 0x84, 0x03, 0x31, 0x83, 0xfc, 0x0f, 0xc7, 0xcf, 0xfb, 0xe7, 0xfd, 0xf7, 0xc0, +0x3f, 0xf7, 0xfe, 0xfb, 0xef, 0x9e, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x8c, 0x03, 0x30, 0xc3, +0xfc, 0x0f, 0x87, 0xc7, 0xe3, 0xe3, 0xf1, 0xf3, 0xc0, 0x3d, 0xe3, 0xfe, 0xfb, 0xef, 0x9e, 0x00, +0x00, 0x10, 0x10, 0x00, 0x01, 0x8c, 0x01, 0x30, 0x67, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x88, 0x01, +0x10, 0x66, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, +0x00, 0x00, 0x00, 0x03, 0xbc, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x40, 0x00, 0x01, 0x98, 0x0e, 0x70, +0x0c, 0x00, 0x00, 0x40, 0x02, 0x00, 0x3f, 0x20, 0x12, 0x58, 0x48, 0x89, 0x82, 0x00, 0x81, 0x40, +0x01, 0x81, 0x11, 0x54, 0x00, 0xc0, 0x0f, 0x08, 0x70, 0x1c, 0x0e, 0x00, 0xc0, 0x00, 0x00, 0x3f, +0x32, 0x1a, 0x7a, 0x49, 0xab, 0xce, 0x00, 0x21, 0x05, 0x1f, 0x82, 0x00, 0xc0, 0x00, 0xc7, 0xff, +0x10, 0xbc, 0x30, 0x0a, 0x31, 0x80, 0x00, 0x20, 0x7f, 0x36, 0x92, 0x32, 0x4f, 0xa0, 0x48, 0x00, +0x01, 0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x11, 0x9c, 0x30, 0x06, 0x31, 0x80, 0x00, +0x20, 0x3f, 0x3e, 0x9a, 0x32, 0x6f, 0xa2, 0x58, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, +0x07, 0xfc, 0x31, 0x8c, 0x66, 0x26, 0x33, 0x04, 0x00, 0x00, 0x1e, 0x2a, 0x1a, 0x32, 0x4e, 0xa3, +0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfc, 0x07, 0x0c, 0x33, 0x8c, 0x66, 0x2e, 0x33, +0xc4, 0x00, 0x00, 0x00, 0x22, 0x82, 0x12, 0x48, 0xb9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0x8c, +0xfd, 0xcc, 0xc3, 0xfc, 0x31, 0x8c, 0x6e, 0x5f, 0x35, 0x80, 0x00, 0x00, 0xbf, 0x22, 0x92, 0x32, +0x48, 0xb8, 0xd0, 0x00, 0x00, 0x03, 0x9d, 0x99, 0xdc, 0xcf, 0xc0, 0xc7, 0xfc, 0x3d, 0x8c, 0xee, +0x43, 0x39, 0x88, 0x00, 0x00, 0xbf, 0x22, 0x9a, 0x32, 0x58, 0xa2, 0x50, 0x00, 0x00, 0x03, 0x9f, +0x9b, 0xfd, 0xc6, 0xc0, 0xc0, 0x7f, 0x39, 0x8c, 0xfe, 0x41, 0xb1, 0xf0, 0x00, 0x00, 0xe1, 0x22, +0x52, 0x32, 0x58, 0xa2, 0x58, 0x00, 0x00, 0x03, 0x87, 0x1f, 0xfd, 0x86, 0xe0, 0xc0, 0x0f, 0x01, +0x8d, 0x33, 0xc1, 0xb0, 0x60, 0x00, 0x00, 0xff, 0x22, 0x10, 0x30, 0x58, 0xa3, 0x4e, 0x00, 0x00, +0x03, 0x86, 0x1f, 0xfd, 0xbe, 0x78, 0xc0, 0x00, 0x01, 0x8d, 0x03, 0x80, 0x80, 0x00, 0x00, 0x00, +0x7e, 0x22, 0x62, 0x91, 0x88, 0xb9, 0xc6, 0x00, 0x00, 0x02, 0x9f, 0x9e, 0xed, 0xfe, 0x3c, 0xc3, +0xfc, 0x01, 0x8e, 0x01, 0x00, 0x88, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0x9f, 0x9c, 0xed, 0xf0, 0x0c, 0xc3, 0xfc, 0x01, 0x84, 0x00, 0x00, 0xbc, 0x08, +0x18, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x1c, 0xed, 0x80, +0x8e, 0xc7, 0xfe, 0x01, 0xf8, 0x00, 0x00, 0xbd, 0xdc, 0xc9, 0x9c, 0x3f, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0x9c, 0xcd, 0xc4, 0xce, 0xc6, 0x06, 0x01, 0x8b, 0xaa, 0x80, +0xb5, 0xfd, 0xfb, 0xdc, 0x1c, 0x06, 0x06, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x88, +0xcc, 0xfc, 0xfe, 0xc7, 0xfc, 0x03, 0x89, 0x6f, 0x00, 0xb1, 0xf5, 0xeb, 0xd4, 0x0f, 0x0f, 0xc0, +0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x44, 0x78, 0x7c, 0x83, 0xfc, 0x04, 0x81, +0x6b, 0x21, 0x3d, 0x9d, 0x9b, 0xd8, 0x3f, 0x14, 0x80, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x86, 0x00, 0x00, 0x00, 0x30, 0x01, 0xf8, 0x0c, 0x81, 0x6b, 0x31, 0x35, 0xbd, 0xbb, 0x4e, 0x3f, +0x07, 0x04, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x09, 0x81, 0x6f, 0x23, 0x35, 0xb5, 0xbb, 0xd6, 0x00, 0x02, 0x82, 0xa4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0x9f, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x01, 0x4e, 0xa2, 0x3d, 0xbd, 0xfb, +0xdc, 0x37, 0x19, 0xe6, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9f, 0x80, 0x00, 0x00, 0x09, +0xe7, 0xfc, 0x0f, 0x00, 0x00, 0x1c, 0x10, 0x10, 0x00, 0x88, 0x23, 0x26, 0x20, 0xa4, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x08, 0x40, 0x87, 0xfc, 0x0e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7f, 0x08, 0x27, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, +0x08, 0x08, 0xe3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x45, 0x64, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x80, 0x01, 0x08, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x06, 0x1e, 0x01, 0x84, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, +0x00, 0x00, 0x40, 0x08, 0x23, 0xfc, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, +0x07, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9d, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xfc, 0x24, +0x48, 0x00, 0x08, 0x22, 0x23, 0x02, 0x06, 0x3f, 0x18, 0x04, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x8f, 0x00, 0x00, 0x00, 0x00, 0xe7, 0xfc, 0x24, 0x88, 0x44, 0x2a, 0x20, 0xa0, 0x0a, 0x0e, +0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, 0x06, +0x64, 0x26, 0x6c, 0xcc, 0x2c, 0x30, 0xb3, 0x14, 0x06, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0xe7, 0xfe, 0x24, 0x28, 0x40, 0xa8, 0x22, 0xa1, +0x10, 0x06, 0x3f, 0x30, 0x41, 0xde, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xe3, 0xbc, 0x06, 0x48, 0x00, 0x40, 0x12, 0x20, 0x00, 0x06, 0x36, 0x30, 0x82, 0x12, 0x94, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xe1, 0xbc, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xa2, 0x50, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x25, 0xa2, +0x52, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0xe7, 0xfc, 0x00, 0x00, +0x00, 0x00, 0x35, 0xd5, 0xd6, 0xa7, 0x3f, 0x25, 0x21, 0xcc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, +0x18, 0x80, 0x00, 0x00, 0x01, 0xe7, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xdb, 0xe6, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x27, 0xfc, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x90, 0x0e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x06, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x37, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0e, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfc, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +void setup() +{ + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println("e-Paper init and clear"); + epd.LDirInit(); //init in landscape mode? maybe low mode + epd.Clear(); //clear display + + //set drawing area? + paint.SetWidth(200); + paint.SetHeight(24); + + Serial.println("e-Paper paint"); + paint.Clear(COLORED); //flashes 0/black only on paint area + paint.DrawStringAt(30, 4, "Hello world!", &Font16, UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), 0, 10, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawStringAt(30, 4, "e-Paper Demo", &Font16, COLORED); + epd.SetFrameMemory(paint.GetImage(), 0, 30, paint.GetWidth(), paint.GetHeight()); + + paint.SetWidth(64); + paint.SetHeight(64); + + paint.Clear(UNCOLORED); + paint.DrawRectangle(0, 0, 40, 50, COLORED); + paint.DrawLine(0, 0, 40, 50, COLORED); + paint.DrawLine(40, 0, 0, 50, COLORED); + epd.SetFrameMemory(paint.GetImage(), 16, 60, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawCircle(32, 32, 30, COLORED); + epd.SetFrameMemory(paint.GetImage(), 120, 60, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawFilledRectangle(0, 0, 40, 50, COLORED); + epd.SetFrameMemory(paint.GetImage(), 16, 130, paint.GetWidth(), paint.GetHeight()); + + paint.Clear(UNCOLORED); + paint.DrawFilledCircle(32, 32, 30, COLORED); + epd.SetFrameMemory(paint.GetImage(), 120, 130, paint.GetWidth(), paint.GetHeight()); + epd.DisplayFrame(); + delay(2000); + + Serial.println("e-Paper show pic"); + epd.HDirInit(); + // epd.Display(IMAGE_DATA); + + //Part display + epd.HDirInit(); + epd.DisplayPartBaseImage(thankyoulogo); + //my code + epd.Clear(); //clear display + + paint.SetWidth(35); + paint.SetHeight(35); + + paint.Clear(COLORED); + + epd.DisplayPartBaseImage(thankyoulogo); + + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); + + epd.DisplayFrame(); + delay(100); + + //end my code + paint.SetWidth(50); + paint.SetHeight(60); + paint.Clear(UNCOLORED); + + char i = 0; + char str[10][10] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; + for (i = 0; i < 10; i++) { + paint.Clear(UNCOLORED); + paint.DrawStringAt(10, 10, str[i], &Font24, COLORED); + epd.SetFrameMemoryPartial(paint.GetImage(), 80, 70, paint.GetWidth(), paint.GetHeight()); + epd.DisplayPartFrame(); + delay(100); + } + + Serial.println("e-Paper clear and goto sleep"); + epd.HDirInit(); + epd.Clear(); + epd.Sleep(); +} + +void loop() +{ + +} + +void setup() { + Serial.begin(115200); + epd.LDirInit(); + epd.Clear(); // clears whole screen to white + paint.SetRotate(ROTATE_180); //rotate screen + + paint.SetWidth(100); + paint.SetHeight(8); + paint.Clear(COLORED); //paints the height and width the given colour + paint.DrawStringAt(30, 2, "smallest", &Font8, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 50, (150), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + paint.SetWidth(120); + paint.SetHeight(12); + paint.Clear(COLORED); //paints the height and width the given colour + paint.DrawStringAt(40, 2, "Smaller", &Font12, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 40, (136), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + paint.SetWidth(140); + paint.SetHeight(14); + paint.Clear(COLORED); //paints the height and width the given colour + paint.DrawStringAt(10, 2, "Hello world!", &Font16, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 30, (120), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + paint.SetWidth(160); + paint.SetHeight(18); + paint.Clear(COLORED); //paints the height and width the given colour + paint.DrawStringAt(40, 2, "BIGGER", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 20, (100), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + paint.SetWidth(180); + paint.SetHeight(20); + paint.Clear(COLORED); //paints the height and width the given colour + paint.DrawStringAt(30, 1, "BIGGEST!", &Font24, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 10, (78), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + epd.DisplayFrame(); +} + +void setup() { + Serial.begin(115200); + + epd.LDirInit(); + epd.Clear(); // clears whole screen to white + paint.SetRotate(ROTATE_180); //rotate screen + + paint.SetWidth(35); + paint.SetHeight(35); + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 40, (200-35), paint.GetWidth(), paint.GetHeight()); + + paint.SetWidth(35); + paint.SetHeight(35); + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, (200-35), paint.GetWidth(), paint.GetHeight()); + + paint.SetWidth(200); + paint.SetHeight(18); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(2, 2, "YES ABSTAIN NO", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + //paint.DrawStringAt(0, 2, "Yes Abstain No", &Font16, COLORED); + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + + epd.DisplayFrame(); +} + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + epd.LDirInit(); + paint.SetRotate(ROTATE_180); //rotate screen + epd.Clear(); + + paint.SetWidth(40); + paint.SetHeight(50); + + paint.Clear(COLORED); + paint.DrawHorizontalLine(0, 24, 50, UNCOLORED); //co-ordinates to start followed by length of line + paint.DrawHorizontalLine(0, 25, 50, UNCOLORED); + paint.DrawHorizontalLine(0, 26, 50, UNCOLORED); + + paint.DrawLine(40, 0, 0, 50, UNCOLORED); + paint.DrawLine(39, 0, 0, 49, UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), 16, 60, paint.GetWidth(), paint.GetHeight()); + + epd.DisplayFrame(); +} + +*/ \ No newline at end of file From df8f8ce6e4209941a72512676115777fc5b8f546 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Tue, 2 Jan 2024 19:23:13 +0200 Subject: [PATCH 04/36] still working on processing vote string --- Display_code/epd1in54_V2/epd1in54_V2.ino | 76 ++++++++++++++++++------ 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/Display_code/epd1in54_V2/epd1in54_V2.ino b/Display_code/epd1in54_V2/epd1in54_V2.ino index 2cbe063..0c50273 100644 --- a/Display_code/epd1in54_V2/epd1in54_V2.ino +++ b/Display_code/epd1in54_V2/epd1in54_V2.ino @@ -59,34 +59,76 @@ void drawImage(int x, int y, int width, int height, const unsigned char *image) bool question_mark(const char *question) { int question_len = strlen(question); - if (question[question_len-1] == '?') { + if (question_len > 0 && question[question_len - 1] == '?') { return true; } return false; } -void display_question(const char *question) { - paint.SetWidth(200); - paint.SetHeight(16); - - int position = 0; - if (!question_mark(question)) { - printf("ERROR: no question mark!"); - } - char string[16]; - strncpy(string, question, 15); +void process_string(const char *question, char *string, int *position) { + strncpy(string, question + *position, 15); string[15] = '\0'; - int string_len = strlen(string); + int string_len = 15; while (string[string_len] != ' ') { string_len--; } - if (string_len >= 0) { + int remainder = *position - string_len - 1; + *position -= remainder; + if (string_len > 0) { string[string_len] = '\0'; // Null-terminate at the space - postion = string_len; } +} + +void display_question(const char *question) { + char string[16]; + if (!question_mark(question)) { + printf("ERROR: no question mark!"); + return; + } + + paint.SetWidth(200); + paint.SetHeight(16); + + int position = 0; + int count = 0; + char buffer[20]; + process_string(question, string, &position); + sprintf(buffer, "%d", position); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + + count = 1; + process_string(question, string, &position); + sprintf(buffer, "%d", position); paint.Clear(UNCOLORED); //paints the height and width the given colour paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, 100, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + + count = 2; + process_string(question, string, &position); + paint.Clear(UNCOLORED); //paints the height and width the given colour + sprintf(buffer, "%d", position); + paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + + count = 3; + process_string(question, string, &position); + paint.Clear(UNCOLORED); //paints the height and width the given colour + sprintf(buffer, "%d", position); + paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + + /* + do { + process_string(question, string, &position); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + count++; + } while (strchr(string, '?') == NULL); + */ + } void setup() { @@ -142,7 +184,7 @@ void setup() { //paint.SetWidth(200); //paint.SetHeight(16); //paint.Clear(UNCOLORED); //paints the height and width the given colour - //paint.DrawStringAt(15, 2, question, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + //paint.DrawStringAt(15, 2, "How many", &Font16, COLORED); //moves text to co-ordinates with-in the set height and width //epd.SetFrameMemory(paint.GetImage(), 0, 100, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates //paint.Clear(UNCOLORED); //paint.DrawStringAt(15, 2, "characters can", &Font16, COLORED); @@ -151,7 +193,7 @@ void setup() { //paint.DrawStringAt(15, 2, "Epaper fit", &Font16, COLORED); //epd.SetFrameMemory(paint.GetImage(), 0, (100-16-16), paint.GetWidth(), paint.GetHeight()); //paint.Clear(UNCOLORED); - //paint.DrawStringAt(15, 2, "across? 13/14", &Font16, COLORED); + //paint.DrawStringAt(15, 2, "across?", &Font16, COLORED); //epd.SetFrameMemory(paint.GetImage(), 0, (100-16-16-16), paint.GetWidth(), paint.GetHeight()); epd.DisplayFrame(); From 5ed7a8e896229d8218305b599f2df7a3a46ca18c Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Wed, 3 Jan 2024 18:42:49 +0200 Subject: [PATCH 05/36] finished process_question and display_question function --- Display_code/epd1in54_V2/epd1in54_V2.ino | 160 +++++++++++------------ 1 file changed, 77 insertions(+), 83 deletions(-) diff --git a/Display_code/epd1in54_V2/epd1in54_V2.ino b/Display_code/epd1in54_V2/epd1in54_V2.ino index 0c50273..71c9b64 100644 --- a/Display_code/epd1in54_V2/epd1in54_V2.ino +++ b/Display_code/epd1in54_V2/epd1in54_V2.ino @@ -58,77 +58,79 @@ void drawImage(int x, int y, int width, int height, const unsigned char *image) } bool question_mark(const char *question) { - int question_len = strlen(question); - if (question_len > 0 && question[question_len - 1] == '?') { - return true; - } - return false; + int question_len = strlen(question); + if (question_len > 0 && question[question_len - 1] == '?') { + return true; + } + return false; } -void process_string(const char *question, char *string, int *position) { - strncpy(string, question + *position, 15); - string[15] = '\0'; - int string_len = 15; - while (string[string_len] != ' ') { - string_len--; - } - int remainder = *position - string_len - 1; - *position -= remainder; - if (string_len > 0) { - string[string_len] = '\0'; // Null-terminate at the space - } +bool check_question(const char *question, char *line, int *position) { + if (!question_mark(question)) { + printf("ERROR: No question mark!"); + return false; + } + int count = 0; + do { + strncpy(line, question + *position, 15); + line[15] = '\0'; + + int pos = 15; + int extra = 0; + while (pos >= 0 && line[pos] != ' ') { + pos--; + extra++; + } + line[pos] = '\0'; + + if (extra == 16) { + line[14] = '-'; + *position -= 1; // Update position to after the '-' + } else { + *position -= extra; // Update position to the last space + *position += 1; // Update position to after the space + } + printf("%s\n", line); + *position += 15; + count++; + } while (!question_mark(line) && count < 6); + + if (count == 6) { + printf("ERROR: Question too long!"); + return false; + } + return true; } -void display_question(const char *question) { - char string[16]; - if (!question_mark(question)) { - printf("ERROR: no question mark!"); - return; - } - - paint.SetWidth(200); - paint.SetHeight(16); - - int position = 0; - int count = 0; - char buffer[20]; - process_string(question, string, &position); - sprintf(buffer, "%d", position); - paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate - - count = 1; - process_string(question, string, &position); - sprintf(buffer, "%d", position); - paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate - - count = 2; - process_string(question, string, &position); - paint.Clear(UNCOLORED); //paints the height and width the given colour - sprintf(buffer, "%d", position); - paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate - - count = 3; - process_string(question, string, &position); - paint.Clear(UNCOLORED); //paints the height and width the given colour - sprintf(buffer, "%d", position); - paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate - - /* - do { - process_string(question, string, &position); - paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(15, 2, string, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, (100-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate - count++; - } while (strchr(string, '?') == NULL); - */ - +void display_question(const char *question, char *line, int *position) { + paint.SetWidth(200); + paint.SetHeight(16); + int count = 0; + do { + strncpy(line, question + *position, 15); + line[15] = '\0'; + + int pos = 15; + int extra = 0; + while (pos >= 0 && line[pos] != ' ') { + pos--; + extra++; + } + line[pos] = '\0'; + + if (extra == 16) { + line[14] = '-'; + *position -= 1; // Update position to after the '-' + } else { + *position -= extra; // Update position to the last space + *position += 1; // Update position to after the space + } + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(15, 2, line, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, (120-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + *position += 15; + count++; + } while (!question_mark(line)); } void setup() { @@ -179,23 +181,15 @@ void setup() { //vote question char question[100] = "How many characters can E-paper fit across?"; - display_question(question); - - //paint.SetWidth(200); - //paint.SetHeight(16); - //paint.Clear(UNCOLORED); //paints the height and width the given colour - //paint.DrawStringAt(15, 2, "How many", &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - //epd.SetFrameMemory(paint.GetImage(), 0, 100, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates - //paint.Clear(UNCOLORED); - //paint.DrawStringAt(15, 2, "characters can", &Font16, COLORED); - //epd.SetFrameMemory(paint.GetImage(), 0, (100-16), paint.GetWidth(), paint.GetHeight()); - //paint.Clear(UNCOLORED); - //paint.DrawStringAt(15, 2, "Epaper fit", &Font16, COLORED); - //epd.SetFrameMemory(paint.GetImage(), 0, (100-16-16), paint.GetWidth(), paint.GetHeight()); - //paint.Clear(UNCOLORED); - //paint.DrawStringAt(15, 2, "across?", &Font16, COLORED); - //epd.SetFrameMemory(paint.GetImage(), 0, (100-16-16-16), paint.GetWidth(), paint.GetHeight()); + char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question?"; + int position = 0; + char line[16]; + bool all_good = check_question(question2, line, &position); + if (all_good) { + position = 0; + display_question(question2, line, &position); + } epd.DisplayFrame(); } From 4bf44aad4b3e9901a1a652db907266692ba2f035 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Thu, 4 Jan 2024 18:38:43 +0200 Subject: [PATCH 06/36] created state machine --- Display_code/epd1in54_V2/epd1in54_V2.ino | 6 +- voting_device/config.h | 13 +++- voting_device/voting_device.ino | 78 ++++++++++++++++-------- 3 files changed, 65 insertions(+), 32 deletions(-) diff --git a/Display_code/epd1in54_V2/epd1in54_V2.ino b/Display_code/epd1in54_V2/epd1in54_V2.ino index 71c9b64..f8bdde1 100644 --- a/Display_code/epd1in54_V2/epd1in54_V2.ino +++ b/Display_code/epd1in54_V2/epd1in54_V2.ino @@ -93,9 +93,9 @@ bool check_question(const char *question, char *line, int *position) { printf("%s\n", line); *position += 15; count++; - } while (!question_mark(line) && count < 6); + } while (!question_mark(line)); - if (count == 6) { + if (count > 6) { printf("ERROR: Question too long!"); return false; } @@ -181,7 +181,7 @@ void setup() { //vote question char question[100] = "How many characters can E-paper fit across?"; - char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question?"; + char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question another another?"; int position = 0; char line[16]; diff --git a/voting_device/config.h b/voting_device/config.h index a9a1c1a..153d864 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -9,12 +9,21 @@ #define BUTTON_PIN_2 4 // GPIO 4 (entspricht D2) für Taster 2 #define BUTTON_PIN_3 16 // GPIO 16 (entspricht D0) für Taster 3 +#define YES 0 +#define ABSTAIN 1 +#define NO 2 + +#define BOOT 0 +#define VOTE 1 +#define CONFIRM 2 +#define CLOSE_VOTE 3 + // WLAN-Settings -const char* ssid = "RasPi-Netzwerk"; -const char* password = ""; +const char* ssid = "franks_galaxy"; +const char* password = "veef2267"; // MQTT-Server Settings const char* mqtt_server = "10.42.0.1"; diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 301eb05..1a75af0 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -75,33 +75,57 @@ void setup() { #endif } -void loop() { - if (digitalRead(BUTTON_PIN_1) == LOW) { - digitalWrite(LED_PIN_1, HIGH); // Wenn Taster 1 gedrückt wird, schalte LED 1 ein - if (message_count == 0) { - mqttClient.publish(pubInit, (const uint8_t*)"{'VotingID':'Unique voting id'}", MQTTpubQos, false); - message_count++; - } - } else { - message_count = 0; - digitalWrite(LED_PIN_1, LOW); // Andernfalls schalte LED 1 aus - } +int state = 0; +int response; - if (digitalRead(BUTTON_PIN_2) == LOW) { - digitalWrite(LED_PIN_2, HIGH); // Wenn Taster 2 gedrückt wird, schalte LED 2 ein - } else { - digitalWrite(LED_PIN_2, LOW); // Andernfalls schalte LED 2 aus - } +bool username = true; // move to right location +bool question = true; //move to right location - if (digitalRead(BUTTON_PIN_3) == LOW) { - digitalWrite(LED_PIN_3, HIGH); // Wenn Taster 3 gedrückt wird, schalte LED 3 ein - } else { - digitalWrite(LED_PIN_3, LOW); // Andernfalls schalte LED 3 aus - } - // MQTT-Nachrichten abrufen - if (!mqttClient.loop()) { -#ifdef DEBUG - Serial.println("Verbindung zum MQTT-Server abgebrochen"); -#endif - } +void loop() {/* working progress, need to define pressed function and buttons + switch (state) { + case BOOT: + //display start up screen + //check connection + if (WiFi.status() != WL_CONNECTED) { + //error msg + //try connect again + } + //receive user name and vote question + if (!username) { + //error msg + //request user name + } + if (!question) { + //error msg + //request question + } + //battery status + state = 1; + case VOTE: + //display question + if (button_A) { + response = YES + state = 2; + } + else if (button_B) { + response = ABSTAIN + state = 2; + } + else if (button_C) { + response = NO + state = 2; + } + case CONFIRM: + if (button_A) { + response = YES + state = 3; + } + else if (button_C){ + response = NO + state = 1; + } + case CLOSE_VOTE: + //display closing thank you + delay(5000); + }*/ } From 4a7a315defd33e7ef97ac5c02da56ec2fc1434d1 Mon Sep 17 00:00:00 2001 From: iamna Date: Thu, 11 Jan 2024 22:26:39 +0200 Subject: [PATCH 07/36] interrupt for power button --- voting_device/button_interrupts.cpp | 20 ++++++++++++++++++++ voting_device/button_interrupts.h | 2 ++ voting_device/config.h | 3 +++ voting_device/voting_device.ino | 8 +++++++- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/voting_device/button_interrupts.cpp b/voting_device/button_interrupts.cpp index bc9cf15..92bb2d0 100644 --- a/voting_device/button_interrupts.cpp +++ b/voting_device/button_interrupts.cpp @@ -1,4 +1,8 @@ #include "button_interrupts.h" + + +uint32_t startTime; +volatile bool powerSW = false; ICACHE_RAM_ATTR void Isr_Btn_1(void){ //todo send stuff if button 1 is pressed } @@ -7,4 +11,20 @@ ICACHE_RAM_ATTR void Isr_Btn_2(void){ } ICACHE_RAM_ATTR void Isr_Btn_3(void){ //todo send stuff if button 3 is pressed +} +ICACHE_RAM_ATTR void powerButtonInterrupt(void){ + delay(30); // Debounce + if (!digitalRead(RXPIN)) { + if (!powerSW) { + startTime = millis(); + powerSW = true; + } + if (millis() - startTime > 3000) { + digitalWrite(BUTTON_PIN_1, LOW); // Turn device off + digitalWrite(LED_BUILTIN, LOW); + while (!digitalRead(RXPIN)); // Wait for button released + } + } else { + powerSW = false; + } } \ No newline at end of file diff --git a/voting_device/button_interrupts.h b/voting_device/button_interrupts.h index e0b8a99..7b40d95 100644 --- a/voting_device/button_interrupts.h +++ b/voting_device/button_interrupts.h @@ -1,9 +1,11 @@ #ifndef BUTTON_ISR #define BUTTON_ISR #include +#include "config.h" ICACHE_RAM_ATTR void Isr_Btn_1(void); ICACHE_RAM_ATTR void Isr_Btn_2(void); ICACHE_RAM_ATTR void Isr_Btn_3(void); +ICACHE_RAM_ATTR void powerButtonInterrupt(void); #endif \ No newline at end of file diff --git a/voting_device/config.h b/voting_device/config.h index 153d864..4c236e2 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -1,6 +1,7 @@ #include #include // default wifi library #include //Mqtt library by Nick O'Leary +#include "button_interrupt.h" //#include @@ -8,6 +9,7 @@ #define BUTTON_PIN_1 5 // GPIO 5 (entspricht D1) für Taster 1 #define BUTTON_PIN_2 4 // GPIO 4 (entspricht D2) für Taster 2 #define BUTTON_PIN_3 16 // GPIO 16 (entspricht D0) für Taster 3 +#define RXPIN 3 #define YES 0 #define ABSTAIN 1 @@ -72,5 +74,6 @@ void attachISR(void){ attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); +attachInterrupt(digitalPinToInterrupt(RXPIN), powerButtonInterrupt, FALLING); } #endif \ No newline at end of file diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 1a75af0..6411e64 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -21,10 +21,16 @@ void callback(char* topic, byte* payload, unsigned int length) { } void setup() { + /* pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand - + */ + pinMode(LED_BUILTIN, OUTPUT); + pinMode(powerBtn, OUTPUT); + digitalWrite(powerBtn, HIGH); + digitalWrite(LED_BUILTIN, HIGH); + pinMode(RXPIN, INPUT_PULLUP); #ifdef ISRS_FOR_BUTTONS attachISR(); #endif From 23723b812ec95ad3f21584842ea27dd8a82ab499 Mon Sep 17 00:00:00 2001 From: iamna Date: Fri, 12 Jan 2024 00:29:38 +0200 Subject: [PATCH 08/36] Battery Level update --- voting_device/button_interrupts.cpp | 8 +++++--- voting_device/button_interrupts.h | 1 - voting_device/config.h | 13 +++++++------ voting_device/voting_device.ino | 11 +++++++++-- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/voting_device/button_interrupts.cpp b/voting_device/button_interrupts.cpp index 92bb2d0..414d0ba 100644 --- a/voting_device/button_interrupts.cpp +++ b/voting_device/button_interrupts.cpp @@ -1,4 +1,5 @@ #include "button_interrupts.h" +#include "config.h" uint32_t startTime; @@ -20,11 +21,12 @@ ICACHE_RAM_ATTR void powerButtonInterrupt(void){ powerSW = true; } if (millis() - startTime > 3000) { - digitalWrite(BUTTON_PIN_1, LOW); // Turn device off + digitalWrite(BUTTON_PIN_1, LOW); digitalWrite(LED_BUILTIN, LOW); - while (!digitalRead(RXPIN)); // Wait for button released + while (!digitalRead(RXPIN)); } } else { powerSW = false; } -} \ No newline at end of file + +} diff --git a/voting_device/button_interrupts.h b/voting_device/button_interrupts.h index 7b40d95..1f062e5 100644 --- a/voting_device/button_interrupts.h +++ b/voting_device/button_interrupts.h @@ -1,7 +1,6 @@ #ifndef BUTTON_ISR #define BUTTON_ISR #include -#include "config.h" ICACHE_RAM_ATTR void Isr_Btn_1(void); ICACHE_RAM_ATTR void Isr_Btn_2(void); diff --git a/voting_device/config.h b/voting_device/config.h index 4c236e2..cd681c1 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -1,9 +1,10 @@ #include #include // default wifi library #include //Mqtt library by Nick O'Leary -#include "button_interrupt.h" //#include +#define BATTERY_PIN A0 +#define REFERENCE_VOLTAGE 3.3 //Definition of GPIOS for Buttons #define BUTTON_PIN_1 5 // GPIO 5 (entspricht D1) für Taster 1 @@ -71,9 +72,9 @@ const char* pubPubVote = "/vote/VotingID"; #ifdef ISRS_FOR_BUTTONS #include "button_interrupts.h" void attachISR(void){ -attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); -attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); -attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); -attachInterrupt(digitalPinToInterrupt(RXPIN), powerButtonInterrupt, FALLING); + //attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); + //attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); + //attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); + attachInterrupt(digitalPinToInterrupt(RXPIN), powerButtonInterrupt, FALLING); } -#endif \ No newline at end of file +#endif diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 6411e64..cfbd8e4 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -19,6 +19,13 @@ void callback(char* topic, byte* payload, unsigned int length) { // Nachricht weiterleiten //mqttClient.publish("e", payload, length); } +int checkBatteryLevel(){ + int adcValue = analogRead(BATTERY_PIN); + float voltage = adcValue * REFERENCE_VOLTAGE / 1023 + //int batteryLevel = map(constrain(voltage, 3.0, 9.0), 3.0, 9.0, 0, 100); + int batteryLevel = map(voltage, 3.0, 9.0, 0, 100); + return batteryLevel; +} void setup() { /* @@ -27,8 +34,8 @@ void setup() { pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand */ pinMode(LED_BUILTIN, OUTPUT); - pinMode(powerBtn, OUTPUT); - digitalWrite(powerBtn, HIGH); + pinMode(BUTTON_PIN_1, OUTPUT); + digitalWrite(BUTTON_PIN_1, HIGH); digitalWrite(LED_BUILTIN, HIGH); pinMode(RXPIN, INPUT_PULLUP); #ifdef ISRS_FOR_BUTTONS From 95e1a85854f567e6fafa798e38629949196a5fd9 Mon Sep 17 00:00:00 2001 From: Flx12 Date: Sat, 20 Jan 2024 15:06:17 +0100 Subject: [PATCH 09/36] bugfixes and implementing of Buttons --- voting_device/Button_Class.cpp | 14 ++++++++++++++ voting_device/Button_Class.h | 13 +++++++++++++ voting_device/button_interrupts.cpp | 6 ++++++ voting_device/button_interrupts.h | 1 + voting_device/config.h | 5 +++++ voting_device/voting_device.ino | 26 +++++++++++++------------- 6 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 voting_device/Button_Class.cpp create mode 100644 voting_device/Button_Class.h diff --git a/voting_device/Button_Class.cpp b/voting_device/Button_Class.cpp new file mode 100644 index 0000000..b1df0c5 --- /dev/null +++ b/voting_device/Button_Class.cpp @@ -0,0 +1,14 @@ +#include "Button_Class.h" + +bool ButtonVote::getState(void){ + bool temp =ButtonVote::State; + ButtonVote::resetState(); + return temp; +} + +void ButtonVote::setState(bool State){ + ButtonVote::State = State; +} +void ButtonVote::resetState(void){ + ButtonVote::State = false; +} \ No newline at end of file diff --git a/voting_device/Button_Class.h b/voting_device/Button_Class.h new file mode 100644 index 0000000..0bf3f48 --- /dev/null +++ b/voting_device/Button_Class.h @@ -0,0 +1,13 @@ +#ifndef BUTTONCLASS +#define BUTTONCLASS + +class ButtonVote{ +public: + bool getState(void); + void setState(bool); +private: + bool State = false; + void resetState(void); +}; + +#endif \ No newline at end of file diff --git a/voting_device/button_interrupts.cpp b/voting_device/button_interrupts.cpp index 414d0ba..7b55ca1 100644 --- a/voting_device/button_interrupts.cpp +++ b/voting_device/button_interrupts.cpp @@ -5,12 +5,18 @@ uint32_t startTime; volatile bool powerSW = false; ICACHE_RAM_ATTR void Isr_Btn_1(void){ + delay(30);// Debounce + ButtonYes.setState(1); //todo send stuff if button 1 is pressed } ICACHE_RAM_ATTR void Isr_Btn_2(void){ +delay(30);// Debounce +ButtonAbstain.setState(1); //todo send stuff if button 2 is pressed } ICACHE_RAM_ATTR void Isr_Btn_3(void){ +delay(30);// Debounce +ButtonNo.setState(1); //todo send stuff if button 3 is pressed } ICACHE_RAM_ATTR void powerButtonInterrupt(void){ diff --git a/voting_device/button_interrupts.h b/voting_device/button_interrupts.h index 1f062e5..00ec532 100644 --- a/voting_device/button_interrupts.h +++ b/voting_device/button_interrupts.h @@ -7,4 +7,5 @@ ICACHE_RAM_ATTR void Isr_Btn_2(void); ICACHE_RAM_ATTR void Isr_Btn_3(void); ICACHE_RAM_ATTR void powerButtonInterrupt(void); + #endif \ No newline at end of file diff --git a/voting_device/config.h b/voting_device/config.h index cd681c1..ec8dbf0 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -12,6 +12,11 @@ #define BUTTON_PIN_3 16 // GPIO 16 (entspricht D0) für Taster 3 #define RXPIN 3 +#include "Button_Class.h" +ButtonVote ButtonYes; +ButtonVote ButtonNo; +ButtonVote ButtonAbstain; + #define YES 0 #define ABSTAIN 1 #define NO 2 diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index cfbd8e4..d36f403 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -21,7 +21,7 @@ void callback(char* topic, byte* payload, unsigned int length) { } int checkBatteryLevel(){ int adcValue = analogRead(BATTERY_PIN); - float voltage = adcValue * REFERENCE_VOLTAGE / 1023 + float voltage = adcValue * REFERENCE_VOLTAGE / 1023; //int batteryLevel = map(constrain(voltage, 3.0, 9.0), 3.0, 9.0, 0, 100); int batteryLevel = map(voltage, 3.0, 9.0, 0, 100); return batteryLevel; @@ -94,7 +94,7 @@ int response; bool username = true; // move to right location bool question = true; //move to right location -void loop() {/* working progress, need to define pressed function and buttons +void loop() { //working progress, need to define pressed function and buttons switch (state) { case BOOT: //display start up screen @@ -116,29 +116,29 @@ void loop() {/* working progress, need to define pressed function and buttons state = 1; case VOTE: //display question - if (button_A) { - response = YES + if (ButtonYes.getState()) { + response = YES; state = 2; } - else if (button_B) { - response = ABSTAIN + else if (ButtonAbstain.getState()) { + response = ABSTAIN; state = 2; } - else if (button_C) { - response = NO + else if (ButtonNo.getState()) { + response = NO; state = 2; } case CONFIRM: - if (button_A) { - response = YES + if (ButtonYes.getState()) { + response = YES; state = 3; } - else if (button_C){ - response = NO + else if (ButtonNo.getState()){ + response = NO; state = 1; } case CLOSE_VOTE: //display closing thank you delay(5000); - }*/ + } } From b767e97fdf3a870d7af6264a8b33d401c4e7d884 Mon Sep 17 00:00:00 2001 From: Nadim-2022 Date: Wed, 24 Jan 2024 18:50:05 +0200 Subject: [PATCH 10/36] fixed file structure, button interrupts now working, power interrupt not working --- voting_device/Button_Class.h | 1 + voting_device/button_interrupts.cpp | 37 +++++++---------- voting_device/button_interrupts.h | 9 ++++- voting_device/config.h | 28 +++++-------- voting_device/power.cpp | 22 ++++++++++ voting_device/power.h | 8 ++++ voting_device/voting_device.ino | 62 +++++++++++++++++++++-------- 7 files changed, 109 insertions(+), 58 deletions(-) create mode 100644 voting_device/power.cpp create mode 100644 voting_device/power.h diff --git a/voting_device/Button_Class.h b/voting_device/Button_Class.h index 0bf3f48..7127ea1 100644 --- a/voting_device/Button_Class.h +++ b/voting_device/Button_Class.h @@ -10,4 +10,5 @@ class ButtonVote{ void resetState(void); }; + #endif \ No newline at end of file diff --git a/voting_device/button_interrupts.cpp b/voting_device/button_interrupts.cpp index 7b55ca1..b7a36c9 100644 --- a/voting_device/button_interrupts.cpp +++ b/voting_device/button_interrupts.cpp @@ -1,38 +1,29 @@ #include "button_interrupts.h" -#include "config.h" + +ButtonVote ButtonYes; +ButtonVote ButtonNo; +ButtonVote ButtonAbstain; + +//Definition of GPIOS for Buttons +//#define BUTTON_PIN_1 0 // GPIO 5 (entspricht D1) für Taster 1 +//#define BUTTON_PIN_2 2 // GPIO 4 (entspricht D2) für Taster 2 +//#define BUTTON_PIN_3 12 // GPIO 16 (entspricht D0) für Taster 3 +//#define RXPIN 3 -uint32_t startTime; -volatile bool powerSW = false; ICACHE_RAM_ATTR void Isr_Btn_1(void){ delay(30);// Debounce ButtonYes.setState(1); //todo send stuff if button 1 is pressed } ICACHE_RAM_ATTR void Isr_Btn_2(void){ -delay(30);// Debounce -ButtonAbstain.setState(1); + delay(30);// Debounce + ButtonAbstain.setState(1); //todo send stuff if button 2 is pressed } ICACHE_RAM_ATTR void Isr_Btn_3(void){ -delay(30);// Debounce -ButtonNo.setState(1); + delay(30);// Debounce + ButtonNo.setState(1); //todo send stuff if button 3 is pressed } -ICACHE_RAM_ATTR void powerButtonInterrupt(void){ - delay(30); // Debounce - if (!digitalRead(RXPIN)) { - if (!powerSW) { - startTime = millis(); - powerSW = true; - } - if (millis() - startTime > 3000) { - digitalWrite(BUTTON_PIN_1, LOW); - digitalWrite(LED_BUILTIN, LOW); - while (!digitalRead(RXPIN)); - } - } else { - powerSW = false; - } -} diff --git a/voting_device/button_interrupts.h b/voting_device/button_interrupts.h index 00ec532..21636b7 100644 --- a/voting_device/button_interrupts.h +++ b/voting_device/button_interrupts.h @@ -1,11 +1,18 @@ #ifndef BUTTON_ISR #define BUTTON_ISR #include +//#include "config.h" + +//#include "Button_Class.h" +#include "Button_Class.h" +extern ButtonVote ButtonYes; +extern ButtonVote ButtonNo; +extern ButtonVote ButtonAbstain; + ICACHE_RAM_ATTR void Isr_Btn_1(void); ICACHE_RAM_ATTR void Isr_Btn_2(void); ICACHE_RAM_ATTR void Isr_Btn_3(void); -ICACHE_RAM_ATTR void powerButtonInterrupt(void); #endif \ No newline at end of file diff --git a/voting_device/config.h b/voting_device/config.h index ec8dbf0..18b11a0 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -2,20 +2,16 @@ #include // default wifi library #include //Mqtt library by Nick O'Leary //#include - #define BATTERY_PIN A0 #define REFERENCE_VOLTAGE 3.3 //Definition of GPIOS for Buttons -#define BUTTON_PIN_1 5 // GPIO 5 (entspricht D1) für Taster 1 -#define BUTTON_PIN_2 4 // GPIO 4 (entspricht D2) für Taster 2 -#define BUTTON_PIN_3 16 // GPIO 16 (entspricht D0) für Taster 3 -#define RXPIN 3 +#define BUTTON_PIN_1 0 // GPIO 5 (entspricht D1) für Taster 1 +#define BUTTON_PIN_2 2 // GPIO 4 (entspricht D2) für Taster 2 +#define BUTTON_PIN_3 12 // GPIO 16 (entspricht D0) für Taster 3 + + -#include "Button_Class.h" -ButtonVote ButtonYes; -ButtonVote ButtonNo; -ButtonVote ButtonAbstain; #define YES 0 #define ABSTAIN 1 @@ -29,6 +25,7 @@ ButtonVote ButtonAbstain; + // WLAN-Settings const char* ssid = "franks_galaxy"; const char* password = "veef2267"; @@ -64,11 +61,6 @@ const char* pubPubVote = "/vote/VotingID"; #include //todo find encryption library #endif -#ifdef STATUS_LEDS -#define LED_PIN_1 14 // GPIO 14 (entspricht D5) für LED 1 -#define LED_PIN_2 12 // GPIO 12 (entspricht D6) für LED 2 -#define LED_PIN_3 13 // GPIO 13 (entspricht D7) für LED 3 -#endif #ifdef E_PAPER #include //todo find epaper library @@ -77,9 +69,9 @@ const char* pubPubVote = "/vote/VotingID"; #ifdef ISRS_FOR_BUTTONS #include "button_interrupts.h" void attachISR(void){ - //attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); - //attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); - //attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); - attachInterrupt(digitalPinToInterrupt(RXPIN), powerButtonInterrupt, FALLING); + // attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); + } #endif diff --git a/voting_device/power.cpp b/voting_device/power.cpp new file mode 100644 index 0000000..fd882d9 --- /dev/null +++ b/voting_device/power.cpp @@ -0,0 +1,22 @@ + #include "power.h" + + + uint32_t startTime; + bool powerSW = false; + + void powerOff(){ + if (!digitalRead(RXPIN)) { + if (!powerSW) { + startTime = millis(); + powerSW = true; + } + if (millis() - startTime > 3000) { + digitalWrite(5, LOW); + digitalWrite(LED_BUILTIN, HIGH); + while (!digitalRead(RXPIN)); + } + } + else { + powerSW = false; + } + } \ No newline at end of file diff --git a/voting_device/power.h b/voting_device/power.h new file mode 100644 index 0000000..665daa1 --- /dev/null +++ b/voting_device/power.h @@ -0,0 +1,8 @@ +#ifndef POWER +#define POWER +#include +#define RXPIN 3 + +void powerOff(); + +#endif \ No newline at end of file diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index d36f403..612a223 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -1,4 +1,8 @@ #include "config.h" +#include "power.h" +#include "button_interrupts.h" +//#include "Button_Class.h" + int message_count = 0; @@ -34,25 +38,20 @@ void setup() { pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand */ pinMode(LED_BUILTIN, OUTPUT); - pinMode(BUTTON_PIN_1, OUTPUT); - digitalWrite(BUTTON_PIN_1, HIGH); - digitalWrite(LED_BUILTIN, HIGH); + pinMode(5, OUTPUT); + digitalWrite(5, HIGH); + digitalWrite(LED_BUILTIN, LOW); pinMode(RXPIN, INPUT_PULLUP); + pinMode(BUTTON_PIN_1, INPUT_PULLUP); #ifdef ISRS_FOR_BUTTONS attachISR(); #endif -#ifdef STATUS_LEDS - pinMode(LED_PIN_1, OUTPUT); // LED 1 als Ausgang - pinMode(LED_PIN_2, OUTPUT); // LED 2 als Ausgang - pinMode(LED_PIN_3, OUTPUT); // LED 3 als Ausgang -#endif - #ifdef DEBUG Serial.begin(115200); #endif delay(10); - +/* // Verbindung zum WLAN herstellen #ifdef DEBUG Serial.println("Verbindung zum WLAN herstellen"); @@ -65,6 +64,7 @@ void setup() { Serial.print("."); #endif } + #ifdef DEBUG Serial.println("Verbindung zum WLAN hergestellt"); #endif @@ -86,6 +86,7 @@ void setup() { #ifdef DEBUG Serial.println("Verbindung zum MQTT-Server hergestellt"); #endif +*/ } int state = 0; @@ -95,8 +96,28 @@ bool username = true; // move to right location bool question = true; //move to right location void loop() { //working progress, need to define pressed function and buttons + //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off + if (!digitalRead(0)) { + Serial.println("YES"); + response = YES; + //state = CONFIRM; + } + if (ButtonAbstain.getState()) { + Serial.println("ABSTAIN"); + response = ABSTAIN; + //state = CONFIRM; + } + if (digitalRead(2)) { + Serial.println("NO"); + response = NO; + //state = CONFIRM; + } + /* + switch (state) { + case BOOT: + //display start up screen //check connection if (WiFi.status() != WL_CONNECTED) { @@ -113,32 +134,41 @@ void loop() { //working progress, need to define pressed function and buttons //request question } //battery status - state = 1; + + state = VOTE; case VOTE: //display question if (ButtonYes.getState()) { + Serial.println("YES"); response = YES; - state = 2; + state = CONFIRM; } else if (ButtonAbstain.getState()) { + Serial.println("ABSTAIN"); response = ABSTAIN; - state = 2; + state = CONFIRM; } else if (ButtonNo.getState()) { + Serial.println("NO"); response = NO; - state = 2; + state = CONFIRM; } case CONFIRM: if (ButtonYes.getState()) { + Serial.println("YES"); response = YES; - state = 3; + state = CLOSE_VOTE; } else if (ButtonNo.getState()){ + Serial.println("NO"); response = NO; - state = 1; + state = VOTE; } case CLOSE_VOTE: //display closing thank you delay(5000); } + +*/ + } From 8e7a3c7666f62015b939c14b709c3a36be9f6571 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Thu, 25 Jan 2024 16:18:05 +0200 Subject: [PATCH 11/36] adding display files, small code clean ups --- voting_device/Button_Class.cpp | 1 + voting_device/button_interrupts.cpp | 7 ------- voting_device/button_interrupts.h | 2 -- voting_device/config.h | 2 +- voting_device/display.cpp | 1 + voting_device/display.h | 5 +++++ voting_device/voting_device.ino | 3 +-- 7 files changed, 9 insertions(+), 12 deletions(-) create mode 100644 voting_device/display.cpp create mode 100644 voting_device/display.h diff --git a/voting_device/Button_Class.cpp b/voting_device/Button_Class.cpp index b1df0c5..18d5bf5 100644 --- a/voting_device/Button_Class.cpp +++ b/voting_device/Button_Class.cpp @@ -9,6 +9,7 @@ bool ButtonVote::getState(void){ void ButtonVote::setState(bool State){ ButtonVote::State = State; } + void ButtonVote::resetState(void){ ButtonVote::State = false; } \ No newline at end of file diff --git a/voting_device/button_interrupts.cpp b/voting_device/button_interrupts.cpp index b7a36c9..ef148af 100644 --- a/voting_device/button_interrupts.cpp +++ b/voting_device/button_interrupts.cpp @@ -4,13 +4,6 @@ ButtonVote ButtonYes; ButtonVote ButtonNo; ButtonVote ButtonAbstain; -//Definition of GPIOS for Buttons -//#define BUTTON_PIN_1 0 // GPIO 5 (entspricht D1) für Taster 1 -//#define BUTTON_PIN_2 2 // GPIO 4 (entspricht D2) für Taster 2 -//#define BUTTON_PIN_3 12 // GPIO 16 (entspricht D0) für Taster 3 -//#define RXPIN 3 - - ICACHE_RAM_ATTR void Isr_Btn_1(void){ delay(30);// Debounce ButtonYes.setState(1); diff --git a/voting_device/button_interrupts.h b/voting_device/button_interrupts.h index 21636b7..b4e2b37 100644 --- a/voting_device/button_interrupts.h +++ b/voting_device/button_interrupts.h @@ -1,9 +1,7 @@ #ifndef BUTTON_ISR #define BUTTON_ISR #include -//#include "config.h" -//#include "Button_Class.h" #include "Button_Class.h" extern ButtonVote ButtonYes; extern ButtonVote ButtonNo; diff --git a/voting_device/config.h b/voting_device/config.h index 18b11a0..f91f9b3 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -69,7 +69,7 @@ const char* pubPubVote = "/vote/VotingID"; #ifdef ISRS_FOR_BUTTONS #include "button_interrupts.h" void attachISR(void){ - // attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); diff --git a/voting_device/display.cpp b/voting_device/display.cpp new file mode 100644 index 0000000..92ffefa --- /dev/null +++ b/voting_device/display.cpp @@ -0,0 +1 @@ +#include "display.h" \ No newline at end of file diff --git a/voting_device/display.h b/voting_device/display.h new file mode 100644 index 0000000..afcef52 --- /dev/null +++ b/voting_device/display.h @@ -0,0 +1,5 @@ +#ifndef DISPLAY +#define DISPLAY + + +#endif \ No newline at end of file diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 612a223..64558cb 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -1,8 +1,7 @@ #include "config.h" #include "power.h" #include "button_interrupts.h" -//#include "Button_Class.h" - +#include "display.h" int message_count = 0; From 83a8eab731d0df02175b928b64bd61a07e367de1 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:30:31 +0200 Subject: [PATCH 12/36] testing adding display library --- voting_device/epd1in54_V2/epd1in54_V2.cpp | 576 +++++ voting_device/epd1in54_V2/epd1in54_V2.h | 92 + voting_device/epd1in54_V2/epdif.cpp | 68 + voting_device/epd1in54_V2/epdif.h | 52 + voting_device/epd1in54_V2/epdpaint.cpp | 319 +++ voting_device/epd1in54_V2/epdpaint.h | 75 + voting_device/epd1in54_V2/font12.c | 1385 +++++++++++ voting_device/epd1in54_V2/font16.c | 1765 +++++++++++++++ voting_device/epd1in54_V2/font20.c | 2143 ++++++++++++++++++ voting_device/epd1in54_V2/font24.c | 2521 +++++++++++++++++++++ voting_device/epd1in54_V2/font8.c | 1005 ++++++++ voting_device/epd1in54_V2/fonts.h | 75 + voting_device/epd1in54_V2/imagedata.cpp | 344 +++ voting_device/epd1in54_V2/imagedata.h | 30 + voting_device/voting_device.ino | 28 +- 15 files changed, 10454 insertions(+), 24 deletions(-) create mode 100644 voting_device/epd1in54_V2/epd1in54_V2.cpp create mode 100644 voting_device/epd1in54_V2/epd1in54_V2.h create mode 100644 voting_device/epd1in54_V2/epdif.cpp create mode 100644 voting_device/epd1in54_V2/epdif.h create mode 100644 voting_device/epd1in54_V2/epdpaint.cpp create mode 100644 voting_device/epd1in54_V2/epdpaint.h create mode 100644 voting_device/epd1in54_V2/font12.c create mode 100644 voting_device/epd1in54_V2/font16.c create mode 100644 voting_device/epd1in54_V2/font20.c create mode 100644 voting_device/epd1in54_V2/font24.c create mode 100644 voting_device/epd1in54_V2/font8.c create mode 100644 voting_device/epd1in54_V2/fonts.h create mode 100644 voting_device/epd1in54_V2/imagedata.cpp create mode 100644 voting_device/epd1in54_V2/imagedata.h diff --git a/voting_device/epd1in54_V2/epd1in54_V2.cpp b/voting_device/epd1in54_V2/epd1in54_V2.cpp new file mode 100644 index 0000000..7df047b --- /dev/null +++ b/voting_device/epd1in54_V2/epd1in54_V2.cpp @@ -0,0 +1,576 @@ +/***************************************************************************** +* | File : epd1in54_V2.cpp +* | Author : Waveshare team +* | Function : 1.54inch e-paper V2 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-24 +* | Info : +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ +#include +#include "epd1in54_V2.h" + + +// waveform full refresh +unsigned char WF_Full_1IN54[159] = +{ +0x80, 0x48, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x80, 0x48, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x40, 0x48, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x8, 0x1, 0x0, 0x8, 0x1, 0x0, 0x2, +0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, +0x22, 0x17, 0x41, 0x0, 0x32, 0x20 +}; + +// waveform partial refresh(fast) +unsigned char WF_PARTIAL_1IN54_0[159] = +{ +0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x40,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0xF,0x0,0x0,0x0,0x0,0x0,0x0, +0x1,0x1,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x22,0x22,0x22,0x22,0x22,0x22,0x0,0x0,0x0, +0x02,0x17,0x41,0xB0,0x32,0x28, +}; + +Epd::~Epd() +{ +}; + +Epd::Epd() +{ + reset_pin = RST_PIN; + dc_pin = DC_PIN; + cs_pin = CS_PIN; + busy_pin = BUSY_PIN; + width = EPD_WIDTH; + height = EPD_HEIGHT; +}; + +/** + * @brief: basic function for sending commands + */ +void Epd::SendCommand(unsigned char command) +{ + DigitalWrite(dc_pin, LOW); + SpiTransfer(command); +} + +/** + * @brief: basic function for sending data + */ +void Epd::SendData(unsigned char data) +{ + DigitalWrite(dc_pin, HIGH); + SpiTransfer(data); +} + +/** + * @brief: Wait until the busy_pin goes HIGH + */ +void Epd::WaitUntilIdle(void) +{ + while(DigitalRead(busy_pin) == 1) { //LOW: idle, HIGH: busy + DelayMs(100); + } + DelayMs(200); +} + +void Epd::Lut(unsigned char* lut) +{ + SendCommand(0x32); + for(unsigned char i=0; i<153; i++) + SendData(lut[i]); + WaitUntilIdle(); +} + +void Epd::SetLut(unsigned char* lut) +{ + Lut(lut); + + SendCommand(0x3f); + SendData(lut[153]); + + SendCommand(0x03); + SendData(lut[154]); + + SendCommand(0x04); + SendData(lut[155]); + SendData(lut[156]); + SendData(lut[157]); + + SendCommand(0x2c); + SendData(lut[158]); +} + +// High Direction +int Epd::HDirInit(void) +{ + /* this calls the peripheral hardware interface, see epdif */ + if (IfInit() != 0) { + return -1; + } + /* EPD hardware init start */ + Reset(); + + WaitUntilIdle(); + SendCommand(0x12); //SWRESET + WaitUntilIdle(); + + SendCommand(0x01); //Driver output control + SendData(0xC7); + SendData(0x00); + SendData(0x01); + + SendCommand(0x11); //data entry mode + SendData(0x01); + + SendCommand(0x44); //set Ram-X address start/end position + SendData(0x00); + SendData(0x18); //0x0C-->(18+1)*8=200 + + SendCommand(0x45); //set Ram-Y address start/end position + SendData(0xC7); //0xC7-->(199+1)=200 + SendData(0x00); + SendData(0x00); + SendData(0x00); + + SendCommand(0x3C); //BorderWavefrom + SendData(0x01); + + SendCommand(0x18); + SendData(0x80); + + SendCommand(0x22); // //Load Temperature and waveform setting. + SendData(0XB1); + SendCommand(0x20); + + SendCommand(0x4E); // set RAM x address count to 0; + SendData(0x00); + SendCommand(0x4F); // set RAM y address count to 0X199; + SendData(0xC7); + SendData(0x00); + WaitUntilIdle(); + + SetLut(WF_Full_1IN54); + /* EPD hardware init end */ + + return 0; +} + +// Low Direction +int Epd::LDirInit(void) +{ + /* this calls the peripheral hardware interface, see epdif */ + if (IfInit() != 0) { + return -1; + } + /* EPD hardware init start */ + Reset(); + + WaitUntilIdle(); + SendCommand(0x12); //SWRESET + WaitUntilIdle(); + + SendCommand(0x01); //Driver output control + SendData(0xC7); + SendData(0x00); + SendData(0x00); + + SendCommand(0x11); //data entry mode + SendData(0x03); + + SendCommand(0x44); + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + SendData((0 >> 3) & 0xFF); + SendData((199 >> 3) & 0xFF); + SendCommand(0x45); + SendData(0 & 0xFF); + SendData((0 >> 8) & 0xFF); + SendData(199 & 0xFF); + SendData((199 >> 8) & 0xFF); + + SendCommand(0x3C); //BorderWavefrom + SendData(0x01); + + SendCommand(0x18); + SendData(0x80); + + SendCommand(0x22); // //Load Temperature and waveform setting. + SendData(0XB1); + SendCommand(0x20); + + SendCommand(0x4E); // set RAM x address count to 0; + SendData(0x00); + SendCommand(0x4F); // set RAM y address count to 0X199; + SendData(0xC7); + SendData(0x00); + WaitUntilIdle(); + + SetLut(WF_Full_1IN54); + /* EPD hardware init end */ + + return 0; +} + + +/** + * @brief: module reset. + * often used to awaken the module in deep sleep, + * see Epd::Sleep(); + */ +void Epd::Reset(void) +{ + DigitalWrite(reset_pin, HIGH); + DelayMs(20); + DigitalWrite(reset_pin, LOW); //module reset + DelayMs(5); + DigitalWrite(reset_pin, HIGH); + DelayMs(20); +} + +void Epd::Clear(void) +{ + int w, h; + w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + h = EPD_HEIGHT; + + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + SendCommand(0x26); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + //DISPLAY REFRESH + DisplayFrame(); +} + +void Epd::Display(const unsigned char* frame_buffer) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + if (frame_buffer != NULL) { + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + } + + //DISPLAY REFRESH + DisplayFrame(); +} + +void Epd::DisplayPartBaseImage(const unsigned char* frame_buffer) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + if (frame_buffer != NULL) { + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + + SendCommand(0x26); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + } + + //DISPLAY REFRESH + DisplayFrame(); +} +void Epd::DisplayPartBaseWhiteImage(void) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + + SendCommand(0x26); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(0xff); + } + } + + + //DISPLAY REFRESH + DisplayFrame(); +} + + +void Epd::DisplayPart(const unsigned char* frame_buffer) +{ + int w = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1); + int h = EPD_HEIGHT; + + if (frame_buffer != NULL) { + SendCommand(0x24); + for (int j = 0; j < h; j++) { + for (int i = 0; i < w; i++) { + SendData(pgm_read_byte(&frame_buffer[i + j * w])); + } + } + } + + //DISPLAY REFRESH + DisplayPartFrame(); +} + + +/** + * @brief: private function to specify the memory area for data R/W + */ +void Epd::SetMemoryArea(int x_start, int y_start, int x_end, int y_end) +{ + SendCommand(0x44); + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + SendData((x_start >> 3) & 0xFF); + SendData((x_end >> 3) & 0xFF); + SendCommand(0x45); + SendData(y_start & 0xFF); + SendData((y_start >> 8) & 0xFF); + SendData(y_end & 0xFF); + SendData((y_end >> 8) & 0xFF); +} + +/** + * @brief: private function to specify the start point for data R/W + */ +void Epd::SetMemoryPointer(int x, int y) +{ + SendCommand(0x4e); + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + SendData((x >> 3) & 0xFF); + SendCommand(0x4F); + SendData(y & 0xFF); + SendData((y >> 8) & 0xFF); + WaitUntilIdle(); +} + + +/** + * @brief: update the display + * there are 2 memory areas embedded in the e-paper display + * but once this function is called, + * the the next action of SetFrameMemory or ClearFrame will + * set the other memory area. + */ +void Epd::DisplayFrame(void) +{ + //DISPLAY REFRESH + SendCommand(0x22); + SendData(0xc7); + SendCommand(0x20); + WaitUntilIdle(); +} + +void Epd::DisplayPartFrame(void) +{ + SendCommand(0x22); + SendData(0xcF); + SendCommand(0x20); + WaitUntilIdle(); +} + + +void Epd::SetFrameMemory( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height +) +{ + int x_end; + int y_end; + + DigitalWrite(reset_pin, LOW); //module reset + DelayMs(2); + DigitalWrite(reset_pin, HIGH); + DelayMs(2); + SendCommand(0x3c); + SendData(0x80); + + if ( + image_buffer == NULL || + x < 0 || image_width < 0 || + y < 0 || image_height < 0 + ) { + return; + } + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + x &= 0xF8; + image_width &= 0xF8; + if (x + image_width >= this->width) { + x_end = this->width - 1; + } else { + x_end = x + image_width - 1; + } + if (y + image_height >= this->height) { + y_end = this->height - 1; + } else { + y_end = y + image_height - 1; + } + SetMemoryArea(x, y, x_end, y_end); + SetMemoryPointer(x, y); + SendCommand(0x24); + /* send the image data */ + for (int j = 0; j < y_end - y + 1; j++) { + for (int i = 0; i < (x_end - x + 1) / 8; i++) { + SendData(image_buffer[i + j * (image_width / 8)]); + } + } +} + +void Epd::SetFrameMemoryPartial( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height +) +{ + int x_end; + int y_end; + + DigitalWrite(reset_pin, LOW); //module reset + DelayMs(2); + DigitalWrite(reset_pin, HIGH); + DelayMs(2); + + SetLut(WF_PARTIAL_1IN54_0); + SendCommand(0x37); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x40); + SendData(0x00); + SendData(0x00); + SendData(0x00); + SendData(0x00); + + SendCommand(0x3c); + SendData(0x80); + + SendCommand(0x22); + SendData(0xc0); + SendCommand(0x20); + WaitUntilIdle(); + + if ( + image_buffer == NULL || + x < 0 || image_width < 0 || + y < 0 || image_height < 0 + ) { + return; + } + /* x point must be the multiple of 8 or the last 3 bits will be ignored */ + x &= 0xF8; + image_width &= 0xF8; + if (x + image_width >= this->width) { + x_end = this->width - 1; + } else { + x_end = x + image_width - 1; + } + if (y + image_height >= this->height) { + y_end = this->height - 1; + } else { + y_end = y + image_height - 1; + } + SetMemoryArea(x, y, x_end, y_end); + SetMemoryPointer(x, y); + SendCommand(0x24); + /* send the image data */ + for (int j = 0; j < y_end - y + 1; j++) { + for (int i = 0; i < (x_end - x + 1) / 8; i++) { + SendData(image_buffer[i + j * (image_width / 8)]); + } + } +} + +/** + * @brief: After this command is transmitted, the chip would enter the + * deep-sleep mode to save power. + * The deep sleep mode would return to standby by hardware reset. + * The only one parameter is a check code, the command would be + * executed if check code = 0xA5. + * You can use Epd::Init() to awaken + */ +void Epd::Sleep() +{ + SendCommand(0x10); //enter deep sleep + SendData(0x01); + DelayMs(200); + + DigitalWrite(reset_pin, LOW); +} + +/* END OF FILE */ diff --git a/voting_device/epd1in54_V2/epd1in54_V2.h b/voting_device/epd1in54_V2/epd1in54_V2.h new file mode 100644 index 0000000..42682c1 --- /dev/null +++ b/voting_device/epd1in54_V2/epd1in54_V2.h @@ -0,0 +1,92 @@ +/***************************************************************************** +* | File : epd1in54_V2.h +* | Author : Waveshare team +* | Function : 1.54inch e-paper V2 +* | Info : +*---------------- +* | This version: V1.0 +* | Date : 2019-06-24 +* | Info : +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documnetation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +******************************************************************************/ + +#ifndef epd1in54_V2_H +#define epd1in54_V2_H + +#include "epdif.h" + +// Display resolution +#define EPD_WIDTH 200 +#define EPD_HEIGHT 200 + +class Epd : EpdIf +{ +public: + unsigned long width; + unsigned long height; + + Epd(); + ~Epd(); + // int Init(void); + int LDirInit(void); + int HDirInit(void); + void SendCommand(unsigned char command); + void SendData(unsigned char data); + void WaitUntilIdle(void); + void Reset(void); + void Clear(void); + void Display(const unsigned char* frame_buffer); + void DisplayPartBaseImage(const unsigned char* frame_buffer); + void DisplayPartBaseWhiteImage(void); + void DisplayPart(const unsigned char* frame_buffer); + void SetFrameMemory( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height + ); + void SetFrameMemoryPartial( + const unsigned char* image_buffer, + int x, + int y, + int image_width, + int image_height + ); + void DisplayFrame(void); + void DisplayPartFrame(void); + + void Sleep(void); +private: + unsigned int reset_pin; + unsigned int dc_pin; + unsigned int cs_pin; + unsigned int busy_pin; + + void Lut(unsigned char* lut); + void SetLut(unsigned char* lut); + void SetMemoryArea(int x_start, int y_start, int x_end, int y_end); + void SetMemoryPointer(int x, int y); +}; + +#endif /* EPD1IN54B_H */ + +/* END OF FILE */ diff --git a/voting_device/epd1in54_V2/epdif.cpp b/voting_device/epd1in54_V2/epdif.cpp new file mode 100644 index 0000000..b1f89c9 --- /dev/null +++ b/voting_device/epd1in54_V2/epdif.cpp @@ -0,0 +1,68 @@ +/** + * @filename : epdif.cpp + * @brief : Implements EPD interface functions + * Users have to implement all the functions in epdif.cpp + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare August 10 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "epdif.h" +#include + +EpdIf::EpdIf() { +}; + +EpdIf::~EpdIf() { +}; + +void EpdIf::DigitalWrite(int pin, int value) { + digitalWrite(pin, value); +} + +int EpdIf::DigitalRead(int pin) { + return digitalRead(pin); +} + +void EpdIf::DelayMs(unsigned int delaytime) { + delay(delaytime); +} + +void EpdIf::SpiTransfer(unsigned char data) { + digitalWrite(CS_PIN, LOW); + SPI.transfer(data); + digitalWrite(CS_PIN, HIGH); +} + +int EpdIf::IfInit(void) { + pinMode(CS_PIN, OUTPUT); + pinMode(RST_PIN, OUTPUT); + pinMode(DC_PIN, OUTPUT); + pinMode(BUSY_PIN, INPUT); + + pinMode(PWR_PIN, OUTPUT); + DigitalWrite(PWR_PIN, 1); + + SPI.begin(); + SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); + return 0; +} + diff --git a/voting_device/epd1in54_V2/epdif.h b/voting_device/epd1in54_V2/epdif.h new file mode 100644 index 0000000..be06092 --- /dev/null +++ b/voting_device/epd1in54_V2/epdif.h @@ -0,0 +1,52 @@ +/** + * @filename : epdif.h + * @brief : Header file of epdif.cpp providing EPD interface functions + * Users have to implement all the functions in epdif.cpp + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare August 10 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef EPDIF_H +#define EPDIF_H + +#include + +// Pin definition +#define RST_PIN D2 +#define DC_PIN D0 +#define CS_PIN D8 +#define BUSY_PIN D7 +#define PWR_PIN D5 + +class EpdIf { +public: + EpdIf(void); + ~EpdIf(void); + + static int IfInit(void); + static void DigitalWrite(int pin, int value); + static int DigitalRead(int pin); + static void DelayMs(unsigned int delaytime); + static void SpiTransfer(unsigned char data); +}; + +#endif diff --git a/voting_device/epd1in54_V2/epdpaint.cpp b/voting_device/epd1in54_V2/epdpaint.cpp new file mode 100644 index 0000000..1dfe0d7 --- /dev/null +++ b/voting_device/epd1in54_V2/epdpaint.cpp @@ -0,0 +1,319 @@ +/** + * @filename : epdpaint.cpp + * @brief : Paint tools + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare September 9 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include "epdpaint.h" + +Paint::Paint(unsigned char* image, int width, int height) { + this->rotate = ROTATE_0; + this->image = image; + /* 1 byte = 8 pixels, so the width should be the multiple of 8 */ + this->width = width % 8 ? width + 8 - (width % 8) : width; + this->height = height; +} + +Paint::~Paint() { +} + +/** + * @brief: clear the image + */ +void Paint::Clear(int colored) { + for (int x = 0; x < this->width; x++) { + for (int y = 0; y < this->height; y++) { + DrawAbsolutePixel(x, y, colored); + } + } +} + +/** + * @brief: this draws a pixel by absolute coordinates. + * this function won't be affected by the rotate parameter. + */ +void Paint::DrawAbsolutePixel(int x, int y, int colored) { + if (x < 0 || x >= this->width || y < 0 || y >= this->height) { + return; + } + if (IF_INVERT_COLOR) { + if (colored) { + image[(x + y * this->width) / 8] |= 0x80 >> (x % 8); + } else { + image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8)); + } + } else { + if (colored) { + image[(x + y * this->width) / 8] &= ~(0x80 >> (x % 8)); + } else { + image[(x + y * this->width) / 8] |= 0x80 >> (x % 8); + } + } +} + +/** + * @brief: Getters and Setters + */ +unsigned char* Paint::GetImage(void) { + return this->image; +} + +int Paint::GetWidth(void) { + return this->width; +} + +void Paint::SetWidth(int width) { + this->width = width % 8 ? width + 8 - (width % 8) : width; +} + +int Paint::GetHeight(void) { + return this->height; +} + +void Paint::SetHeight(int height) { + this->height = height; +} + +int Paint::GetRotate(void) { + return this->rotate; +} + +void Paint::SetRotate(int rotate){ + this->rotate = rotate; +} + +/** + * @brief: this draws a pixel by the coordinates + */ +void Paint::DrawPixel(int x, int y, int colored) { + int point_temp; + if (this->rotate == ROTATE_0) { + if(x < 0 || x >= this->width || y < 0 || y >= this->height) { + return; + } + DrawAbsolutePixel(x, y, colored); + } else if (this->rotate == ROTATE_90) { + if(x < 0 || x >= this->height || y < 0 || y >= this->width) { + return; + } + point_temp = x; + x = this->width - y; + y = point_temp; + DrawAbsolutePixel(x, y, colored); + } else if (this->rotate == ROTATE_180) { + if(x < 0 || x >= this->width || y < 0 || y >= this->height) { + return; + } + x = this->width - x; + y = this->height - y; + DrawAbsolutePixel(x, y, colored); + } else if (this->rotate == ROTATE_270) { + if(x < 0 || x >= this->height || y < 0 || y >= this->width) { + return; + } + point_temp = x; + x = y; + y = this->height - point_temp; + DrawAbsolutePixel(x, y, colored); + } +} + +/** + * @brief: this draws a charactor on the frame buffer but not refresh + */ +void Paint::DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored) { + int i, j; + unsigned int char_offset = (ascii_char - ' ') * font->Height * (font->Width / 8 + (font->Width % 8 ? 1 : 0)); + const unsigned char* ptr = &font->table[char_offset]; + + for (j = 0; j < font->Height; j++) { + for (i = 0; i < font->Width; i++) { + if (pgm_read_byte(ptr) & (0x80 >> (i % 8))) { + DrawPixel(x + i, y + j, colored); + } + if (i % 8 == 7) { + ptr++; + } + } + if (font->Width % 8 != 0) { + ptr++; + } + } +} + +/** +* @brief: this displays a string on the frame buffer but not refresh +*/ +void Paint::DrawStringAt(int x, int y, const char* text, sFONT* font, int colored) { + const char* p_text = text; + unsigned int counter = 0; + int refcolumn = x; + + /* Send the string character by character on EPD */ + while (*p_text != 0) { + /* Display one character on EPD */ + DrawCharAt(refcolumn, y, *p_text, font, colored); + /* Decrement the column position by 16 */ + refcolumn += font->Width; + /* Point on the next character */ + p_text++; + counter++; + } +} + +/** +* @brief: this draws a line on the frame buffer +*/ +void Paint::DrawLine(int x0, int y0, int x1, int y1, int colored) { + /* Bresenham algorithm */ + int dx = x1 - x0 >= 0 ? x1 - x0 : x0 - x1; + int sx = x0 < x1 ? 1 : -1; + int dy = y1 - y0 <= 0 ? y1 - y0 : y0 - y1; + int sy = y0 < y1 ? 1 : -1; + int err = dx + dy; + + while((x0 != x1) && (y0 != y1)) { + DrawPixel(x0, y0 , colored); + if (2 * err >= dy) { + err += dy; + x0 += sx; + } + if (2 * err <= dx) { + err += dx; + y0 += sy; + } + } +} + +/** +* @brief: this draws a horizontal line on the frame buffer +*/ +void Paint::DrawHorizontalLine(int x, int y, int line_width, int colored) { + int i; + for (i = x; i < x + line_width; i++) { + DrawPixel(i, y, colored); + } +} + +/** +* @brief: this draws a vertical line on the frame buffer +*/ +void Paint::DrawVerticalLine(int x, int y, int line_height, int colored) { + int i; + for (i = y; i < y + line_height; i++) { + DrawPixel(x, i, colored); + } +} + +/** +* @brief: this draws a rectangle +*/ +void Paint::DrawRectangle(int x0, int y0, int x1, int y1, int colored) { + int min_x, min_y, max_x, max_y; + min_x = x1 > x0 ? x0 : x1; + max_x = x1 > x0 ? x1 : x0; + min_y = y1 > y0 ? y0 : y1; + max_y = y1 > y0 ? y1 : y0; + + DrawHorizontalLine(min_x, min_y, max_x - min_x + 1, colored); + DrawHorizontalLine(min_x, max_y, max_x - min_x + 1, colored); + DrawVerticalLine(min_x, min_y, max_y - min_y + 1, colored); + DrawVerticalLine(max_x, min_y, max_y - min_y + 1, colored); +} + +/** +* @brief: this draws a filled rectangle +*/ +void Paint::DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored) { + int min_x, min_y, max_x, max_y; + int i; + min_x = x1 > x0 ? x0 : x1; + max_x = x1 > x0 ? x1 : x0; + min_y = y1 > y0 ? y0 : y1; + max_y = y1 > y0 ? y1 : y0; + + for (i = min_x; i <= max_x; i++) { + DrawVerticalLine(i, min_y, max_y - min_y + 1, colored); + } +} + +/** +* @brief: this draws a circle +*/ +void Paint::DrawCircle(int x, int y, int radius, int colored) { + /* Bresenham algorithm */ + int x_pos = -radius; + int y_pos = 0; + int err = 2 - 2 * radius; + int e2; + + do { + DrawPixel(x - x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y - y_pos, colored); + DrawPixel(x - x_pos, y - y_pos, colored); + e2 = err; + if (e2 <= y_pos) { + err += ++y_pos * 2 + 1; + if(-x_pos == y_pos && e2 <= x_pos) { + e2 = 0; + } + } + if (e2 > x_pos) { + err += ++x_pos * 2 + 1; + } + } while (x_pos <= 0); +} + +/** +* @brief: this draws a filled circle +*/ +void Paint::DrawFilledCircle(int x, int y, int radius, int colored) { + /* Bresenham algorithm */ + int x_pos = -radius; + int y_pos = 0; + int err = 2 - 2 * radius; + int e2; + + do { + DrawPixel(x - x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y + y_pos, colored); + DrawPixel(x + x_pos, y - y_pos, colored); + DrawPixel(x - x_pos, y - y_pos, colored); + DrawHorizontalLine(x + x_pos, y + y_pos, 2 * (-x_pos) + 1, colored); + DrawHorizontalLine(x + x_pos, y - y_pos, 2 * (-x_pos) + 1, colored); + e2 = err; + if (e2 <= y_pos) { + err += ++y_pos * 2 + 1; + if(-x_pos == y_pos && e2 <= x_pos) { + e2 = 0; + } + } + if(e2 > x_pos) { + err += ++x_pos * 2 + 1; + } + } while(x_pos <= 0); +} + +/* END OF FILE */ diff --git a/voting_device/epd1in54_V2/epdpaint.h b/voting_device/epd1in54_V2/epdpaint.h new file mode 100644 index 0000000..17b366f --- /dev/null +++ b/voting_device/epd1in54_V2/epdpaint.h @@ -0,0 +1,75 @@ +/** + * @filename : epdpaint.h + * @brief : Header file for epdpaint.cpp + * @author : Yehui from Waveshare + * + * Copyright (C) Waveshare July 28 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef EPDPAINT_H +#define EPDPAINT_H + +// Display orientation +#define ROTATE_0 0 +#define ROTATE_90 1 +#define ROTATE_180 2 +#define ROTATE_270 3 + +// Color inverse. 1 or 0 = set or reset a bit if set a colored pixel +#define IF_INVERT_COLOR 1 + +#include "fonts.h" + +class Paint { +public: + Paint(unsigned char* image, int width, int height); + ~Paint(); + void Clear(int colored); + int GetWidth(void); + void SetWidth(int width); + int GetHeight(void); + void SetHeight(int height); + int GetRotate(void); + void SetRotate(int rotate); + unsigned char* GetImage(void); + void DrawAbsolutePixel(int x, int y, int colored); + void DrawPixel(int x, int y, int colored); + void DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored); + void DrawStringAt(int x, int y, const char* text, sFONT* font, int colored); + void DrawLine(int x0, int y0, int x1, int y1, int colored); + void DrawHorizontalLine(int x, int y, int width, int colored); + void DrawVerticalLine(int x, int y, int height, int colored); + void DrawRectangle(int x0, int y0, int x1, int y1, int colored); + void DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored); + void DrawCircle(int x, int y, int radius, int colored); + void DrawFilledCircle(int x, int y, int radius, int colored); + +private: + unsigned char* image; + int width; + int height; + int rotate; +}; + +#endif + +/* END OF FILE */ + diff --git a/voting_device/epd1in54_V2/font12.c b/voting_device/epd1in54_V2/font12.c new file mode 100644 index 0000000..9963fe3 --- /dev/null +++ b/voting_device/epd1in54_V2/font12.c @@ -0,0 +1,1385 @@ +/** + ****************************************************************************** + * @file Font12.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// +// Font data for Courier New 12pt +// + +const uint8_t Font12_Table[] PROGMEM = +{ + // @0 ' ' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @12 '!' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @24 '"' (7 pixels wide) + 0x00, // + 0x6C, // ## ## + 0x48, // # # + 0x48, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @36 '#' (7 pixels wide) + 0x00, // + 0x14, // # # + 0x14, // # # + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + + // @48 '$' (7 pixels wide) + 0x00, // + 0x10, // # + 0x38, // ### + 0x40, // # + 0x40, // # + 0x38, // ### + 0x48, // # # + 0x70, // ### + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @60 '%' (7 pixels wide) + 0x00, // + 0x20, // # + 0x50, // # # + 0x20, // # + 0x0C, // ## + 0x70, // ### + 0x08, // # + 0x14, // # # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + + // @72 '&' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x20, // # + 0x20, // # + 0x54, // # # # + 0x48, // # # + 0x34, // ## # + 0x00, // + 0x00, // + 0x00, // + + // @84 ''' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @96 '(' (7 pixels wide) + 0x00, // + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x00, // + + // @108 ')' (7 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @120 '*' (7 pixels wide) + 0x00, // + 0x10, // # + 0x7C, // ##### + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @132 '+' (7 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0xFE, // ####### + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @144 ',' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x10, // # + 0x30, // ## + 0x20, // # + 0x00, // + + // @156 '-' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @168 '.' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @180 '/' (7 pixels wide) + 0x00, // + 0x04, // # + 0x04, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @192 '0' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @204 '1' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @216 '2' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @228 '3' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x18, // ## + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @240 '4' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x14, // # # + 0x14, // # # + 0x24, // # # + 0x44, // # # + 0x7E, // ###### + 0x04, // # + 0x0E, // ### + 0x00, // + 0x00, // + 0x00, // + + // @252 '5' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x20, // # + 0x20, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @264 '6' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x40, // # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @276 '7' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @288 '8' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @300 '9' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x08, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @312 ':' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @324 ';' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x18, // ## + 0x00, // + 0x00, // + 0x18, // ## + 0x30, // ## + 0x20, // # + 0x00, // + 0x00, // + + // @336 '<' (7 pixels wide) + 0x00, // + 0x00, // + 0x0C, // ## + 0x10, // # + 0x60, // ## + 0x80, // # + 0x60, // ## + 0x10, // # + 0x0C, // ## + 0x00, // + 0x00, // + 0x00, // + + // @348 '=' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @360 '>' (7 pixels wide) + 0x00, // + 0x00, // + 0xC0, // ## + 0x20, // # + 0x18, // ## + 0x04, // # + 0x18, // ## + 0x20, // # + 0xC0, // ## + 0x00, // + 0x00, // + 0x00, // + + // @372 '?' (7 pixels wide) + 0x00, // + 0x00, // + 0x18, // ## + 0x24, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x00, // + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @384 '@' (7 pixels wide) + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @396 'A' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x7C, // ##### + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @408 'B' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @420 'C' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @432 'D' (7 pixels wide) + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + 0x00, // + + // @444 'E' (7 pixels wide) + 0x00, // + 0xFC, // ###### + 0x44, // # # + 0x50, // # # + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x44, // # # + 0xFC, // ###### + 0x00, // + 0x00, // + 0x00, // + + // @456 'F' (7 pixels wide) + 0x00, // + 0x7E, // ###### + 0x22, // # # + 0x28, // # # + 0x38, // ### + 0x28, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @468 'G' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x4E, // # ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @480 'H' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x7C, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @492 'I' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @504 'J' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @516 'K' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x48, // # # + 0x50, // # # + 0x70, // ### + 0x48, // # # + 0x44, // # # + 0xE6, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @528 'L' (7 pixels wide) + 0x00, // + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x24, // # # + 0x24, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @540 'M' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x6C, // ## ## + 0x6C, // ## ## + 0x54, // # # # + 0x54, // # # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @552 'N' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x64, // ## # + 0x64, // ## # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0xEC, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @564 'O' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @576 'P' (7 pixels wide) + 0x00, // + 0x78, // #### + 0x24, // # # + 0x24, // # # + 0x24, // # # + 0x38, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @588 'Q' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x1C, // ### + 0x00, // + 0x00, // + + // @600 'R' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x48, // # # + 0x44, // # # + 0xE2, // ### # + 0x00, // + 0x00, // + 0x00, // + + // @612 'S' (7 pixels wide) + 0x00, // + 0x34, // ## # + 0x4C, // # ## + 0x40, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x64, // ## # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + + // @624 'T' (7 pixels wide) + 0x00, // + 0xFE, // ####### + 0x92, // # # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @636 'U' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @648 'V' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @660 'W' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @672 'X' (7 pixels wide) + 0x00, // + 0xC6, // ## ## + 0x44, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0xC6, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @684 'Y' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @696 'Z' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @708 '[' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x38, // ### + 0x00, // + + // @720 '\' (7 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x00, // + 0x00, // + + // @732 ']' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x38, // ### + 0x00, // + + // @744 '^' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @756 '_' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xFE, // ####### + + // @768 '`' (7 pixels wide) + 0x00, // + 0x10, // # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @780 'a' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x3C, // #### + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @792 'b' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @804 'c' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @816 'd' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x04, // # + 0x34, // ## # + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @828 'e' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x7C, // ##### + 0x40, // # + 0x40, // # + 0x3C, // #### + 0x00, // + 0x00, // + 0x00, // + + // @840 'f' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @852 'g' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x38, // ### + 0x00, // + + // @864 'h' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @876 'i' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @888 'j' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x78, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x70, // ### + 0x00, // + + // @900 'k' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x5C, // # ### + 0x48, // # # + 0x70, // ### + 0x50, // # # + 0x48, // # # + 0xDC, // ## ### + 0x00, // + 0x00, // + 0x00, // + + // @912 'l' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @924 'm' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xE8, // ### # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0xFE, // ####### + 0x00, // + 0x00, // + 0x00, // + + // @936 'n' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @948 'o' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @960 'p' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x40, // # + 0xE0, // ### + 0x00, // + + // @972 'q' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x0E, // ### + 0x00, // + + // @984 'r' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x6C, // ## ## + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @996 's' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x38, // ### + 0x04, // # + 0x44, // # # + 0x78, // #### + 0x00, // + 0x00, // + 0x00, // + + // @1008 't' (7 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x22, // # # + 0x1C, // ### + 0x00, // + 0x00, // + 0x00, // + + // @1020 'u' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x36, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1032 'v' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @1044 'w' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @1056 'x' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0xCC, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1068 'y' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x24, // # # + 0x28, // # # + 0x18, // ## + 0x10, // # + 0x10, // # + 0x78, // #### + 0x00, // + + // @1080 'z' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @1092 '{' (7 pixels wide) + 0x00, // + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x00, // + + // @1104 '|' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @1116 '}' (7 pixels wide) + 0x00, // + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x00, // + + // @1128 '~' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x24, // # # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font12 = { + Font12_Table, + 7, /* Width */ + 12, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/voting_device/epd1in54_V2/font16.c b/voting_device/epd1in54_V2/font16.c new file mode 100644 index 0000000..a36db6e --- /dev/null +++ b/voting_device/epd1in54_V2/font16.c @@ -0,0 +1,1765 @@ +/** + ****************************************************************************** + * @file font16.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font16 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// +// Font data for Courier New 12pt +// + +const uint8_t Font16_Table[] PROGMEM = +{ + // @0 ' ' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @32 '!' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @64 '"' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x08, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @96 '#' (11 pixels wide) + 0x00, 0x00, // + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x3F, 0xC0, // ######## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @128 '$' (11 pixels wide) + 0x04, 0x00, // # + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1E, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '%' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x00, // # # + 0x24, 0x00, // # # + 0x18, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x1E, 0x00, // #### + 0x31, 0x80, // ## ## + 0x02, 0x40, // # # + 0x02, 0x40, // # # + 0x01, 0x80, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @192 '&' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x1D, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x33, 0x00, // ## ## + 0x1D, 0x80, // ### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @224 ''' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @256 '(' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0E, 0x00, // ### + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @288 ')' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '*' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x0F, 0x00, // #### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @352 '+' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x3F, 0x80, // ####### + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @384 ',' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + + // @416 '-' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @448 '.' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 '/' (11 pixels wide) + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @512 '0' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @544 '1' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x3E, 0x00, // ##### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @576 '2' (11 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x19, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @608 '3' (11 pixels wide) + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x61, 0x80, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x61, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '4' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0F, 0x00, // #### + 0x0B, 0x00, // # ## + 0x1B, 0x00, // ## ## + 0x13, 0x00, // # ## + 0x33, 0x00, // ## ## + 0x3F, 0x80, // ####### + 0x03, 0x00, // ## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @672 '5' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x11, 0x80, // # ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x21, 0x80, // # ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @704 '6' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1C, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @736 '7' (11 pixels wide) + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x43, 0x00, // # ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @768 '8' (11 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '9' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x3C, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @832 ':' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @864 ';' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @896 '<' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @928 '=' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '>' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x60, 0x00, // ## + 0x18, 0x00, // ## + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0xC0, // ## + 0x03, 0x00, // ## + 0x04, 0x00, // # + 0x18, 0x00, // ## + 0x60, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @992 '?' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x01, 0x80, // ## + 0x07, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1024 '@' (11 pixels wide) + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x11, 0x00, // # # + 0x21, 0x00, // # # + 0x21, 0x00, // # # + 0x27, 0x00, // # ### + 0x29, 0x00, // # # # + 0x29, 0x00, // # # # + 0x27, 0x00, // # ### + 0x20, 0x00, // # + 0x11, 0x00, // # # + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1056 'A' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x0F, 0x00, // #### + 0x09, 0x00, // # # + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x79, 0xE0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1088 'B' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 'C' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x40, // ##### # + 0x30, 0xC0, // ## ## + 0x60, 0x40, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x60, 0x40, // ## # + 0x30, 0x80, // ## # + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1152 'D' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1184 'E' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x80, // ## # + 0x30, 0x80, // ## # + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1216 'F' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xC0, // ######### + 0x30, 0x40, // ## # + 0x30, 0x40, // ## # + 0x32, 0x00, // ## # + 0x3E, 0x00, // ##### + 0x32, 0x00, // ## # + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1248 'G' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x00, // ## + 0x67, 0xC0, // ## ##### + 0x61, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 'H' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x80, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1312 'I' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1344 'J' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x63, 0x00, // ## ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1376 'K' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x33, 0x00, // ## ## + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x79, 0xC0, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1408 'L' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0x00, // ###### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x18, 0x40, // ## # + 0x7F, 0xC0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'M' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xE0, 0xE0, // ### ### + 0x60, 0xC0, // ## ## + 0x71, 0xC0, // ### ### + 0x7B, 0xC0, // #### #### + 0x6A, 0xC0, // ## # # ## + 0x6E, 0xC0, // ## ### ## + 0x64, 0xC0, // ## # ## + 0x60, 0xC0, // ## ## + 0xFB, 0xE0, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1472 'N' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0xC0, // ### #### + 0x31, 0x80, // ## ## + 0x39, 0x80, // ### ## + 0x3D, 0x80, // #### ## + 0x35, 0x80, // ## # ## + 0x37, 0x80, // ## #### + 0x33, 0x80, // ## ### + 0x31, 0x80, // ## ## + 0x79, 0x80, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1504 'O' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1536 'P' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7E, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1568 'Q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x0C, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'R' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x00, // ####### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3E, 0x00, // ##### + 0x33, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7C, 0xE0, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1632 'S' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1664 'T' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x4C, 0x80, // # ## # + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1696 'U' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1728 'V' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0A, 0x00, // # # + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'W' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0xFB, 0xE0, // ##### ##### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x6E, 0xC0, // ## ### ## + 0x2A, 0x80, // # # # # + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1792 'X' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1824 'Y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1856 'Z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x23, 0x00, // # ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x0C, 0x00, // ## + 0x18, 0x80, // ## # + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1888 '[' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 '\' (11 pixels wide) + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1952 ']' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1984 '^' (11 pixels wide) + 0x04, 0x00, // # + 0x0A, 0x00, // # # + 0x0A, 0x00, // # # + 0x11, 0x00, // # # + 0x20, 0x80, // # # + 0x20, 0x80, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2016 '_' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xE0, // ########### + + // @2048 '`' (11 pixels wide) + 0x08, 0x00, // # + 0x04, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'a' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2112 'b' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x77, 0x00, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2144 'c' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1E, 0x80, // #### # + 0x31, 0x80, // ## ## + 0x60, 0x80, // ## # + 0x60, 0x00, // ## + 0x60, 0x80, // ## # + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2176 'd' (11 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1D, 0x80, // ### ## + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2208 'e' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x7F, 0xC0, // ######### + 0x60, 0x00, // ## + 0x30, 0xC0, // ## ## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'f' (11 pixels wide) + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2272 'g' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2304 'h' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x00, // ## ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2336 'i' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2368 'j' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 'k' (11 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x36, 0x00, // ## ## + 0x3C, 0x00, // #### + 0x3C, 0x00, // #### + 0x36, 0x00, // ## ## + 0x33, 0x00, // ## ## + 0x77, 0xC0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2432 'l' (11 pixels wide) + 0x00, 0x00, // + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2464 'm' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x36, 0xC0, // ## ## ## + 0x76, 0xE0, // ### ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2496 'n' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2528 'o' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x31, 0x80, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x60, 0xC0, // ## ## + 0x31, 0x80, // ## ## + 0x1F, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2560 'p' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x00, // ### ### + 0x39, 0x80, // ### ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x39, 0x80, // ### ## + 0x37, 0x00, // ## ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2592 'q' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1D, 0xC0, // ### ### + 0x33, 0x80, // ## ### + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x61, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0x80, // ### ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2624 'r' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0x80, // #### ### + 0x1C, 0xC0, // ### ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2656 's' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x31, 0x80, // ## ## + 0x3C, 0x00, // #### + 0x1F, 0x00, // ##### + 0x03, 0x80, // ### + 0x31, 0x80, // ## ## + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2688 't' (11 pixels wide) + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x7F, 0x00, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x80, // ## # + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'u' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x73, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x33, 0x80, // ## ### + 0x1D, 0xC0, // ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2752 'v' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x31, 0x80, // ## ## + 0x31, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2784 'w' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xF1, 0xE0, // #### #### + 0x60, 0xC0, // ## ## + 0x64, 0xC0, // ## # ## + 0x6E, 0xC0, // ## ### ## + 0x3B, 0x80, // ### ### + 0x3B, 0x80, // ### ### + 0x31, 0x80, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2816 'x' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7B, 0xC0, // #### #### + 0x1B, 0x00, // ## ## + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x0E, 0x00, // ### + 0x1B, 0x00, // ## ## + 0x7B, 0xC0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2848 'y' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x79, 0xE0, // #### #### + 0x30, 0xC0, // ## ## + 0x19, 0x80, // ## ## + 0x19, 0x80, // ## ## + 0x0B, 0x00, // # ## + 0x0F, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'z' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x21, 0x80, // # ## + 0x03, 0x00, // ## + 0x0E, 0x00, // ### + 0x18, 0x00, // ## + 0x30, 0x80, // ## # + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2912 '{' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2944 '|' (11 pixels wide) + 0x00, 0x00, // + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2976 '}' (11 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3008 '~' (11 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x18, 0x00, // ## + 0x24, 0x80, // # # # + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + +sFONT Font16 = { + Font16_Table, + 11, /* Width */ + 16, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/voting_device/epd1in54_V2/font20.c b/voting_device/epd1in54_V2/font20.c new file mode 100644 index 0000000..49c8e14 --- /dev/null +++ b/voting_device/epd1in54_V2/font20.c @@ -0,0 +1,2143 @@ +/** + ****************************************************************************** + * @file font20.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font20 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// Character bitmaps for Courier New 15pt +const uint8_t Font20_Table[] PROGMEM = +{ + // @0 ' ' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @40 '!' (14 pixels wide) + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x02, 0x00, // # + 0x02, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @80 '"' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x1C, 0xE0, // ### ### + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x08, 0x40, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @120 '#' (14 pixels wide) + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @160 '$' (14 pixels wide) + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0xE0, // ###### + 0x0F, 0xE0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x00, // ## + 0x1F, 0x00, // ##### + 0x0F, 0xC0, // ###### + 0x00, 0xE0, // ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xC0, // ####### + 0x1F, 0x80, // ###### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @200 '%' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x22, 0x00, // # # + 0x1C, 0x60, // ### ## + 0x01, 0xE0, // #### + 0x0F, 0x80, // ##### + 0x3C, 0x00, // #### + 0x31, 0xC0, // ## ### + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x02, 0x20, // # # + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @240 '&' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x0F, 0x30, // #### ## + 0x1F, 0xF0, // ######### + 0x19, 0xE0, // ## #### + 0x18, 0xC0, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @280 ''' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x01, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @320 '(' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @360 ')' (14 pixels wide) + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @400 '*' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1B, 0x60, // ## ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x0C, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @440 '+' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @480 ',' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @520 '-' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @560 '.' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @600 '/' (14 pixels wide) + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @640 '0' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @680 '1' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @720 '2' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @760 '3' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x3F, 0xC0, // ######## + 0x30, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0xE0, // ### + 0x07, 0xC0, // ##### + 0x07, 0xC0, // ##### + 0x00, 0xE0, // ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x60, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x3F, 0x80, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @800 '4' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0xC0, // ## ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x00, 0xC0, // ## + 0x03, 0xE0, // ##### + 0x03, 0xE0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @840 '5' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1F, 0x80, // ###### + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @880 '6' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xE0, // ##### + 0x0F, 0xE0, // ####### + 0x1E, 0x00, // #### + 0x18, 0x00, // ## + 0x38, 0x00, // ### + 0x37, 0x80, // ## #### + 0x3F, 0xC0, // ######## + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @920 '7' (14 pixels wide) + 0x00, 0x00, // + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x30, 0x60, // ## ## + 0x00, 0x60, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @960 '8' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x38, 0xE0, // ### ### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xC0, // ####### + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1000 '9' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x1F, 0xC0, // ####### + 0x38, 0xC0, // ### ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x38, 0xE0, // ### ### + 0x1F, 0xE0, // ######## + 0x0F, 0x60, // #### ## + 0x00, 0xE0, // ### + 0x00, 0xC0, // ## + 0x03, 0xC0, // #### + 0x3F, 0x80, // ####### + 0x3E, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1040 ':' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x03, 0x80, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1080 ';' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x04, 0x00, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1120 '<' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x30, // ## + 0x00, 0xF0, // #### + 0x03, 0xC0, // #### + 0x07, 0x00, // ### + 0x1C, 0x00, // ### + 0x78, 0x00, // #### + 0x1C, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0xC0, // #### + 0x00, 0xF0, // #### + 0x00, 0x30, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1160 '=' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0xF0, // ########### + 0x7F, 0xF0, // ########### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1200 '>' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x30, 0x00, // ## + 0x3C, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x80, // ### + 0x00, 0xE0, // ### + 0x00, 0x78, // #### + 0x00, 0xE0, // ### + 0x03, 0x80, // ### + 0x0F, 0x00, // #### + 0x3C, 0x00, // #### + 0x30, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1240 '?' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0x80, // ##### + 0x1F, 0xC0, // ####### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x00, 0x60, // ## + 0x01, 0xC0, // ### + 0x03, 0x80, // ### + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1280 '@' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x80, // ### + 0x0C, 0x80, // ## # + 0x08, 0x40, // # # + 0x10, 0x40, // # # + 0x10, 0x40, // # # + 0x11, 0xC0, // # ### + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x12, 0x40, // # # # + 0x11, 0xC0, // # ### + 0x10, 0x00, // # + 0x08, 0x00, // # + 0x08, 0x40, // # # + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1320 'A' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x03, 0x80, // ### + 0x06, 0xC0, // ## ## + 0x06, 0xC0, // ## ## + 0x0C, 0xC0, // ## ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x30, 0x30, // ## ## + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1360 'B' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x80, // ####### + 0x3F, 0xC0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xC0, // ####### + 0x1F, 0xE0, // ######## + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xE0, // ######### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1400 'C' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x1C, 0x70, // ### ### + 0x38, 0x30, // ### ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1C, 0x70, // ### ### + 0x0F, 0xE0, // ####### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1440 'D' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7F, 0x80, // ######## + 0x7F, 0xC0, // ######### + 0x30, 0xE0, // ## ### + 0x30, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x70, // ## ### + 0x30, 0xE0, // ## ### + 0x7F, 0xC0, // ######### + 0x7F, 0x80, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1480 'E' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1520 'F' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x19, 0x80, // ## ## + 0x1F, 0x80, // ###### + 0x1F, 0x80, // ###### + 0x19, 0x80, // ## ## + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1560 'G' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x31, 0xF8, // ## ###### + 0x31, 0xF8, // ## ###### + 0x30, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1600 'H' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1640 'I' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1680 'J' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x03, 0xF8, // ####### + 0x03, 0xF8, // ####### + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x30, 0xE0, // ## ### + 0x3F, 0xC0, // ######## + 0x0F, 0x80, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1720 'K' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3E, 0xF8, // ##### ##### + 0x3E, 0xF8, // ##### ##### + 0x18, 0xE0, // ## ### + 0x19, 0x80, // ## ## + 0x1B, 0x00, // ## ## + 0x1F, 0x00, // ##### + 0x1D, 0x80, // ### ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0x60, // ## ## + 0x3E, 0x78, // ##### #### + 0x3E, 0x38, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1760 'L' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x0C, 0x30, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1800 'M' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0x78, // #### #### + 0x78, 0x78, // #### #### + 0x38, 0x70, // ### ### + 0x3C, 0xF0, // #### #### + 0x34, 0xB0, // ## # # ## + 0x37, 0xB0, // ## #### ## + 0x37, 0xB0, // ## #### ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x30, 0x30, // ## ## + 0x7C, 0xF8, // ##### ##### + 0x7C, 0xF8, // ##### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1840 'N' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x39, 0xF0, // ### ##### + 0x3D, 0xF0, // #### ##### + 0x1C, 0x60, // ### ## + 0x1E, 0x60, // #### ## + 0x1E, 0x60, // #### ## + 0x1B, 0x60, // ## ## ## + 0x1B, 0x60, // ## ## ## + 0x19, 0xE0, // ## #### + 0x19, 0xE0, // ## #### + 0x18, 0xE0, // ## ### + 0x3E, 0xE0, // ##### ### + 0x3E, 0x60, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1880 'O' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1920 'P' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x3F, 0x00, // ###### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @1960 'Q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x0F, 0xC0, // ###### + 0x1C, 0xE0, // ### ### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x07, 0xB0, // #### ## + 0x0F, 0xF0, // ######## + 0x0C, 0xE0, // ## ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2000 'R' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xC0, // ######## + 0x3F, 0xE0, // ######### + 0x18, 0x70, // ## ### + 0x18, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xE0, // ######## + 0x1F, 0xC0, // ####### + 0x18, 0xE0, // ## ### + 0x18, 0x60, // ## ## + 0x18, 0x70, // ## ### + 0x3E, 0x38, // ##### ### + 0x3E, 0x18, // ##### ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2040 'S' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xB0, // ##### ## + 0x1F, 0xF0, // ######### + 0x38, 0x70, // ### ### + 0x30, 0x30, // ## ## + 0x38, 0x00, // ### + 0x1F, 0x80, // ###### + 0x07, 0xE0, // ###### + 0x00, 0x70, // ### + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x3F, 0xE0, // ######### + 0x37, 0xC0, // ## ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2080 'T' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2120 'U' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1C, 0xE0, // ### ### + 0x0F, 0xC0, // ###### + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2160 'V' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2200 'W' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x7C, 0x7C, // ##### ##### + 0x7C, 0x7C, // ##### ##### + 0x30, 0x18, // ## ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x33, 0x98, // ## ### ## + 0x36, 0xD8, // ## ## ## ## + 0x16, 0xD0, // # ## ## # + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x1C, 0x70, // ### ### + 0x18, 0x30, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2240 'X' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2280 'Y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x18, 0x60, // ## ## + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0xC0, // ###### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2320 'Z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2360 '[' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x03, 0xC0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2400 '\' (14 pixels wide) + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x01, 0x80, // ## + 0x01, 0x80, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0x60, // ## + 0x00, 0x60, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2440 ']' (14 pixels wide) + 0x00, 0x00, // + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x0F, 0x00, // #### + 0x0F, 0x00, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2480 '^' (14 pixels wide) + 0x00, 0x00, // + 0x02, 0x00, // # + 0x07, 0x00, // ### + 0x0D, 0x80, // ## ## + 0x18, 0xC0, // ## ## + 0x30, 0x60, // ## ## + 0x20, 0x20, // # # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2520 '_' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0xFF, 0xFC, // ############## + 0xFF, 0xFC, // ############## + + // @2560 '`' (14 pixels wide) + 0x00, 0x00, // + 0x04, 0x00, // # + 0x03, 0x00, // ## + 0x00, 0x80, // # + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2600 'a' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0F, 0xC0, // ###### + 0x1F, 0xE0, // ######## + 0x00, 0x60, // ## + 0x0F, 0xE0, // ####### + 0x1F, 0xE0, // ######## + 0x38, 0x60, // ### ## + 0x30, 0xE0, // ## ### + 0x3F, 0xF0, // ########## + 0x1F, 0x70, // ##### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2640 'b' (14 pixels wide) + 0x00, 0x00, // + 0x70, 0x00, // ### + 0x70, 0x00, // ### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x37, 0x80, // ## #### + 0x3F, 0xE0, // ######### + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x7F, 0xE0, // ########## + 0x77, 0x80, // ### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2680 'c' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x38, 0x30, // ### ## + 0x1F, 0xF0, // ######### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2720 'd' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x70, // ### + 0x00, 0x70, // ### + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x07, 0xB0, // #### ## + 0x1F, 0xF0, // ######### + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x70, // ### ### + 0x1F, 0xF8, // ########## + 0x07, 0xB8, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2760 'e' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x3F, 0xF0, // ########## + 0x3F, 0xF0, // ########## + 0x30, 0x00, // ## + 0x18, 0x30, // ## ## + 0x1F, 0xF0, // ######### + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2800 'f' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0xF0, // ###### + 0x07, 0xF0, // ####### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2840 'g' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x70, // ### + 0x0F, 0xE0, // ####### + 0x0F, 0xC0, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @2880 'h' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xC0, // ## #### + 0x1F, 0xE0, // ######## + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2920 'i' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @2960 'j' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xC0, // ####### + 0x1F, 0xC0, // ####### + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x00, 0xC0, // ## + 0x01, 0xC0, // ### + 0x3F, 0x80, // ####### + 0x3F, 0x00, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3000 'k' (14 pixels wide) + 0x00, 0x00, // + 0x38, 0x00, // ### + 0x38, 0x00, // ### + 0x18, 0x00, // ## + 0x18, 0x00, // ## + 0x1B, 0xE0, // ## ##### + 0x1B, 0xE0, // ## ##### + 0x1B, 0x00, // ## ## + 0x1E, 0x00, // #### + 0x1E, 0x00, // #### + 0x1B, 0x00, // ## ## + 0x19, 0x80, // ## ## + 0x39, 0xF0, // ### ##### + 0x39, 0xF0, // ### ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3040 'l' (14 pixels wide) + 0x00, 0x00, // + 0x1F, 0x00, // ##### + 0x1F, 0x00, // ##### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3080 'm' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x7E, 0xE0, // ###### ### + 0x7F, 0xF0, // ########### + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x33, 0x30, // ## ## ## + 0x7B, 0xB8, // #### ### ### + 0x7B, 0xB8, // #### ### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3120 'n' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3B, 0xC0, // ### #### + 0x3F, 0xE0, // ######### + 0x1C, 0x60, // ### ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3160 'o' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0x80, // #### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x07, 0x80, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3200 'p' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x77, 0x80, // ### #### + 0x7F, 0xE0, // ########## + 0x38, 0x60, // ### ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x38, 0x60, // ### ## + 0x3F, 0xE0, // ######### + 0x37, 0x80, // ## #### + 0x30, 0x00, // ## + 0x30, 0x00, // ## + 0x7C, 0x00, // ##### + 0x7C, 0x00, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3240 'q' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xB8, // #### ### + 0x1F, 0xF8, // ########## + 0x18, 0x70, // ## ### + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x30, 0x30, // ## ## + 0x18, 0x70, // ## ### + 0x1F, 0xF0, // ######### + 0x07, 0xB0, // #### ## + 0x00, 0x30, // ## + 0x00, 0x30, // ## + 0x00, 0xF8, // ##### + 0x00, 0xF8, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3280 'r' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xE0, // #### ### + 0x3D, 0xF0, // #### ##### + 0x0F, 0x30, // #### ## + 0x0E, 0x00, // ### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xC0, // ######## + 0x3F, 0xC0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3320 's' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x07, 0xE0, // ###### + 0x1F, 0xE0, // ######## + 0x18, 0x60, // ## ## + 0x1E, 0x00, // #### + 0x0F, 0xC0, // ###### + 0x01, 0xE0, // #### + 0x18, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0x80, // ###### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3360 't' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x3F, 0xE0, // ######### + 0x3F, 0xE0, // ######### + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x00, // ## + 0x0C, 0x30, // ## ## + 0x0F, 0xF0, // ######## + 0x07, 0xC0, // ##### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3400 'u' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x38, 0xE0, // ### ### + 0x38, 0xE0, // ### ### + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0x60, // ## ## + 0x18, 0xE0, // ## ### + 0x1F, 0xF0, // ######### + 0x0F, 0x70, // #### ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3440 'v' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0D, 0x80, // ## ## + 0x07, 0x00, // ### + 0x07, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3480 'w' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x32, 0x60, // ## # ## + 0x32, 0x60, // ## # ## + 0x37, 0xE0, // ## ###### + 0x1D, 0xC0, // ### ### + 0x1D, 0xC0, // ### ### + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3520 'x' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x0C, 0xC0, // ## ## + 0x07, 0x80, // #### + 0x03, 0x00, // ## + 0x07, 0x80, // #### + 0x0C, 0xC0, // ## ## + 0x3C, 0xF0, // #### #### + 0x3C, 0xF0, // #### #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3560 'y' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x78, 0xF0, // #### #### + 0x78, 0xF0, // #### #### + 0x30, 0x60, // ## ## + 0x18, 0xC0, // ## ## + 0x18, 0xC0, // ## ## + 0x0D, 0x80, // ## ## + 0x0F, 0x80, // ##### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x00, // ## + 0x7F, 0x00, // ####### + 0x7F, 0x00, // ####### + 0x00, 0x00, // + 0x00, 0x00, // + + // @3600 'z' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x18, 0xC0, // ## ## + 0x01, 0x80, // ## + 0x03, 0x00, // ## + 0x06, 0x00, // ## + 0x0C, 0x60, // ## ## + 0x1F, 0xE0, // ######## + 0x1F, 0xE0, // ######## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3640 '{' (14 pixels wide) + 0x00, 0x00, // + 0x01, 0xC0, // ### + 0x03, 0xC0, // #### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x07, 0x00, // ### + 0x0E, 0x00, // ### + 0x07, 0x00, // ### + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0xC0, // #### + 0x01, 0xC0, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3680 '|' (14 pixels wide) + 0x00, 0x00, // + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x03, 0x00, // ## + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3720 '}' (14 pixels wide) + 0x00, 0x00, // + 0x1C, 0x00, // ### + 0x1E, 0x00, // #### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x07, 0x00, // ### + 0x03, 0x80, // ### + 0x07, 0x00, // ### + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x06, 0x00, // ## + 0x1E, 0x00, // #### + 0x1C, 0x00, // ### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + + // @3760 '~' (14 pixels wide) + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x0E, 0x00, // ### + 0x3F, 0x30, // ###### ## + 0x33, 0xF0, // ## ###### + 0x01, 0xE0, // #### + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // + 0x00, 0x00, // +}; + + +sFONT Font20 = { + Font20_Table, + 14, /* Width */ + 20, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/voting_device/epd1in54_V2/font24.c b/voting_device/epd1in54_V2/font24.c new file mode 100644 index 0000000..735f487 --- /dev/null +++ b/voting_device/epd1in54_V2/font24.c @@ -0,0 +1,2521 @@ +/** + ****************************************************************************** + * @file font24.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text font24 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +const uint8_t Font24_Table [] PROGMEM = +{ + // @0 ' ' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @72 '!' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @144 '"' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x0E, 0x70, 0x00, // ### ### + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x04, 0x20, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @216 '#' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @288 '$' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0xB0, 0x00, // #### ## + 0x0F, 0xF0, 0x00, // ######## + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x1C, 0x00, 0x00, // ### + 0x0F, 0x80, 0x00, // ##### + 0x07, 0xE0, 0x00, // ###### + 0x00, 0xF0, 0x00, // #### + 0x18, 0x30, 0x00, // ## ## + 0x1C, 0x30, 0x00, // ### ## + 0x1C, 0x70, 0x00, // ### ### + 0x1F, 0xE0, 0x00, // ######## + 0x1B, 0xC0, 0x00, // ## #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @360 '%' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x80, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x1C, 0xE0, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF0, 0x00, // ######### + 0x07, 0x38, 0x00, // ### ### + 0x06, 0x18, 0x00, // ## ## + 0x06, 0x18, 0x00, // ## ## + 0x07, 0x38, 0x00, // ### ### + 0x03, 0xF0, 0x00, // ###### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @432 '&' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xF0, 0x00, // ###### + 0x07, 0xF0, 0x00, // ####### + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x07, 0x00, 0x00, // ### + 0x0F, 0x9C, 0x00, // ##### ### + 0x1D, 0xFC, 0x00, // ### ####### + 0x18, 0xF0, 0x00, // ## #### + 0x18, 0x70, 0x00, // ## ### + 0x0F, 0xFC, 0x00, // ########## + 0x07, 0xDC, 0x00, // ##### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @504 ''' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x01, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @576 '(' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x70, 0x00, // ### + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @648 ')' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x0F, 0x00, 0x00, // #### + 0x0E, 0x00, 0x00, // ### + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @720 '*' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1D, 0xB8, 0x00, // ### ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @792 '+' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @864 ',' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @936 '-' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1008 '.' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1080 '/' (17 pixels wide) + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1152 '0' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1224 '1' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x07, 0x80, 0x00, // #### + 0x1F, 0x80, 0x00, // ###### + 0x1D, 0x80, 0x00, // ### ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1296 '2' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1368 '3' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x70, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x70, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1440 '4' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x60, 0x00, // ## + 0x03, 0xF8, 0x00, // ####### + 0x03, 0xF8, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1512 '5' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x3F, 0xF0, 0x00, // ########## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1584 '6' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF8, 0x00, // ##### + 0x03, 0xF8, 0x00, // ####### + 0x07, 0x00, 0x00, // ### + 0x0E, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xC0, 0x00, // ## #### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1656 '7' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0xE0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1728 '8' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x07, 0xE0, 0x00, // ###### + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xE0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1800 '9' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x30, 0x00, // ### ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x38, 0x00, // ## ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xD8, 0x00, // #### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x1F, 0xC0, 0x00, // ####### + 0x1F, 0x00, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1872 ':' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @1944 ';' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x02, 0x00, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2016 '<' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x1C, 0x00, // ### + 0x00, 0x3C, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0xF0, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0F, 0x00, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0xF0, 0x00, // #### + 0x00, 0x3C, 0x00, // #### + 0x00, 0x1C, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2088 '=' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2160 '>' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x70, 0x00, 0x00, // ### + 0x78, 0x00, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x1E, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x01, 0xE0, 0x00, // #### + 0x07, 0x80, 0x00, // #### + 0x1E, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x70, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2232 '?' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xC0, 0x00, // ##### + 0x0F, 0xE0, 0x00, // ####### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x00, 0x70, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x03, 0xC0, 0x00, // #### + 0x03, 0x80, 0x00, // ### + 0x03, 0x00, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2304 '@' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xE0, 0x00, // ##### + 0x07, 0xF0, 0x00, // ####### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x78, 0x00, // ## #### + 0x18, 0xF8, 0x00, // ## ##### + 0x19, 0xD8, 0x00, // ## ### ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x18, 0x00, // ### ## + 0x07, 0xF8, 0x00, // ######## + 0x03, 0xE0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2376 'A' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0xC0, 0x00, // ####### + 0x01, 0xC0, 0x00, // ### + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFC, 0x7F, 0x00, // ###### ####### + 0xFC, 0x7F, 0x00, // ###### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2448 'B' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x1C, 0x00, // ## ### + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF0, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2520 'C' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2592 'D' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xC0, 0x00, // ######### + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0xF0, 0x00, // ########### + 0x7F, 0xE0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2664 'E' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x19, 0x80, 0x00, // ## ## + 0x19, 0x98, 0x00, // ## ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7F, 0xF8, 0x00, // ############ + 0x7F, 0xF8, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2736 'F' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0xCC, 0x00, // ## ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0F, 0xC0, 0x00, // ###### + 0x0F, 0xC0, 0x00, // ###### + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0xC0, 0x00, // ## ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2808 'G' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x18, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0xFE, 0x00, // ## ####### + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xFC, 0x00, // ########## + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2880 'H' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @2952 'I' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3024 'J' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xFE, 0x00, // ########## + 0x07, 0xFE, 0x00, // ########## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x60, 0x00, // ## ## + 0x3F, 0xE0, 0x00, // ######### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3096 'K' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x3E, 0x00, // ####### ##### + 0x7F, 0x3E, 0x00, // ####### ##### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x19, 0x80, 0x00, // ## ## + 0x1B, 0x80, 0x00, // ## ### + 0x1F, 0xC0, 0x00, // ####### + 0x1C, 0xE0, 0x00, // ### ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x7F, 0x1F, 0x00, // ####### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3168 'L' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x80, 0x00, // ######## + 0x7F, 0x80, 0x00, // ######## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x7F, 0xFC, 0x00, // ############# + 0x7F, 0xFC, 0x00, // ############# + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3240 'M' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF0, 0x0F, 0x00, // #### #### + 0xF8, 0x1F, 0x00, // ##### ##### + 0x38, 0x1C, 0x00, // ### ### + 0x3C, 0x3C, 0x00, // #### #### + 0x3C, 0x3C, 0x00, // #### #### + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x36, 0x6C, 0x00, // ## ## ## ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x33, 0xCC, 0x00, // ## #### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0xFE, 0x7F, 0x00, // ####### ####### + 0xFE, 0x7F, 0x00, // ####### ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3312 'N' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0xFE, 0x00, // #### ####### + 0x78, 0xFE, 0x00, // #### ####### + 0x1C, 0x18, 0x00, // ### ## + 0x1E, 0x18, 0x00, // #### ## + 0x1F, 0x18, 0x00, // ##### ## + 0x1B, 0x18, 0x00, // ## ## ## + 0x1B, 0x98, 0x00, // ## ### ## + 0x19, 0xD8, 0x00, // ## ### ## + 0x18, 0xD8, 0x00, // ## ## ## + 0x18, 0xF8, 0x00, // ## ##### + 0x18, 0x78, 0x00, // ## #### + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x18, 0x00, // ####### ## + 0x7F, 0x18, 0x00, // ####### ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3384 'O' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3456 'P' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF8, 0x00, // ########### + 0x0C, 0x1C, 0x00, // ## ### + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0F, 0xF8, 0x00, // ######### + 0x0F, 0xE0, 0x00, // ####### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3528 'Q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x07, 0xC0, 0x00, // ##### + 0x07, 0xCC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x0C, 0x38, 0x00, // ## ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3600 'R' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0xE0, 0x00, // ########## + 0x7F, 0xF0, 0x00, // ########### + 0x18, 0x38, 0x00, // ## ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xC0, 0x00, // ####### + 0x18, 0xE0, 0x00, // ## ### + 0x18, 0x70, 0x00, // ## ### + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x7F, 0x1E, 0x00, // ####### #### + 0x7F, 0x0E, 0x00, // ####### ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3672 'S' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xD8, 0x00, // ##### ## + 0x0F, 0xF8, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1E, 0x00, 0x00, // #### + 0x0F, 0xC0, 0x00, // ###### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x78, 0x00, // #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1C, 0x38, 0x00, // ### ### + 0x1F, 0xF0, 0x00, // ######### + 0x1B, 0xE0, 0x00, // ## ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3744 'T' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3816 'U' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3888 'V' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7F, 0x7F, 0x00, // ####### ####### + 0x7F, 0x7F, 0x00, // ####### ####### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x01, 0xC0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x00, 0x80, 0x00, // # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @3960 'W' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFE, 0x3F, 0x80, // ####### ####### + 0xFE, 0x3F, 0x80, // ####### ####### + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x06, 0x00, // ## ## + 0x30, 0x86, 0x00, // ## # ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x19, 0xCC, 0x00, // ## ### ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1B, 0x6C, 0x00, // ## ## ## ## + 0x1E, 0x7C, 0x00, // #### ##### + 0x0E, 0x38, 0x00, // ### ### + 0x0E, 0x38, 0x00, // ### ### + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4032 'X' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4104 'Y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x7E, 0x00, // ##### ###### + 0x7C, 0x7E, 0x00, // ##### ###### + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4176 'Z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x18, 0xC0, 0x00, // ## ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4248 '[' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xF0, 0x00, // ##### + 0x01, 0xF0, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4320 '\' (17 pixels wide) + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1C, 0x00, 0x00, // ### + 0x0C, 0x00, 0x00, // ## + 0x0E, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x60, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x00, 0x30, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4392 ']' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x80, 0x00, // ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4464 '^' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x80, 0x00, // # + 0x01, 0xC0, 0x00, // ### + 0x03, 0xE0, 0x00, // ##### + 0x07, 0x70, 0x00, // ### ### + 0x06, 0x30, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x10, 0x04, 0x00, // # # + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4536 '_' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xFF, 0xFF, 0x00, // ################ + 0xFF, 0xFF, 0x00, // ################ + + // @4608 '`' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x03, 0x00, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x60, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4680 'a' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0F, 0xC0, 0x00, // ###### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x07, 0xF0, 0x00, // ####### + 0x1F, 0xF0, 0x00, // ######### + 0x38, 0x30, 0x00, // ### ## + 0x30, 0x30, 0x00, // ## ## + 0x30, 0x70, 0x00, // ## ### + 0x1F, 0xFC, 0x00, // ########### + 0x0F, 0xBC, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4752 'b' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF8, 0x00, // ########## + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x7F, 0xF8, 0x00, // ############ + 0x7B, 0xE0, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4824 'c' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xEC, 0x00, // ##### ## + 0x0F, 0xFC, 0x00, // ########## + 0x1C, 0x1C, 0x00, // ### ### + 0x38, 0x0C, 0x00, // ### ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x38, 0x0C, 0x00, // ### ## + 0x1C, 0x1C, 0x00, // ### ### + 0x0F, 0xF8, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4896 'd' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x78, 0x00, // #### + 0x00, 0x78, 0x00, // #### + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x07, 0xD8, 0x00, // ##### ## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xFE, 0x00, // ############ + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @4968 'e' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xE0, 0x00, // ###### + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x18, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x30, 0x00, 0x00, // ## + 0x30, 0x00, 0x00, // ## + 0x18, 0x0C, 0x00, // ## ## + 0x1F, 0xFC, 0x00, // ########### + 0x07, 0xF0, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5040 'f' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0xFC, 0x00, // ####### + 0x03, 0xFC, 0x00, // ######## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF8, 0x00, // ########### + 0x3F, 0xF8, 0x00, // ########### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5112 'g' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x38, 0x00, // ### + 0x0F, 0xF0, 0x00, // ######## + 0x0F, 0xC0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5184 'h' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x00, 0x00, // #### + 0x78, 0x00, 0x00, // #### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x1B, 0xE0, 0x00, // ## ##### + 0x1F, 0xF0, 0x00, // ######### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5256 'i' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5328 'j' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xC0, 0x00, // ## + 0x00, 0xC0, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xF0, 0x00, // ######### + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x30, 0x00, // ## + 0x00, 0x70, 0x00, // ### + 0x1F, 0xE0, 0x00, // ######## + 0x1F, 0x80, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5400 'k' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3C, 0x00, 0x00, // #### + 0x3C, 0x00, 0x00, // #### + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xF8, 0x00, // ## ##### + 0x0C, 0xC0, 0x00, // ## ## + 0x0D, 0x80, 0x00, // ## ## + 0x0F, 0x80, 0x00, // ##### + 0x0F, 0x00, 0x00, // #### + 0x0F, 0x80, 0x00, // ##### + 0x0D, 0xC0, 0x00, // ## ### + 0x0C, 0xE0, 0x00, // ## ### + 0x3C, 0x7C, 0x00, // #### ##### + 0x3C, 0x7C, 0x00, // #### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5472 'l' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0x80, 0x00, // ###### + 0x1F, 0x80, 0x00, // ###### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x3F, 0xFC, 0x00, // ############ + 0x3F, 0xFC, 0x00, // ############ + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5544 'm' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0xF7, 0x78, 0x00, // #### ### #### + 0xFF, 0xFC, 0x00, // ############## + 0x39, 0xCC, 0x00, // ### ### ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0x31, 0x8C, 0x00, // ## ## ## + 0xFD, 0xEF, 0x00, // ###### #### #### + 0xFD, 0xEF, 0x00, // ###### #### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5616 'n' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF0, 0x00, // ########### + 0x1C, 0x38, 0x00, // ### ### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x7E, 0x7E, 0x00, // ###### ###### + 0x7E, 0x7E, 0x00, // ###### ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5688 'o' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x03, 0xC0, 0x00, // #### + 0x0F, 0xF0, 0x00, // ######## + 0x1C, 0x38, 0x00, // ### ### + 0x38, 0x1C, 0x00, // ### ### + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x30, 0x0C, 0x00, // ## ## + 0x38, 0x1C, 0x00, // ### ### + 0x1C, 0x38, 0x00, // ### ### + 0x0F, 0xF0, 0x00, // ######## + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5760 'p' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7B, 0xE0, 0x00, // #### ##### + 0x7F, 0xF8, 0x00, // ############ + 0x1C, 0x18, 0x00, // ### ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x18, 0x0C, 0x00, // ## ## + 0x1C, 0x18, 0x00, // ### ## + 0x1F, 0xF8, 0x00, // ########## + 0x1B, 0xE0, 0x00, // ## ##### + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x18, 0x00, 0x00, // ## + 0x7F, 0x00, 0x00, // ####### + 0x7F, 0x00, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5832 'q' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xDE, 0x00, // ##### #### + 0x1F, 0xFE, 0x00, // ############ + 0x18, 0x38, 0x00, // ## ### + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x30, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF8, 0x00, // ########## + 0x07, 0xD8, 0x00, // ##### ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0x18, 0x00, // ## + 0x00, 0xFE, 0x00, // ####### + 0x00, 0xFE, 0x00, // ####### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5904 'r' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x78, 0x00, // ##### #### + 0x3E, 0xFC, 0x00, // ##### ###### + 0x07, 0xCC, 0x00, // ##### ## + 0x07, 0x00, 0x00, // ### + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x06, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @5976 's' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0xF8, 0x00, // ######## + 0x0F, 0xF8, 0x00, // ######### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x1F, 0x80, 0x00, // ###### + 0x0F, 0xF0, 0x00, // ######## + 0x00, 0xF8, 0x00, // ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x1F, 0xF0, 0x00, // ######### + 0x1F, 0xE0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6048 't' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x3F, 0xF0, 0x00, // ########## + 0x3F, 0xF0, 0x00, // ########## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x00, 0x00, // ## + 0x0C, 0x1C, 0x00, // ## ### + 0x07, 0xFC, 0x00, // ######### + 0x03, 0xF0, 0x00, // ###### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6120 'u' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x78, 0x00, // #### #### + 0x78, 0x78, 0x00, // #### #### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x38, 0x00, // ## ### + 0x0F, 0xFE, 0x00, // ########### + 0x07, 0xDE, 0x00, // ##### #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6192 'v' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7C, 0x3E, 0x00, // ##### ##### + 0x7C, 0x3E, 0x00, // ##### ##### + 0x18, 0x18, 0x00, // ## ## + 0x18, 0x18, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x07, 0xE0, 0x00, // ###### + 0x03, 0xC0, 0x00, // #### + 0x03, 0xC0, 0x00, // #### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6264 'w' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x78, 0x3C, 0x00, // #### #### + 0x78, 0x3C, 0x00, // #### #### + 0x31, 0x18, 0x00, // ## # ## + 0x33, 0x98, 0x00, // ## ### ## + 0x33, 0x98, 0x00, // ## ### ## + 0x1A, 0xB0, 0x00, // ## # # ## + 0x1E, 0xF0, 0x00, // #### #### + 0x1E, 0xF0, 0x00, // #### #### + 0x1C, 0x60, 0x00, // ### ## + 0x0C, 0x60, 0x00, // ## ## + 0x0C, 0x60, 0x00, // ## ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6336 'x' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x0C, 0x30, 0x00, // ## ## + 0x06, 0x60, 0x00, // ## ## + 0x03, 0xC0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x03, 0xC0, 0x00, // #### + 0x06, 0x60, 0x00, // ## ## + 0x0C, 0x30, 0x00, // ## ## + 0x3E, 0x7C, 0x00, // ##### ##### + 0x3E, 0x7C, 0x00, // ##### ##### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6408 'y' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x7E, 0x1F, 0x00, // ###### ##### + 0x7E, 0x1F, 0x00, // ###### ##### + 0x18, 0x0C, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x06, 0x30, 0x00, // ## ## + 0x03, 0x60, 0x00, // ## ## + 0x03, 0xE0, 0x00, // ##### + 0x01, 0xC0, 0x00, // ### + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x3F, 0xC0, 0x00, // ######## + 0x3F, 0xC0, 0x00, // ######## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6480 'z' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x18, 0x30, 0x00, // ## ## + 0x18, 0x60, 0x00, // ## ## + 0x00, 0xC0, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x00, 0x00, // ## + 0x06, 0x18, 0x00, // ## ## + 0x0C, 0x18, 0x00, // ## ## + 0x1F, 0xF8, 0x00, // ########## + 0x1F, 0xF8, 0x00, // ########## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6552 '{' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0xE0, 0x00, // ### + 0x01, 0xE0, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x03, 0x80, 0x00, // ### + 0x07, 0x00, 0x00, // ### + 0x03, 0x80, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xE0, 0x00, // #### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6624 '|' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6696 '}' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x07, 0x00, 0x00, // ### + 0x07, 0x80, 0x00, // #### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0xC0, 0x00, // ### + 0x00, 0xE0, 0x00, // ### + 0x01, 0xC0, 0x00, // ### + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x01, 0x80, 0x00, // ## + 0x07, 0x80, 0x00, // #### + 0x07, 0x00, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + + // @6768 '~' (17 pixels wide) + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x0E, 0x00, 0x00, // ### + 0x1F, 0x18, 0x00, // ##### ## + 0x3B, 0xB8, 0x00, // ### ### ### + 0x31, 0xF0, 0x00, // ## ##### + 0x00, 0xE0, 0x00, // ### + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // + 0x00, 0x00, 0x00, // +}; + +sFONT Font24 = { + Font24_Table, + 17, /* Width */ + 24, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/voting_device/epd1in54_V2/font8.c b/voting_device/epd1in54_V2/font8.c new file mode 100644 index 0000000..1b0d2ab --- /dev/null +++ b/voting_device/epd1in54_V2/font8.c @@ -0,0 +1,1005 @@ +/** + ****************************************************************************** + * @file Font8.c + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "fonts.h" +#include + +// +// Font data for Courier New 12pt +// + +const uint8_t Font8_Table[] PROGMEM = +{ + // @0 ' ' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @8 '!' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @16 '"' (5 pixels wide) + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @24 '#' (5 pixels wide) + 0x28, // # # + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xF8, // ##### + 0x50, // # # + 0xA0, // # # + 0x00, // + + // @32 '$' (5 pixels wide) + 0x20, // # + 0x30, // ## + 0x60, // ## + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x20, // # + 0x00, // + + // @40 '%' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x18, // ## + 0x60, // ## + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @48 '&' (5 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x60, // ## + 0x50, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @56 ''' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @64 '(' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @72 ')' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @80 '*' (5 pixels wide) + 0x20, // # + 0x70, // ### + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @88 '+' (5 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @96 ',' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @104 '-' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @112 '.' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @120 '/' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x40, // # + 0x80, // # + 0x00, // + + // @128 '0' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @136 '1' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @144 '2' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @152 '3' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @160 '4' (5 pixels wide) + 0x10, // # + 0x30, // ## + 0x50, // # # + 0x78, // #### + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + + // @168 '5' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x60, // ## + 0x10, // # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @176 '6' (5 pixels wide) + 0x30, // ## + 0x40, // # + 0x60, // ## + 0x50, // # # + 0x50, // # # + 0x60, // ## + 0x00, // + 0x00, // + + // @184 '7' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x10, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + 0x00, // + + // @192 '8' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x20, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @200 '9' (5 pixels wide) + 0x30, // ## + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @208 ':' (5 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @216 ';' (5 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x10, // # + 0x20, // # + 0x00, // + 0x00, // + + // @224 '<' (5 pixels wide) + 0x00, // + 0x10, // # + 0x20, // # + 0xC0, // ## + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + + // @232 '=' (5 pixels wide) + 0x00, // + 0x70, // ### + 0x00, // + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @240 '>' (5 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x18, // ## + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @248 '?' (5 pixels wide) + 0x20, // # + 0x50, // # # + 0x10, // # + 0x20, // # + 0x00, // + 0x20, // # + 0x00, // + 0x00, // + + // @256 '@' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x58, // # ## + 0x48, // # # + 0x40, // # + 0x38, // ### + 0x00, // + + // @264 'A' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x50, // # # + 0x70, // ### + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @272 'B' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @280 'C' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @288 'D' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @296 'E' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @304 'F' (5 pixels wide) + 0xF8, // ##### + 0x48, // # # + 0x60, // ## + 0x40, // # + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @312 'G' (5 pixels wide) + 0x70, // ### + 0x40, // # + 0x40, // # + 0x58, // # ## + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @320 'H' (5 pixels wide) + 0xE8, // ### # + 0x48, // # # + 0x78, // #### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @328 'I' (5 pixels wide) + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @336 'J' (5 pixels wide) + 0x38, // ### + 0x10, // # + 0x10, // # + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x00, // + 0x00, // + + // @344 'K' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x60, // ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @352 'L' (5 pixels wide) + 0xE0, // ### + 0x40, // # + 0x40, // # + 0x40, // # + 0x48, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + + // @360 'M' (5 pixels wide) + 0xD8, // ## ## + 0xD8, // ## ## + 0xD8, // ## ## + 0xA8, // # # # + 0x88, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @368 'N' (5 pixels wide) + 0xD8, // ## ## + 0x68, // ## # + 0x68, // ## # + 0x58, // # ## + 0x58, // # ## + 0xE8, // ### # + 0x00, // + 0x00, // + + // @376 'O' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @384 'P' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + 0x00, // + 0x00, // + + // @392 'Q' (5 pixels wide) + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x18, // ## + 0x00, // + + // @400 'R' (5 pixels wide) + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @408 'S' (5 pixels wide) + 0x70, // ### + 0x50, // # # + 0x20, // # + 0x10, // # + 0x50, // # # + 0x70, // ### + 0x00, // + 0x00, // + + // @416 'T' (5 pixels wide) + 0xF8, // ##### + 0xA8, // # # # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @424 'U' (5 pixels wide) + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @432 'V' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x48, // # # + 0x50, // # # + 0x50, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @440 'W' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @448 'X' (5 pixels wide) + 0xD8, // ## ## + 0x50, // # # + 0x20, // # + 0x20, // # + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @456 'Y' (5 pixels wide) + 0xD8, // ## ## + 0x88, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @464 'Z' (5 pixels wide) + 0x78, // #### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x48, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @472 '[' (5 pixels wide) + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x00, // + + // @480 '\' (5 pixels wide) + 0x80, // # + 0x40, // # + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @488 ']' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x00, // + + // @496 '^' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @504 '_' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xF8, // ##### + + // @512 '`' (5 pixels wide) + 0x20, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @520 'a' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x10, // # + 0x70, // ### + 0x78, // #### + 0x00, // + 0x00, // + + // @528 'b' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + + // @536 'c' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x40, // # + 0x40, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @544 'd' (5 pixels wide) + 0x18, // ## + 0x08, // # + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @552 'e' (5 pixels wide) + 0x00, // + 0x00, // + 0x70, // ### + 0x70, // ### + 0x40, // # + 0x30, // ## + 0x00, // + 0x00, // + + // @560 'f' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x70, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @568 'g' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x30, // ## + + // @576 'h' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x70, // ### + 0x48, // # # + 0x48, // # # + 0xE8, // ### # + 0x00, // + 0x00, // + + // @584 'i' (5 pixels wide) + 0x20, // # + 0x00, // + 0x60, // ## + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @592 'j' (5 pixels wide) + 0x20, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x70, // ### + + // @600 'k' (5 pixels wide) + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x70, // ### + 0x50, // # # + 0xD8, // ## ## + 0x00, // + 0x00, // + + // @608 'l' (5 pixels wide) + 0x60, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @616 'm' (5 pixels wide) + 0x00, // + 0x00, // + 0xD0, // ## # + 0xA8, // # # # + 0xA8, // # # # + 0xA8, // # # # + 0x00, // + 0x00, // + + // @624 'n' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0xC8, // ## # + 0x00, // + 0x00, // + + // @632 'o' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @640 'p' (5 pixels wide) + 0x00, // + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x48, // # # + 0x70, // ### + 0x40, // # + 0xE0, // ### + + // @648 'q' (5 pixels wide) + 0x00, // + 0x00, // + 0x38, // ### + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x08, // # + 0x18, // ## + + // @656 'r' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + + // @664 's' (5 pixels wide) + 0x00, // + 0x00, // + 0x30, // ## + 0x20, // # + 0x10, // # + 0x60, // ## + 0x00, // + 0x00, // + + // @672 't' (5 pixels wide) + 0x00, // + 0x40, // # + 0xF0, // #### + 0x40, // # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + + // @680 'u' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x48, // # # + 0x48, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @688 'v' (5 pixels wide) + 0x00, // + 0x00, // + 0xC8, // ## # + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + + // @696 'w' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0xA8, // # # # + 0xA8, // # # # + 0x50, // # # + 0x00, // + 0x00, // + + // @704 'x' (5 pixels wide) + 0x00, // + 0x00, // + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0x00, // + 0x00, // + + // @712 'y' (5 pixels wide) + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x50, // # # + 0x50, // # # + 0x20, // # + 0x20, // # + 0x60, // ## + + // @720 'z' (5 pixels wide) + 0x00, // + 0x00, // + 0x78, // #### + 0x50, // # # + 0x28, // # # + 0x78, // #### + 0x00, // + 0x00, // + + // @728 '{' (5 pixels wide) + 0x10, // # + 0x20, // # + 0x20, // # + 0x60, // ## + 0x20, // # + 0x20, // # + 0x10, // # + 0x00, // + + // @736 '|' (5 pixels wide) + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @744 '}' (5 pixels wide) + 0x40, // # + 0x20, // # + 0x20, // # + 0x30, // ## + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + + // @752 '~' (5 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x28, // # # + 0x50, // # # + 0x00, // + 0x00, // + 0x00, // +}; + +sFONT Font8 = { + Font8_Table, + 5, /* Width */ + 8, /* Height */ +}; + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/voting_device/epd1in54_V2/fonts.h b/voting_device/epd1in54_V2/fonts.h new file mode 100644 index 0000000..4530308 --- /dev/null +++ b/voting_device/epd1in54_V2/fonts.h @@ -0,0 +1,75 @@ +/** + ****************************************************************************** + * @file fonts.h + * @author MCD Application Team + * @version V1.0.0 + * @date 18-February-2014 + * @brief Header for fonts.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2014 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FONTS_H +#define __FONTS_H + +/* Max size of bitmap will based on a font24 (17x24) */ +#define MAX_HEIGHT_FONT 24 +#define MAX_WIDTH_FONT 17 +#define OFFSET_BITMAP 54 + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include + +typedef struct _tFont +{ + const uint8_t *table; + uint16_t Width; + uint16_t Height; + +} sFONT; + +extern sFONT Font24; +extern sFONT Font20; +extern sFONT Font16; +extern sFONT Font12; +extern sFONT Font8; + +#ifdef __cplusplus +} +#endif + +#endif /* __FONTS_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/voting_device/epd1in54_V2/imagedata.cpp b/voting_device/epd1in54_V2/imagedata.cpp new file mode 100644 index 0000000..d5aef37 --- /dev/null +++ b/voting_device/epd1in54_V2/imagedata.cpp @@ -0,0 +1,344 @@ +/** + * @filename : imagedata.cpp + * @brief : data file for epd demo + * + * Copyright (C) Waveshare September 5 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "imagedata.h" +#include + +const unsigned char IMAGE_DATA[] PROGMEM = { +/* 0X00,0X01,0XC8,0X00,0XC8,0X00, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0X01,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XF8,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFF, +0X3F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XF0,0X00, +0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE1,0XFE,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XF0,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE3,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF,0X9F,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XE1,0XE3,0X00,0X00,0X00,0X00,0X01, +0XFF,0XFF,0XE7,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XC3,0XF3,0X0F,0XFF,0XFF,0XFF,0XFC,0XFF,0XFF,0XE3,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC3,0X3B,0X0F,0XFF,0XFF, +0XFF,0XFE,0XFF,0XFF,0XE3,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XC3,0X0F,0X0F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XE1,0XFE,0X1F, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC3,0X0F,0X0F, +0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF0,0XFC,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE3, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XC3,0X87,0X0F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF0, +0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE0,0X7F,0XFF,0XFF,0XFF,0XFF,0XF1,0XC1, +0X03,0X0F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF8,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XE0,0X0F,0XFF,0XFF,0XFF,0XFF,0XF1,0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XFE,0XFF, +0XFF,0XFE,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFC,0X03,0XFF,0XFF,0XFF,0XFF, +0XF1,0XE0,0X00,0X1F,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0X80,0X7F,0XFF,0XFF,0XFF,0XF1,0XF0,0X00,0X3F,0XFF,0XFF,0XFF, +0X7E,0XFF,0XFF,0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XF0,0X1F,0XFF, +0XFF,0XFF,0XF1,0XF8,0X00,0X7F,0XFF,0XFF,0XFC,0X3E,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0X00,0X1F,0XFF,0XFF,0XFF,0XF1,0XFE,0X00,0XFF,0XFF, +0XFF,0XF0,0X3E,0XFF,0XFF,0XC6,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XF8,0X07, +0X8F,0XFF,0XFF,0XFF,0XF1,0XFE,0X87,0XFF,0XFF,0XFF,0XE0,0XCE,0XFF,0XFF,0XCE,0X7F, +0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE0,0X1F,0X8F,0XC0,0X07,0XFF,0XF1,0XFE,0XFF, +0XFF,0XFF,0XFF,0X81,0X86,0XFF,0XFF,0XCE,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XE0,0XFF,0XCF,0X80,0X07,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X02,0X06,0XFF,0XFF, +0XC6,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE3,0XFF,0XEF,0X00,0X07,0XFF,0XF1, +0XFE,0XFF,0XFF,0XFF,0XFE,0X0C,0X02,0XFF,0XFF,0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFE,0X18,0X02, +0XFF,0XFF,0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF, +0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFE,0X20,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFE,0X01,0XFF,0X1F,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFE, +0XC0,0X02,0XFF,0XFF,0XFF,0X03,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XF0,0X01,0XFF, +0X9F,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X00,0X02,0XFF,0XFF,0XF8,0X00,0X7F, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XE0,0X01,0XE0,0X80,0X0F,0XFF,0XF1,0XFE,0XFF,0XFF, +0XFF,0XFF,0X00,0X02,0XFF,0XFF,0XF0,0X00,0X3F,0XFF,0XE7,0XFF,0XFF,0X8F,0XFF,0XE0, +0X03,0XE0,0X00,0X07,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X80,0X06,0XFF,0XFF,0XE0, +0XCC,0X1F,0XFF,0XE0,0XFF,0XFF,0X8F,0XFF,0XE2,0X71,0XE0,0X00,0X07,0XFF,0XF1,0XFE, +0XFF,0XFF,0XFF,0XFF,0XC0,0X0E,0XFF,0XFF,0XE3,0XC7,0X1F,0XFF,0XE0,0X3F,0XFF,0X8F, +0XFF,0XE7,0X39,0XE0,0X00,0X0F,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XC0,0X0E,0XFF, +0XFF,0XE7,0XE7,0X8F,0XFF,0XF0,0X07,0XFF,0X8F,0XFF,0XE7,0X38,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0X00,0X1E,0XFF,0XFF,0XE7,0XE7,0X8F,0XFF,0XFE,0X01, +0XFF,0X8F,0XFF,0XE3,0X10,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFC,0X00, +0X3E,0XFF,0XFF,0XE3,0XC7,0X8F,0XFF,0XFF,0XC0,0X7F,0X8F,0XFF,0XE3,0X01,0XFF,0X1F, +0XC7,0XFF,0XF1,0XFE,0XFF,0X83,0XFF,0XF0,0X00,0X7E,0XFF,0XFF,0XE0,0X07,0X1F,0XFF, +0XFF,0XF8,0X3F,0X8F,0XFF,0XF3,0X81,0XFF,0X1F,0XC7,0XFF,0XF1,0XFE,0XFC,0X01,0XFF, +0XE0,0X00,0XFE,0XFF,0XFF,0XF0,0X0F,0X1F,0XFF,0XFF,0XC0,0X1F,0X8F,0XFF,0XFF,0XC7, +0XFF,0X1F,0XC7,0XFF,0XF1,0XFE,0XF0,0X07,0XFF,0X80,0X01,0XFE,0XFF,0XFF,0XF8,0X1F, +0XBF,0XFF,0XFE,0X00,0X0F,0X8F,0XFF,0XFF,0XFF,0XF8,0X00,0X07,0XFF,0XF1,0XFE,0XC0, +0X18,0XFE,0X00,0X03,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X07,0X87,0X8F,0XFF, +0XFF,0XFF,0XF8,0X00,0X0F,0XFF,0XF1,0XFE,0XC0,0XE0,0XF8,0X00,0X0F,0XFE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE0,0X1F,0XC7,0X8F,0XFF,0XFF,0XFF,0XF8,0X00,0X0F,0XFF,0XF1, +0XFE,0XC7,0X00,0XE0,0X00,0X1F,0XFE,0XFF,0XFF,0XFF,0XFF,0X9F,0XFF,0XE0,0XFF,0XC7, +0X8F,0XFE,0X00,0X01,0XFF,0X1E,0XFF,0XFF,0XF1,0XFE,0XDC,0X00,0XC0,0X00,0X3F,0XFE, +0XFF,0XFF,0XF8,0X3F,0X1F,0XFF,0XE3,0XFF,0XC7,0X8F,0XFE,0X00,0X01,0XFF,0X1F,0XFF, +0XFF,0XF1,0XFE,0XE0,0X00,0X00,0X00,0XFF,0XFE,0XFF,0XFF,0XF0,0X0F,0X1F,0XFF,0XFF, +0XFF,0XC7,0X8F,0XFE,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0XC0,0X00,0X00,0X03, +0XFF,0XFE,0XFF,0XFF,0XE0,0X03,0X1F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFE,0X03,0XFF,0XF8, +0X7F,0XFF,0XFF,0XF1,0XFE,0XE0,0X00,0X00,0X07,0XFF,0XFE,0XFF,0XFF,0XE3,0XC1,0X9F, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XC0,0X7F,0XF8,0X1F,0XFF,0XFF,0XF1,0XFE,0XE0,0X00, +0X00,0X1F,0XFF,0XFE,0XFF,0XFF,0XE7,0XE0,0X9F,0XFF,0XF8,0X00,0XFF,0X8F,0XFF,0XF8, +0X1F,0XF8,0X07,0XFF,0XFF,0XF1,0XFE,0XF0,0X00,0X00,0XFF,0XFF,0XFE,0XFF,0XFF,0XE7, +0XF8,0X1F,0XFF,0XF0,0X00,0XFF,0X8F,0XFF,0XFE,0X03,0XF8,0X01,0XFF,0XFF,0XF1,0XFE, +0XF8,0X00,0X03,0XFF,0XFF,0XFE,0XFF,0XFF,0XE7,0XFC,0X1F,0XFF,0XE0,0X00,0XFF,0X8F, +0XFF,0XFF,0X83,0XF8,0XC0,0X7F,0XFF,0XF1,0XFE,0XFC,0X00,0X3F,0XFF,0XFF,0XFE,0XFF, +0XFF,0XE3,0XFE,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFC,0X07,0XF8,0XF0,0X1F,0XFF, +0XF1,0XFE,0XFF,0XB7,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XF1,0XFF,0X1F,0XFF,0XE3,0X31, +0XFF,0X8F,0XFF,0XE0,0X3F,0XF8,0XFC,0X07,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFE,0XFF,0XFF,0XF3,0XFF,0X9F,0XFF,0XE3,0X38,0XFF,0X8F,0XFF,0X00,0XFF,0XF8,0XFF, +0X03,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE3,0X38,0XFF,0X8F,0XFE,0X07,0XFF,0XF8,0XFF,0XC3,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0X18,0XFF,0X8F,0XFE,0X00,0X01, +0XF8,0XFF,0XF3,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XDF, +0XFF,0XFF,0XE3,0X00,0XFF,0X8F,0XFE,0X00,0X01,0XF8,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XE3,0X80,0XFF,0X8F,0XFE, +0X00,0X01,0XF8,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF, +0XFF,0X87,0XFF,0XFF,0XF1,0X81,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,0XC3,0XFF,0XFF,0XFF,0XC3,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE, +0XFF,0XFF,0XFF,0XE3,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFE,0X7F,0XFF,0XFF,0XFF,0XFF,0XFC,0XFF,0XFF,0XFF,0XF3,0XFF,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0X00,0X00,0X00,0X00, +0X00,0X01,0XFF,0XFF,0XFF,0XE3,0XFF,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE3,0XFF, +0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC3,0XFF,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X87,0XFF,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XE3,0XF1,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X1F,0XFF,0XFF,0XE3,0XF9,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XE3,0XF8, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XE3,0XF8,0XFF,0X80,0X00,0X00,0X00,0X00,0X00, +0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X3F,0XFF,0XFF, +0XE1,0XF0,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XF0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F, +0XFF,0XFF,0XF0,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,0XFF,0XFF,0XF8,0X01,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X87,0XFF,0XFF,0XFE,0X07,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8, +0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XFF,0XFF,0XF0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X70,0X3F, +0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, +0XFF,0XFA,0XFF,0XFF,0XFF,0XFF,0XF0,0X20,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XC0,0X1F,0XFF,0XFF,0XFF,0XE0, +0X02,0X1F,0XFF,0XE3,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XFF,0XFF,0X00,0X0F,0XFF,0XFF,0XFF,0XE3,0X87,0X1F,0XFF,0XE3,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFE,0X00,0X07,0XFF,0XFF, +0XFF,0XE7,0X8F,0X8F,0XFF,0XE3,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFE,0X00,0X02,0X7F,0XFF,0XFF,0XE7,0XCF,0X8F,0XFF,0XF0,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFC,0X00,0X00, +0X7F,0XFF,0XFF,0XE7,0XCF,0X9F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0XFF,0XFF,0XFF,0XE3,0XFF,0X1F,0XFF, +0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF8, +0X30,0X00,0XFF,0XFF,0XFF,0XF3,0XFE,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF8,0X30,0X00,0XFF,0XFF,0XFF,0XF7,0XFF, +0X3F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XF0,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0X90,0X00,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0X10,0X00,0X00,0XFF, +0XFF,0XFF,0XF8,0X1F,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XFC,0X10,0X00,0X00,0XFF,0XFF,0XFF,0XF0,0X0F,0X1F,0XFF,0XE0, +0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF8,0X18,0X30, +0X00,0XFF,0XFF,0XFF,0XE0,0X03,0X1F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF8,0X08,0X38,0X00,0XFF,0XFF,0XFF,0XE3,0XC1,0X9F, +0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF0, +0X08,0X30,0X01,0XFF,0XFF,0XFF,0XE7,0XF0,0X9F,0XFF,0XFF,0XE1,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0X08,0X00,0X01,0XFF,0XFF,0XFF,0XE7, +0XF8,0X1F,0XFF,0XFF,0XF9,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XE0,0XE4,0X00,0X01,0XFF,0XFF,0XFF,0XE7,0XFC,0X1F,0XFF,0XFF,0XF8,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0XE2,0X00,0X03,0XFF,0XFF, +0XFF,0XE3,0XFE,0X1F,0XFF,0XFF,0XF8,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XC0,0XE2,0X00,0X07,0XFF,0XFF,0XFF,0XF1,0XFF,0X1F,0XFF,0XE0,0X00, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X41,0X00,0X0F, +0XFF,0XFF,0XFF,0XF3,0XFF,0X9F,0XFF,0XE0,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00,0XC0,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XE0,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00, +0X30,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,0X03,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00,0X07,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XC0,0X00,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0X00,0X00,0X7F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XC0,0X40,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XC0,0XE0,0X00,0X7F,0XFF, +0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFF,0X87,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XE0,0XE0,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0X1E, +0X03,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0XE0,0X00, +0X7F,0XFF,0XFF,0XFE,0XFF,0XBF,0XCF,0XFE,0X3E,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XE0,0X00,0X00,0X3F,0XFF,0XFF,0XFE,0X3F,0XFF,0X8F, +0XFE,0X3C,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF0, +0X00,0X00,0X3F,0XFF,0XFF,0XFF,0X3C,0X0F,0X9F,0XFE,0X3C,0X30,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XF8,0X00,0X01,0X1F,0XFF,0XFF,0XFF,0XF0, +0X03,0XFF,0XFE,0X3C,0X78,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XF8,0X00,0X03,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFE,0X38,0X78,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFC,0X00,0X07,0XFF,0XFF,0XFF, +0XFF,0XC0,0X00,0XFF,0XFE,0X18,0X78,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X7F,0XFE,0X00,0XF8, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0X80,0X3F,0XFF, +0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0X00,0XF8,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF, +0X01,0XF0,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0XC3,0XF1,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0X00,0X00, +0X31,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0X00,0X00,0X31,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X80,0X00,0X3F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X80,0X00,0X3F,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X80,0X00,0X7F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,0X00,0X7F,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,0X01,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X78,0X03,0XDF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X3F, +0X1F,0X8F,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0X7F,0XFF,0XCF,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFE,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0X00,0X00, +0X00,0X01,0X7F,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFD,0X80,0X00,0X00,0X03,0X1F,0XFF,0X00,0X00,0X00, +0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF8, +0X80,0X00,0X00,0X02,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X40,0X00,0X00,0X04,0X0F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X60,0X00,0X00,0X0C,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X20,0X00,0X00,0X08,0X07, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X30,0X00,0X00,0X10,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X10,0X00,0X00, +0X30,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X18,0X00,0X00,0X20,0X07,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X08, +0X00,0X00,0X60,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X04,0X00,0X00,0X40,0X07,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X06,0X00,0X00,0X80,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X02,0X00,0X01,0X80,0X07,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X03,0X00,0X01,0X00,0X07,0XFF,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X01,0X00,0X02,0X00, +0X07,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF0,0X01,0X80,0X06,0X00,0X07,0XFF,0XFF,0XFF,0XFC,0X00,0X00, +0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X80, +0X04,0X00,0X07,0XFF,0XFF,0XFF,0XF0,0X00,0X38,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X40,0X08,0X00,0X07,0XFF,0XFF,0XFF,0XE0, +0X00,0XFE,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0, +0X00,0X40,0X08,0X00,0X07,0XFF,0XFF,0XFF,0XC0,0X03,0XFF,0X80,0X00,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X20,0X10,0X00,0X07,0XFF,0XFF, +0XFF,0X80,0X0F,0XFF,0XF8,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X00,0X30,0X30,0X00,0X07,0XFF,0XFF,0XFF,0X00,0X3F,0XFF,0XFC,0X00,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X10,0X20,0X00,0X07, +0XFF,0XFF,0XFE,0X00,0XFF,0XE7,0XFE,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X00,0X18,0X40,0X00,0X07,0XFF,0XFF,0XFC,0X01,0XFF,0X81,0XFF, +0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X08,0XC0, +0X00,0X07,0XFF,0XFF,0XFC,0X01,0XFF,0X00,0X7F,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X04,0X80,0X00,0X07,0XFF,0XFF,0XF8,0X01,0XFF, +0XC0,0X7F,0X80,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00, +0X05,0X00,0X00,0X07,0XFF,0XFF,0XF8,0X00,0XFF,0XF8,0X00,0X00,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X03,0X00,0X00,0X07,0XFF,0XFF,0XF0, +0X00,0X1F,0XFE,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X00,0X03,0X00,0X00,0X07,0XFF,0XFF,0XF0,0X00,0X07,0XFF,0X80,0X00,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X01,0X00,0X00,0X07,0XFF, +0XFF,0XF1,0XFF,0X81,0XFF,0X80,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X00,0X01,0X80,0X00,0X07,0XFF,0XFF,0XE0,0XFF,0X00,0X7F,0X80,0X00, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X47,0X80,0X80,0X00, +0X07,0XFF,0XFF,0XE0,0X7F,0XC1,0X3F,0X80,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF0,0X4F,0XC0,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X3F,0XF9,0X4F, +0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X4C,0X40, +0X40,0X00,0X07,0XFF,0XFF,0XE0,0X1F,0XFE,0X78,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X64,0XC0,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X0F, +0XFF,0X80,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0, +0X7F,0XC0,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X05,0XFF,0XF0,0X00,0X00,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X1F,0X00,0XC0,0X00,0X07,0XFF,0XFF, +0XE0,0X00,0X3F,0XFC,0X00,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X00,0X00,0X80,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X0F,0XFF,0X00,0X00,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X01,0X00,0X00,0X07, +0XFF,0XFF,0XE0,0X00,0X03,0XFF,0X80,0X00,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X00,0X01,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X07,0XFF,0X80, +0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X02,0X00, +0X00,0X07,0XFF,0XFF,0XE0,0X00,0X3F,0XFF,0X00,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X06,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X00,0XFF, +0XFC,0X00,0X01,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00, +0X05,0X00,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFF,0XE0,0X00,0X01,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X0D,0X80,0X00,0X07,0XFF,0XFF,0XE0, +0X01,0XFF,0X00,0X00,0X03,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X00,0X08,0X80,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFF,0X80,0X00,0X03,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X10,0X40,0X00,0X07,0XFF, +0XFF,0XE0,0X00,0XFF,0XF0,0X00,0X03,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X00,0X10,0X40,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X1F,0XFE,0X00,0X07, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X20,0X20,0X00, +0X07,0XFF,0XFF,0XE0,0X00,0X03,0XFF,0X80,0X07,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X60,0X30,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X07,0XFF, +0X80,0X0F,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0X40, +0X10,0X00,0X07,0XFF,0XFF,0XE0,0X00,0X3F,0XFF,0X80,0X1F,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X00,0XC0,0X08,0X00,0X07,0XFF,0XFF,0XE0,0X01, +0XFF,0XFF,0X00,0X1F,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0, +0X00,0X80,0X0C,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFF,0XF8,0X00,0X3F,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X01,0X80,0X04,0X00,0X07,0XFF,0XFF, +0XE0,0X01,0XFF,0XE0,0X00,0X7F,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XF0,0X01,0X00,0X02,0X00,0X07,0XFF,0XFF,0XE0,0X01,0XFE,0X00,0X00,0XFF,0XFF, +0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X02,0X00,0X03,0X00,0X07, +0XFF,0XFF,0XE0,0X01,0XF0,0X00,0X03,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF1,0XFF,0XF0,0X06,0X00,0X01,0X00,0X07,0XFF,0XFF,0XE0,0X01,0X80,0X00,0X07, +0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X04,0X00,0X01, +0X80,0X07,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X1F,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X0C,0X00,0X00,0X80,0X07,0XFF,0XFF,0XE0,0X00,0X00, +0X00,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X08, +0X00,0X00,0X40,0X07,0XFF,0XFF,0XE0,0X00,0X00,0X0F,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X18,0X00,0X00,0X60,0X07,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF, +0XF0,0X10,0X00,0X00,0X20,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X20,0X00,0X00,0X10,0X07,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF1,0XFF,0XF0,0X60,0X00,0X00,0X18,0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF0,0X40,0X00,0X00,0X08, +0X07,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF1,0XFF,0XF8,0XC0,0X00,0X00,0X04,0X0F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XF8,0X80,0X00, +0X00,0X04,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0X00,0X00,0X00,0X02,0X3F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF1, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +}; diff --git a/voting_device/epd1in54_V2/imagedata.h b/voting_device/epd1in54_V2/imagedata.h new file mode 100644 index 0000000..2234ead --- /dev/null +++ b/voting_device/epd1in54_V2/imagedata.h @@ -0,0 +1,30 @@ +/** + * @filename : imagedata.h + * @brief : head file for imagedata.cpp + * + * Copyright (C) Waveshare September 5 2017 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documnetation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +extern const unsigned char IMAGE_DATA[]; + +/* FILE END */ + + diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 64558cb..c434a10 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -31,17 +31,17 @@ int checkBatteryLevel(){ } void setup() { - /* + pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand - */ + pinMode(LED_BUILTIN, OUTPUT); pinMode(5, OUTPUT); digitalWrite(5, HIGH); digitalWrite(LED_BUILTIN, LOW); pinMode(RXPIN, INPUT_PULLUP); - pinMode(BUTTON_PIN_1, INPUT_PULLUP); + #ifdef ISRS_FOR_BUTTONS attachISR(); #endif @@ -96,28 +96,11 @@ bool question = true; //move to right location void loop() { //working progress, need to define pressed function and buttons //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off - if (!digitalRead(0)) { - Serial.println("YES"); - response = YES; - //state = CONFIRM; - } - if (ButtonAbstain.getState()) { - Serial.println("ABSTAIN"); - response = ABSTAIN; - //state = CONFIRM; - } - if (digitalRead(2)) { - Serial.println("NO"); - response = NO; - //state = CONFIRM; - } - /* - switch (state) { case BOOT: - //display start up screen + //check connection if (WiFi.status() != WL_CONNECTED) { //error msg @@ -167,7 +150,4 @@ void loop() { //working progress, need to define pressed function and buttons //display closing thank you delay(5000); } - -*/ - } From 55ceaa59195bb66fc7cd716c72a7aeed0e060fe8 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:28:38 +0200 Subject: [PATCH 13/36] mqtt working sending and receiving. subscribe after connect --- voting_device/config.h | 2 +- voting_device/display.cpp | 136 +++++++++++++++++- voting_device/display.h | 30 +++- .../{epd1in54_V2 => src}/epd1in54_V2.cpp | 0 .../{epd1in54_V2 => src}/epd1in54_V2.h | 0 voting_device/{epd1in54_V2 => src}/epdif.cpp | 0 voting_device/{epd1in54_V2 => src}/epdif.h | 0 .../{epd1in54_V2 => src}/epdpaint.cpp | 0 voting_device/{epd1in54_V2 => src}/epdpaint.h | 0 voting_device/{epd1in54_V2 => src}/font12.c | 0 voting_device/{epd1in54_V2 => src}/font16.c | 0 voting_device/{epd1in54_V2 => src}/font20.c | 0 voting_device/{epd1in54_V2 => src}/font24.c | 0 voting_device/{epd1in54_V2 => src}/font8.c | 0 voting_device/{epd1in54_V2 => src}/fonts.h | 0 .../{epd1in54_V2 => src}/imagedata.cpp | 0 .../{epd1in54_V2 => src}/imagedata.h | 0 voting_device/voting_device.ino | 21 ++- 18 files changed, 178 insertions(+), 11 deletions(-) rename voting_device/{epd1in54_V2 => src}/epd1in54_V2.cpp (100%) rename voting_device/{epd1in54_V2 => src}/epd1in54_V2.h (100%) rename voting_device/{epd1in54_V2 => src}/epdif.cpp (100%) rename voting_device/{epd1in54_V2 => src}/epdif.h (100%) rename voting_device/{epd1in54_V2 => src}/epdpaint.cpp (100%) rename voting_device/{epd1in54_V2 => src}/epdpaint.h (100%) rename voting_device/{epd1in54_V2 => src}/font12.c (100%) rename voting_device/{epd1in54_V2 => src}/font16.c (100%) rename voting_device/{epd1in54_V2 => src}/font20.c (100%) rename voting_device/{epd1in54_V2 => src}/font24.c (100%) rename voting_device/{epd1in54_V2 => src}/font8.c (100%) rename voting_device/{epd1in54_V2 => src}/fonts.h (100%) rename voting_device/{epd1in54_V2 => src}/imagedata.cpp (100%) rename voting_device/{epd1in54_V2 => src}/imagedata.h (100%) diff --git a/voting_device/config.h b/voting_device/config.h index f91f9b3..6f071f3 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -31,7 +31,7 @@ const char* ssid = "franks_galaxy"; const char* password = "veef2267"; // MQTT-Server Settings -const char* mqtt_server = "10.42.0.1"; +const char* mqtt_server = "194.110.231.227"; const int mqtt_port = 1883; const char* mqtt_user = ""; const char* mqtt_password = ""; diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 92ffefa..2823df4 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -1 +1,135 @@ -#include "display.h" \ No newline at end of file +#include "display.h" + +const unsigned char wifilogo[] PROGMEM = { +// 'imresizer-1702234655501', 35x35px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, +0xf0, 0x00, 0x07, 0xf0, 0x01, 0xfc, 0x00, 0x0f, 0x80, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x00, 0x1f, +0x00, 0x1c, 0x0f, 0xfe, 0x07, 0x00, 0x08, 0x3f, 0xff, 0x82, 0x00, 0x00, 0x7f, 0x9f, 0xc0, 0x00, +0x01, 0xf8, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x00, +0x07, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1c, +0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, +0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +Epd epd; +unsigned char image[1024]; +Paint paint(image, 0, 0); + +void initDisplay(){ + //E-paper init + epd.LDirInit(); + epd.Clear(); // clears whole screen to white + paint.SetRotate(ROTATE_180); //rotate screen +} + +void paintDragon() { + //wifilogo + paint.SetWidth(35); + paint.SetHeight(35); + paint.Clear(COLORED); // paints the height and width with the given color + drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 40, (200-35), paint.GetWidth(), paint.GetHeight()); +} + +void drawImage(int x, int y, int width, int height, const unsigned char *image) { + int byteWidth = (width + 7) / 8; // Number of bytes in a row + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + if (pgm_read_byte(image + j * byteWidth + i / 8) & (128 >> (i % 8))) { + paint.DrawPixel(x + i, y + j, COLORED); + } else { + paint.DrawPixel(x + i, y + j, UNCOLORED); + } + } + } +} + +bool question_mark(const char *question) { + int question_len = strlen(question); + if (question_len > 0 && question[question_len - 1] == '?') { + return true; + } + return false; +} + +bool check_question(const char *question, char *line, int *position) { + if (!question_mark(question)) { + printf("ERROR: No question mark!"); + return false; + } + int count = 0; + do { + strncpy(line, question + *position, 15); + line[15] = '\0'; + + int pos = 15; + int extra = 0; + while (pos >= 0 && line[pos] != ' ') { + pos--; + extra++; + } + line[pos] = '\0'; + + if (extra == 16) { + line[14] = '-'; + *position -= 1; // Update position to after the '-' + } else { + *position -= extra; // Update position to the last space + *position += 1; // Update position to after the space + } + printf("%s\n", line); + *position += 15; + count++; + } while (!question_mark(line)); + + if (count > 6) { + printf("ERROR: Question too long!"); + return false; + } + return true; +} + +void display_question(const char *question, char *line, int *position) { + paint.SetWidth(200); + paint.SetHeight(16); + int count = 0; + do { + strncpy(line, question + *position, 15); + line[15] = '\0'; + + int pos = 15; + int extra = 0; + while (pos >= 0 && line[pos] != ' ') { + pos--; + extra++; + } + line[pos] = '\0'; + + if (extra == 16) { + line[14] = '-'; + *position -= 1; // Update position to after the '-' + } else { + *position -= extra; // Update position to the last space + *position += 1; // Update position to after the space + } + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(15, 2, line, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, (120-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + *position += 15; + count++; + } while (!question_mark(line)); +} + +void displayWifi(){ + //wifilogo + paint.SetWidth(35); + paint.SetHeight(35); + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 40, (200-35), paint.GetWidth(), paint.GetHeight()); +} + diff --git a/voting_device/display.h b/voting_device/display.h index afcef52..cc5f10d 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -1,5 +1,31 @@ -#ifndef DISPLAY -#define DISPLAY +#ifndef DISPLAY_H +#define DISPLAY_H +#include +#include "src/epd1in54_V2.h" +#include "src/imagedata.h" +#include "src/epdpaint.h" +#include +#define COLORED 0 +#define UNCOLORED 1 + +void initDisplay(); + +void paintDragon(); + +//Epaper object declaration +//Epd epd; +//unsigned char image[1024]; +//Paint paint(image, 0, 0); + + + +void display_question(const char *question, char *line, int *position); + +bool check_question(const char *question, char *line, int *position); + +bool question_mark(const char *question); + +void drawImage(int x, int y, int width, int height, const unsigned char *image); #endif \ No newline at end of file diff --git a/voting_device/epd1in54_V2/epd1in54_V2.cpp b/voting_device/src/epd1in54_V2.cpp similarity index 100% rename from voting_device/epd1in54_V2/epd1in54_V2.cpp rename to voting_device/src/epd1in54_V2.cpp diff --git a/voting_device/epd1in54_V2/epd1in54_V2.h b/voting_device/src/epd1in54_V2.h similarity index 100% rename from voting_device/epd1in54_V2/epd1in54_V2.h rename to voting_device/src/epd1in54_V2.h diff --git a/voting_device/epd1in54_V2/epdif.cpp b/voting_device/src/epdif.cpp similarity index 100% rename from voting_device/epd1in54_V2/epdif.cpp rename to voting_device/src/epdif.cpp diff --git a/voting_device/epd1in54_V2/epdif.h b/voting_device/src/epdif.h similarity index 100% rename from voting_device/epd1in54_V2/epdif.h rename to voting_device/src/epdif.h diff --git a/voting_device/epd1in54_V2/epdpaint.cpp b/voting_device/src/epdpaint.cpp similarity index 100% rename from voting_device/epd1in54_V2/epdpaint.cpp rename to voting_device/src/epdpaint.cpp diff --git a/voting_device/epd1in54_V2/epdpaint.h b/voting_device/src/epdpaint.h similarity index 100% rename from voting_device/epd1in54_V2/epdpaint.h rename to voting_device/src/epdpaint.h diff --git a/voting_device/epd1in54_V2/font12.c b/voting_device/src/font12.c similarity index 100% rename from voting_device/epd1in54_V2/font12.c rename to voting_device/src/font12.c diff --git a/voting_device/epd1in54_V2/font16.c b/voting_device/src/font16.c similarity index 100% rename from voting_device/epd1in54_V2/font16.c rename to voting_device/src/font16.c diff --git a/voting_device/epd1in54_V2/font20.c b/voting_device/src/font20.c similarity index 100% rename from voting_device/epd1in54_V2/font20.c rename to voting_device/src/font20.c diff --git a/voting_device/epd1in54_V2/font24.c b/voting_device/src/font24.c similarity index 100% rename from voting_device/epd1in54_V2/font24.c rename to voting_device/src/font24.c diff --git a/voting_device/epd1in54_V2/font8.c b/voting_device/src/font8.c similarity index 100% rename from voting_device/epd1in54_V2/font8.c rename to voting_device/src/font8.c diff --git a/voting_device/epd1in54_V2/fonts.h b/voting_device/src/fonts.h similarity index 100% rename from voting_device/epd1in54_V2/fonts.h rename to voting_device/src/fonts.h diff --git a/voting_device/epd1in54_V2/imagedata.cpp b/voting_device/src/imagedata.cpp similarity index 100% rename from voting_device/epd1in54_V2/imagedata.cpp rename to voting_device/src/imagedata.cpp diff --git a/voting_device/epd1in54_V2/imagedata.h b/voting_device/src/imagedata.h similarity index 100% rename from voting_device/epd1in54_V2/imagedata.h rename to voting_device/src/imagedata.h diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index c434a10..05f3639 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -20,7 +20,7 @@ void callback(char* topic, byte* payload, unsigned int length) { } Serial.println(); // Nachricht weiterleiten - //mqttClient.publish("e", payload, length); + mqttClient.publish("e", payload, length); } int checkBatteryLevel(){ int adcValue = analogRead(BATTERY_PIN); @@ -42,6 +42,10 @@ void setup() { digitalWrite(LED_BUILTIN, LOW); pinMode(RXPIN, INPUT_PULLUP); + initDisplay(); + + paintDragon(); + #ifdef ISRS_FOR_BUTTONS attachISR(); #endif @@ -50,7 +54,7 @@ void setup() { Serial.begin(115200); #endif delay(10); -/* + // Verbindung zum WLAN herstellen #ifdef DEBUG Serial.println("Verbindung zum WLAN herstellen"); @@ -71,9 +75,9 @@ void setup() { // Verbindung zum MQTT-Server herstellen mqttClient.setServer(mqtt_server, mqtt_port); mqttClient.setCallback(callback); - mqttClient.subscribe(subInit, MQTTsubQos); - mqttClient.subscribe(subResync, MQTTsubQos); - mqttClient.subscribe(subVoteSetup, MQTTsubQos); + //mqttClient.subscribe(subInit, MQTTsubQos); + //mqttClient.subscribe(subResync, MQTTsubQos); + //mqttClient.subscribe(subVoteSetup, MQTTsubQos); while (!mqttClient.connected()) { #ifdef DEBUG @@ -82,10 +86,11 @@ void setup() { mqttClient.connect("ESP8266", mqtt_user, mqtt_password); delay(500); } + mqttClient.publish("e", "payload"); #ifdef DEBUG Serial.println("Verbindung zum MQTT-Server hergestellt"); #endif -*/ +mqttClient.subscribe("/registration/esp/1A", MQTTsubQos); } int state = 0; @@ -96,6 +101,8 @@ bool question = true; //move to right location void loop() { //working progress, need to define pressed function and buttons //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off + mqttClient.loop(); + /* switch (state) { case BOOT: @@ -149,5 +156,5 @@ void loop() { //working progress, need to define pressed function and buttons case CLOSE_VOTE: //display closing thank you delay(5000); - } + }*/ } From 35b52bcf7536976ea85e9377f4e255171d5ea4e4 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:31:03 +0200 Subject: [PATCH 14/36] display working, logos and yes no abstain on screen --- voting_device/display.cpp | 58 ++++++++++++++++++++++++++++++--- voting_device/display.h | 2 +- voting_device/voting_device.ino | 15 +++++---- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 2823df4..9e5b6f5 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -15,6 +15,21 @@ const unsigned char wifilogo[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const unsigned char batterylogo[] PROGMEM = { +// 'imresizer-1702234758351', 35x35px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, +0xfc, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, +0x00, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0xc0, +0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, +0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, +0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x3f, 0xff, 0xff, +0xfc, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + Epd epd; unsigned char image[1024]; Paint paint(image, 0, 0); @@ -23,16 +38,51 @@ void initDisplay(){ //E-paper init epd.LDirInit(); epd.Clear(); // clears whole screen to white - paint.SetRotate(ROTATE_180); //rotate screen + paint.SetRotate(ROTATE_270); //rotate screen } -void paintDragon() { +void paintVoteScreen() { //wifilogo paint.SetWidth(35); paint.SetHeight(35); - paint.Clear(COLORED); // paints the height and width with the given color + paint.Clear(UNCOLORED); // paints the height and width with the given color drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates - epd.SetFrameMemory(paint.GetImage(), 40, (200-35), paint.GetWidth(), paint.GetHeight()); + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); + //battery logo + paint.Clear(UNCOLORED); + drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, (200-35), paint.GetWidth(), paint.GetHeight()); + //battery status bar + //paint.SetWidth(20); + //paint.SetHeight(13); + //paint.Clear(COLORED); + //paint.DrawFilledRectangle(0, 0, 20, 14, COLORED); + //epd.SetFrameMemory(paint.GetImage(), 16, (200-23), paint.GetWidth(), paint.GetHeight()); + //Bottom bar + paint.SetWidth(22); + paint.SetHeight(200); + paint.Clear(COLORED); //paints the height and width the given colour + paint.DrawStringAt(0, 0, "YES ABSTAIN NO", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + //paint.DrawStringAt(0, 2, "Yes Abstain No", &Font16, COLORED); + //paint.DrawFilledRectangle(0, 0, 200, 3, UNCOLORED); + //paint.DrawFilledRectangle(48, 0, 50, 25, UNCOLORED); + //paint.DrawFilledRectangle(160, 0, 162, 25, UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), (200-22), 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + //Name + + //Question + char question[100] = "How many characters can E-paper fit across?"; + char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question another another?"; + int position = 0; + char line[16]; + + bool all_good = check_question(question1, line, &position); + if (all_good) { + position = 0; + display_question(question1, line, &position); + } + + epd.DisplayFrame(); } void drawImage(int x, int y, int width, int height, const unsigned char *image) { diff --git a/voting_device/display.h b/voting_device/display.h index cc5f10d..858f926 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -11,7 +11,7 @@ void initDisplay(); -void paintDragon(); +void paintVoteScreen(); //Epaper object declaration //Epd epd; diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 05f3639..7ca3323 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -12,7 +12,7 @@ PubSubClient mqttClient(wifiClient); // MQTT-Nachrichten verarbeiten void callback(char* topic, byte* payload, unsigned int length) { // Nachricht ausgeben - Serial.print("Nachricht empfangen: "); + Serial.print("Message received: "); Serial.print(topic); Serial.print(" : "); for (int i = 0; i < length; i++) { @@ -44,8 +44,8 @@ void setup() { initDisplay(); - paintDragon(); - + paintVoteScreen(); +/* #ifdef ISRS_FOR_BUTTONS attachISR(); #endif @@ -57,7 +57,7 @@ void setup() { // Verbindung zum WLAN herstellen #ifdef DEBUG - Serial.println("Verbindung zum WLAN herstellen"); + Serial.println("Connect to WiFi"); #endif WiFi.begin(ssid, password); @@ -69,7 +69,7 @@ void setup() { } #ifdef DEBUG - Serial.println("Verbindung zum WLAN hergestellt"); + Serial.println("Connected to WiFi established"); #endif // Verbindung zum MQTT-Server herstellen @@ -81,16 +81,17 @@ void setup() { while (!mqttClient.connected()) { #ifdef DEBUG - Serial.println("Verbindung zum MQTT-Server herstellen"); + Serial.println("Connect to the MQTT server"); #endif mqttClient.connect("ESP8266", mqtt_user, mqtt_password); delay(500); } mqttClient.publish("e", "payload"); #ifdef DEBUG - Serial.println("Verbindung zum MQTT-Server hergestellt"); + Serial.println("Connection to MQTT server established"); #endif mqttClient.subscribe("/registration/esp/1A", MQTTsubQos); +*/ } int state = 0; From 93f51a084ef62dcd8716cae3e7bcb3b8a52298a4 Mon Sep 17 00:00:00 2001 From: Nadim-2022 Date: Fri, 2 Feb 2024 15:27:05 +0200 Subject: [PATCH 15/36] Display function working perfectly --- voting_device/display.cpp | 82 +++++++++------------------------ voting_device/display.h | 2 +- voting_device/voting_device.ino | 5 +- 3 files changed, 25 insertions(+), 64 deletions(-) diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 9e5b6f5..02940cb 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -41,7 +41,7 @@ void initDisplay(){ paint.SetRotate(ROTATE_270); //rotate screen } -void paintVoteScreen() { +void paintVoteScreen(const char *question) { //wifilogo paint.SetWidth(35); paint.SetHeight(35); @@ -51,7 +51,7 @@ void paintVoteScreen() { //battery logo paint.Clear(UNCOLORED); drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates - epd.SetFrameMemory(paint.GetImage(), 0, (200-35), paint.GetWidth(), paint.GetHeight()); + epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); //battery status bar //paint.SetWidth(20); //paint.SetHeight(13); @@ -61,8 +61,8 @@ void paintVoteScreen() { //Bottom bar paint.SetWidth(22); paint.SetHeight(200); - paint.Clear(COLORED); //paints the height and width the given colour - paint.DrawStringAt(0, 0, "YES ABSTAIN NO", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(0, 0, "YES ABSTAIN NO", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width //paint.DrawStringAt(0, 2, "Yes Abstain No", &Font16, COLORED); //paint.DrawFilledRectangle(0, 0, 200, 3, UNCOLORED); //paint.DrawFilledRectangle(48, 0, 50, 25, UNCOLORED); @@ -71,17 +71,20 @@ void paintVoteScreen() { //Name //Question - char question[100] = "How many characters can E-paper fit across?"; - char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question another another?"; + //char question[100] = "How many characters can E-paper fit across?"; + //char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question another another?"; int position = 0; char line[16]; - - bool all_good = check_question(question1, line, &position); - if (all_good) { - position = 0; - display_question(question1, line, &position); + size_t sizeOfString = strlen(question); // Size of the string + if(sizeOfString <= 90){ + display_question(question, line, &position); + } + else { + char stringMod[90]; // Including space for null terminator + strncpy(stringMod, question, 90); + stringMod[89] = '\0'; + display_question(stringMod, line, &position); // Pass the modified string to display_question } - epd.DisplayFrame(); } @@ -98,54 +101,11 @@ void drawImage(int x, int y, int width, int height, const unsigned char *image) } } -bool question_mark(const char *question) { - int question_len = strlen(question); - if (question_len > 0 && question[question_len - 1] == '?') { - return true; - } - return false; -} - -bool check_question(const char *question, char *line, int *position) { - if (!question_mark(question)) { - printf("ERROR: No question mark!"); - return false; - } - int count = 0; - do { - strncpy(line, question + *position, 15); - line[15] = '\0'; - - int pos = 15; - int extra = 0; - while (pos >= 0 && line[pos] != ' ') { - pos--; - extra++; - } - line[pos] = '\0'; - - if (extra == 16) { - line[14] = '-'; - *position -= 1; // Update position to after the '-' - } else { - *position -= extra; // Update position to the last space - *position += 1; // Update position to after the space - } - printf("%s\n", line); - *position += 15; - count++; - } while (!question_mark(line)); - - if (count > 6) { - printf("ERROR: Question too long!"); - return false; - } - return true; -} void display_question(const char *question, char *line, int *position) { - paint.SetWidth(200); - paint.SetHeight(16); + size_t sizeOfString = strlen(question); + paint.SetWidth(16); + paint.SetHeight(200); int count = 0; do { strncpy(line, question + *position, 15); @@ -167,11 +127,11 @@ void display_question(const char *question, char *line, int *position) { *position += 1; // Update position to after the space } paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(15, 2, line, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, (120-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate + paint.DrawStringAt(20, 0, line, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), (40+(count*16)),0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate *position += 15; count++; - } while (!question_mark(line)); + } while ((*position) < sizeOfString); } void displayWifi(){ diff --git a/voting_device/display.h b/voting_device/display.h index 858f926..c7786ba 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -11,7 +11,7 @@ void initDisplay(); -void paintVoteScreen(); +void paintVoteScreen(const char *question); //Epaper object declaration //Epd epd; diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 7ca3323..8a06b11 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -43,8 +43,9 @@ void setup() { pinMode(RXPIN, INPUT_PULLUP); initDisplay(); - - paintVoteScreen(); + char question[100] = "How many characters can E-paper fit across?"; + char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; + paintVoteScreen(question2); /* #ifdef ISRS_FOR_BUTTONS attachISR(); From 75a085756ba9883d9afb9ed965c5ea0600391a02 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:01:50 +0200 Subject: [PATCH 16/36] nothing working --- voting_device/config.h | 2 ++ voting_device/voting_device.ino | 42 ++++++++++++--------------------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index 6f071f3..b029949 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -1,6 +1,7 @@ #include #include // default wifi library #include //Mqtt library by Nick O'Leary +#include //#include #define BATTERY_PIN A0 #define REFERENCE_VOLTAGE 3.3 @@ -45,6 +46,7 @@ const char* subVoteSetup = "/setupVote/Setup"; const char* subResync = "/setupVote/Resync"; //Mqtt topics to publish const char* pubInit = ("/registration/Server/"+WiFi.macAddress()).c_str(); + const char* pubPubVote = "/vote/VotingID"; diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 8a06b11..ed216c3 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -19,9 +19,8 @@ void callback(char* topic, byte* payload, unsigned int length) { Serial.print((char)payload[i]); } Serial.println(); - // Nachricht weiterleiten - mqttClient.publish("e", payload, length); } + int checkBatteryLevel(){ int adcValue = analogRead(BATTERY_PIN); float voltage = adcValue * REFERENCE_VOLTAGE / 1023; @@ -46,34 +45,27 @@ void setup() { char question[100] = "How many characters can E-paper fit across?"; char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; paintVoteScreen(question2); -/* -#ifdef ISRS_FOR_BUTTONS + attachISR(); -#endif #ifdef DEBUG Serial.begin(115200); #endif delay(10); - -// Verbindung zum WLAN herstellen #ifdef DEBUG - Serial.println("Connect to WiFi"); + Serial.println("Connecting to WiFi"); #endif WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { delay(500); #ifdef DEBUG Serial.print("."); #endif } - #ifdef DEBUG Serial.println("Connected to WiFi established"); #endif - // Verbindung zum MQTT-Server herstellen mqttClient.setServer(mqtt_server, mqtt_port); mqttClient.setCallback(callback); //mqttClient.subscribe(subInit, MQTTsubQos); @@ -82,17 +74,22 @@ void setup() { while (!mqttClient.connected()) { #ifdef DEBUG - Serial.println("Connect to the MQTT server"); + Serial.println("Connecting to the MQTT server"); #endif mqttClient.connect("ESP8266", mqtt_user, mqtt_password); delay(500); } - mqttClient.publish("e", "payload"); + char macAddress[18] = "\0"; + strcpy(macAddress, "Mac :"); + strcat(macAddress, WiFi.macAddress().c_str()); #ifdef DEBUG Serial.println("Connection to MQTT server established"); + Serial.println(macAddress); + Serial.println((WiFi.macAddress()).c_str()); #endif -mqttClient.subscribe("/registration/esp/1A", MQTTsubQos); -*/ + + mqttClient.publish("Nadim", macAddress); + mqttClient.subscribe("/registration/esp/1A", MQTTsubQos); } int state = 0; @@ -106,20 +103,10 @@ void loop() { //working progress, need to define pressed function and buttons mqttClient.loop(); /* switch (state) { - case BOOT: //display start up screen - - //check connection - if (WiFi.status() != WL_CONNECTED) { - //error msg - //try connect again - } //receive user name and vote question - if (!username) { - //error msg - //request user name - } + // Nachricht weiterleiten if (!question) { //error msg //request question @@ -158,5 +145,6 @@ void loop() { //working progress, need to define pressed function and buttons case CLOSE_VOTE: //display closing thank you delay(5000); - }*/ + } + */ } From d69f1c8a41a89f267f59bb83a2e0ab0d2156382d Mon Sep 17 00:00:00 2001 From: Nadim-2022 Date: Fri, 2 Feb 2024 17:02:51 +0200 Subject: [PATCH 17/36] Working --- voting_device/display.cpp | 2 +- voting_device/voting_device.ino | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 02940cb..db4e87f 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -118,7 +118,7 @@ void display_question(const char *question, char *line, int *position) { extra++; } line[pos] = '\0'; - + if (extra == 16) { line[14] = '-'; *position -= 1; // Update position to after the '-' diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 8a06b11..05502a2 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -19,8 +19,7 @@ void callback(char* topic, byte* payload, unsigned int length) { Serial.print((char)payload[i]); } Serial.println(); - // Nachricht weiterleiten - mqttClient.publish("e", payload, length); + // mqttClient.publish("e", payload, length); } int checkBatteryLevel(){ int adcValue = analogRead(BATTERY_PIN); @@ -46,7 +45,7 @@ void setup() { char question[100] = "How many characters can E-paper fit across?"; char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; paintVoteScreen(question2); -/* + #ifdef ISRS_FOR_BUTTONS attachISR(); #endif @@ -68,7 +67,7 @@ void setup() { Serial.print("."); #endif } - + #ifdef DEBUG Serial.println("Connected to WiFi established"); #endif @@ -76,9 +75,6 @@ void setup() { // Verbindung zum MQTT-Server herstellen mqttClient.setServer(mqtt_server, mqtt_port); mqttClient.setCallback(callback); - //mqttClient.subscribe(subInit, MQTTsubQos); - //mqttClient.subscribe(subResync, MQTTsubQos); - //mqttClient.subscribe(subVoteSetup, MQTTsubQos); while (!mqttClient.connected()) { #ifdef DEBUG @@ -91,8 +87,9 @@ void setup() { #ifdef DEBUG Serial.println("Connection to MQTT server established"); #endif -mqttClient.subscribe("/registration/esp/1A", MQTTsubQos); -*/ + mqttClient.subscribe(subInit, MQTTsubQos); + mqttClient.subscribe(subResync, MQTTsubQos); + mqttClient.subscribe(subVoteSetup, MQTTsubQos); } int state = 0; From d1c812577b6c037609c10f9e4ee6633191903950 Mon Sep 17 00:00:00 2001 From: Nadim-2022 Date: Fri, 2 Feb 2024 17:59:55 +0200 Subject: [PATCH 18/36] Voting id Some time recives some time not, Might be stuck some where or my printing is not working --- voting_device/config.h | 12 +++++----- voting_device/voting_device.ino | 42 ++++++++++++++++----------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index b029949..e7cb005 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -28,8 +28,8 @@ // WLAN-Settings -const char* ssid = "franks_galaxy"; -const char* password = "veef2267"; +const char* ssid = "Nadim"; +const char* password = "nadimahmed"; // MQTT-Server Settings const char* mqtt_server = "194.110.231.227"; @@ -39,13 +39,13 @@ const char* mqtt_password = ""; #define MQTTpubQos 1 #define MQTTsubQos 1 -// MQTT topics to subscribe +//Mqtt topics to publish +const String pubInit = "/registration/Server/"+ String(WiFi.macAddress()); -const char* subInit = ("/registration/esp/"+WiFi.macAddress()).c_str(); +// MQTT topics to subscribe +const String subInit = "/registration/esp/"+ String(WiFi.macAddress()); const char* subVoteSetup = "/setupVote/Setup"; const char* subResync = "/setupVote/Resync"; -//Mqtt topics to publish -const char* pubInit = ("/registration/Server/"+WiFi.macAddress()).c_str(); const char* pubPubVote = "/vote/VotingID"; diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 2a31b19..9923340 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -9,6 +9,8 @@ int message_count = 0; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); +String id; + // MQTT-Nachrichten verarbeiten void callback(char* topic, byte* payload, unsigned int length) { // Nachricht ausgeben @@ -18,11 +20,8 @@ void callback(char* topic, byte* payload, unsigned int length) { for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } + id = String((char*)payload); Serial.println(); -<<<<<<< HEAD - // mqttClient.publish("e", payload, length); -======= ->>>>>>> 75a085756ba9883d9afb9ed965c5ea0600391a02 } int checkBatteryLevel(){ @@ -49,11 +48,6 @@ void setup() { char question[100] = "How many characters can E-paper fit across?"; char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; paintVoteScreen(question2); - -<<<<<<< HEAD -#ifdef ISRS_FOR_BUTTONS -======= ->>>>>>> 75a085756ba9883d9afb9ed965c5ea0600391a02 attachISR(); #ifdef DEBUG @@ -84,31 +78,37 @@ void setup() { mqttClient.connect("ESP8266", mqtt_user, mqtt_password); delay(500); } - char macAddress[18] = "\0"; - strcpy(macAddress, "Mac :"); - strcat(macAddress, WiFi.macAddress().c_str()); #ifdef DEBUG Serial.println("Connection to MQTT server established"); - Serial.println(macAddress); Serial.println((WiFi.macAddress()).c_str()); + //String rawMacAddress = String(WiFi.macAddress()); + String macAddress = "Mac : " + String(WiFi.macAddress()); + //String Nadim = "/registration/Server/"+ String(WiFi.macAddress()); + +Serial.println(macAddress); #endif - mqttClient.subscribe(subInit, MQTTsubQos); - mqttClient.subscribe(subResync, MQTTsubQos); - mqttClient.subscribe(subVoteSetup, MQTTsubQos); - mqttClient.publish("Nadim", macAddress); - mqttClient.subscribe("/registration/esp/1A", MQTTsubQos); - + //mqttClient.publish(pubInit.c_str(), macAddress.c_str()); + mqttClient.subscribe(subInit.c_str(), MQTTsubQos); + //mqttClient.subscribe(subResync, MQTTsubQos); + //mqttClient.subscribe(subVoteSetup, MQTTsubQos); +} int state = 0; int response; -bool username = true; // move to right location -bool question = true; //move to right location +//bool username = true; // move to right location +//bool question = true; //move to right location void loop() { //working progress, need to define pressed function and buttons //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off mqttClient.loop(); /* + if(id){ + Serial.println(id); + id = '\0'; + } + */ + /* switch (state) { case BOOT: //display start up screen From ea51e35db54c7412386e00684607afeb8c97bd16 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Sat, 3 Feb 2024 12:35:34 +0200 Subject: [PATCH 19/36] mqtt working, display working, switch case in progress --- .idea/.gitignore | 8 ++++ .idea/Voting_Device.iml | 8 ++++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 6 +++ voting_device/config.h | 28 +++--------- voting_device/voting_device.ino | 76 ++++++++++++++++----------------- 6 files changed, 74 insertions(+), 60 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/Voting_Device.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/Voting_Device.iml b/.idea/Voting_Device.iml new file mode 100644 index 0000000..bc2cd87 --- /dev/null +++ b/.idea/Voting_Device.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..64723db --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/voting_device/config.h b/voting_device/config.h index e7cb005..b956e1c 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -11,25 +11,19 @@ #define BUTTON_PIN_2 2 // GPIO 4 (entspricht D2) für Taster 2 #define BUTTON_PIN_3 12 // GPIO 16 (entspricht D0) für Taster 3 - - - #define YES 0 #define ABSTAIN 1 #define NO 2 #define BOOT 0 -#define VOTE 1 -#define CONFIRM 2 -#define CLOSE_VOTE 3 - - - - +#define QUESTION 1 +#define VOTE 2 +#define CONFIRM 3 +#define CLOSE_VOTE 4 // WLAN-Settings -const char* ssid = "Nadim"; -const char* password = "nadimahmed"; +const char* ssid = "franks_galaxy"; +const char* password = "veef2267"; // MQTT-Server Settings const char* mqtt_server = "194.110.231.227"; @@ -41,15 +35,13 @@ const char* mqtt_password = ""; //Mqtt topics to publish const String pubInit = "/registration/Server/"+ String(WiFi.macAddress()); +const char* pubPubVote = "/vote/"; // MQTT topics to subscribe const String subInit = "/registration/esp/"+ String(WiFi.macAddress()); const char* subVoteSetup = "/setupVote/Setup"; const char* subResync = "/setupVote/Resync"; -const char* pubPubVote = "/vote/VotingID"; - - //configuration of functionality //#define ENCRYPTION #define STATUS_LEDS @@ -58,16 +50,10 @@ const char* pubPubVote = "/vote/VotingID"; #define ISRS_FOR_BUTTONS //Includes according to config - #ifdef ENCRYPTION #include //todo find encryption library #endif - -#ifdef E_PAPER -#include //todo find epaper library -#endif - #ifdef ISRS_FOR_BUTTONS #include "button_interrupts.h" void attachISR(void){ diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 9923340..945605a 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -9,19 +9,14 @@ int message_count = 0; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); -String id; +char MQTTmsg[] = "This is a test string for payload"; +bool flag = 0; // MQTT-Nachrichten verarbeiten void callback(char* topic, byte* payload, unsigned int length) { - // Nachricht ausgeben - Serial.print("Message received: "); - Serial.print(topic); - Serial.print(" : "); - for (int i = 0; i < length; i++) { - Serial.print((char)payload[i]); - } - id = String((char*)payload); - Serial.println(); + memcpy(MQTTmsg, payload, length); + MQTTmsg[length] = '\0'; + flag = 1; } int checkBatteryLevel(){ @@ -47,7 +42,6 @@ void setup() { initDisplay(); char question[100] = "How many characters can E-paper fit across?"; char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; - paintVoteScreen(question2); attachISR(); #ifdef DEBUG @@ -87,71 +81,75 @@ void setup() { Serial.println(macAddress); #endif - //mqttClient.publish(pubInit.c_str(), macAddress.c_str()); - mqttClient.subscribe(subInit.c_str(), MQTTsubQos); + mqttClient.publish(pubInit.c_str(), macAddress.c_str()); //send mac address + mqttClient.subscribe(subInit.c_str(), MQTTsubQos); //recieve voting ID //mqttClient.subscribe(subResync, MQTTsubQos); - //mqttClient.subscribe(subVoteSetup, MQTTsubQos); + mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question } int state = 0; -int response; +char response[10] = ""; +char votingID[20] = ""; +char pubTopicVoteResponse[50] = ""; +char voteTitle[256] = ""; //bool username = true; // move to right location //bool question = true; //move to right location void loop() { //working progress, need to define pressed function and buttons //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off - mqttClient.loop(); - /* - if(id){ - Serial.println(id); - id = '\0'; - } - */ - /* switch (state) { case BOOT: - //display start up screen - //receive user name and vote question - // Nachricht weiterleiten - if (!question) { + //display start up screen + if (flag) { + flag = 0; + strcpy(votingID, MQTTmsg); + Serial.println(MQTTmsg); + state = QUESTION; + } + //if (!question) { //error msg //request question - } + //} //battery status - - state = VOTE; + case QUESTION: + if (flag) { + flag = 0; + Serial.println(MQTTmsg); + strcpy(voteTitle, MQTTmsg); + paintVoteScreen(voteTitle); + state = VOTE; + } case VOTE: //display question + strcat(pubTopicVoteResponse, pubPubVote); + strcat(pubTopicVoteResponse, votingID); if (ButtonYes.getState()) { + strcpy(response, "Yes"); Serial.println("YES"); - response = YES; state = CONFIRM; } else if (ButtonAbstain.getState()) { - Serial.println("ABSTAIN"); - response = ABSTAIN; + strcpy(response, "Pass"); + Serial.println("PASS"); state = CONFIRM; } else if (ButtonNo.getState()) { + strcpy(response, "No"); Serial.println("NO"); - response = NO; state = CONFIRM; } case CONFIRM: if (ButtonYes.getState()) { - Serial.println("YES"); - response = YES; + mqttClient.publish(pubPubVote, response); state = CLOSE_VOTE; } else if (ButtonNo.getState()){ - Serial.println("NO"); - response = NO; state = VOTE; } case CLOSE_VOTE: //display closing thank you delay(5000); } - */ + mqttClient.loop(); } From c63a54112ecb2bbe30e458826b31db1b2d2eab5b Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Sat, 3 Feb 2024 14:06:18 +0200 Subject: [PATCH 20/36] button hardware not working, more testing needed, but suspision that button a working, button B and C not working --- voting_device/voting_device.ino | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 945605a..3105664 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -42,7 +42,7 @@ void setup() { initDisplay(); char question[100] = "How many characters can E-paper fit across?"; char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; - attachISR(); + //attachISR(); #ifdef DEBUG Serial.begin(115200); @@ -112,44 +112,55 @@ void loop() { //working progress, need to define pressed function and buttons //request question //} //battery status + break; case QUESTION: if (flag) { flag = 0; Serial.println(MQTTmsg); strcpy(voteTitle, MQTTmsg); paintVoteScreen(voteTitle); + strcat(pubTopicVoteResponse, pubPubVote); + strcat(pubTopicVoteResponse, votingID); state = VOTE; } + break; case VOTE: //display question - strcat(pubTopicVoteResponse, pubPubVote); - strcat(pubTopicVoteResponse, votingID); - if (ButtonYes.getState()) { + //strcpy(response, "Yes"); + //state = CONFIRM; + if (!digitalRead(12)) { + delay(500); strcpy(response, "Yes"); Serial.println("YES"); state = CONFIRM; - } - else if (ButtonAbstain.getState()) { + }/* + else if (digitalRead(2)) { strcpy(response, "Pass"); Serial.println("PASS"); state = CONFIRM; } - else if (ButtonNo.getState()) { + else if (digitalRead(12)) { strcpy(response, "No"); Serial.println("NO"); state = CONFIRM; - } + }*/ + break; case CONFIRM: - if (ButtonYes.getState()) { + if (digitalRead(12)) { + delay(500); mqttClient.publish(pubPubVote, response); state = CLOSE_VOTE; } - else if (ButtonNo.getState()){ + else if (!digitalRead(0)){ state = VOTE; } + break; case CLOSE_VOTE: //display closing thank you - delay(5000); + Serial.println("voting ending"); + delay(2000); + state = BOOT; + break; } mqttClient.loop(); } From ae3143e4e72063cc0391f92e58d73ad48c37e73e Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Sun, 4 Feb 2024 16:50:22 +0200 Subject: [PATCH 21/36] separated byte arrays into another file, added paintConfirmScreen, added battery status bar, yet to impiment welcome screen and closing screen --- voting_device/display.cpp | 112 +++++------ voting_device/display.h | 15 +- voting_device/images.cpp | 347 ++++++++++++++++++++++++++++++++ voting_device/images.h | 12 ++ voting_device/voting_device.ino | 37 ++-- 5 files changed, 437 insertions(+), 86 deletions(-) create mode 100644 voting_device/images.cpp create mode 100644 voting_device/images.h diff --git a/voting_device/display.cpp b/voting_device/display.cpp index db4e87f..42c4209 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -1,34 +1,5 @@ #include "display.h" - -const unsigned char wifilogo[] PROGMEM = { -// 'imresizer-1702234655501', 35x35px -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, -0xf0, 0x00, 0x07, 0xf0, 0x01, 0xfc, 0x00, 0x0f, 0x80, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x00, 0x1f, -0x00, 0x1c, 0x0f, 0xfe, 0x07, 0x00, 0x08, 0x3f, 0xff, 0x82, 0x00, 0x00, 0x7f, 0x9f, 0xc0, 0x00, -0x01, 0xf8, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x00, -0x07, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1c, -0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, -0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -const unsigned char batterylogo[] PROGMEM = { -// 'imresizer-1702234758351', 35x35px -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, -0xfc, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, -0x00, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0xc0, -0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, -0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, -0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x3f, 0xff, 0xff, -0xfc, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; +#include "images.h" Epd epd; unsigned char image[1024]; @@ -41,7 +12,7 @@ void initDisplay(){ paint.SetRotate(ROTATE_270); //rotate screen } -void paintVoteScreen(const char *question) { +void paintVoteScreen(const char *question, int batteryLevel) { //battery level is a range between 0 and 25, ie. battery at 100% = 25, battery empty=0 //wifilogo paint.SetWidth(35); paint.SetHeight(35); @@ -53,26 +24,20 @@ void paintVoteScreen(const char *question) { drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); //battery status bar - //paint.SetWidth(20); - //paint.SetHeight(13); - //paint.Clear(COLORED); - //paint.DrawFilledRectangle(0, 0, 20, 14, COLORED); - //epd.SetFrameMemory(paint.GetImage(), 16, (200-23), paint.GetWidth(), paint.GetHeight()); - //Bottom bar + paint.SetWidth(9); + paint.SetHeight(batteryLevel); + paint.Clear(COLORED); + epd.SetFrameMemory(paint.GetImage(), 15, (200-(batteryLevel + 5)), paint.GetWidth(), paint.GetHeight()); //x value 10-15 good (16 too far) + //Bottom buttton bar paint.SetWidth(22); paint.SetHeight(200); paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(0, 0, "YES ABSTAIN NO", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width - //paint.DrawStringAt(0, 2, "Yes Abstain No", &Font16, COLORED); - //paint.DrawFilledRectangle(0, 0, 200, 3, UNCOLORED); - //paint.DrawFilledRectangle(48, 0, 50, 25, UNCOLORED); - //paint.DrawFilledRectangle(160, 0, 162, 25, UNCOLORED); + paint.DrawStringAt(2, 6, "YES ABSTAIN NO", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawFilledRectangle(0, 0, 200, 3, COLORED); + paint.DrawFilledRectangle(48, 0, 50, 25, COLORED); + paint.DrawFilledRectangle(160, 0, 162, 25, COLORED); epd.SetFrameMemory(paint.GetImage(), (200-22), 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates - //Name - //Question - //char question[100] = "How many characters can E-paper fit across?"; - //char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question another another?"; int position = 0; char line[16]; size_t sizeOfString = strlen(question); // Size of the string @@ -88,6 +53,50 @@ void paintVoteScreen(const char *question) { epd.DisplayFrame(); } +void paintConfirmScreen(const char *response, int batteryLevel) { + //wifilogo + paint.SetWidth(35); + paint.SetHeight(35); + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); + //battery logo + paint.Clear(UNCOLORED); + drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); + //battery status bar + paint.SetWidth(9); + paint.SetHeight(batteryLevel); + paint.Clear(COLORED); + epd.SetFrameMemory(paint.GetImage(), 15, (200-(batteryLevel + 5)), paint.GetWidth(), paint.GetHeight()); //x value 10-15 good (16 too far) + //Bottom button bar + paint.SetWidth(22); + paint.SetHeight(200); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(2, 6, "YES NO", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawFilledRectangle(0, 0, 200, 3, COLORED); + paint.DrawFilledRectangle(48, 0, 50, 25, COLORED); + paint.DrawFilledRectangle(160, 0, 162, 25, COLORED); + epd.SetFrameMemory(paint.GetImage(), (200-22), 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + //Confirmation question (Are you sure?) + paint.SetWidth(26); + paint.SetHeight(200); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(20, 0, "You voted:", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 40, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(70, 0, response, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt(71, 0, response, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 80, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(UNCOLORED); //paints the height and width the given colour + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 140, 0, paint.GetWidth(), paint.GetHeight()); + + epd.DisplayFrame(); +} + + +//helper functions void drawImage(int x, int y, int width, int height, const unsigned char *image) { int byteWidth = (width + 7) / 8; // Number of bytes in a row for (int j = 0; j < height; j++) { @@ -101,7 +110,6 @@ void drawImage(int x, int y, int width, int height, const unsigned char *image) } } - void display_question(const char *question, char *line, int *position) { size_t sizeOfString = strlen(question); paint.SetWidth(16); @@ -133,13 +141,3 @@ void display_question(const char *question, char *line, int *position) { count++; } while ((*position) < sizeOfString); } - -void displayWifi(){ - //wifilogo - paint.SetWidth(35); - paint.SetHeight(35); - paint.Clear(UNCOLORED); // paints the height and width with the given color - drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates - epd.SetFrameMemory(paint.GetImage(), 40, (200-35), paint.GetWidth(), paint.GetHeight()); -} - diff --git a/voting_device/display.h b/voting_device/display.h index c7786ba..cd873b9 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -9,23 +9,16 @@ #define COLORED 0 #define UNCOLORED 1 +//Display functions called in voting_device.ino void initDisplay(); -void paintVoteScreen(const char *question); - -//Epaper object declaration -//Epd epd; -//unsigned char image[1024]; -//Paint paint(image, 0, 0); - +void paintVoteScreen(const char *question, int batteryLevel); +void paintConfirmScreen(const char *response, int batteryLevel); +//Unused in voting_device.ino, could be deleted from this .h file void display_question(const char *question, char *line, int *position); -bool check_question(const char *question, char *line, int *position); - -bool question_mark(const char *question); - void drawImage(int x, int y, int width, int height, const unsigned char *image); #endif \ No newline at end of file diff --git a/voting_device/images.cpp b/voting_device/images.cpp new file mode 100644 index 0000000..608e7d7 --- /dev/null +++ b/voting_device/images.cpp @@ -0,0 +1,347 @@ +#include "images.h" + +const unsigned char wifilogo[] PROGMEM = { +// 'imresizer-1702234655501', 35x35px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, +0xf0, 0x00, 0x07, 0xf0, 0x01, 0xfc, 0x00, 0x0f, 0x80, 0x00, 0x3e, 0x00, 0x1f, 0x00, 0x00, 0x1f, +0x00, 0x1c, 0x0f, 0xfe, 0x07, 0x00, 0x08, 0x3f, 0xff, 0x82, 0x00, 0x00, 0x7f, 0x9f, 0xc0, 0x00, +0x01, 0xf8, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0xf0, 0x00, 0x01, 0x80, 0x00, 0x30, 0x00, 0x00, +0x07, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x1c, +0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, +0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char batterylogo[] PROGMEM = { +// 'imresizer-1702234758351', 35x35px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, +0xfc, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, +0x00, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0xc0, +0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, +0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, +0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x3f, 0xff, 0xff, +0xfc, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char thankyoulogo[] PROGMEM = { +// 'imresizer-1702236559618', 200x200px +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, +0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3e, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3c, 0x78, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xbf, 0xf3, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1f, 0xbf, 0xf0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x79, 0x7f, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xf0, +0x30, 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0xe0, 0x30, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, +0x8f, 0xc3, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x78, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x10, 0x90, 0x00, 0x00, 0x06, 0x78, 0x5f, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x01, 0x01, 0xff, 0xff, 0xe3, 0xf0, +0x60, 0x00, 0x00, 0x06, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x89, 0x05, 0x61, 0xff, 0xff, 0xe1, 0xe0, 0x30, 0x00, 0x00, 0x02, 0x78, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x05, 0x61, 0xff, 0xff, +0xe0, 0xc3, 0xf0, 0x00, 0x00, 0x06, 0x78, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xff, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x78, +0x6f, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0xff, 0xff, 0xe3, 0xf0, 0x10, 0x00, 0x00, 0x06, 0x20, 0x5b, 0x04, 0x20, 0xa0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, +0x06, 0x00, 0x5b, 0x04, 0x20, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x06, 0x00, 0x7f, 0x0a, 0xa2, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0f, 0xff, 0xe3, 0xe3, 0xf0, +0x00, 0x00, 0x07, 0x30, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x28, 0x0f, 0xff, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x07, 0x78, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xc0, 0xc2, 0x06, 0x28, 0x1f, 0xff, 0xe0, +0xc0, 0x10, 0x02, 0x30, 0xa2, 0x78, 0x3e, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x71, 0x51, 0x81, 0x66, 0x1c, 0x20, 0x1f, 0xff, 0xe1, 0x80, 0xf0, 0x92, 0x2a, 0x26, 0x79, 0x7f, +0x2a, 0xa9, 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x82, 0x42, 0x44, 0x12, 0x20, 0x3f, +0xff, 0xe3, 0xf0, 0x00, 0x92, 0x21, 0x24, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0xbb, 0x84, 0xc6, 0x04, 0x26, 0x1c, 0x3f, 0xff, 0xe3, 0xe0, 0xb0, 0x0a, 0x30, 0xa6, +0x78, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7f, 0x0c, 0xc4, 0x08, 0x66, +0x30, 0x38, 0x70, 0x60, 0x00, 0x00, 0x4a, 0x28, 0xa6, 0x31, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x53, 0x09, 0x84, 0x08, 0x5c, 0x30, 0x38, 0x70, 0x60, 0x30, 0x01, 0x4a, +0x28, 0x26, 0xf9, 0x7f, 0x00, 0x04, 0x48, 0x41, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xb3, 0x0e, 0x8c, +0x18, 0xf4, 0x50, 0x3f, 0xbf, 0xf0, 0xe1, 0xf0, 0x00, 0x00, 0x02, 0xf8, 0x3e, 0x38, 0x04, 0x40, +0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x32, 0x08, 0xd7, 0xef, 0xc6, 0xf0, 0x3f, 0xbf, 0xf3, 0xe0, +0x00, 0x00, 0x00, 0x06, 0x08, 0x01, 0x00, 0x04, 0xf0, 0x51, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x60, 0x00, 0x03, 0x00, 0x1f, 0xbf, 0xf3, 0xe0, 0x00, 0x00, 0x00, 0x36, 0x78, 0x6f, 0x1e, +0x24, 0x14, 0x62, 0x20, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, +0xe1, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x70, 0x7f, 0x25, 0x04, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, +0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0xe0, 0x72, 0x0c, 0x31, 0xc3, 0x20, 0x78, +0x3c, 0x09, 0x04, 0x91, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, +0x07, 0x8f, 0xc0, 0x02, 0xfc, 0x79, 0xc7, 0xa0, 0x79, 0xff, 0x19, 0x08, 0x91, 0x00, 0x40, 0x00, +0x00, 0x00, 0x01, 0x40, 0x31, 0x21, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x01, 0xc3, 0xe4, 0xca, 0x8c, +0xa0, 0x39, 0xff, 0x02, 0x11, 0x60, 0xb0, 0x80, 0x00, 0x00, 0x00, 0x03, 0x40, 0x20, 0x90, 0x1c, +0x01, 0x00, 0x3f, 0x00, 0x03, 0xe3, 0x24, 0xfa, 0x88, 0x20, 0x79, 0xff, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x30, 0xc0, 0x00, 0x11, 0x00, 0x3f, 0xf8, 0x02, 0x22, 0x64, +0xf2, 0x98, 0x64, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x30, +0x00, 0x00, 0x1f, 0xe0, 0x1f, 0xff, 0xe2, 0x32, 0x65, 0xc4, 0x98, 0x64, 0x78, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x30, 0x00, 0x00, 0x03, 0xe0, 0x3f, 0xff, 0xe3, +0xf2, 0x67, 0x7c, 0xe7, 0xb8, 0x01, 0x9b, 0x35, 0x54, 0xb0, 0xcc, 0xcd, 0x48, 0x00, 0x00, 0x03, +0x00, 0x31, 0xc0, 0xfc, 0x01, 0x00, 0x1f, 0xff, 0xe3, 0xf2, 0x00, 0x30, 0x43, 0x10, 0xf8, 0x22, +0x04, 0x64, 0x88, 0x82, 0x95, 0x78, 0x00, 0x00, 0x02, 0x00, 0x17, 0x07, 0xc6, 0x13, 0x00, 0x07, +0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x31, 0x26, 0x64, 0xb0, 0xc2, 0xdd, 0x48, 0x00, +0x00, 0x00, 0x00, 0x1c, 0x04, 0x02, 0x32, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x78, 0x20, 0x85, 0x50, 0x80, 0x92, 0x95, 0x48, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x32, +0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1b, 0x30, 0x43, 0x00, 0xc8, 0xc0, +0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x01, 0x1f, 0xe6, 0x1f, 0xff, 0xe3, 0xc6, 0x0c, 0x78, +0xc0, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x03, 0x02, 0x02, 0x3f, 0xff, 0xe3, 0xc4, 0x0c, 0x78, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x02, 0x3f, 0xff, 0xe0, 0x1f, +0x8c, 0x01, 0xf0, 0x80, 0x78, 0x27, 0x28, 0xeb, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x02, 0x02, 0x03, 0x1f, 0xff, 0x05, 0x89, 0x8c, 0xb5, 0x30, 0x80, 0xf9, 0xd5, 0x5a, +0x2b, 0xe4, 0x2a, 0x1a, 0x04, 0x50, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x02, 0x02, 0x1f, 0x80, +0x07, 0xd9, 0x0c, 0xfd, 0x10, 0x80, 0x78, 0xa9, 0x2b, 0xeb, 0xe0, 0x03, 0x51, 0x10, 0x80, 0x00, +0x00, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x02, 0x10, 0x00, 0x00, 0x0f, 0xbc, 0x01, 0xf5, 0xc0, 0x78, +0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x40, 0x38, 0x01, 0x8e, +0x00, 0x00, 0x00, 0x1f, 0xfe, 0x01, 0xff, 0xc0, 0x78, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0xe0, 0x00, 0xfc, 0x1f, 0xff, 0xe3, 0xd9, 0x8c, 0x79, 0x10, +0x8f, 0xf8, 0xfe, 0x3f, 0xf1, 0xef, 0x8f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1f, 0xff, 0xe0, 0x19, 0x0c, 0x01, 0x30, 0x8f, 0xf9, 0xff, 0x3f, 0xf1, 0xef, 0x9f, +0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x0f, 0xac, +0x01, 0xf4, 0x9f, 0xf9, 0xff, 0x3f, 0xf9, 0xef, 0xbf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe3, 0xc9, 0xac, 0x79, 0x14, 0x9f, 0xf9, 0xef, 0xbf, 0xf9, +0xef, 0xbe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, +0x19, 0xac, 0x01, 0x34, 0x9f, 0x79, 0xe7, 0x9e, 0xf9, 0xff, 0x3c, 0xf0, 0x00, 0x00, 0x08, 0x1f, +0x0f, 0x07, 0x01, 0x07, 0xe1, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, 0xac, 0x01, 0xf4, 0x9e, 0x78, 0x1f, +0x9e, 0xf9, 0xfe, 0x3f, 0xf0, 0x00, 0x00, 0x18, 0x1f, 0x0f, 0x1f, 0x81, 0x87, 0xe3, 0xf0, 0x18, +0x00, 0x03, 0xdf, 0x2c, 0x7b, 0xf6, 0x9e, 0x78, 0xff, 0x9e, 0x79, 0xfe, 0x3f, 0xf0, 0x00, 0x00, +0x1c, 0x19, 0x86, 0x19, 0xc1, 0x81, 0x87, 0x30, 0x1c, 0x00, 0x02, 0x43, 0xac, 0x48, 0x72, 0x9e, +0x79, 0xff, 0x9e, 0x79, 0xfe, 0x3f, 0xf0, 0x00, 0x00, 0x1c, 0x19, 0x86, 0x18, 0x03, 0xc1, 0x86, +0x19, 0xff, 0xff, 0xe2, 0x47, 0x8c, 0x48, 0xd0, 0x9e, 0x79, 0xff, 0x9e, 0xf9, 0xff, 0x3c, 0x00, +0x00, 0x00, 0x34, 0x1f, 0x86, 0x1b, 0xc3, 0xc1, 0x86, 0x19, 0xff, 0xff, 0xe2, 0x4d, 0x8c, 0x49, +0x90, 0x9f, 0x79, 0xef, 0x9e, 0xf9, 0xef, 0x3c, 0xf0, 0x00, 0x00, 0x36, 0x1f, 0x06, 0x1b, 0xc6, +0xc1, 0x86, 0x19, 0xff, 0xff, 0xe2, 0x59, 0x8c, 0x4b, 0x10, 0x9f, 0xf9, 0xff, 0xbe, 0x7b, 0xef, +0xbe, 0xf0, 0x00, 0x00, 0x7e, 0x1b, 0x06, 0x18, 0xc7, 0xe1, 0x87, 0x31, 0xff, 0xff, 0xe2, 0x71, +0x0c, 0x4e, 0x10, 0x9f, 0xfd, 0xff, 0xbe, 0x7b, 0xff, 0xbf, 0xf0, 0x00, 0x00, 0x7f, 0x1b, 0x8f, +0x1f, 0x87, 0xe1, 0x83, 0xf1, 0xff, 0xff, 0xe3, 0xc1, 0x8c, 0x78, 0x31, 0x8f, 0xfd, 0xff, 0xbe, +0x7b, 0xf7, 0x9f, 0xf0, 0x00, 0x00, 0x63, 0x19, 0x8f, 0x0f, 0x0c, 0x21, 0x81, 0xe1, 0xff, 0xff, +0xe2, 0x07, 0x38, 0x40, 0xe7, 0x0f, 0xfc, 0xf7, 0xbe, 0x7b, 0xe7, 0x8f, 0xc0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, +0x7e, 0x7f, 0x07, 0xfe, 0x07, 0xc3, 0xf3, 0xf0, 0xfc, 0x0f, 0x03, 0xc0, 0xfe, 0x07, 0xe3, 0xb1, +0xa0, 0x00, 0x40, 0x00, 0xba, 0x8a, 0xa9, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, +0xf9, 0xfc, 0x0f, 0xc7, 0xe3, 0xff, 0x87, 0xf3, 0xf9, 0xb6, 0xb6, 0xdb, 0x04, 0x80, 0x88, 0xb1, +0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xe7, 0xff, 0xc7, +0xf3, 0xf9, 0xb6, 0xb6, 0x5b, 0x00, 0x02, 0x90, 0x99, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, +0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xe7, 0xff, 0xc7, 0xf3, 0xf1, 0xb6, 0xb6, 0xdb, 0x00, 0x12, +0xa2, 0xa1, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xcf, +0xff, 0xc7, 0xf3, 0xf9, 0xb6, 0xb7, 0xfb, 0x03, 0xb2, 0xab, 0x11, 0xff, 0xfc, 0xfe, 0x7f, 0x07, +0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf8, 0x07, 0xcf, 0xcf, 0xef, 0xe7, 0xf3, 0xf0, 0x00, 0x05, 0x10, +0x04, 0x80, 0x00, 0x01, 0xff, 0xfc, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf0, 0x07, +0xef, 0xcf, 0xcf, 0xe7, 0xf3, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, +0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf0, 0x07, 0xef, 0xcf, 0xcf, 0xe7, 0xf3, 0xf8, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, +0xf0, 0x07, 0xef, 0xcf, 0xc7, 0xe7, 0xf3, 0xf9, 0xf9, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1f, +0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xfb, 0xf3, 0xff, 0xe0, 0x03, 0xef, 0x8f, 0xc7, 0xe7, 0xf3, +0xf8, 0x61, 0x84, 0x80, 0x00, 0x00, 0x01, 0x10, 0x9f, 0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xfb, +0xf3, 0xff, 0xe0, 0x03, 0xef, 0x8f, 0xcf, 0xe7, 0xf3, 0xf0, 0x41, 0x84, 0x80, 0x00, 0x00, 0x00, +0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x0f, 0xdf, 0x07, 0xfb, 0xf3, 0xff, 0xe0, 0x03, 0xff, 0x8f, 0xcf, +0xe7, 0xf3, 0xf8, 0x42, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0xdf, +0x07, 0xff, 0xf3, 0xff, 0xe0, 0x03, 0xff, 0x8f, 0xc7, 0xe7, 0xf3, 0xf0, 0x42, 0x46, 0x00, 0x00, +0x40, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0xdf, 0x87, 0xff, 0xf3, 0xff, 0xc0, 0x01, 0xff, +0x0f, 0xc7, 0xe7, 0xf3, 0xf8, 0x42, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, +0x0f, 0xdf, 0x87, 0xff, 0xf3, 0xff, 0xc0, 0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x43, 0xc6, +0x00, 0x00, 0x04, 0x00, 0x20, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xc0, +0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x67, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1f, 0xc0, +0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xe0, 0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, +0x44, 0x25, 0x00, 0x00, 0x00, 0x00, 0x24, 0x1f, 0xc0, 0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, +0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x44, 0x24, 0x80, 0x00, 0x40, 0x20, 0x04, +0x1f, 0xc0, 0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, +0xf3, 0xf8, 0x4c, 0x14, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0x9f, 0x87, +0xff, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x68, 0x14, 0x40, 0x00, 0x00, +0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0x9f, 0x87, 0xdf, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, +0xcf, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, +0xff, 0x87, 0xdf, 0xf3, 0xff, 0xf0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0xff, 0xc7, 0xdf, 0xf3, 0xff, 0xf0, 0x00, +0xfe, 0x0f, 0xc7, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, +0x7f, 0x1f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, 0xf0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf0, 0x22, +0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, +0xf8, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf0, 0x24, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1f, +0xc0, 0xfe, 0x7f, 0x3f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, +0xf0, 0x20, 0x00, 0x70, 0x38, 0x00, 0x00, 0x05, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x9f, 0xc7, 0xcf, +0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xef, 0xe7, 0xf3, 0xf0, 0x2c, 0xfc, 0xa0, 0x02, 0x22, 0x24, +0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xc7, 0xc7, 0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xff, +0xe7, 0xff, 0xf0, 0x30, 0x84, 0x20, 0x12, 0x26, 0x24, 0x20, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, +0xc7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, 0x07, 0xff, 0xc3, 0xff, 0xf0, 0x40, 0x04, 0xf0, 0x02, +0x24, 0x04, 0x20, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xe7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, +0x07, 0xff, 0xc3, 0xff, 0xe0, 0x80, 0x04, 0x42, 0x02, 0x24, 0x04, 0x44, 0x1f, 0xc0, 0xfe, 0x7f, +0x3f, 0x8f, 0xe7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, 0x03, 0xff, 0x81, 0xff, 0xe0, 0x80, 0x04, +0x02, 0x03, 0xe1, 0x14, 0xc2, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xe7, 0xc3, 0xf3, 0xf9, 0xfc, +0x00, 0xfe, 0x01, 0xff, 0x00, 0xff, 0xc0, 0x80, 0x18, 0x22, 0x12, 0x21, 0x04, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1e, 0x00, +0x7c, 0x20, 0x1c, 0x02, 0x2f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x28, 0x0c, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x80, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x02, 0x20, +0x04, 0x01, 0x1f, 0xf8, 0x60, 0x10, 0x67, 0xfc, 0x00, 0x07, 0x80, 0x03, 0xe6, 0x84, 0x22, 0x85, +0x51, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x60, 0x30, 0xc7, +0xfc, 0x00, 0x07, 0x80, 0x03, 0xe6, 0x94, 0xa2, 0xb5, 0x53, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x70, 0x30, 0x87, 0xfc, 0x00, 0x07, 0x80, 0x03, 0xe0, 0x00, +0x02, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xf0, +0x31, 0x82, 0x60, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xd0, 0x33, 0x03, 0xfc, 0x3e, 0xf7, 0x87, 0xe3, +0xe3, 0xf1, 0xe7, 0x00, 0x3d, 0xe1, 0xf0, 0xf7, 0x8f, 0xbc, 0x00, 0x01, 0x94, 0x28, 0x91, 0x91, +0x80, 0x90, 0x33, 0x03, 0xfc, 0x7e, 0xf7, 0x8f, 0xf3, 0xe7, 0xf9, 0xff, 0x80, 0x3f, 0xe7, 0xfc, +0xff, 0xcf, 0xbe, 0x00, 0x02, 0x14, 0x20, 0x09, 0x09, 0x80, 0x98, 0x36, 0x01, 0xdc, 0x7e, 0xf7, +0x9f, 0xfb, 0xef, 0xfd, 0xff, 0x80, 0x7f, 0xe7, 0xfc, 0xff, 0xcf, 0xbe, 0x00, 0x00, 0x14, 0x28, +0xf1, 0x09, 0x81, 0x88, 0x3c, 0x00, 0x00, 0x3c, 0xf7, 0xde, 0xfb, 0xef, 0x3d, 0xff, 0xc0, 0x7f, +0xe7, 0xbc, 0xff, 0xcf, 0xfc, 0x00, 0x04, 0x14, 0x21, 0x0d, 0x09, 0x81, 0x08, 0x38, 0x03, 0xfc, +0x3c, 0xf7, 0x9e, 0x7b, 0xef, 0x3c, 0xf7, 0xc0, 0x79, 0xe7, 0xbe, 0xfb, 0xcf, 0xfc, 0x00, 0x04, +0x14, 0x20, 0x05, 0x09, 0x81, 0x0c, 0x38, 0x07, 0xfe, 0x3e, 0xe7, 0x9f, 0xfb, 0xef, 0xfc, 0xf7, +0xc0, 0x79, 0xe0, 0x7e, 0xfb, 0xcf, 0xf8, 0x00, 0x04, 0x14, 0x22, 0x05, 0x09, 0x83, 0x0c, 0x38, +0x07, 0xfc, 0x1e, 0xe7, 0x9f, 0xfb, 0xef, 0xfc, 0xf7, 0xc0, 0x79, 0xe1, 0xfe, 0x7b, 0xcf, 0xf8, +0x00, 0x04, 0x14, 0x2a, 0x05, 0x09, 0x83, 0xfc, 0x3c, 0x02, 0x04, 0x1f, 0xe7, 0x9f, 0xfb, 0xef, +0xfc, 0xf7, 0xc0, 0x79, 0xe7, 0xfe, 0xfb, 0xcf, 0xf8, 0x00, 0x04, 0x14, 0x28, 0x05, 0x09, 0x82, +0x06, 0x36, 0x07, 0xff, 0x1f, 0xe7, 0x9e, 0x03, 0xef, 0x00, 0xf7, 0xc0, 0x79, 0xe7, 0xbc, 0x7b, +0xcf, 0xf8, 0x00, 0x00, 0x14, 0x20, 0x05, 0x09, 0x86, 0x06, 0x36, 0x07, 0xff, 0x1f, 0xc7, 0x9e, +0x7b, 0xef, 0x3c, 0xf7, 0xc0, 0x79, 0xef, 0xbe, 0x7b, 0xcf, 0xfc, 0x00, 0x02, 0x12, 0x29, 0x0d, +0x09, 0x86, 0x06, 0x33, 0x03, 0xfe, 0x0f, 0xc7, 0xde, 0xfb, 0xef, 0x3d, 0xf7, 0xc0, 0x7f, 0xef, +0xfe, 0xfb, 0xef, 0xbc, 0x00, 0x00, 0xf1, 0xa8, 0xf5, 0x09, 0x84, 0x02, 0x31, 0x80, 0x00, 0x0f, +0xc7, 0xdf, 0xfb, 0xef, 0xfd, 0xf7, 0xc0, 0x7f, 0xff, 0xfe, 0xfb, 0xef, 0xbe, 0x00, 0x00, 0x10, +0x08, 0x00, 0x01, 0x84, 0x03, 0x31, 0x83, 0xfc, 0x0f, 0xc7, 0xcf, 0xfb, 0xe7, 0xfd, 0xf7, 0xc0, +0x3f, 0xf7, 0xfe, 0xfb, 0xef, 0x9e, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x8c, 0x03, 0x30, 0xc3, +0xfc, 0x0f, 0x87, 0xc7, 0xe3, 0xe3, 0xf1, 0xf3, 0xc0, 0x3d, 0xe3, 0xfe, 0xfb, 0xef, 0x9e, 0x00, +0x00, 0x10, 0x10, 0x00, 0x01, 0x8c, 0x01, 0x30, 0x67, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x88, 0x01, +0x10, 0x66, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, +0x00, 0x00, 0x00, 0x03, 0xbc, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x40, 0x00, 0x01, 0x98, 0x0e, 0x70, +0x0c, 0x00, 0x00, 0x40, 0x02, 0x00, 0x3f, 0x20, 0x12, 0x58, 0x48, 0x89, 0x82, 0x00, 0x81, 0x40, +0x01, 0x81, 0x11, 0x54, 0x00, 0xc0, 0x0f, 0x08, 0x70, 0x1c, 0x0e, 0x00, 0xc0, 0x00, 0x00, 0x3f, +0x32, 0x1a, 0x7a, 0x49, 0xab, 0xce, 0x00, 0x21, 0x05, 0x1f, 0x82, 0x00, 0xc0, 0x00, 0xc7, 0xff, +0x10, 0xbc, 0x30, 0x0a, 0x31, 0x80, 0x00, 0x20, 0x7f, 0x36, 0x92, 0x32, 0x4f, 0xa0, 0x48, 0x00, +0x01, 0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x11, 0x9c, 0x30, 0x06, 0x31, 0x80, 0x00, +0x20, 0x3f, 0x3e, 0x9a, 0x32, 0x6f, 0xa2, 0x58, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, +0x07, 0xfc, 0x31, 0x8c, 0x66, 0x26, 0x33, 0x04, 0x00, 0x00, 0x1e, 0x2a, 0x1a, 0x32, 0x4e, 0xa3, +0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfc, 0x07, 0x0c, 0x33, 0x8c, 0x66, 0x2e, 0x33, +0xc4, 0x00, 0x00, 0x00, 0x22, 0x82, 0x12, 0x48, 0xb9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0x8c, +0xfd, 0xcc, 0xc3, 0xfc, 0x31, 0x8c, 0x6e, 0x5f, 0x35, 0x80, 0x00, 0x00, 0xbf, 0x22, 0x92, 0x32, +0x48, 0xb8, 0xd0, 0x00, 0x00, 0x03, 0x9d, 0x99, 0xdc, 0xcf, 0xc0, 0xc7, 0xfc, 0x3d, 0x8c, 0xee, +0x43, 0x39, 0x88, 0x00, 0x00, 0xbf, 0x22, 0x9a, 0x32, 0x58, 0xa2, 0x50, 0x00, 0x00, 0x03, 0x9f, +0x9b, 0xfd, 0xc6, 0xc0, 0xc0, 0x7f, 0x39, 0x8c, 0xfe, 0x41, 0xb1, 0xf0, 0x00, 0x00, 0xe1, 0x22, +0x52, 0x32, 0x58, 0xa2, 0x58, 0x00, 0x00, 0x03, 0x87, 0x1f, 0xfd, 0x86, 0xe0, 0xc0, 0x0f, 0x01, +0x8d, 0x33, 0xc1, 0xb0, 0x60, 0x00, 0x00, 0xff, 0x22, 0x10, 0x30, 0x58, 0xa3, 0x4e, 0x00, 0x00, +0x03, 0x86, 0x1f, 0xfd, 0xbe, 0x78, 0xc0, 0x00, 0x01, 0x8d, 0x03, 0x80, 0x80, 0x00, 0x00, 0x00, +0x7e, 0x22, 0x62, 0x91, 0x88, 0xb9, 0xc6, 0x00, 0x00, 0x02, 0x9f, 0x9e, 0xed, 0xfe, 0x3c, 0xc3, +0xfc, 0x01, 0x8e, 0x01, 0x00, 0x88, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0x9f, 0x9c, 0xed, 0xf0, 0x0c, 0xc3, 0xfc, 0x01, 0x84, 0x00, 0x00, 0xbc, 0x08, +0x18, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x1c, 0xed, 0x80, +0x8e, 0xc7, 0xfe, 0x01, 0xf8, 0x00, 0x00, 0xbd, 0xdc, 0xc9, 0x9c, 0x3f, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0x9c, 0xcd, 0xc4, 0xce, 0xc6, 0x06, 0x01, 0x8b, 0xaa, 0x80, +0xb5, 0xfd, 0xfb, 0xdc, 0x1c, 0x06, 0x06, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x88, +0xcc, 0xfc, 0xfe, 0xc7, 0xfc, 0x03, 0x89, 0x6f, 0x00, 0xb1, 0xf5, 0xeb, 0xd4, 0x0f, 0x0f, 0xc0, +0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x44, 0x78, 0x7c, 0x83, 0xfc, 0x04, 0x81, +0x6b, 0x21, 0x3d, 0x9d, 0x9b, 0xd8, 0x3f, 0x14, 0x80, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x86, 0x00, 0x00, 0x00, 0x30, 0x01, 0xf8, 0x0c, 0x81, 0x6b, 0x31, 0x35, 0xbd, 0xbb, 0x4e, 0x3f, +0x07, 0x04, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x09, 0x81, 0x6f, 0x23, 0x35, 0xb5, 0xbb, 0xd6, 0x00, 0x02, 0x82, 0xa4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0x9f, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x01, 0x4e, 0xa2, 0x3d, 0xbd, 0xfb, +0xdc, 0x37, 0x19, 0xe6, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9f, 0x80, 0x00, 0x00, 0x09, +0xe7, 0xfc, 0x0f, 0x00, 0x00, 0x1c, 0x10, 0x10, 0x00, 0x88, 0x23, 0x26, 0x20, 0xa4, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x08, 0x40, 0x87, 0xfc, 0x0e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7f, 0x08, 0x27, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, +0x08, 0x08, 0xe3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x45, 0x64, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x80, 0x01, 0x08, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x06, 0x1e, 0x01, 0x84, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, +0x00, 0x00, 0x40, 0x08, 0x23, 0xfc, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, +0x07, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9d, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xfc, 0x24, +0x48, 0x00, 0x08, 0x22, 0x23, 0x02, 0x06, 0x3f, 0x18, 0x04, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x8f, 0x00, 0x00, 0x00, 0x00, 0xe7, 0xfc, 0x24, 0x88, 0x44, 0x2a, 0x20, 0xa0, 0x0a, 0x0e, +0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, 0x06, +0x64, 0x26, 0x6c, 0xcc, 0x2c, 0x30, 0xb3, 0x14, 0x06, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0xe7, 0xfe, 0x24, 0x28, 0x40, 0xa8, 0x22, 0xa1, +0x10, 0x06, 0x3f, 0x30, 0x41, 0xde, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xe3, 0xbc, 0x06, 0x48, 0x00, 0x40, 0x12, 0x20, 0x00, 0x06, 0x36, 0x30, 0x82, 0x12, 0x94, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xe1, 0xbc, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xa2, 0x50, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x25, 0xa2, +0x52, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0xe7, 0xfc, 0x00, 0x00, +0x00, 0x00, 0x35, 0xd5, 0xd6, 0xa7, 0x3f, 0x25, 0x21, 0xcc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, +0x18, 0x80, 0x00, 0x00, 0x01, 0xe7, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xdb, 0xe6, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x27, 0xfc, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x90, 0x0e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x06, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x37, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0e, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfc, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; \ No newline at end of file diff --git a/voting_device/images.h b/voting_device/images.h new file mode 100644 index 0000000..fa65179 --- /dev/null +++ b/voting_device/images.h @@ -0,0 +1,12 @@ +#ifndef IMAGES_H +#define IMAGES_H +#include + +//Images +extern const unsigned char wifilogo[] PROGMEM; + +extern const unsigned char batterylogo[] PROGMEM; + +extern const unsigned char thankyoulogo[] PROGMEM; + +#endif \ No newline at end of file diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 3105664..5fdad42 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -28,17 +28,17 @@ int checkBatteryLevel(){ } void setup() { - + //button initialization pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand - + //LED initialization pinMode(LED_BUILTIN, OUTPUT); pinMode(5, OUTPUT); digitalWrite(5, HIGH); digitalWrite(LED_BUILTIN, LOW); pinMode(RXPIN, INPUT_PULLUP); - + //Display initialization initDisplay(); char question[100] = "How many characters can E-paper fit across?"; char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; @@ -85,18 +85,17 @@ Serial.println(macAddress); mqttClient.subscribe(subInit.c_str(), MQTTsubQos); //recieve voting ID //mqttClient.subscribe(subResync, MQTTsubQos); mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question - + } + int state = 0; +int batteryPercentage = 20; char response[10] = ""; char votingID[20] = ""; char pubTopicVoteResponse[50] = ""; char voteTitle[256] = ""; -//bool username = true; // move to right location -//bool question = true; //move to right location - -void loop() { //working progress, need to define pressed function and buttons +void loop() { //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off switch (state) { case BOOT: @@ -107,44 +106,43 @@ void loop() { //working progress, need to define pressed function and buttons Serial.println(MQTTmsg); state = QUESTION; } - //if (!question) { - //error msg - //request question - //} //battery status break; + case QUESTION: if (flag) { flag = 0; Serial.println(MQTTmsg); strcpy(voteTitle, MQTTmsg); - paintVoteScreen(voteTitle); + paintVoteScreen(voteTitle, batteryPercentage); strcat(pubTopicVoteResponse, pubPubVote); strcat(pubTopicVoteResponse, votingID); state = VOTE; } break; + case VOTE: - //display question - //strcpy(response, "Yes"); - //state = CONFIRM; if (!digitalRead(12)) { delay(500); strcpy(response, "Yes"); + paintConfirmScreen(response, batteryPercentage); Serial.println("YES"); state = CONFIRM; - }/* + } else if (digitalRead(2)) { strcpy(response, "Pass"); + paintConfirmScreen(response, batteryPercentage); Serial.println("PASS"); state = CONFIRM; } else if (digitalRead(12)) { strcpy(response, "No"); + paintConfirmScreen(response, batteryPercentage); Serial.println("NO"); state = CONFIRM; - }*/ + } break; + case CONFIRM: if (digitalRead(12)) { delay(500); @@ -152,9 +150,11 @@ void loop() { //working progress, need to define pressed function and buttons state = CLOSE_VOTE; } else if (!digitalRead(0)){ + paintVoteScreen(voteTitle, batteryPercentage); state = VOTE; } break; + case CLOSE_VOTE: //display closing thank you Serial.println("voting ending"); @@ -162,5 +162,6 @@ void loop() { //working progress, need to define pressed function and buttons state = BOOT; break; } + */ mqttClient.loop(); } From 52dbfdd623e5ca290b7c09a28cda7b3184f460de Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:05:54 +0200 Subject: [PATCH 22/36] cleaning up code, adding comments. TODO-fix button interrupts --- voting_device/display.cpp | 34 ++++++++++++++++++++++++++++++ voting_device/display.h | 2 ++ voting_device/voting_device.ino | 37 +++++++++++++++------------------ 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 42c4209..ee5bf3e 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -95,6 +95,40 @@ void paintConfirmScreen(const char *response, int batteryLevel) { epd.DisplayFrame(); } +void paintClosingScreen(const char *question, int batteryLevel) { //battery level is a range between 0 and 25, ie. battery at 100% = 25, battery empty=0 + // this function is under construction and will quite different when complete(6.2.24) + paint.SetWidth(30); + paint.SetHeight(200); + paint.Clear(COLORED); // paints the height and width with the given color + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(COLORED); // paints the height and width with the given color + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 30, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(COLORED); // paints the height and width with the given color + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 60, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(COLORED); // paints the height and width with the given color + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 90, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(COLORED); // paints the height and width with the given color + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 120, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(COLORED); // paints the height and width with the given color + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 150, 0, paint.GetWidth(), paint.GetHeight()); + paint.Clear(COLORED); // paints the height and width with the given color + paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + epd.SetFrameMemory(paint.GetImage(), 180, 0, paint.GetWidth(), paint.GetHeight()); + + epd.DisplayFrame(); + delay(5000); + paint.SetWidth(190); + paint.SetHeight(190); + paint.Clear(UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); + epd.DisplayFrame(); +} //helper functions void drawImage(int x, int y, int width, int height, const unsigned char *image) { diff --git a/voting_device/display.h b/voting_device/display.h index cd873b9..22373c1 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -16,6 +16,8 @@ void paintVoteScreen(const char *question, int batteryLevel); void paintConfirmScreen(const char *response, int batteryLevel); +void paintClosingScreen(const char *question, int batteryLevel); + //Unused in voting_device.ino, could be deleted from this .h file void display_question(const char *question, char *line, int *position); diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 5fdad42..6aee1ca 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -3,22 +3,22 @@ #include "button_interrupts.h" #include "display.h" -int message_count = 0; - // MQTT-Client erstellen WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); -char MQTTmsg[] = "This is a test string for payload"; -bool flag = 0; +char MQTTmsg[255] = ""; +bool MQTT_flag = 0; // MQTT-Nachrichten verarbeiten void callback(char* topic, byte* payload, unsigned int length) { + //look into what topic is memcpy(MQTTmsg, payload, length); MQTTmsg[length] = '\0'; - flag = 1; + MQTT_flag = 1; } +//move this function to another folder int checkBatteryLevel(){ int adcValue = analogRead(BATTERY_PIN); float voltage = adcValue * REFERENCE_VOLTAGE / 1023; @@ -40,8 +40,7 @@ void setup() { pinMode(RXPIN, INPUT_PULLUP); //Display initialization initDisplay(); - char question[100] = "How many characters can E-paper fit across?"; - char question2[] = "In this example, exampleString is a character array containing the string Hello, World!. The strlen function is then u Hello, World!."; + //attachISR(); #ifdef DEBUG @@ -85,23 +84,22 @@ Serial.println(macAddress); mqttClient.subscribe(subInit.c_str(), MQTTsubQos); //recieve voting ID //mqttClient.subscribe(subResync, MQTTsubQos); mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question - } -int state = 0; -int batteryPercentage = 20; -char response[10] = ""; -char votingID[20] = ""; -char pubTopicVoteResponse[50] = ""; -char voteTitle[256] = ""; - void loop() { //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off + int state = 0; + int batteryPercentage = 20; //this may need to be global if we diplay screen in setup + char response[10] = ""; + char votingID[20] = ""; + char pubTopicVoteResponse[50] = ""; + char voteTitle[256] = ""; + switch (state) { case BOOT: //display start up screen - if (flag) { - flag = 0; + if (MQTT_flag) { + MQTT_flag = 0; strcpy(votingID, MQTTmsg); Serial.println(MQTTmsg); state = QUESTION; @@ -110,8 +108,8 @@ void loop() { break; case QUESTION: - if (flag) { - flag = 0; + if (MQTT_flag) { + MQTT_flag = 0; Serial.println(MQTTmsg); strcpy(voteTitle, MQTTmsg); paintVoteScreen(voteTitle, batteryPercentage); @@ -162,6 +160,5 @@ void loop() { state = BOOT; break; } - */ mqttClient.loop(); } From 7e5bfbbf9f2e9b5cb59de9aa36778d7bb6ff4d67 Mon Sep 17 00:00:00 2001 From: murphyslemon <111736225+murphyslemon@users.noreply.github.com> Date: Tue, 6 Feb 2024 16:14:23 +0200 Subject: [PATCH 23/36] clean up --- voting_device/config.h | 4 ++++ voting_device/display.cpp | 1 + voting_device/display.h | 1 - voting_device/voting_device.ino | 19 +++++++++++-------- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index b956e1c..c35a086 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -54,6 +54,10 @@ const char* subResync = "/setupVote/Resync"; #include //todo find encryption library #endif +//Battery +#define FULL_BATTERY 25 +#define EMPTY_BATTERY 0 + #ifdef ISRS_FOR_BUTTONS #include "button_interrupts.h" void attachISR(void){ diff --git a/voting_device/display.cpp b/voting_device/display.cpp index ee5bf3e..75af0e2 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -22,6 +22,7 @@ void paintVoteScreen(const char *question, int batteryLevel) { //battery level i //battery logo paint.Clear(UNCOLORED); drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates + //if you want to add a proper status bar, this is where to do it, (draw rectangle) epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); //battery status bar paint.SetWidth(9); diff --git a/voting_device/display.h b/voting_device/display.h index 22373c1..7a29c3e 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -2,7 +2,6 @@ #define DISPLAY_H #include #include "src/epd1in54_V2.h" -#include "src/imagedata.h" #include "src/epdpaint.h" #include diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 6aee1ca..a321032 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -3,6 +3,8 @@ #include "button_interrupts.h" #include "display.h" +//REMEMBER TO REMOVE ALL SERIAL RELATED STUFF AS IT AFFECTS RX PIN. + // MQTT-Client erstellen WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); @@ -13,6 +15,7 @@ bool MQTT_flag = 0; // MQTT-Nachrichten verarbeiten void callback(char* topic, byte* payload, unsigned int length) { //look into what topic is + //add specific topic flags here memcpy(MQTTmsg, payload, length); MQTTmsg[length] = '\0'; MQTT_flag = 1; @@ -21,10 +24,10 @@ void callback(char* topic, byte* payload, unsigned int length) { //move this function to another folder int checkBatteryLevel(){ int adcValue = analogRead(BATTERY_PIN); - float voltage = adcValue * REFERENCE_VOLTAGE / 1023; - //int batteryLevel = map(constrain(voltage, 3.0, 9.0), 3.0, 9.0, 0, 100); - int batteryLevel = map(voltage, 3.0, 9.0, 0, 100); - return batteryLevel; + if (adcValue > 440) { + return FULL_BATTERY; + } + return EMPTY_BATTERY; } void setup() { @@ -33,11 +36,11 @@ void setup() { pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand //LED initialization - pinMode(LED_BUILTIN, OUTPUT); pinMode(5, OUTPUT); digitalWrite(5, HIGH); - digitalWrite(LED_BUILTIN, LOW); - pinMode(RXPIN, INPUT_PULLUP); +#ifndef DEBUG + pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL +#endif //Display initialization initDisplay(); @@ -89,7 +92,7 @@ Serial.println(macAddress); void loop() { //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off int state = 0; - int batteryPercentage = 20; //this may need to be global if we diplay screen in setup + int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup char response[10] = ""; char votingID[20] = ""; char pubTopicVoteResponse[50] = ""; From c1281aba006c4f147cc6e3d37233e9fdfb794cf4 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Thu, 8 Feb 2024 19:06:34 +0200 Subject: [PATCH 24/36] device keeps resetting, code not working --- voting_device/voting_device.ino | 54 ++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index a321032..62038f4 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -1,7 +1,11 @@ #include "config.h" #include "power.h" #include "button_interrupts.h" -#include "display.h" +//#include "display.h" + +#define btn1 0 +#define btn2 2 +#define btn3 12 //REMEMBER TO REMOVE ALL SERIAL RELATED STUFF AS IT AFFECTS RX PIN. @@ -30,24 +34,44 @@ int checkBatteryLevel(){ return EMPTY_BATTERY; } +void ICACHE_RAM_ATTR btnIRQ(){ + delay(30); + if (!digitalRead(btn1)){ + Serial.println("btn1"); + while (!digitalRead(btn1)); + } + if (!digitalRead(btn2)){ + Serial.println("btn2"); + while (!digitalRead(btn2)); + } + if (!digitalRead(btn3)){ + Serial.println("btn3"); + while (!digitalRead(btn3)); + } +} + void setup() { //button initialization - pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand - pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand - pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand + pinMode(btn1, INPUT_PULLUP); + pinMode(btn2, INPUT_PULLUP); + pinMode(btn3, INPUT_PULLUP); + Serial.begin(115200); + attachInterrupt(digitalPinToInterrupt(btn1), btnIRQ, FALLING); + attachInterrupt(digitalPinToInterrupt(btn2), btnIRQ, FALLING); + attachInterrupt(digitalPinToInterrupt(btn3), btnIRQ, FALLING); //LED initialization pinMode(5, OUTPUT); digitalWrite(5, HIGH); #ifndef DEBUG - pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL + //pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL #endif //Display initialization - initDisplay(); + //initDisplay(); //attachISR(); #ifdef DEBUG - Serial.begin(115200); + //Serial.begin(115200); #endif delay(10); #ifdef DEBUG @@ -115,7 +139,7 @@ void loop() { MQTT_flag = 0; Serial.println(MQTTmsg); strcpy(voteTitle, MQTTmsg); - paintVoteScreen(voteTitle, batteryPercentage); + //paintVoteScreen(voteTitle, batteryPercentage); strcat(pubTopicVoteResponse, pubPubVote); strcat(pubTopicVoteResponse, votingID); state = VOTE; @@ -123,35 +147,35 @@ void loop() { break; case VOTE: - if (!digitalRead(12)) { + if (!digitalRead(0)) { delay(500); strcpy(response, "Yes"); - paintConfirmScreen(response, batteryPercentage); + //paintConfirmScreen(response, batteryPercentage); Serial.println("YES"); state = CONFIRM; } else if (digitalRead(2)) { strcpy(response, "Pass"); - paintConfirmScreen(response, batteryPercentage); + //paintConfirmScreen(response, batteryPercentage); Serial.println("PASS"); state = CONFIRM; } else if (digitalRead(12)) { strcpy(response, "No"); - paintConfirmScreen(response, batteryPercentage); + //paintConfirmScreen(response, batteryPercentage); Serial.println("NO"); state = CONFIRM; } break; case CONFIRM: - if (digitalRead(12)) { + if (digitalRead(0)) { delay(500); mqttClient.publish(pubPubVote, response); state = CLOSE_VOTE; } - else if (!digitalRead(0)){ - paintVoteScreen(voteTitle, batteryPercentage); + else if (!digitalRead(12)){ + //paintVoteScreen(voteTitle, batteryPercentage); state = VOTE; } break; From eec2912aa859c44383e11bd2cb6a5b7221d483ef Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Thu, 8 Feb 2024 19:07:15 +0200 Subject: [PATCH 25/36] device keeps resetting, code not working --- voting_device/voting_device.ino | 102 ++++++++++++++++---------------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 62038f4..b4255e2 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -1,11 +1,7 @@ #include "config.h" #include "power.h" #include "button_interrupts.h" -//#include "display.h" - -#define btn1 0 -#define btn2 2 -#define btn3 12 +#include "display.h" //REMEMBER TO REMOVE ALL SERIAL RELATED STUFF AS IT AFFECTS RX PIN. @@ -34,46 +30,31 @@ int checkBatteryLevel(){ return EMPTY_BATTERY; } -void ICACHE_RAM_ATTR btnIRQ(){ - delay(30); - if (!digitalRead(btn1)){ - Serial.println("btn1"); - while (!digitalRead(btn1)); - } - if (!digitalRead(btn2)){ - Serial.println("btn2"); - while (!digitalRead(btn2)); - } - if (!digitalRead(btn3)){ - Serial.println("btn3"); - while (!digitalRead(btn3)); - } +bool debounce(int pin) { + static uint16_t state = 0; + state = (state<<1) | digitalRead(pin) | 0xfe00; + return (state == 0xff00); } void setup() { //button initialization - pinMode(btn1, INPUT_PULLUP); - pinMode(btn2, INPUT_PULLUP); - pinMode(btn3, INPUT_PULLUP); + pinMode(BUTTON_PIN_1, INPUT_PULLUP); + pinMode(BUTTON_PIN_2, INPUT_PULLUP); + pinMode(BUTTON_PIN_3, INPUT_PULLUP); +#ifdef DEBUG Serial.begin(115200); - attachInterrupt(digitalPinToInterrupt(btn1), btnIRQ, FALLING); - attachInterrupt(digitalPinToInterrupt(btn2), btnIRQ, FALLING); - attachInterrupt(digitalPinToInterrupt(btn3), btnIRQ, FALLING); +#endif + //why delay + delay(10); //LED initialization pinMode(5, OUTPUT); digitalWrite(5, HIGH); + //Display initialization + initDisplay(); #ifndef DEBUG - //pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL + pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL #endif - //Display initialization - //initDisplay(); - //attachISR(); - -#ifdef DEBUG - //Serial.begin(115200); -#endif - delay(10); #ifdef DEBUG Serial.println("Connecting to WiFi"); #endif @@ -96,16 +77,15 @@ void setup() { Serial.println("Connecting to the MQTT server"); #endif mqttClient.connect("ESP8266", mqtt_user, mqtt_password); - delay(500); + delay(500); //why is this here } + String macAddress = "Mac : " + String(WiFi.macAddress()); #ifdef DEBUG Serial.println("Connection to MQTT server established"); Serial.println((WiFi.macAddress()).c_str()); //String rawMacAddress = String(WiFi.macAddress()); - String macAddress = "Mac : " + String(WiFi.macAddress()); //String Nadim = "/registration/Server/"+ String(WiFi.macAddress()); - -Serial.println(macAddress); + Serial.println(macAddress); #endif mqttClient.publish(pubInit.c_str(), macAddress.c_str()); //send mac address mqttClient.subscribe(subInit.c_str(), MQTTsubQos); //recieve voting ID @@ -113,33 +93,38 @@ Serial.println(macAddress); mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question } -void loop() { - //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off int state = 0; int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup char response[10] = ""; char votingID[20] = ""; char pubTopicVoteResponse[50] = ""; char voteTitle[256] = ""; - + +void loop() { +#ifndef DEBUG + powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off +#endif switch (state) { case BOOT: //display start up screen if (MQTT_flag) { MQTT_flag = 0; strcpy(votingID, MQTTmsg); +#ifdef DEBUG Serial.println(MQTTmsg); +#endif state = QUESTION; } - //battery status break; case QUESTION: if (MQTT_flag) { MQTT_flag = 0; +#ifdef DEBUG Serial.println(MQTTmsg); +#endif strcpy(voteTitle, MQTTmsg); - //paintVoteScreen(voteTitle, batteryPercentage); + paintVoteScreen(voteTitle, batteryPercentage); strcat(pubTopicVoteResponse, pubPubVote); strcat(pubTopicVoteResponse, votingID); state = VOTE; @@ -147,42 +132,55 @@ void loop() { break; case VOTE: - if (!digitalRead(0)) { + if (debounce(!BUTTON_PIN_1)) { delay(500); strcpy(response, "Yes"); - //paintConfirmScreen(response, batteryPercentage); + paintConfirmScreen(response, batteryPercentage); +#ifdef DEBUG Serial.println("YES"); +#endif state = CONFIRM; + while (!debounce(BUTTON_PIN_1)); } - else if (digitalRead(2)) { + else if (!debounce(BUTTON_PIN_2)) { strcpy(response, "Pass"); - //paintConfirmScreen(response, batteryPercentage); + paintConfirmScreen(response, batteryPercentage); +#ifdef DEBUG Serial.println("PASS"); +#endif state = CONFIRM; + while (!debounce(BUTTON_PIN_2)); } - else if (digitalRead(12)) { + else if (debounce(BUTTON_PIN_3)) { strcpy(response, "No"); - //paintConfirmScreen(response, batteryPercentage); + paintConfirmScreen(response, batteryPercentage); +#ifdef DEBUG Serial.println("NO"); +#endif state = CONFIRM; + while (debounce(BUTTON_PIN_1)); } break; case CONFIRM: - if (digitalRead(0)) { + if (!debounce(BUTTON_PIN_1)) { delay(500); mqttClient.publish(pubPubVote, response); state = CLOSE_VOTE; + while (!debounce(BUTTON_PIN_1)); } - else if (!digitalRead(12)){ - //paintVoteScreen(voteTitle, batteryPercentage); + else if (!debounce(BUTTON_PIN_3)){ + paintVoteScreen(voteTitle, batteryPercentage); state = VOTE; + while (!debounce(BUTTON_PIN_3)); } break; case CLOSE_VOTE: //display closing thank you +#ifdef DEBUG Serial.println("voting ending"); +#endif delay(2000); state = BOOT; break; From 4396519d599aa69be3a13dfbebd5520f5ff792ef Mon Sep 17 00:00:00 2001 From: Flx12 Date: Fri, 9 Feb 2024 11:34:02 +0100 Subject: [PATCH 26/36] disabled interrupts --- voting_device/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voting_device/config.h b/voting_device/config.h index c35a086..9a3b2a4 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -47,7 +47,7 @@ const char* subResync = "/setupVote/Resync"; #define STATUS_LEDS //#define E_PAPER #define DEBUG -#define ISRS_FOR_BUTTONS +//#define ISRS_FOR_BUTTONS //Includes according to config #ifdef ENCRYPTION From 137f0932656662ecf66b4415ddc02745608f98eb Mon Sep 17 00:00:00 2001 From: Nadim-2022 Date: Fri, 9 Feb 2024 14:49:23 +0200 Subject: [PATCH 27/36] Things started working, Buttons are fine, Jason to c_string working fine, wifi and mqtt have separete functions --- voting_device/config.h | 20 ++-- voting_device/voting_device.ino | 172 +++++++++++++++++++------------- 2 files changed, 110 insertions(+), 82 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index c35a086..3ffe363 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -3,6 +3,8 @@ #include //Mqtt library by Nick O'Leary #include //#include + +#define STRINGSIZE 256 #define BATTERY_PIN A0 #define REFERENCE_VOLTAGE 3.3 @@ -21,9 +23,10 @@ #define CONFIRM 3 #define CLOSE_VOTE 4 + // WLAN-Settings -const char* ssid = "franks_galaxy"; -const char* password = "veef2267"; +const char* ssid = "Nadim"; +const char* password = "nadimahmed"; // MQTT-Server Settings const char* mqtt_server = "194.110.231.227"; @@ -38,7 +41,7 @@ const String pubInit = "/registration/Server/"+ String(WiFi.macAddress()); const char* pubPubVote = "/vote/"; // MQTT topics to subscribe -const String subInit = "/registration/esp/"+ String(WiFi.macAddress()); +const String subInit = "/registration/esp/"+ String(WiFi.macAddress()); // /registration/esp/ const char* subVoteSetup = "/setupVote/Setup"; const char* subResync = "/setupVote/Resync"; @@ -47,7 +50,7 @@ const char* subResync = "/setupVote/Resync"; #define STATUS_LEDS //#define E_PAPER #define DEBUG -#define ISRS_FOR_BUTTONS + //Includes according to config #ifdef ENCRYPTION @@ -58,12 +61,3 @@ const char* subResync = "/setupVote/Resync"; #define FULL_BATTERY 25 #define EMPTY_BATTERY 0 -#ifdef ISRS_FOR_BUTTONS -#include "button_interrupts.h" -void attachISR(void){ - attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); - attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); - attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); - -} -#endif diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index a321032..2915e52 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -1,25 +1,63 @@ #include "config.h" #include "power.h" -#include "button_interrupts.h" #include "display.h" +#include //REMEMBER TO REMOVE ALL SERIAL RELATED STUFF AS IT AFFECTS RX PIN. // MQTT-Client erstellen WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); - -char MQTTmsg[255] = ""; +const size_t JSON_CAPACITY = 256; +char MQTTmsg[STRINGSIZE] = ""; bool MQTT_flag = 0; +char MQTTVotingId [STRINGSIZE]= ""; +char MQTTVotingTitle [STRINGSIZE]= ""; + +// MQTT Callback Function +void callback(char* topic, byte* payload, unsigned int length) { + // Copy payload bytes to MQTTmsg + memcpy(MQTTmsg, payload, length); + MQTTmsg[length] = '\0'; // Ensure null-termination for string -// MQTT-Nachrichten verarbeiten + // Parse JSON + StaticJsonDocument doc; + DeserializationError error = deserializeJson(doc, MQTTmsg); + + // If parsing succeeds, extract the necessary fields + if (!error) { + if (doc.containsKey("VotingID")) { + const char* votingID = doc["VotingID"]; + Serial.print("Received Voting ID: "); + Serial.println(votingID); + memcpy(MQTTVotingId, votingID, strlen(votingID) + 1); + // Optionally, you can set a flag to indicate that a new ID has been received + MQTT_flag = true; + } + + if (doc.containsKey("VoteTitle")) { + const char* voteTitle = doc["VoteTitle"]; + Serial.print("Received Vote Title: "); + Serial.println(voteTitle); + memcpy(MQTTVotingTitle, voteTitle, strlen(voteTitle) + 1); + // Optionally, you can set a flag to indicate that a new title has been received + MQTT_flag = true; + } + + // Add more conditions to extract other fields as needed + } else { + Serial.print("Failed to parse JSON: "); + Serial.println(error.c_str()); + } +} +/* +// MQTT Callback Function void callback(char* topic, byte* payload, unsigned int length) { - //look into what topic is - //add specific topic flags here memcpy(MQTTmsg, payload, length); MQTTmsg[length] = '\0'; MQTT_flag = 1; } +*/ //move this function to another folder int checkBatteryLevel(){ @@ -30,81 +68,75 @@ int checkBatteryLevel(){ return EMPTY_BATTERY; } +void connectToWiFi() { + Serial.print("Connecting to WiFi"); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + Serial.print("Connected, IP address: "); + Serial.println(WiFi.localIP()); +} +void connectToMQTT() { + while (!mqttClient.connected()) { + Serial.println("Connecting to the MQTT server"); + mqttClient.connect("ESP8266", mqtt_user, mqtt_password); + delay(500); + } + Serial.println("Connection to MQTT server established"); +} + void setup() { + + Serial.begin(115200); //button initialization pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand + //LED initialization pinMode(5, OUTPUT); digitalWrite(5, HIGH); -#ifndef DEBUG - pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL -#endif + //pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL + //Display initialization - initDisplay(); + //initDisplay(); //attachISR(); - -#ifdef DEBUG - Serial.begin(115200); -#endif - delay(10); -#ifdef DEBUG - Serial.println("Connecting to WiFi"); -#endif WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); -#ifdef DEBUG - Serial.print("."); -#endif - } -#ifdef DEBUG - Serial.println("Connected to WiFi established"); -#endif - + connectToWiFi(); mqttClient.setServer(mqtt_server, mqtt_port); mqttClient.setCallback(callback); - - while (!mqttClient.connected()) { -#ifdef DEBUG - Serial.println("Connecting to the MQTT server"); -#endif - mqttClient.connect("ESP8266", mqtt_user, mqtt_password); - delay(500); - } -#ifdef DEBUG + connectToMQTT(); Serial.println("Connection to MQTT server established"); - Serial.println((WiFi.macAddress()).c_str()); - //String rawMacAddress = String(WiFi.macAddress()); - String macAddress = "Mac : " + String(WiFi.macAddress()); - //String Nadim = "/registration/Server/"+ String(WiFi.macAddress()); + String macAddress = "{\"Mac\" : \"" + String(WiFi.macAddress()) + "\"}"; -Serial.println(macAddress); -#endif - mqttClient.publish(pubInit.c_str(), macAddress.c_str()); //send mac address - mqttClient.subscribe(subInit.c_str(), MQTTsubQos); //recieve voting ID - //mqttClient.subscribe(subResync, MQTTsubQos); - mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question + Serial.println(macAddress); + mqttClient.publish(pubInit.c_str(), macAddress.c_str()); //send mac address + mqttClient.subscribe(subInit.c_str(), MQTTsubQos); //recieve voting ID + Serial.println("#" + String(subInit.c_str()) + "#") ; + //mqttClient.subscribe(subResync, MQTTsubQos); + mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question + // mqttClient.subscribe("/registration/esp/C8:C9:A3:1B:ED:5F", MQTTsubQos); } -void loop() { - //powerOff(); // RXPIN dose not work as interrupt, So we put it in main as a function for power off int state = 0; int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup - char response[10] = ""; - char votingID[20] = ""; - char pubTopicVoteResponse[50] = ""; - char voteTitle[256] = ""; - + char response[STRINGSIZE] = ""; + char votingID[STRINGSIZE] = ""; + char pubTopicVoteResponse[STRINGSIZE] = ""; + char voteTitle[STRINGSIZE] = ""; + + +void loop() { switch (state) { case BOOT: //display start up screen if (MQTT_flag) { MQTT_flag = 0; - strcpy(votingID, MQTTmsg); - Serial.println(MQTTmsg); + strcpy(votingID, MQTTVotingId); + Serial.println(votingID); state = QUESTION; } //battery status @@ -113,9 +145,9 @@ void loop() { case QUESTION: if (MQTT_flag) { MQTT_flag = 0; - Serial.println(MQTTmsg); - strcpy(voteTitle, MQTTmsg); - paintVoteScreen(voteTitle, batteryPercentage); + strcpy(voteTitle, MQTTVotingTitle); + Serial.println(voteTitle); + //paintVoteScreen(voteTitle, batteryPercentage); strcat(pubTopicVoteResponse, pubPubVote); strcat(pubTopicVoteResponse, votingID); state = VOTE; @@ -123,35 +155,36 @@ void loop() { break; case VOTE: - if (!digitalRead(12)) { + + if (!digitalRead(0)) { delay(500); strcpy(response, "Yes"); - paintConfirmScreen(response, batteryPercentage); + //paintConfirmScreen(response, batteryPercentage); Serial.println("YES"); state = CONFIRM; } - else if (digitalRead(2)) { + else if (!digitalRead(2)) { strcpy(response, "Pass"); - paintConfirmScreen(response, batteryPercentage); + //paintConfirmScreen(response, batteryPercentage); Serial.println("PASS"); state = CONFIRM; } - else if (digitalRead(12)) { + else if (!digitalRead(12)) { strcpy(response, "No"); - paintConfirmScreen(response, batteryPercentage); + //paintConfirmScreen(response, batteryPercentage); Serial.println("NO"); state = CONFIRM; } break; case CONFIRM: - if (digitalRead(12)) { + if (!digitalRead(0)) { delay(500); mqttClient.publish(pubPubVote, response); state = CLOSE_VOTE; } - else if (!digitalRead(0)){ - paintVoteScreen(voteTitle, batteryPercentage); + else if (!digitalRead(12)){ + //paintVoteScreen(voteTitle, batteryPercentage); state = VOTE; } break; @@ -163,5 +196,6 @@ void loop() { state = BOOT; break; } - mqttClient.loop(); + + mqttClient.loop(); } From 0fa3b37972cd2809c8d3228b8405b30167fa3cfa Mon Sep 17 00:00:00 2001 From: Nadim-2022 Date: Fri, 9 Feb 2024 15:56:26 +0200 Subject: [PATCH 28/36] Without displpay , everyting is workig, as intended, Polishing the code is left --- voting_device/voting_device.ino | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 0254965..0474c18 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -158,13 +158,17 @@ void loop() { case VOTE: if (!digitalRead(0)) { delay(500); - strcpy(response, "Yes"); + char responseBuffer[STRINGSIZE]; + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Yes\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + strcpy(response, responseBuffer); //paintConfirmScreen(response, batteryPercentage); Serial.println("YES"); state = CONFIRM; - while (!debounce(BUTTON_PIN_1)); + } + /* else if (!digitalRead(2)) { + delay(500); strcpy(response, "Pass"); //paintConfirmScreen(response, batteryPercentage); Serial.println("PASS"); @@ -172,12 +176,14 @@ void loop() { while (!debounce(BUTTON_PIN_2)); } else if (!digitalRead(12)) { + delay(500); strcpy(response, "No"); //paintConfirmScreen(response, batteryPercentage); Serial.println("NO"); state = CONFIRM; - while (debounce(BUTTON_PIN_1)); + while (debounce(BUTTON_PIN_3)); } + */ break; case CONFIRM: @@ -185,13 +191,14 @@ void loop() { delay(500); mqttClient.publish(pubPubVote, response); state = CLOSE_VOTE; - while (!debounce(BUTTON_PIN_1)); } + /* else if (!digitalRead(12)){ //paintVoteScreen(voteTitle, batteryPercentage); state = VOTE; while (!debounce(BUTTON_PIN_3)); } + */ break; case CLOSE_VOTE: From 576bb12e0ec3ca8e3a0e20e4f3fbe6487522e347 Mon Sep 17 00:00:00 2001 From: Nadim-2022 Date: Sat, 10 Feb 2024 20:53:20 +0200 Subject: [PATCH 29/36] Display is working now littele changes need in printvotetitle function to clear whole screen --- voting_device/config.h | 9 +++++ voting_device/src/epd1in54_V2.cpp | 4 --- voting_device/src/epdif.cpp | 5 +-- voting_device/src/epdif.h | 2 -- voting_device/voting_device.ino | 57 +++++++++++++++---------------- 5 files changed, 37 insertions(+), 40 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index 623cb2d..796e1f3 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -57,3 +57,12 @@ const char* subResync = "/setupVote/Resync"; #define FULL_BATTERY 25 #define EMPTY_BATTERY 0 +//#ifdef ISRS_FOR_BUTTONS +#include "button_interrupts.h" +void attachISR(void){ + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); + attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); +} +//#endif + diff --git a/voting_device/src/epd1in54_V2.cpp b/voting_device/src/epd1in54_V2.cpp index 7df047b..6e421a8 100644 --- a/voting_device/src/epd1in54_V2.cpp +++ b/voting_device/src/epd1in54_V2.cpp @@ -88,7 +88,6 @@ Epd::Epd() reset_pin = RST_PIN; dc_pin = DC_PIN; cs_pin = CS_PIN; - busy_pin = BUSY_PIN; width = EPD_WIDTH; height = EPD_HEIGHT; }; @@ -116,9 +115,6 @@ void Epd::SendData(unsigned char data) */ void Epd::WaitUntilIdle(void) { - while(DigitalRead(busy_pin) == 1) { //LOW: idle, HIGH: busy - DelayMs(100); - } DelayMs(200); } diff --git a/voting_device/src/epdif.cpp b/voting_device/src/epdif.cpp index b1f89c9..f4e5db2 100644 --- a/voting_device/src/epdif.cpp +++ b/voting_device/src/epdif.cpp @@ -56,12 +56,9 @@ int EpdIf::IfInit(void) { pinMode(CS_PIN, OUTPUT); pinMode(RST_PIN, OUTPUT); pinMode(DC_PIN, OUTPUT); - pinMode(BUSY_PIN, INPUT); - - pinMode(PWR_PIN, OUTPUT); - DigitalWrite(PWR_PIN, 1); SPI.begin(); + pinMode(MISO, INPUT_PULLUP); SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); return 0; } diff --git a/voting_device/src/epdif.h b/voting_device/src/epdif.h index be06092..d36c726 100644 --- a/voting_device/src/epdif.h +++ b/voting_device/src/epdif.h @@ -34,8 +34,6 @@ #define RST_PIN D2 #define DC_PIN D0 #define CS_PIN D8 -#define BUSY_PIN D7 -#define PWR_PIN D5 class EpdIf { public: diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 0474c18..8ba2a74 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -1,6 +1,7 @@ #include "config.h" #include "power.h" #include "display.h" +#include "button_interrupts.h" #include //REMEMBER TO REMOVE ALL SERIAL RELATED STUFF AS IT AFFECTS RX PIN. @@ -50,14 +51,6 @@ void callback(char* topic, byte* payload, unsigned int length) { Serial.println(error.c_str()); } } -/* -// MQTT Callback Function -void callback(char* topic, byte* payload, unsigned int length) { - memcpy(MQTTmsg, payload, length); - MQTTmsg[length] = '\0'; - MQTT_flag = 1; -} -*/ //move this function to another folder int checkBatteryLevel(){ @@ -92,20 +85,23 @@ bool debounce(int pin) { } void setup() { - Serial.begin(115200); //button initialization pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand - pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand + //pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand + /* //LED initialization + pinMode(LED_BUILTIN, OUTPUT); pinMode(5, OUTPUT); digitalWrite(5, HIGH); - //pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL - + digitalWrite(LED_BUILTIN, HIGH); + pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL + */ + //Display initialization - //initDisplay(); + initDisplay(); //attachISR(); @@ -130,8 +126,9 @@ void setup() { char votingID[STRINGSIZE] = ""; char pubTopicVoteResponse[STRINGSIZE] = ""; char voteTitle[STRINGSIZE] = ""; - + char responseBuffer[STRINGSIZE]; void loop() { + //powerOff(); switch (state) { case BOOT: //display start up screen @@ -148,7 +145,7 @@ void loop() { MQTT_flag = 0; strcpy(voteTitle, MQTTVotingTitle); Serial.println(voteTitle); - //paintVoteScreen(voteTitle, batteryPercentage); + paintVoteScreen(voteTitle, batteryPercentage); strcat(pubTopicVoteResponse, pubPubVote); strcat(pubTopicVoteResponse, votingID); state = VOTE; @@ -158,52 +155,52 @@ void loop() { case VOTE: if (!digitalRead(0)) { delay(500); - char responseBuffer[STRINGSIZE]; + Serial.println("I am in Button1: Vote"); snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Yes\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); strcpy(response, responseBuffer); - //paintConfirmScreen(response, batteryPercentage); + paintConfirmScreen("YES", batteryPercentage); Serial.println("YES"); state = CONFIRM; } - /* else if (!digitalRead(2)) { delay(500); - strcpy(response, "Pass"); - //paintConfirmScreen(response, batteryPercentage); + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Abstain\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + strcpy(response, responseBuffer); + paintConfirmScreen("ABSTAIN", batteryPercentage); Serial.println("PASS"); state = CONFIRM; - while (!debounce(BUTTON_PIN_2)); + } else if (!digitalRead(12)) { delay(500); - strcpy(response, "No"); - //paintConfirmScreen(response, batteryPercentage); + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"No\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + strcpy(response, responseBuffer); + paintConfirmScreen("NO", batteryPercentage); Serial.println("NO"); state = CONFIRM; - while (debounce(BUTTON_PIN_3)); } - */ break; case CONFIRM: + // ButtonYes.getState() if (!digitalRead(0)) { delay(500); + Serial.println("I am in Button1: Confirm"); mqttClient.publish(pubPubVote, response); state = CLOSE_VOTE; } - /* else if (!digitalRead(12)){ - //paintVoteScreen(voteTitle, batteryPercentage); + delay(500); + paintVoteScreen(voteTitle, batteryPercentage); state = VOTE; - while (!debounce(BUTTON_PIN_3)); } - */ break; case CLOSE_VOTE: delay(2000); - state = BOOT; + paintVoteScreen("Wating...for new question. ", batteryPercentage); + state = QUESTION; break; } From 49d89698d479c10c218f9c9574b3458cdabc3e06 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Sun, 11 Feb 2024 00:06:07 +0200 Subject: [PATCH 30/36] everything seems to be working, need to check battery status bar --- voting_device/config.h | 4 +-- voting_device/display.cpp | 56 +++++++++++---------------------- voting_device/display.h | 6 ++-- voting_device/power.cpp | 39 +++++++++++++---------- voting_device/power.h | 5 ++- voting_device/voting_device.ino | 6 ++-- 6 files changed, 55 insertions(+), 61 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index 796e1f3..c88e14e 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -25,8 +25,8 @@ // WLAN-Settings -const char* ssid = "Nadim"; -const char* password = "nadimahmed"; +const char* ssid = "franks_galaxy"; +const char* password = "veef2267"; // MQTT-Server Settings const char* mqtt_server = "194.110.231.227"; diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 75af0e2..52c329d 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -22,13 +22,9 @@ void paintVoteScreen(const char *question, int batteryLevel) { //battery level i //battery logo paint.Clear(UNCOLORED); drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates - //if you want to add a proper status bar, this is where to do it, (draw rectangle) - epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); //battery status bar - paint.SetWidth(9); - paint.SetHeight(batteryLevel); - paint.Clear(COLORED); - epd.SetFrameMemory(paint.GetImage(), 15, (200-(batteryLevel + 5)), paint.GetWidth(), paint.GetHeight()); //x value 10-15 good (16 too far) + paint.DrawFilledRectangle(4, 8, batteryLevel, 24, COLORED); + epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); //Bottom buttton bar paint.SetWidth(22); paint.SetHeight(200); @@ -46,10 +42,10 @@ void paintVoteScreen(const char *question, int batteryLevel) { //battery level i display_question(question, line, &position); } else { - char stringMod[90]; // Including space for null terminator - strncpy(stringMod, question, 90); - stringMod[89] = '\0'; - display_question(stringMod, line, &position); // Pass the modified string to display_question + char stringMod[90]; // Including space for null terminator + strncpy(stringMod, question, 90); + stringMod[89] = '\0'; + display_question(stringMod, line, &position); // Pass the modified string to display_question } epd.DisplayFrame(); } @@ -64,12 +60,9 @@ void paintConfirmScreen(const char *response, int batteryLevel) { //battery logo paint.Clear(UNCOLORED); drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates - epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); //battery status bar - paint.SetWidth(9); - paint.SetHeight(batteryLevel); - paint.Clear(COLORED); - epd.SetFrameMemory(paint.GetImage(), 15, (200-(batteryLevel + 5)), paint.GetWidth(), paint.GetHeight()); //x value 10-15 good (16 too far) + paint.DrawFilledRectangle(4, 8, batteryLevel, 24, COLORED); + epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); //Bottom button bar paint.SetWidth(22); paint.SetHeight(200); @@ -96,38 +89,25 @@ void paintConfirmScreen(const char *response, int batteryLevel) { epd.DisplayFrame(); } -void paintClosingScreen(const char *question, int batteryLevel) { //battery level is a range between 0 and 25, ie. battery at 100% = 25, battery empty=0 - // this function is under construction and will quite different when complete(6.2.24) +void paintClosingScreen() { paint.SetWidth(30); paint.SetHeight(200); - paint.Clear(COLORED); // paints the height and width with the given color - paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(COLORED); // paints the height and width with the given color - paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 30, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(COLORED); // paints the height and width with the given color - paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 60, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(COLORED); // paints the height and width with the given color - paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); // paints the height and width with the given color + paint.DrawStringAt(25, 0, "THANK YOU!!", &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt(26, 0, "THANK YOU!!", &Font24, COLORED); epd.SetFrameMemory(paint.GetImage(), 90, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(COLORED); // paints the height and width with the given color - paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 120, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(COLORED); // paints the height and width with the given color - paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 150, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(COLORED); // paints the height and width with the given color - paint.DrawStringAt(10, 0, "Are you sure?", &Font20, UNCOLORED); //moves text to co-ordinates with-in the set height and width + paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 180, 0, paint.GetWidth(), paint.GetHeight()); - - epd.DisplayFrame(); - delay(5000); - paint.SetWidth(190); - paint.SetHeight(190); - paint.Clear(UNCOLORED); - epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); epd.DisplayFrame(); } diff --git a/voting_device/display.h b/voting_device/display.h index 7a29c3e..327a83f 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -5,6 +5,8 @@ #include "src/epdpaint.h" #include +extern Epd epd; + #define COLORED 0 #define UNCOLORED 1 @@ -15,9 +17,9 @@ void paintVoteScreen(const char *question, int batteryLevel); void paintConfirmScreen(const char *response, int batteryLevel); -void paintClosingScreen(const char *question, int batteryLevel); +void paintClosingScreen(); -//Unused in voting_device.ino, could be deleted from this .h file +//Unused in voting_device.ino, could be removed from this .h file void display_question(const char *question, char *line, int *position); void drawImage(int x, int y, int width, int height, const unsigned char *image); diff --git a/voting_device/power.cpp b/voting_device/power.cpp index fd882d9..32d9422 100644 --- a/voting_device/power.cpp +++ b/voting_device/power.cpp @@ -1,22 +1,29 @@ - #include "power.h" +#include "power.h" +#include "display.h" +uint32_t startTime; +bool powerSW = false; - uint32_t startTime; - bool powerSW = false; - - void powerOff(){ - if (!digitalRead(RXPIN)) { - if (!powerSW) { - startTime = millis(); - powerSW = true; +void powerOff(){ + if (!digitalRead(RX_PIN)){ + delay(30); //debounce + if (!digitalRead(RX_PIN)){ + if (!powerSW){ + startTime = millis(); + powerSW = true; } - if (millis() - startTime > 3000) { - digitalWrite(5, LOW); - digitalWrite(LED_BUILTIN, HIGH); - while (!digitalRead(RXPIN)); + if (millis() - startTime > 3000){ + digitalWrite(PWR_PIN, LOW); //turn device off + //write your code here to clear the epaper to notify the user know to release the button + epd.LDirInit(); + epd.Clear(); // clears whole screen to white + while (!digitalRead(RX_PIN)){ //wait for button released + delay(100); + } } - } - else { + } + } + else{ powerSW = false; } - } \ No newline at end of file +} \ No newline at end of file diff --git a/voting_device/power.h b/voting_device/power.h index 665daa1..b904f9e 100644 --- a/voting_device/power.h +++ b/voting_device/power.h @@ -1,7 +1,10 @@ #ifndef POWER #define POWER #include -#define RXPIN 3 +#include "display.h" + +#define RX_PIN 3 +#define PWR_PIN 5 void powerOff(); diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 8ba2a74..196d7f3 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -121,12 +121,14 @@ void setup() { } int state = 0; - int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup + //int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup + int batteryPercentage = 20; char response[STRINGSIZE] = ""; char votingID[STRINGSIZE] = ""; char pubTopicVoteResponse[STRINGSIZE] = ""; char voteTitle[STRINGSIZE] = ""; char responseBuffer[STRINGSIZE]; + void loop() { //powerOff(); switch (state) { @@ -199,7 +201,7 @@ void loop() { case CLOSE_VOTE: delay(2000); - paintVoteScreen("Wating...for new question. ", batteryPercentage); + paintClosingScreen(); state = QUESTION; break; } From 4d5c8de64c68cc9bb3d6bdec4e43cfbf2f85e265 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Sun, 11 Feb 2024 00:56:35 +0200 Subject: [PATCH 31/36] changed battery status bar, full battery now 28 pixels long --- voting_device/config.h | 2 +- voting_device/display.cpp | 4 +- voting_device/voting_device.ino | 104 ++++++++++++++++++++------------ 3 files changed, 68 insertions(+), 42 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index c88e14e..0310dd0 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -54,7 +54,7 @@ const char* subResync = "/setupVote/Resync"; #endif //Battery -#define FULL_BATTERY 25 +#define FULL_BATTERY 28 #define EMPTY_BATTERY 0 //#ifdef ISRS_FOR_BUTTONS diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 52c329d..8d3d89c 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -99,8 +99,8 @@ void paintClosingScreen() { paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 60, 0, paint.GetWidth(), paint.GetHeight()); paint.Clear(UNCOLORED); // paints the height and width with the given color - paint.DrawStringAt(25, 0, "THANK YOU!!", &Font24, COLORED); //moves text to co-ordinates with-in the set height and width - paint.DrawStringAt(26, 0, "THANK YOU!!", &Font24, COLORED); + paint.DrawStringAt(12, 0, "THANK YOU!!", &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt(13, 0, "THANK YOU!!", &Font24, COLORED); epd.SetFrameMemory(paint.GetImage(), 90, 0, paint.GetWidth(), paint.GetHeight()); paint.Clear(UNCOLORED); // paints the height and width with the given color epd.SetFrameMemory(paint.GetImage(), 120, 0, paint.GetWidth(), paint.GetHeight()); diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 196d7f3..0948167 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -4,7 +4,9 @@ #include "button_interrupts.h" #include -//REMEMBER TO REMOVE ALL SERIAL RELATED STUFF AS IT AFFECTS RX PIN. +//################################################################################################# +//### REMEMBER TO COMMENT OUT: Serial.begin(115200); FROM SETUP FUNCTION, AS IT AFFECTS RX PIN. ### +//################################################################################################# // MQTT-Client erstellen WiFiClient wifiClient; @@ -85,11 +87,13 @@ bool debounce(int pin) { } void setup() { - Serial.begin(115200); + //Serial.begin(115200); //button initialization pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand - //pinMode(BUTTON_PIN_3, INPUT_PULLUP); // Taster 3 als Eingang mit Pull-up-Widerstand + pinMode(PWR_PIN, OUTPUT); + pinMode(RX_PIN, INPUT_PULLUP); + digitalWrite(PWR_PIN, HIGH); //power on device /* //LED initialization @@ -121,8 +125,7 @@ void setup() { } int state = 0; - //int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup - int batteryPercentage = 20; + int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup char response[STRINGSIZE] = ""; char votingID[STRINGSIZE] = ""; char pubTopicVoteResponse[STRINGSIZE] = ""; @@ -130,7 +133,7 @@ void setup() { char responseBuffer[STRINGSIZE]; void loop() { - //powerOff(); + powerOff(); switch (state) { case BOOT: //display start up screen @@ -155,47 +158,70 @@ void loop() { break; case VOTE: - if (!digitalRead(0)) { - delay(500); - Serial.println("I am in Button1: Vote"); - snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Yes\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); - strcpy(response, responseBuffer); - paintConfirmScreen("YES", batteryPercentage); - Serial.println("YES"); - state = CONFIRM; - + if (!digitalRead(BUTTON_PIN_1)) { + delay(30); + if (!digitalRead(BUTTON_PIN_1)){ + Serial.println("I am in Button1: Vote"); + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Yes\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + strcpy(response, responseBuffer); + paintConfirmScreen("YES", batteryPercentage); + Serial.println("YES"); + state = CONFIRM; + while (!digitalRead(BUTTON_PIN_1)){ + delay(100); + } + } } - else if (!digitalRead(2)) { - delay(500); - snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Abstain\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); - strcpy(response, responseBuffer); - paintConfirmScreen("ABSTAIN", batteryPercentage); - Serial.println("PASS"); - state = CONFIRM; - + else if (!digitalRead(BUTTON_PIN_2)) { + delay(30); + if (!digitalRead(BUTTON_PIN_2)){ + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Abstain\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + strcpy(response, responseBuffer); + paintConfirmScreen("ABSTAIN", batteryPercentage); + Serial.println("PASS"); + state = CONFIRM; + while (!digitalRead(BUTTON_PIN_2)){ + delay(100); + } + } } - else if (!digitalRead(12)) { - delay(500); - snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"No\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); - strcpy(response, responseBuffer); - paintConfirmScreen("NO", batteryPercentage); - Serial.println("NO"); - state = CONFIRM; + else if (!digitalRead(BUTTON_PIN_3)) { + delay(30); + if (!digitalRead(BUTTON_PIN_3)){ + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"No\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + strcpy(response, responseBuffer); + paintConfirmScreen("NO", batteryPercentage); + Serial.println("NO"); + state = CONFIRM; + while (!digitalRead(BUTTON_PIN_3)){ + delay(100); + } + } } break; case CONFIRM: // ButtonYes.getState() - if (!digitalRead(0)) { - delay(500); - Serial.println("I am in Button1: Confirm"); - mqttClient.publish(pubPubVote, response); - state = CLOSE_VOTE; + if (!digitalRead(BUTTON_PIN_1)) { + delay(30); + if (!digitalRead(BUTTON_PIN_1)){ + Serial.println("I am in Button1: Confirm"); + mqttClient.publish(pubPubVote, response); + state = CLOSE_VOTE; + while (!digitalRead(BUTTON_PIN_1)){ + delay(100); + } + } } - else if (!digitalRead(12)){ - delay(500); - paintVoteScreen(voteTitle, batteryPercentage); - state = VOTE; + else if (!digitalRead(BUTTON_PIN_3)) { + delay(30); + if (!digitalRead(BUTTON_PIN_3)){ + paintVoteScreen(voteTitle, batteryPercentage); + state = VOTE; + while (!digitalRead(BUTTON_PIN_3)){ + delay(100); + } + } } break; From 24bd6a0e179db49dd138c20b82e7561e2dac5f29 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Mon, 12 Feb 2024 10:09:20 +0200 Subject: [PATCH 32/36] mongs changes --- Display_code/epd1in54_V2/epd1in54_V2.ino | 434 ++++++++++++++++------- voting_device/config.h | 4 +- voting_device/display.cpp | 80 +++-- voting_device/display.h | 4 + voting_device/images.cpp | 36 +- voting_device/voting_device.ino | 42 +-- 6 files changed, 371 insertions(+), 229 deletions(-) diff --git a/Display_code/epd1in54_V2/epd1in54_V2.ino b/Display_code/epd1in54_V2/epd1in54_V2.ino index f8bdde1..4bc79c5 100644 --- a/Display_code/epd1in54_V2/epd1in54_V2.ino +++ b/Display_code/epd1in54_V2/epd1in54_V2.ino @@ -8,8 +8,6 @@ Epd epd; unsigned char image[1024]; Paint paint(image, 0, 0); -unsigned long time_start_ms; -unsigned long time_now_s; #define COLORED 0 #define UNCOLORED 1 @@ -28,22 +26,292 @@ const unsigned char wifilogo[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -const unsigned char batterylogo[] PROGMEM = { -// 'imresizer-1702234758351', 35x35px +const unsigned char thankyoulogo[] PROGMEM = { +// 'imresizer-1702236559618', 200x180px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, -0xfc, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, -0x00, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0xc0, -0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0xc0, 0x70, -0x00, 0x00, 0x0f, 0xc0, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, 0x00, 0x0f, 0x80, 0x70, 0x00, -0x00, 0x0e, 0x00, 0x70, 0x00, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x00, 0x1e, 0x00, 0x3f, 0xff, 0xff, -0xfc, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, +0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3e, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3c, 0x78, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xbf, 0xf3, 0xe0, 0x00, +0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1f, 0xbf, 0xf0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x79, 0x7f, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xf0, +0x30, 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0xe0, 0x30, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, +0x8f, 0xc3, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x78, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x10, 0x90, 0x00, 0x00, 0x06, 0x78, 0x5f, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x01, 0x01, 0xff, 0xff, 0xe3, 0xf0, +0x60, 0x00, 0x00, 0x06, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x89, 0x05, 0x61, 0xff, 0xff, 0xe1, 0xe0, 0x30, 0x00, 0x00, 0x02, 0x78, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x05, 0x61, 0xff, 0xff, +0xe0, 0xc3, 0xf0, 0x00, 0x00, 0x06, 0x78, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xff, 0xff, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x78, +0x6f, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0xff, 0xff, 0xe3, 0xf0, 0x10, 0x00, 0x00, 0x06, 0x20, 0x5b, 0x04, 0x20, 0xa0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, +0x06, 0x00, 0x5b, 0x04, 0x20, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x06, 0x00, 0x7f, 0x0a, 0xa2, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0f, 0xff, 0xe3, 0xe3, 0xf0, +0x00, 0x00, 0x07, 0x30, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x28, 0x0f, 0xff, 0xe3, 0xe0, 0x00, 0x00, 0x00, 0x07, 0x78, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x10, 0xc0, 0xc2, 0x06, 0x28, 0x1f, 0xff, 0xe0, +0xc0, 0x10, 0x02, 0x30, 0xa2, 0x78, 0x3e, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x71, 0x51, 0x81, 0x66, 0x1c, 0x20, 0x1f, 0xff, 0xe1, 0x80, 0xf0, 0x92, 0x2a, 0x26, 0x79, 0x7f, +0x2a, 0xa9, 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x82, 0x42, 0x44, 0x12, 0x20, 0x3f, +0xff, 0xe3, 0xf0, 0x00, 0x92, 0x21, 0x24, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0xbb, 0x84, 0xc6, 0x04, 0x26, 0x1c, 0x3f, 0xff, 0xe3, 0xe0, 0xb0, 0x0a, 0x30, 0xa6, +0x78, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7f, 0x0c, 0xc4, 0x08, 0x66, +0x30, 0x38, 0x70, 0x60, 0x00, 0x00, 0x4a, 0x28, 0xa6, 0x31, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x53, 0x09, 0x84, 0x08, 0x5c, 0x30, 0x38, 0x70, 0x60, 0x30, 0x01, 0x4a, +0x28, 0x26, 0xf9, 0x7f, 0x00, 0x04, 0x48, 0x41, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xb3, 0x0e, 0x8c, +0x18, 0xf4, 0x50, 0x3f, 0xbf, 0xf0, 0xe1, 0xf0, 0x00, 0x00, 0x02, 0xf8, 0x3e, 0x38, 0x04, 0x40, +0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x32, 0x08, 0xd7, 0xef, 0xc6, 0xf0, 0x3f, 0xbf, 0xf3, 0xe0, +0x00, 0x00, 0x00, 0x06, 0x08, 0x01, 0x00, 0x04, 0xf0, 0x51, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x60, +0x00, 0x60, 0x00, 0x03, 0x00, 0x1f, 0xbf, 0xf3, 0xe0, 0x00, 0x00, 0x00, 0x36, 0x78, 0x6f, 0x1e, +0x24, 0x14, 0x62, 0x20, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, +0xe1, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x70, 0x7f, 0x25, 0x04, 0x80, 0x80, 0x20, 0x00, 0x00, 0x00, +0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0xe0, 0x72, 0x0c, 0x31, 0xc3, 0x20, 0x78, +0x3c, 0x09, 0x04, 0x91, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, +0x07, 0x8f, 0xc0, 0x02, 0xfc, 0x79, 0xc7, 0xa0, 0x79, 0xff, 0x19, 0x08, 0x91, 0x00, 0x40, 0x00, +0x00, 0x00, 0x01, 0x40, 0x31, 0x21, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x01, 0xc3, 0xe4, 0xca, 0x8c, +0xa0, 0x39, 0xff, 0x02, 0x11, 0x60, 0xb0, 0x80, 0x00, 0x00, 0x00, 0x03, 0x40, 0x20, 0x90, 0x1c, +0x01, 0x00, 0x3f, 0x00, 0x03, 0xe3, 0x24, 0xfa, 0x88, 0x20, 0x79, 0xff, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x30, 0xc0, 0x00, 0x11, 0x00, 0x3f, 0xf8, 0x02, 0x22, 0x64, +0xf2, 0x98, 0x64, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x30, +0x00, 0x00, 0x1f, 0xe0, 0x1f, 0xff, 0xe2, 0x32, 0x65, 0xc4, 0x98, 0x64, 0x78, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x30, 0x00, 0x00, 0x03, 0xe0, 0x3f, 0xff, 0xe3, +0xf2, 0x67, 0x7c, 0xe7, 0xb8, 0x01, 0x9b, 0x35, 0x54, 0xb0, 0xcc, 0xcd, 0x48, 0x00, 0x00, 0x03, +0x00, 0x31, 0xc0, 0xfc, 0x01, 0x00, 0x1f, 0xff, 0xe3, 0xf2, 0x00, 0x30, 0x43, 0x10, 0xf8, 0x22, +0x04, 0x64, 0x88, 0x82, 0x95, 0x78, 0x00, 0x00, 0x02, 0x00, 0x17, 0x07, 0xc6, 0x13, 0x00, 0x07, +0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x31, 0x26, 0x64, 0xb0, 0xc2, 0xdd, 0x48, 0x00, +0x00, 0x00, 0x00, 0x1c, 0x04, 0x02, 0x32, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x78, 0x20, 0x85, 0x50, 0x80, 0x92, 0x95, 0x48, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x32, +0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1b, 0x30, 0x43, 0x00, 0xc8, 0xc0, +0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x01, 0x1f, 0xe6, 0x1f, 0xff, 0xe3, 0xc6, 0x0c, 0x78, +0xc0, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, +0x03, 0x02, 0x02, 0x3f, 0xff, 0xe3, 0xc4, 0x0c, 0x78, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x02, 0x3f, 0xff, 0xe0, 0x1f, +0x8c, 0x01, 0xf0, 0x80, 0x78, 0x27, 0x28, 0xeb, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x02, 0x02, 0x03, 0x1f, 0xff, 0x05, 0x89, 0x8c, 0xb5, 0x30, 0x80, 0xf9, 0xd5, 0x5a, +0x2b, 0xe4, 0x2a, 0x1a, 0x04, 0x50, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x02, 0x02, 0x1f, 0x80, +0x07, 0xd9, 0x0c, 0xfd, 0x10, 0x80, 0x78, 0xa9, 0x2b, 0xeb, 0xe0, 0x03, 0x51, 0x10, 0x80, 0x00, +0x00, 0x01, 0x00, 0x00, 0x0c, 0x03, 0x02, 0x10, 0x00, 0x00, 0x0f, 0xbc, 0x01, 0xf5, 0xc0, 0x78, +0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x40, 0x38, 0x01, 0x8e, +0x00, 0x00, 0x00, 0x1f, 0xfe, 0x01, 0xff, 0xc0, 0x78, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0xe0, 0x00, 0xfc, 0x1f, 0xff, 0xe3, 0xd9, 0x8c, 0x79, 0x10, +0x8f, 0xf8, 0xfe, 0x3f, 0xf1, 0xef, 0x8f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1f, 0xff, 0xe0, 0x19, 0x0c, 0x01, 0x30, 0x8f, 0xf9, 0xff, 0x3f, 0xf1, 0xef, 0x9f, +0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x0f, 0xac, +0x01, 0xf4, 0x9f, 0xf9, 0xff, 0x3f, 0xf9, 0xef, 0xbf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe3, 0xc9, 0xac, 0x79, 0x14, 0x9f, 0xf9, 0xef, 0xbf, 0xf9, +0xef, 0xbe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, +0x19, 0xac, 0x01, 0x34, 0x9f, 0x79, 0xe7, 0x9e, 0xf9, 0xff, 0x3c, 0xf0, 0x00, 0x00, 0x08, 0x1f, +0x0f, 0x07, 0x01, 0x07, 0xe1, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, 0xac, 0x01, 0xf4, 0x9e, 0x78, 0x1f, +0x9e, 0xf9, 0xfe, 0x3f, 0xf0, 0x00, 0x00, 0x18, 0x1f, 0x0f, 0x1f, 0x81, 0x87, 0xe3, 0xf0, 0x18, +0x00, 0x03, 0xdf, 0x2c, 0x7b, 0xf6, 0x9e, 0x78, 0xff, 0x9e, 0x79, 0xfe, 0x3f, 0xf0, 0x00, 0x00, +0x1c, 0x19, 0x86, 0x19, 0xc1, 0x81, 0x87, 0x30, 0x1c, 0x00, 0x02, 0x43, 0xac, 0x48, 0x72, 0x9e, +0x79, 0xff, 0x9e, 0x79, 0xfe, 0x3f, 0xf0, 0x00, 0x00, 0x1c, 0x19, 0x86, 0x18, 0x03, 0xc1, 0x86, +0x19, 0xff, 0xff, 0xe2, 0x47, 0x8c, 0x48, 0xd0, 0x9e, 0x79, 0xff, 0x9e, 0xf9, 0xff, 0x3c, 0x00, +0x00, 0x00, 0x34, 0x1f, 0x86, 0x1b, 0xc3, 0xc1, 0x86, 0x19, 0xff, 0xff, 0xe2, 0x4d, 0x8c, 0x49, +0x90, 0x9f, 0x79, 0xef, 0x9e, 0xf9, 0xef, 0x3c, 0xf0, 0x00, 0x00, 0x36, 0x1f, 0x06, 0x1b, 0xc6, +0xc1, 0x86, 0x19, 0xff, 0xff, 0xe2, 0x59, 0x8c, 0x4b, 0x10, 0x9f, 0xf9, 0xff, 0xbe, 0x7b, 0xef, +0xbe, 0xf0, 0x00, 0x00, 0x7e, 0x1b, 0x06, 0x18, 0xc7, 0xe1, 0x87, 0x31, 0xff, 0xff, 0xe2, 0x71, +0x0c, 0x4e, 0x10, 0x9f, 0xfd, 0xff, 0xbe, 0x7b, 0xff, 0xbf, 0xf0, 0x00, 0x00, 0x7f, 0x1b, 0x8f, +0x1f, 0x87, 0xe1, 0x83, 0xf1, 0xff, 0xff, 0xe3, 0xc1, 0x8c, 0x78, 0x31, 0x8f, 0xfd, 0xff, 0xbe, +0x7b, 0xf7, 0x9f, 0xf0, 0x00, 0x00, 0x63, 0x19, 0x8f, 0x0f, 0x0c, 0x21, 0x81, 0xe1, 0xff, 0xff, +0xe2, 0x07, 0x38, 0x40, 0xe7, 0x0f, 0xfc, 0xf7, 0xbe, 0x7b, 0xe7, 0x8f, 0xc0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfc, +0x7e, 0x7f, 0x07, 0xfe, 0x07, 0xc3, 0xf3, 0xf0, 0xfc, 0x0f, 0x03, 0xc0, 0xfe, 0x07, 0xe3, 0xb1, +0xa0, 0x00, 0x40, 0x00, 0xba, 0x8a, 0xa9, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, +0xf9, 0xfc, 0x0f, 0xc7, 0xe3, 0xff, 0x87, 0xf3, 0xf9, 0xb6, 0xb6, 0xdb, 0x04, 0x80, 0x88, 0xb1, +0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xe7, 0xff, 0xc7, +0xf3, 0xf9, 0xb6, 0xb6, 0x5b, 0x00, 0x02, 0x90, 0x99, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, +0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xe7, 0xff, 0xc7, 0xf3, 0xf1, 0xb6, 0xb6, 0xdb, 0x00, 0x12, +0xa2, 0xa1, 0xff, 0xfc, 0xfe, 0x7f, 0x07, 0xfe, 0x07, 0xe3, 0xf3, 0xf9, 0xf8, 0x0f, 0xc7, 0xcf, +0xff, 0xc7, 0xf3, 0xf9, 0xb6, 0xb7, 0xfb, 0x03, 0xb2, 0xab, 0x11, 0xff, 0xfc, 0xfe, 0x7f, 0x07, +0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf8, 0x07, 0xcf, 0xcf, 0xef, 0xe7, 0xf3, 0xf0, 0x00, 0x05, 0x10, +0x04, 0x80, 0x00, 0x01, 0xff, 0xfc, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf0, 0x07, +0xef, 0xcf, 0xcf, 0xe7, 0xf3, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, +0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, 0xf0, 0x07, 0xef, 0xcf, 0xcf, 0xe7, 0xf3, 0xf8, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xf3, 0xf3, 0xfb, +0xf0, 0x07, 0xef, 0xcf, 0xc7, 0xe7, 0xf3, 0xf9, 0xf9, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1f, +0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xfb, 0xf3, 0xff, 0xe0, 0x03, 0xef, 0x8f, 0xc7, 0xe7, 0xf3, +0xf8, 0x61, 0x84, 0x80, 0x00, 0x00, 0x01, 0x10, 0x9f, 0xc0, 0xfe, 0x7f, 0x0f, 0xff, 0x07, 0xfb, +0xf3, 0xff, 0xe0, 0x03, 0xef, 0x8f, 0xcf, 0xe7, 0xf3, 0xf0, 0x41, 0x84, 0x80, 0x00, 0x00, 0x00, +0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x0f, 0xdf, 0x07, 0xfb, 0xf3, 0xff, 0xe0, 0x03, 0xff, 0x8f, 0xcf, +0xe7, 0xf3, 0xf8, 0x42, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0xdf, +0x07, 0xff, 0xf3, 0xff, 0xe0, 0x03, 0xff, 0x8f, 0xc7, 0xe7, 0xf3, 0xf0, 0x42, 0x46, 0x00, 0x00, +0x40, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0xdf, 0x87, 0xff, 0xf3, 0xff, 0xc0, 0x01, 0xff, +0x0f, 0xc7, 0xe7, 0xf3, 0xf8, 0x42, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xff, 0xff, +0x0f, 0xdf, 0x87, 0xff, 0xf3, 0xff, 0xc0, 0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x43, 0xc6, +0x00, 0x00, 0x04, 0x00, 0x20, 0x1f, 0xc0, 0xff, 0xff, 0x0f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xc0, +0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x67, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1f, 0xc0, +0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xe0, 0x01, 0xff, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, +0x44, 0x25, 0x00, 0x00, 0x00, 0x00, 0x24, 0x1f, 0xc0, 0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, +0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x44, 0x24, 0x80, 0x00, 0x40, 0x20, 0x04, +0x1f, 0xc0, 0xff, 0xff, 0x1f, 0x9f, 0x87, 0xff, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, +0xf3, 0xf8, 0x4c, 0x14, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0x9f, 0x87, +0xff, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x68, 0x14, 0x40, 0x00, 0x00, +0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0x9f, 0x87, 0xdf, 0xf3, 0xff, 0xe0, 0x00, 0xfe, 0x0f, +0xcf, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, +0xff, 0x87, 0xdf, 0xf3, 0xff, 0xf0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x1f, 0xff, 0xc7, 0xdf, 0xf3, 0xff, 0xf0, 0x00, +0xfe, 0x0f, 0xc7, 0xe7, 0xf3, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, +0x7f, 0x1f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, 0xf0, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf0, 0x22, +0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, +0xf8, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, 0xf0, 0x24, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1f, +0xc0, 0xfe, 0x7f, 0x3f, 0xff, 0xc7, 0xcf, 0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xcf, 0xe7, 0xf3, +0xf0, 0x20, 0x00, 0x70, 0x38, 0x00, 0x00, 0x05, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x9f, 0xc7, 0xcf, +0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xef, 0xe7, 0xf3, 0xf0, 0x2c, 0xfc, 0xa0, 0x02, 0x22, 0x24, +0x00, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xc7, 0xc7, 0xf3, 0xfb, 0xf8, 0x00, 0xfe, 0x0f, 0xff, +0xe7, 0xff, 0xf0, 0x30, 0x84, 0x20, 0x12, 0x26, 0x24, 0x20, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, +0xc7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, 0x07, 0xff, 0xc3, 0xff, 0xf0, 0x40, 0x04, 0xf0, 0x02, +0x24, 0x04, 0x20, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xe7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, +0x07, 0xff, 0xc3, 0xff, 0xe0, 0x80, 0x04, 0x42, 0x02, 0x24, 0x04, 0x44, 0x1f, 0xc0, 0xfe, 0x7f, +0x3f, 0x8f, 0xe7, 0xc7, 0xf3, 0xf9, 0xfc, 0x00, 0xfe, 0x03, 0xff, 0x81, 0xff, 0xe0, 0x80, 0x04, +0x02, 0x03, 0xe1, 0x14, 0xc2, 0x1f, 0xc0, 0xfe, 0x7f, 0x3f, 0x8f, 0xe7, 0xc3, 0xf3, 0xf9, 0xfc, +0x00, 0xfe, 0x01, 0xff, 0x00, 0xff, 0xc0, 0x80, 0x18, 0x22, 0x12, 0x21, 0x04, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1e, 0x00, +0x7c, 0x20, 0x1c, 0x02, 0x2f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x28, 0x0c, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x80, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x02, 0x20, +0x04, 0x01, 0x1f, 0xf8, 0x60, 0x10, 0x67, 0xfc, 0x00, 0x07, 0x80, 0x03, 0xe6, 0x84, 0x22, 0x85, +0x51, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf8, 0x60, 0x30, 0xc7, +0xfc, 0x00, 0x07, 0x80, 0x03, 0xe6, 0x94, 0xa2, 0xb5, 0x53, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x70, 0x30, 0x87, 0xfc, 0x00, 0x07, 0x80, 0x03, 0xe0, 0x00, +0x02, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xf0, +0x31, 0x82, 0x60, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x0f, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xd0, 0x33, 0x03, 0xfc, 0x3e, 0xf7, 0x87, 0xe3, +0xe3, 0xf1, 0xe7, 0x00, 0x3d, 0xe1, 0xf0, 0xf7, 0x8f, 0xbc, 0x00, 0x01, 0x94, 0x28, 0x91, 0x91, +0x80, 0x90, 0x33, 0x03, 0xfc, 0x7e, 0xf7, 0x8f, 0xf3, 0xe7, 0xf9, 0xff, 0x80, 0x3f, 0xe7, 0xfc, +0xff, 0xcf, 0xbe, 0x00, 0x02, 0x14, 0x20, 0x09, 0x09, 0x80, 0x98, 0x36, 0x01, 0xdc, 0x7e, 0xf7, +0x9f, 0xfb, 0xef, 0xfd, 0xff, 0x80, 0x7f, 0xe7, 0xfc, 0xff, 0xcf, 0xbe, 0x00, 0x00, 0x14, 0x28, +0xf1, 0x09, 0x81, 0x88, 0x3c, 0x00, 0x00, 0x3c, 0xf7, 0xde, 0xfb, 0xef, 0x3d, 0xff, 0xc0, 0x7f, +0xe7, 0xbc, 0xff, 0xcf, 0xfc, 0x00, 0x04, 0x14, 0x21, 0x0d, 0x09, 0x81, 0x08, 0x38, 0x03, 0xfc, +0x3c, 0xf7, 0x9e, 0x7b, 0xef, 0x3c, 0xf7, 0xc0, 0x79, 0xe7, 0xbe, 0xfb, 0xcf, 0xfc, 0x00, 0x04, +0x14, 0x20, 0x05, 0x09, 0x81, 0x0c, 0x38, 0x07, 0xfe, 0x3e, 0xe7, 0x9f, 0xfb, 0xef, 0xfc, 0xf7, +0xc0, 0x79, 0xe0, 0x7e, 0xfb, 0xcf, 0xf8, 0x00, 0x04, 0x14, 0x22, 0x05, 0x09, 0x83, 0x0c, 0x38, +0x07, 0xfc, 0x1e, 0xe7, 0x9f, 0xfb, 0xef, 0xfc, 0xf7, 0xc0, 0x79, 0xe1, 0xfe, 0x7b, 0xcf, 0xf8, +0x00, 0x04, 0x14, 0x2a, 0x05, 0x09, 0x83, 0xfc, 0x3c, 0x02, 0x04, 0x1f, 0xe7, 0x9f, 0xfb, 0xef, +0xfc, 0xf7, 0xc0, 0x79, 0xe7, 0xfe, 0xfb, 0xcf, 0xf8, 0x00, 0x04, 0x14, 0x28, 0x05, 0x09, 0x82, +0x06, 0x36, 0x07, 0xff, 0x1f, 0xe7, 0x9e, 0x03, 0xef, 0x00, 0xf7, 0xc0, 0x79, 0xe7, 0xbc, 0x7b, +0xcf, 0xf8, 0x00, 0x00, 0x14, 0x20, 0x05, 0x09, 0x86, 0x06, 0x36, 0x07, 0xff, 0x1f, 0xc7, 0x9e, +0x7b, 0xef, 0x3c, 0xf7, 0xc0, 0x79, 0xef, 0xbe, 0x7b, 0xcf, 0xfc, 0x00, 0x02, 0x12, 0x29, 0x0d, +0x09, 0x86, 0x06, 0x33, 0x03, 0xfe, 0x0f, 0xc7, 0xde, 0xfb, 0xef, 0x3d, 0xf7, 0xc0, 0x7f, 0xef, +0xfe, 0xfb, 0xef, 0xbc, 0x00, 0x00, 0xf1, 0xa8, 0xf5, 0x09, 0x84, 0x02, 0x31, 0x80, 0x00, 0x0f, +0xc7, 0xdf, 0xfb, 0xef, 0xfd, 0xf7, 0xc0, 0x7f, 0xff, 0xfe, 0xfb, 0xef, 0xbe, 0x00, 0x00, 0x10, +0x08, 0x00, 0x01, 0x84, 0x03, 0x31, 0x83, 0xfc, 0x0f, 0xc7, 0xcf, 0xfb, 0xe7, 0xfd, 0xf7, 0xc0, +0x3f, 0xf7, 0xfe, 0xfb, 0xef, 0x9e, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x8c, 0x03, 0x30, 0xc3, +0xfc, 0x0f, 0x87, 0xc7, 0xe3, 0xe3, 0xf1, 0xf3, 0xc0, 0x3d, 0xe3, 0xfe, 0xfb, 0xef, 0x9e, 0x00, +0x00, 0x10, 0x10, 0x00, 0x01, 0x8c, 0x01, 0x30, 0x67, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x88, 0x01, +0x10, 0x66, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, +0x00, 0x00, 0x00, 0x03, 0xbc, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x40, 0x00, 0x01, 0x98, 0x0e, 0x70, +0x0c, 0x00, 0x00, 0x40, 0x02, 0x00, 0x3f, 0x20, 0x12, 0x58, 0x48, 0x89, 0x82, 0x00, 0x81, 0x40, +0x01, 0x81, 0x11, 0x54, 0x00, 0xc0, 0x0f, 0x08, 0x70, 0x1c, 0x0e, 0x00, 0xc0, 0x00, 0x00, 0x3f, +0x32, 0x1a, 0x7a, 0x49, 0xab, 0xce, 0x00, 0x21, 0x05, 0x1f, 0x82, 0x00, 0xc0, 0x00, 0xc7, 0xff, +0x10, 0xbc, 0x30, 0x0a, 0x31, 0x80, 0x00, 0x20, 0x7f, 0x36, 0x92, 0x32, 0x4f, 0xa0, 0x48, 0x00, +0x01, 0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x11, 0x9c, 0x30, 0x06, 0x31, 0x80, 0x00, +0x20, 0x3f, 0x3e, 0x9a, 0x32, 0x6f, 0xa2, 0x58, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, +0x07, 0xfc, 0x31, 0x8c, 0x66, 0x26, 0x33, 0x04, 0x00, 0x00, 0x1e, 0x2a, 0x1a, 0x32, 0x4e, 0xa3, +0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xfc, 0x07, 0x0c, 0x33, 0x8c, 0x66, 0x2e, 0x33, +0xc4, 0x00, 0x00, 0x00, 0x22, 0x82, 0x12, 0x48, 0xb9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x09, 0x8c, +0xfd, 0xcc, 0xc3, 0xfc, 0x31, 0x8c, 0x6e, 0x5f, 0x35, 0x80, 0x00, 0x00, 0xbf, 0x22, 0x92, 0x32, +0x48, 0xb8, 0xd0, 0x00, 0x00, 0x03, 0x9d, 0x99, 0xdc, 0xcf, 0xc0, 0xc7, 0xfc, 0x3d, 0x8c, 0xee, +0x43, 0x39, 0x88, 0x00, 0x00, 0xbf, 0x22, 0x9a, 0x32, 0x58, 0xa2, 0x50, 0x00, 0x00, 0x03, 0x9f, +0x9b, 0xfd, 0xc6, 0xc0, 0xc0, 0x7f, 0x39, 0x8c, 0xfe, 0x41, 0xb1, 0xf0, 0x00, 0x00, 0xe1, 0x22, +0x52, 0x32, 0x58, 0xa2, 0x58, 0x00, 0x00, 0x03, 0x87, 0x1f, 0xfd, 0x86, 0xe0, 0xc0, 0x0f, 0x01, +0x8d, 0x33, 0xc1, 0xb0, 0x60, 0x00, 0x00, 0xff, 0x22, 0x10, 0x30, 0x58, 0xa3, 0x4e, 0x00, 0x00, +0x03, 0x86, 0x1f, 0xfd, 0xbe, 0x78, 0xc0, 0x00, 0x01, 0x8d, 0x03, 0x80, 0x80, 0x00, 0x00, 0x00, +0x7e, 0x22, 0x62, 0x91, 0x88, 0xb9, 0xc6, 0x00, 0x00, 0x02, 0x9f, 0x9e, 0xed, 0xfe, 0x3c, 0xc3, +0xfc, 0x01, 0x8e, 0x01, 0x00, 0x88, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0x9f, 0x9c, 0xed, 0xf0, 0x0c, 0xc3, 0xfc, 0x01, 0x84, 0x00, 0x00, 0xbc, 0x08, +0x18, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x1c, 0xed, 0x80, +0x8e, 0xc7, 0xfe, 0x01, 0xf8, 0x00, 0x00, 0xbd, 0xdc, 0xc9, 0x9c, 0x3f, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0f, 0x9f, 0x9c, 0xcd, 0xc4, 0xce, 0xc6, 0x06, 0x01, 0x8b, 0xaa, 0x80, +0xb5, 0xfd, 0xfb, 0xdc, 0x1c, 0x06, 0x06, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x88, +0xcc, 0xfc, 0xfe, 0xc7, 0xfc, 0x03, 0x89, 0x6f, 0x00, 0xb1, 0xf5, 0xeb, 0xd4, 0x0f, 0x0f, 0xc0, +0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x44, 0x78, 0x7c, 0x83, 0xfc, 0x04, 0x81, +0x6b, 0x21, 0x3d, 0x9d, 0x9b, 0xd8, 0x3f, 0x14, 0x80, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, +0x86, 0x00, 0x00, 0x00, 0x30, 0x01, 0xf8, 0x0c, 0x81, 0x6b, 0x31, 0x35, 0xbd, 0xbb, 0x4e, 0x3f, +0x07, 0x04, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x09, 0x81, 0x6f, 0x23, 0x35, 0xb5, 0xbb, 0xd6, 0x00, 0x02, 0x82, 0xa4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0x9f, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x01, 0x4e, 0xa2, 0x3d, 0xbd, 0xfb, +0xdc, 0x37, 0x19, 0xe6, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9f, 0x80, 0x00, 0x00, 0x09, +0xe7, 0xfc, 0x0f, 0x00, 0x00, 0x1c, 0x10, 0x10, 0x00, 0x88, 0x23, 0x26, 0x20, 0xa4, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x08, 0x40, 0x87, 0xfc, 0x0e, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7f, 0x08, 0x27, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x80, 0x00, +0x08, 0x08, 0xe3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x01, 0x45, 0x64, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x80, 0x01, 0x08, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x06, 0x1e, 0x01, 0x84, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, +0x00, 0x00, 0x40, 0x08, 0x23, 0xfc, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, +0x07, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x9d, 0x00, 0x00, 0x00, 0x00, 0xe3, 0xfc, 0x24, +0x48, 0x00, 0x08, 0x22, 0x23, 0x02, 0x06, 0x3f, 0x18, 0x04, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x8f, 0x00, 0x00, 0x00, 0x00, 0xe7, 0xfc, 0x24, 0x88, 0x44, 0x2a, 0x20, 0xa0, 0x0a, 0x0e, +0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, 0x06, +0x64, 0x26, 0x6c, 0xcc, 0x2c, 0x30, 0xb3, 0x14, 0x06, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0xe7, 0xfe, 0x24, 0x28, 0x40, 0xa8, 0x22, 0xa1, +0x10, 0x06, 0x3f, 0x30, 0x41, 0xde, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xe3, 0xbc, 0x06, 0x48, 0x00, 0x40, 0x12, 0x20, 0x00, 0x06, 0x36, 0x30, 0x82, 0x12, 0x94, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xe1, 0xbc, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xa2, 0x50, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x25, 0xa2, +0x52, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0xe7, 0xfc, 0x00, 0x00, +0x00, 0x00, 0x35, 0xd5, 0xd6, 0xa7, 0x3f, 0x25, 0x21, 0xcc, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, +0x18, 0x80, 0x00, 0x00, 0x01, 0xe7, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfd, 0xdb, 0xe6, 0x20, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x27, 0xfc, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x90, 0x0e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x06, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x37, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0e, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3f, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xfc, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00 }; - void drawImage(int x, int y, int width, int height, const unsigned char *image) { int byteWidth = (width + 7) / 8; // Number of bytes in a row for (int j = 0; j < height; j++) { @@ -57,139 +325,35 @@ void drawImage(int x, int y, int width, int height, const unsigned char *image) } } -bool question_mark(const char *question) { - int question_len = strlen(question); - if (question_len > 0 && question[question_len - 1] == '?') { - return true; - } - return false; -} - -bool check_question(const char *question, char *line, int *position) { - if (!question_mark(question)) { - printf("ERROR: No question mark!"); - return false; - } - int count = 0; - do { - strncpy(line, question + *position, 15); - line[15] = '\0'; - - int pos = 15; - int extra = 0; - while (pos >= 0 && line[pos] != ' ') { - pos--; - extra++; - } - line[pos] = '\0'; - - if (extra == 16) { - line[14] = '-'; - *position -= 1; // Update position to after the '-' - } else { - *position -= extra; // Update position to the last space - *position += 1; // Update position to after the space - } - printf("%s\n", line); - *position += 15; - count++; - } while (!question_mark(line)); - - if (count > 6) { - printf("ERROR: Question too long!"); - return false; - } - return true; -} - -void display_question(const char *question, char *line, int *position) { - paint.SetWidth(200); - paint.SetHeight(16); - int count = 0; - do { - strncpy(line, question + *position, 15); - line[15] = '\0'; - - int pos = 15; - int extra = 0; - while (pos >= 0 && line[pos] != ' ') { - pos--; - extra++; - } - line[pos] = '\0'; - - if (extra == 16) { - line[14] = '-'; - *position -= 1; // Update position to after the '-' - } else { - *position -= extra; // Update position to the last space - *position += 1; // Update position to after the space - } - paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(15, 2, line, &Font16, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, (120-(count*16)), paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinate - *position += 15; - count++; - } while (!question_mark(line)); -} - void setup() { Serial.begin(115200); - + epd.LDirInit(); epd.Clear(); // clears whole screen to white - paint.SetRotate(ROTATE_180); //rotate screen - + paint.SetRotate(ROTATE_270); //rotate screen + paint.SetWidth(200); + paint.SetHeight(40); //wifilogo - paint.SetWidth(35); - paint.SetHeight(35); paint.Clear(UNCOLORED); // paints the height and width with the given color - drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates - epd.SetFrameMemory(paint.GetImage(), 40, (200-35), paint.GetWidth(), paint.GetHeight()); + drawImage(0, 0, 200, 180, thankyoulogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, 200-40, paint.GetWidth(), paint.GetHeight()); - //battery logo - paint.SetWidth(35); - paint.SetHeight(35); paint.Clear(UNCOLORED); // paints the height and width with the given color - drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates - epd.SetFrameMemory(paint.GetImage(), 0, (200-35), paint.GetWidth(), paint.GetHeight()); - - //need to finish battery status bar position - paint.SetWidth(20); - paint.SetHeight(13); - //paint.Clear(COLORED); // paints the height and width with the given color - //paint.DrawFilledRectangle(0, 0, 20, 14, COLORED); - epd.SetFrameMemory(paint.GetImage(), 16, (200-23), paint.GetWidth(), paint.GetHeight()); - - //Bottom bar - paint.SetWidth(200); - paint.SetHeight(22); - paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(2, 7, "YES ABSTAIN NO", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width - //paint.DrawStringAt(0, 2, "Yes Abstain No", &Font16, COLORED); - paint.DrawFilledRectangle(0, 0, 200, 3, COLORED); - paint.DrawFilledRectangle(48, 0, 50, 25, COLORED); - paint.DrawFilledRectangle(160, 0, 162, 25, COLORED); - epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + drawImage(0, 0, 200, 180, thankyoulogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, 200-80, paint.GetWidth(), paint.GetHeight()); - //name - paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(40, 2, "NAME", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width - paint.DrawStringAt(41, 2, "NAME", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width - epd.SetFrameMemory(paint.GetImage(), 0, 140, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates - - //vote question - char question[100] = "How many characters can E-paper fit across?"; + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 200, 180, thankyoulogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, 200-120, paint.GetWidth(), paint.GetHeight()); - char question2[100] = "Pneumonoultramicroscopicsilicovolcanoconiosis is a long question another another?"; - int position = 0; - char line[16]; + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 200, 180, thankyoulogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, 200-160, paint.GetWidth(), paint.GetHeight()); - bool all_good = check_question(question2, line, &position); - if (all_good) { - position = 0; - display_question(question2, line, &position); - } + paint.Clear(UNCOLORED); // paints the height and width with the given color + drawImage(0, 0, 200, 180, thankyoulogo); // draw the image at (0, 0) coordinates + epd.SetFrameMemory(paint.GetImage(), 0, 200, paint.GetWidth(), paint.GetHeight()); + epd.DisplayFrame(); } diff --git a/voting_device/config.h b/voting_device/config.h index 0310dd0..24ffc35 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -25,8 +25,8 @@ // WLAN-Settings -const char* ssid = "franks_galaxy"; -const char* password = "veef2267"; +const char* ssid = "Rhod's wifi 2.4G"; +const char* password = "0413113368"; // MQTT-Server Settings const char* mqtt_server = "194.110.231.227"; diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 8d3d89c..886cb1f 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -12,7 +12,7 @@ void initDisplay(){ paint.SetRotate(ROTATE_270); //rotate screen } -void paintVoteScreen(const char *question, int batteryLevel) { //battery level is a range between 0 and 25, ie. battery at 100% = 25, battery empty=0 +void startupScreen(int batteryLevel){ //wifilogo paint.SetWidth(35); paint.SetHeight(35); @@ -25,7 +25,36 @@ void paintVoteScreen(const char *question, int batteryLevel) { //battery level i //battery status bar paint.DrawFilledRectangle(4, 8, batteryLevel, 24, COLORED); epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); - //Bottom buttton bar + //Welcome msg + char text[9] = "WELCOME!"; + paint.SetWidth(30); + paint.SetHeight(200); + paint.Clear(UNCOLORED); // paints the height and width with the given color + paint.DrawStringAt((200-strlen(text)*17)/2, 0, text, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt((200-strlen(text)*17)/2+1, 0, text, &Font24, COLORED); + epd.SetFrameMemory(paint.GetImage(), 100, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + epd.DisplayFrame(); +} + +static void clearQuestionArea(){ + int offset = 36; + for (int i = 0; i < 3; i++){ + paint.SetWidth(40); + paint.SetHeight(200); + paint.Clear(UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), offset, 0, paint.GetWidth(), paint.GetHeight()); + offset += 40; + } + paint.SetWidth(23); + paint.SetHeight(200); + paint.Clear(UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), offset, 0, paint.GetWidth(), paint.GetHeight()); +} + +void paintVoteScreen(const char *question) { //battery level is a range between 0 and 25, ie. battery at 100% = 25, battery empty=0 + //clear screen + clearQuestionArea(); + //Bottom buttton bar paint.SetWidth(22); paint.SetHeight(200); paint.Clear(UNCOLORED); //paints the height and width the given colour @@ -50,19 +79,9 @@ void paintVoteScreen(const char *question, int batteryLevel) { //battery level i epd.DisplayFrame(); } -void paintConfirmScreen(const char *response, int batteryLevel) { - //wifilogo - paint.SetWidth(35); - paint.SetHeight(35); - paint.Clear(UNCOLORED); // paints the height and width with the given color - drawImage(0, 0, 35, 35, wifilogo); // draw the image at (0, 0) coordinates - epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); - //battery logo - paint.Clear(UNCOLORED); - drawImage(0, 0, 35, 35, batterylogo); // draw the image at (0, 0) coordinates - //battery status bar - paint.DrawFilledRectangle(4, 8, batteryLevel, 24, COLORED); - epd.SetFrameMemory(paint.GetImage(), 0, (200-35-3), paint.GetWidth(), paint.GetHeight()); +void paintConfirmScreen(const char *response) { + //clear screen + clearQuestionArea(); //Bottom button bar paint.SetWidth(22); paint.SetHeight(200); @@ -79,8 +98,8 @@ void paintConfirmScreen(const char *response, int batteryLevel) { paint.DrawStringAt(20, 0, "You voted:", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width epd.SetFrameMemory(paint.GetImage(), 40, 0, paint.GetWidth(), paint.GetHeight()); paint.Clear(UNCOLORED); //paints the height and width the given colour - paint.DrawStringAt(70, 0, response, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width - paint.DrawStringAt(71, 0, response, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt((200-strlen(response)*17)/2, 0, response, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt((200-strlen(response)*17)/2+1, 0, response, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width epd.SetFrameMemory(paint.GetImage(), 80, 0, paint.GetWidth(), paint.GetHeight()); paint.Clear(UNCOLORED); //paints the height and width the given colour paint.DrawStringAt(10, 0, "Are you sure?", &Font20, COLORED); //moves text to co-ordinates with-in the set height and width @@ -90,24 +109,21 @@ void paintConfirmScreen(const char *response, int batteryLevel) { } void paintClosingScreen() { + //clear screen + clearQuestionArea(); + //clear bottom bar + paint.SetWidth(40); + paint.SetHeight(200); + paint.Clear(UNCOLORED); + epd.SetFrameMemory(paint.GetImage(), (200-40), 0, paint.GetWidth(), paint.GetHeight()); + //Thank you msg + char text[11] = "THANK YOU!"; paint.SetWidth(30); paint.SetHeight(200); paint.Clear(UNCOLORED); // paints the height and width with the given color - epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(UNCOLORED); // paints the height and width with the given color - epd.SetFrameMemory(paint.GetImage(), 30, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(UNCOLORED); // paints the height and width with the given color - epd.SetFrameMemory(paint.GetImage(), 60, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(UNCOLORED); // paints the height and width with the given color - paint.DrawStringAt(12, 0, "THANK YOU!!", &Font24, COLORED); //moves text to co-ordinates with-in the set height and width - paint.DrawStringAt(13, 0, "THANK YOU!!", &Font24, COLORED); - epd.SetFrameMemory(paint.GetImage(), 90, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(UNCOLORED); // paints the height and width with the given color - epd.SetFrameMemory(paint.GetImage(), 120, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(UNCOLORED); // paints the height and width with the given color - epd.SetFrameMemory(paint.GetImage(), 150, 0, paint.GetWidth(), paint.GetHeight()); - paint.Clear(UNCOLORED); // paints the height and width with the given color - epd.SetFrameMemory(paint.GetImage(), 180, 0, paint.GetWidth(), paint.GetHeight()); + paint.DrawStringAt((200-strlen(text)*17)/2, 0, text, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width + paint.DrawStringAt((200-strlen(text)*17)/2+1, 0, text, &Font24, COLORED); + epd.SetFrameMemory(paint.GetImage(), 100, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates epd.DisplayFrame(); } diff --git a/voting_device/display.h b/voting_device/display.h index 327a83f..a03b9f3 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -13,6 +13,10 @@ extern Epd epd; //Display functions called in voting_device.ino void initDisplay(); +void paintThankyouScreen(); + +void paintWelcomeScreen(); + void paintVoteScreen(const char *question, int batteryLevel); void paintConfirmScreen(const char *response, int batteryLevel); diff --git a/voting_device/images.cpp b/voting_device/images.cpp index 608e7d7..ad346d1 100644 --- a/voting_device/images.cpp +++ b/voting_device/images.cpp @@ -31,7 +31,7 @@ const unsigned char batterylogo[] PROGMEM = { }; const unsigned char thankyoulogo[] PROGMEM = { -// 'imresizer-1702236559618', 200x200px +// 'imresizer-1702236559618', 200x180px 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -313,35 +313,5 @@ const unsigned char thankyoulogo[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; \ No newline at end of file +0x00, 0x00, 0x00, 0x00 +}; \ No newline at end of file diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 0948167..a0b1b7a 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -80,14 +80,11 @@ void connectToMQTT() { } Serial.println("Connection to MQTT server established"); } -bool debounce(int pin) { - static uint16_t state = 0; - state = (state<<1) | digitalRead(pin) | 0xfe00; - return (state == 0xff00); -} + +int batteryPercentage = checkBatteryLevel(); void setup() { - //Serial.begin(115200); + Serial.begin(115200); //button initialization pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand @@ -95,19 +92,9 @@ void setup() { pinMode(RX_PIN, INPUT_PULLUP); digitalWrite(PWR_PIN, HIGH); //power on device - /* - //LED initialization - pinMode(LED_BUILTIN, OUTPUT); - pinMode(5, OUTPUT); - digitalWrite(5, HIGH); - digitalWrite(LED_BUILTIN, HIGH); - pinMode(RXPIN, INPUT_PULLUP); //COMMMENT OUT THIS LINE IF YOU ARE USING SERIAL - */ - //Display initialization initDisplay(); - - //attachISR(); + startupScreen(batteryPercentage); WiFi.begin(ssid, password); connectToWiFi(); @@ -125,7 +112,8 @@ void setup() { } int state = 0; - int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup + //int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup + //int batteryPercentage = 20; char response[STRINGSIZE] = ""; char votingID[STRINGSIZE] = ""; char pubTopicVoteResponse[STRINGSIZE] = ""; @@ -150,7 +138,7 @@ void loop() { MQTT_flag = 0; strcpy(voteTitle, MQTTVotingTitle); Serial.println(voteTitle); - paintVoteScreen(voteTitle, batteryPercentage); + paintVoteScreen(voteTitle); strcat(pubTopicVoteResponse, pubPubVote); strcat(pubTopicVoteResponse, votingID); state = VOTE; @@ -162,9 +150,9 @@ void loop() { delay(30); if (!digitalRead(BUTTON_PIN_1)){ Serial.println("I am in Button1: Vote"); - snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Yes\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Yes\", \"VoteTitle\":\"%s\"}", MQTTVotingTitle); strcpy(response, responseBuffer); - paintConfirmScreen("YES", batteryPercentage); + paintConfirmScreen("YES"); Serial.println("YES"); state = CONFIRM; while (!digitalRead(BUTTON_PIN_1)){ @@ -175,10 +163,10 @@ void loop() { else if (!digitalRead(BUTTON_PIN_2)) { delay(30); if (!digitalRead(BUTTON_PIN_2)){ - snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Abstain\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"Abstain\", \"VoteTitle\":\"%s\"}", MQTTVotingTitle); strcpy(response, responseBuffer); - paintConfirmScreen("ABSTAIN", batteryPercentage); - Serial.println("PASS"); + paintConfirmScreen("ABSTAIN"); + Serial.println("ABSTAIN"); state = CONFIRM; while (!digitalRead(BUTTON_PIN_2)){ delay(100); @@ -188,9 +176,9 @@ void loop() { else if (!digitalRead(BUTTON_PIN_3)) { delay(30); if (!digitalRead(BUTTON_PIN_3)){ - snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"No\", \"votingTitle\":\"%s\"}", MQTTVotingTitle); + snprintf(responseBuffer, sizeof(responseBuffer), "{\"vote\":\"No\", \"VoteTitle\":\"%s\"}", MQTTVotingTitle); strcpy(response, responseBuffer); - paintConfirmScreen("NO", batteryPercentage); + paintConfirmScreen("NO"); Serial.println("NO"); state = CONFIRM; while (!digitalRead(BUTTON_PIN_3)){ @@ -216,7 +204,7 @@ void loop() { else if (!digitalRead(BUTTON_PIN_3)) { delay(30); if (!digitalRead(BUTTON_PIN_3)){ - paintVoteScreen(voteTitle, batteryPercentage); + paintVoteScreen(voteTitle); state = VOTE; while (!digitalRead(BUTTON_PIN_3)){ delay(100); From df80963b1f0c1bb601eabd789bfd2a8a0d3b0289 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Mon, 12 Feb 2024 12:00:04 +0200 Subject: [PATCH 33/36] fixed device restting when too large area is painted --- voting_device/config.h | 6 +++--- voting_device/display.cpp | 18 ++++-------------- voting_device/display.h | 6 +++--- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index 24ffc35..d338575 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -25,11 +25,11 @@ // WLAN-Settings -const char* ssid = "Rhod's wifi 2.4G"; -const char* password = "0413113368"; +const char* ssid = "ISDProjectLAN"; +const char* password = "557949122"; // MQTT-Server Settings -const char* mqtt_server = "194.110.231.227"; +const char* mqtt_server = "10.42.0.1"; const int mqtt_port = 1883; const char* mqtt_user = ""; const char* mqtt_password = ""; diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 886cb1f..7adff8e 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -2,7 +2,7 @@ #include "images.h" Epd epd; -unsigned char image[1024]; +unsigned char image[5*1024]; Paint paint(image, 0, 0); void initDisplay(){ @@ -109,21 +109,11 @@ void paintConfirmScreen(const char *response) { } void paintClosingScreen() { - //clear screen - clearQuestionArea(); - //clear bottom bar - paint.SetWidth(40); + paint.SetWidth(200); paint.SetHeight(200); paint.Clear(UNCOLORED); - epd.SetFrameMemory(paint.GetImage(), (200-40), 0, paint.GetWidth(), paint.GetHeight()); - //Thank you msg - char text[11] = "THANK YOU!"; - paint.SetWidth(30); - paint.SetHeight(200); - paint.Clear(UNCOLORED); // paints the height and width with the given color - paint.DrawStringAt((200-strlen(text)*17)/2, 0, text, &Font24, COLORED); //moves text to co-ordinates with-in the set height and width - paint.DrawStringAt((200-strlen(text)*17)/2+1, 0, text, &Font24, COLORED); - epd.SetFrameMemory(paint.GetImage(), 100, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + drawImage(0,0,200,200,thankyoulogo); + epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates epd.DisplayFrame(); } diff --git a/voting_device/display.h b/voting_device/display.h index a03b9f3..8e1ed26 100644 --- a/voting_device/display.h +++ b/voting_device/display.h @@ -15,11 +15,11 @@ void initDisplay(); void paintThankyouScreen(); -void paintWelcomeScreen(); +void startupScreen(int batteryPercentage); -void paintVoteScreen(const char *question, int batteryLevel); +void paintVoteScreen(const char *question); -void paintConfirmScreen(const char *response, int batteryLevel); +void paintConfirmScreen(const char *response); void paintClosingScreen(); From 0df2e249cf444f1ccf19c3237c31332954f158e8 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Mon, 12 Feb 2024 13:25:58 +0200 Subject: [PATCH 34/36] fixed mqtt each device needs unique id --- voting_device/config.h | 2 +- voting_device/display.cpp | 2 +- voting_device/voting_device.ino | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/voting_device/config.h b/voting_device/config.h index d338575..d13fe30 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -55,7 +55,7 @@ const char* subResync = "/setupVote/Resync"; //Battery #define FULL_BATTERY 28 -#define EMPTY_BATTERY 0 +#define EMPTY_BATTERY 4 //#ifdef ISRS_FOR_BUTTONS #include "button_interrupts.h" diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 7adff8e..960ee4a 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -51,7 +51,7 @@ static void clearQuestionArea(){ epd.SetFrameMemory(paint.GetImage(), offset, 0, paint.GetWidth(), paint.GetHeight()); } -void paintVoteScreen(const char *question) { //battery level is a range between 0 and 25, ie. battery at 100% = 25, battery empty=0 +void paintVoteScreen(const char *question) { //battery level is a range between 4 and 28, ie. battery at 100% = 28, battery empty=4 //clear screen clearQuestionArea(); //Bottom buttton bar diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index a0b1b7a..d3bbc65 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -75,7 +75,7 @@ void connectToWiFi() { void connectToMQTT() { while (!mqttClient.connected()) { Serial.println("Connecting to the MQTT server"); - mqttClient.connect("ESP8266", mqtt_user, mqtt_password); + mqttClient.connect(WiFi.macAddress().c_str(), mqtt_user, mqtt_password); delay(500); } Serial.println("Connection to MQTT server established"); @@ -84,7 +84,7 @@ void connectToMQTT() { int batteryPercentage = checkBatteryLevel(); void setup() { - Serial.begin(115200); + //Serial.begin(115200); //button initialization pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand @@ -194,7 +194,7 @@ void loop() { delay(30); if (!digitalRead(BUTTON_PIN_1)){ Serial.println("I am in Button1: Confirm"); - mqttClient.publish(pubPubVote, response); + mqttClient.publish(pubTopicVoteResponse, response); state = CLOSE_VOTE; while (!digitalRead(BUTTON_PIN_1)){ delay(100); From b04a2ba5fdbddf3ce22bcca130c7ea0929dd3f43 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Mon, 12 Feb 2024 16:46:26 +0200 Subject: [PATCH 35/36] moving functions into separate folders --- voting_device/config.h | 51 +++++---------- voting_device/display.cpp | 3 +- voting_device/mqtt.cpp | 62 ++++++++++++++++++ voting_device/mqtt.h | 29 +++++++++ voting_device/power.cpp | 14 ++++- voting_device/power.h | 8 ++- voting_device/voting_device.ino | 108 +++++++++----------------------- 7 files changed, 158 insertions(+), 117 deletions(-) create mode 100644 voting_device/mqtt.cpp create mode 100644 voting_device/mqtt.h diff --git a/voting_device/config.h b/voting_device/config.h index d13fe30..378799b 100644 --- a/voting_device/config.h +++ b/voting_device/config.h @@ -1,50 +1,35 @@ +#ifndef CONFIG_H +#define CONFIG_H + #include -#include // default wifi library -#include //Mqtt library by Nick O'Leary +#include #include + +#include "power.h" +#include "display.h" + //#include -#define STRINGSIZE 256 -#define BATTERY_PIN A0 -#define REFERENCE_VOLTAGE 3.3 +#define STRINGSIZE 256 +#define BATTERY_PIN A0 +#define REFERENCE_VOLTAGE 3.3 + +#include "mqtt.h" //Definition of GPIOS for Buttons #define BUTTON_PIN_1 0 // GPIO 5 (entspricht D1) für Taster 1 #define BUTTON_PIN_2 2 // GPIO 4 (entspricht D2) für Taster 2 #define BUTTON_PIN_3 12 // GPIO 16 (entspricht D0) für Taster 3 -#define YES 0 -#define ABSTAIN 1 -#define NO 2 - #define BOOT 0 #define QUESTION 1 #define VOTE 2 #define CONFIRM 3 #define CLOSE_VOTE 4 - -// WLAN-Settings -const char* ssid = "ISDProjectLAN"; -const char* password = "557949122"; - -// MQTT-Server Settings -const char* mqtt_server = "10.42.0.1"; -const int mqtt_port = 1883; -const char* mqtt_user = ""; -const char* mqtt_password = ""; #define MQTTpubQos 1 #define MQTTsubQos 1 -//Mqtt topics to publish -const String pubInit = "/registration/Server/"+ String(WiFi.macAddress()); -const char* pubPubVote = "/vote/"; - -// MQTT topics to subscribe -const String subInit = "/registration/esp/"+ String(WiFi.macAddress()); // /registration/esp/ -const char* subVoteSetup = "/setupVote/Setup"; -const char* subResync = "/setupVote/Resync"; - //configuration of functionality //#define ENCRYPTION @@ -53,16 +38,12 @@ const char* subResync = "/setupVote/Resync"; #include //todo find encryption library #endif -//Battery -#define FULL_BATTERY 28 -#define EMPTY_BATTERY 4 - -//#ifdef ISRS_FOR_BUTTONS +#ifdef ISRS_FOR_BUTTONS #include "button_interrupts.h" void attachISR(void){ attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_1), Isr_Btn_1, FALLING); attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_2), Isr_Btn_2, FALLING); attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_3), Isr_Btn_3, FALLING); } -//#endif - +#endif +#endif diff --git a/voting_device/display.cpp b/voting_device/display.cpp index 960ee4a..1e4cfd2 100644 --- a/voting_device/display.cpp +++ b/voting_device/display.cpp @@ -112,8 +112,9 @@ void paintClosingScreen() { paint.SetWidth(200); paint.SetHeight(200); paint.Clear(UNCOLORED); - drawImage(0,0,200,200,thankyoulogo); epd.SetFrameMemory(paint.GetImage(), 0, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates + drawImage(0,0,200,180,thankyoulogo); + epd.SetFrameMemory(paint.GetImage(), 10, 0, paint.GetWidth(), paint.GetHeight()); //moves page to co-ordinates epd.DisplayFrame(); } diff --git a/voting_device/mqtt.cpp b/voting_device/mqtt.cpp new file mode 100644 index 0000000..09d4253 --- /dev/null +++ b/voting_device/mqtt.cpp @@ -0,0 +1,62 @@ +#include "mqtt.h" + +// MQTT-Server Settings + const char* mqtt_server = "10.42.0.1"; + const int mqtt_port = 1883; + const char* mqtt_user = ""; + const char* mqtt_password = ""; + +// MQTT-Client erstellen + WiFiClient wifiClient; + PubSubClient mqttClient(wifiClient); + const size_t JSON_CAPACITY = 256; + char MQTTmsg[STRINGSIZE] = ""; + bool MQTT_flag = 0; + char MQTTVotingId [STRINGSIZE]= ""; + char MQTTVotingTitle [STRINGSIZE]= ""; + +// MQTT Callback Function +void callback(char* topic, byte* payload, unsigned int length) { + // Copy payload bytes to MQTTmsg + memcpy(MQTTmsg, payload, length); + MQTTmsg[length] = '\0'; // Ensure null-termination for string + + // Parse JSON + StaticJsonDocument doc; + DeserializationError error = deserializeJson(doc, MQTTmsg); + + // If parsing succeeds, extract the necessary fields + if (!error) { + if (doc.containsKey("VotingID")) { + const char* votingID = doc["VotingID"]; + Serial.print("Received Voting ID: "); + Serial.println(votingID); + memcpy(MQTTVotingId, votingID, strlen(votingID) + 1); + // Optionally, you can set a flag to indicate that a new ID has been received + MQTT_flag = true; + } + + if (doc.containsKey("VoteTitle")) { + const char* voteTitle = doc["VoteTitle"]; + Serial.print("Received Vote Title: "); + Serial.println(voteTitle); + memcpy(MQTTVotingTitle, voteTitle, strlen(voteTitle) + 1); + // Optionally, you can set a flag to indicate that a new title has been received + MQTT_flag = true; + } + + // Add more conditions to extract other fields as needed + } else { + Serial.print("Failed to parse JSON: "); + Serial.println(error.c_str()); + } +} + +void connectToMQTT() { + while (!mqttClient.connected()) { + Serial.println("Connecting to the MQTT server"); + mqttClient.connect(WiFi.macAddress().c_str(), mqtt_user, mqtt_password); + delay(500); + } + Serial.println("Connection to MQTT server established"); +} \ No newline at end of file diff --git a/voting_device/mqtt.h b/voting_device/mqtt.h new file mode 100644 index 0000000..d59b658 --- /dev/null +++ b/voting_device/mqtt.h @@ -0,0 +1,29 @@ +#ifndef MQTT_H +#define MQTT_H + +#include +#include // default wifi library +#include //Mqtt library by Nick O'Leary + +#include "config.h" + +// MQTT-Client erstellen + extern WiFiClient wifiClient; + extern PubSubClient mqttClient; + extern const size_t JSON_CAPACITY; + extern char MQTTmsg[STRINGSIZE]; + extern bool MQTT_flag; + extern char MQTTVotingId [STRINGSIZE]; + extern char MQTTVotingTitle [STRINGSIZE]; + + // MQTT-Server Settings + extern const char* mqtt_server; + extern const int mqtt_port; + extern const char* mqtt_user; + extern const char* mqtt_password; + +void callback(char* topic, byte* payload, unsigned int length); + +void connectToMQTT(); + +#endif \ No newline at end of file diff --git a/voting_device/power.cpp b/voting_device/power.cpp index 32d9422..4a1ea09 100644 --- a/voting_device/power.cpp +++ b/voting_device/power.cpp @@ -1,5 +1,4 @@ #include "power.h" -#include "display.h" uint32_t startTime; bool powerSW = false; @@ -26,4 +25,17 @@ void powerOff(){ else{ powerSW = false; } +} +#define ADC_FULL_BAT 780 +#define ADC_EMPTY_BAT 390 +int checkBatteryLevel(){ + int adcValue = analogRead(BATTERY_PIN); + if (adcValue > ADC_FULL_BAT) { + return FULL_BATTERY; + } + int displayPercentage = ((adcValue-ADC_EMPTY_BAT)*24)/(ADC_FULL_BAT-ADC_EMPTY_BAT) + 4; + if (adcValue > ADC_EMPTY_BAT) { + return displayPercentage; + } + return EMPTY_BATTERY; } \ No newline at end of file diff --git a/voting_device/power.h b/voting_device/power.h index b904f9e..3f1de4c 100644 --- a/voting_device/power.h +++ b/voting_device/power.h @@ -2,10 +2,16 @@ #define POWER #include #include "display.h" - +#include "config.h" #define RX_PIN 3 #define PWR_PIN 5 +//Battery +#define FULL_BATTERY 28 +#define EMPTY_BATTERY 4 + void powerOff(); +int checkBatteryLevel(); + #endif \ No newline at end of file diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index d3bbc65..1bd4f05 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -1,67 +1,33 @@ #include "config.h" -#include "power.h" -#include "display.h" -#include "button_interrupts.h" -#include //################################################################################################# //### REMEMBER TO COMMENT OUT: Serial.begin(115200); FROM SETUP FUNCTION, AS IT AFFECTS RX PIN. ### //################################################################################################# -// MQTT-Client erstellen -WiFiClient wifiClient; -PubSubClient mqttClient(wifiClient); -const size_t JSON_CAPACITY = 256; -char MQTTmsg[STRINGSIZE] = ""; -bool MQTT_flag = 0; -char MQTTVotingId [STRINGSIZE]= ""; -char MQTTVotingTitle [STRINGSIZE]= ""; - -// MQTT Callback Function -void callback(char* topic, byte* payload, unsigned int length) { - // Copy payload bytes to MQTTmsg - memcpy(MQTTmsg, payload, length); - MQTTmsg[length] = '\0'; // Ensure null-termination for string - - // Parse JSON - StaticJsonDocument doc; - DeserializationError error = deserializeJson(doc, MQTTmsg); - - // If parsing succeeds, extract the necessary fields - if (!error) { - if (doc.containsKey("VotingID")) { - const char* votingID = doc["VotingID"]; - Serial.print("Received Voting ID: "); - Serial.println(votingID); - memcpy(MQTTVotingId, votingID, strlen(votingID) + 1); - // Optionally, you can set a flag to indicate that a new ID has been received - MQTT_flag = true; - } - - if (doc.containsKey("VoteTitle")) { - const char* voteTitle = doc["VoteTitle"]; - Serial.print("Received Vote Title: "); - Serial.println(voteTitle); - memcpy(MQTTVotingTitle, voteTitle, strlen(voteTitle) + 1); - // Optionally, you can set a flag to indicate that a new title has been received - MQTT_flag = true; - } - - // Add more conditions to extract other fields as needed - } else { - Serial.print("Failed to parse JSON: "); - Serial.println(error.c_str()); - } -} +// WLAN-Settings + const char* ssid = "ISDProjectLAN"; + const char* password = "557949122"; + +//Mqtt topics to publish + const String pubInit = "/registration/Server/"+ String(WiFi.macAddress()); + const char* pubPubVote = "/vote/"; + +// MQTT topics to subscribe + const String subInit = "/registration/esp/"+ String(WiFi.macAddress()); // /registration/esp/ + const char* subVoteSetup = "/setupVote/Setup"; + const char* subResync = "/setupVote/Resync"; + +//battery level + int batteryPercentage = checkBatteryLevel(); + +//program variables + int state = 0; + char response[STRINGSIZE] = ""; + char votingID[STRINGSIZE] = ""; + char pubTopicVoteResponse[STRINGSIZE] = ""; + char voteTitle[STRINGSIZE] = ""; + char responseBuffer[STRINGSIZE+50]; -//move this function to another folder -int checkBatteryLevel(){ - int adcValue = analogRead(BATTERY_PIN); - if (adcValue > 440) { - return FULL_BATTERY; - } - return EMPTY_BATTERY; -} void connectToWiFi() { Serial.print("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { @@ -72,36 +38,29 @@ void connectToWiFi() { Serial.print("Connected, IP address: "); Serial.println(WiFi.localIP()); } -void connectToMQTT() { - while (!mqttClient.connected()) { - Serial.println("Connecting to the MQTT server"); - mqttClient.connect(WiFi.macAddress().c_str(), mqtt_user, mqtt_password); - delay(500); - } - Serial.println("Connection to MQTT server established"); -} - -int batteryPercentage = checkBatteryLevel(); void setup() { //Serial.begin(115200); - //button initialization + +//button initialization pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-up-Widerstand pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-up-Widerstand pinMode(PWR_PIN, OUTPUT); pinMode(RX_PIN, INPUT_PULLUP); digitalWrite(PWR_PIN, HIGH); //power on device - //Display initialization +//Display initialization initDisplay(); startupScreen(batteryPercentage); +//wifi initialization WiFi.begin(ssid, password); connectToWiFi(); + +//mqtt initialization mqttClient.setServer(mqtt_server, mqtt_port); mqttClient.setCallback(callback); connectToMQTT(); - String macAddress = "{\"Mac\" : \"" + String(WiFi.macAddress()) + "\"}"; Serial.println(macAddress); mqttClient.publish(pubInit.c_str(), macAddress.c_str()); //send mac address @@ -110,15 +69,6 @@ void setup() { //mqttClient.subscribe(subResync, MQTTsubQos); mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question } - - int state = 0; - //int batteryPercentage = checkBatteryLevel(); //this may need to be global if we diplay screen in setup - //int batteryPercentage = 20; - char response[STRINGSIZE] = ""; - char votingID[STRINGSIZE] = ""; - char pubTopicVoteResponse[STRINGSIZE] = ""; - char voteTitle[STRINGSIZE] = ""; - char responseBuffer[STRINGSIZE]; void loop() { powerOff(); From 374581ac3adb38684d5682fff6cb0c83f2225c38 Mon Sep 17 00:00:00 2001 From: murphyslemon Date: Tue, 13 Feb 2024 11:23:40 +0200 Subject: [PATCH 36/36] remember to subscribe before publishing! --- voting_device/mqtt.cpp | 2 +- voting_device/voting_device.ino | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/voting_device/mqtt.cpp b/voting_device/mqtt.cpp index 09d4253..754a3d1 100644 --- a/voting_device/mqtt.cpp +++ b/voting_device/mqtt.cpp @@ -20,7 +20,7 @@ void callback(char* topic, byte* payload, unsigned int length) { // Copy payload bytes to MQTTmsg memcpy(MQTTmsg, payload, length); MQTTmsg[length] = '\0'; // Ensure null-termination for string - + Serial.println(MQTTmsg); // Parse JSON StaticJsonDocument doc; DeserializationError error = deserializeJson(doc, MQTTmsg); diff --git a/voting_device/voting_device.ino b/voting_device/voting_device.ino index 1bd4f05..01fea60 100644 --- a/voting_device/voting_device.ino +++ b/voting_device/voting_device.ino @@ -63,8 +63,8 @@ void setup() { connectToMQTT(); String macAddress = "{\"Mac\" : \"" + String(WiFi.macAddress()) + "\"}"; Serial.println(macAddress); - mqttClient.publish(pubInit.c_str(), macAddress.c_str()); //send mac address mqttClient.subscribe(subInit.c_str(), MQTTsubQos); //recieve voting ID + mqttClient.publish(pubInit.c_str(), macAddress.c_str()); //send mac address Serial.println("#" + String(subInit.c_str()) + "#") ; //mqttClient.subscribe(subResync, MQTTsubQos); mqttClient.subscribe(subVoteSetup, MQTTsubQos); //recieve question @@ -91,6 +91,7 @@ void loop() { paintVoteScreen(voteTitle); strcat(pubTopicVoteResponse, pubPubVote); strcat(pubTopicVoteResponse, votingID); + Serial.println(pubTopicVoteResponse); state = VOTE; } break;