├── ble_prt.jpg ├── printer_chart.jpg ├── library.properties ├── examples ├── print_photo │ └── print_photo.ino ├── custom_font │ ├── custom_font.ino │ └── FreeSerif12pt7b.h ├── barcode_demo │ └── barcode_demo.ino ├── telegram_bot │ ├── telegram_bot.ino │ ├── Open_Sans_Bold_22.h │ └── Open_Sans_Bold_32.h ├── m5stickc_telegram_bot │ ├── Open_Sans_Bold_22.h │ ├── m5stickc_telegram_bot.ino │ └── Open_Sans_Bold_32.h └── Thermal_Printer_Demo │ └── Thermal_Printer_Demo.ino ├── README.md ├── src └── Thermal_Printer.h └── LICENSE /ble_prt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pixtxa/Thermal_Printer/master/ble_prt.jpg -------------------------------------------------------------------------------- /printer_chart.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pixtxa/Thermal_Printer/master/printer_chart.jpg -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=Thermal Printer Library 2 | version=2.1.0 3 | author=Larry Bank 4 | maintainer=Larry Bank 5 | sentence=Bluetooth Low Energy Thermal Printer Library 6 | paragraph=BLE thermal printer library allows you to easily scan, connect and print graphics plus text on a variety of supported printers. 7 | category=Device Control 8 | url=https://github.com/bitbank2/Thermal_Printer 9 | architectures=nrf52,esp32 10 | -------------------------------------------------------------------------------- /examples/print_photo/print_photo.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "eagle_576.h" 5 | #include "dog_384.h" 6 | 7 | uint8_t ucDither[576 * 16]; // buffer for the dithered pixel output 8 | JPEGDEC jpg; 9 | static int iWidth; 10 | 11 | int JPEGDraw(JPEGDRAW *pDraw) 12 | { 13 | int i, iCount; 14 | uint8_t *s = (uint8_t *)pDraw->pPixels; 15 | 16 | tpSetBackBuffer((uint8_t *)pDraw->pPixels, pDraw->iWidth, pDraw->iHeight); 17 | // The output is inverted, so flip the bits 18 | iCount = (pDraw->iWidth * pDraw->iHeight)/8; 19 | for (i=0; i 2 | Thermal Printer Library
3 | Copyright (c) 2020 BitBank Software, Inc.
4 | Written by Larry Bank
5 | bitbank@pobox.com
6 |
7 | ![printer demo](/ble_prt.jpg?raw=true "Thermal_Printer") 8 | 9 |
10 | This Arduino library allows you to easily generate text and graphics 11 | and send them to various BLE thermal printers. I can support the printers that I currently own; if your model is not yet supported, the best way to encourage me to support it is to send me funds to buy it.
12 | There are many different 13 | BLE APIs depending on the board manufacturer, I support the three more 14 | popular ones: ESP32, Adafruit and Arduino (e.g. Nano BLE 33). The three main features of 15 | thermal printers are supported by this code - plain text, barcodes (1D+2D) and dot addressable 16 | graphics. The graphics are treated like a display driver - you define a RAM buffer and draw text, dots, lines and bitmaps into it, then send it to the printer. Text output supports the various built-in font size+attribute options of some printers as well as Adafruit_GFX format bitmap fonts (sent as graphics). 17 | See the Wiki: https://github.com/bitbank2/Thermal_Printer/wiki/Public-API for a description of each function. 18 |
19 | 20 |
21 | Features
22 | ========
23 | - Supports the GOOJPRT PT-210, MTP-3, PeriPage+ and 'cat' printers (so far)
24 | - Compiles on ESP32, Adafruit nRF52 and Arduino boards with bluetooth
25 | - Supports graphics (dots, lines, text, bitmaps), 1D + 2D barcodes, and plain text output
26 | - Allows printing Adafruit_GFX fonts one line at a time or drawing them into a RAM buffer
27 | - Can scan/connect to printers by BLE name or auto-detect the supported models
28 | - Doesn't depend on any other 3rd party code
29 |
30 | 31 | Here is a subjective chart of the printer models I've tested and are supported by this code. Please feel free to send me info about other models that work and additional comments about these printers.
32 | 33 |
34 |

35 | 36 |

37 |
38 | 39 | If you find this code useful, please consider becoming a Github Sponsor or sending a single donation. 40 | 41 | [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SR4F44J2UR8S4) 42 | -------------------------------------------------------------------------------- /examples/custom_font/custom_font.ino: -------------------------------------------------------------------------------- 1 | // 2 | // Custom Font Demo 3 | // 4 | // Print Adafruit_GFX bitmap fonts on inexpensive thermal printers 5 | // as line-at-a-time graphics output which doesn't require any bitmap buffers 6 | // 7 | // written by Larry Bank 8 | // Copyright (c) 2021 BitBank Software, Inc. 9 | // 10 | // This program is free software: you can redistribute it and/or modify 11 | // it under the terms of the GNU General Public License as published by 12 | // the Free Software Foundation, either version 3 of the License, or 13 | // (at your option) any later version. 14 | // 15 | // This program is distributed in the hope that it will be useful, 16 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | // GNU General Public License for more details. 19 | // 20 | // You should have received a copy of the GNU General Public License 21 | // along with this program. If not, see . 22 | // 23 | 24 | #include 25 | #include "FreeSerif12pt7b.h" 26 | #include "OpenSansBold64.h" 27 | 28 | void setup() { 29 | int iWidth; 30 | // put your setup code here, to run once: 31 | Serial.begin(115200); 32 | while (!Serial); 33 | Serial.println((char *)"Scanning for BLE printer"); 34 | if (tpScan()) // Scan for any supported printer name 35 | { 36 | Serial.println((char *)"Found a printer!, connecting..."); 37 | if (tpConnect()) 38 | { 39 | char *szName = tpGetName(); 40 | Serial.println((char *)"Connected!"); 41 | iWidth = tpGetWidth(); 42 | Serial.print("Printer pixel width = "); 43 | Serial.println(iWidth, DEC); 44 | Serial.print("Reported printer name = "); 45 | Serial.println(szName); 46 | // optionally speed up BLE data throughput if your MCU supports it 47 | // tpSetWriteMode(MODE_WITHOUT_RESPONSE); 48 | // Draw text with a custom proportional font 49 | Serial.println("Printing custom fonts"); 50 | // You can use the tpDrawCustomText to draw these same fonts 51 | // into your graphics buffer instead of sending directly to the printer 52 | tpPrintCustomText((GFXfont *)&FreeSerif12pt7b, 0, (char *)"You too can print nice looking fonts"); 53 | tpPrintCustomText((GFXfont *)&FreeSerif12pt7b, 0, (char *)"with Adafruit_GFX bitmap format."); 54 | tpPrintCustomText((GFXfont *)&Open_Sans_Bold_64, 0, (char *)"Huge fonts!"); 55 | tpFeed(48); // feed the paper out a little from the print head to see what was printed 56 | Serial.println((char *)"Disconnecting"); 57 | tpDisconnect(); 58 | Serial.println((char *)"Done!"); 59 | while (1) {}; 60 | } // if connected 61 | } // successful scan 62 | else 63 | { 64 | Serial.println((char *)"Didn't find a printer :( "); 65 | } 66 | } /* setup() */ 67 | 68 | void loop() { 69 | // nothing going on here :) 70 | } 71 | -------------------------------------------------------------------------------- /examples/barcode_demo/barcode_demo.ino: -------------------------------------------------------------------------------- 1 | // 2 | // 1D & 2D Barcode demo 3 | // 4 | // Some thermal printers have internal support for generating 1D and 2D barcodes 5 | // from a string of ASCII characters. Two functions within the Thermal_Printer library 6 | // allow you to access this functionality in a simple manner. 7 | // Even if the printer supports barcode printing, it probably doesn't support 8 | // the complete list of code types defined by the ESC/POS printer commands. 9 | // In the case of the GOOJPRT PT210/MTP-2, it only supports a small subset of 1D codes 10 | // 11 | // written by Larry Bank 12 | // Copyright (c) 2021 BitBank Software, Inc. 13 | // 14 | // This program is free software: you can redistribute it and/or modify 15 | // it under the terms of the GNU General Public License as published by 16 | // the Free Software Foundation, either version 3 of the License, or 17 | // (at your option) any later version. 18 | // 19 | // This program is distributed in the hope that it will be useful, 20 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 21 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 22 | // GNU General Public License for more details. 23 | // 24 | // You should have received a copy of the GNU General Public License 25 | // along with this program. If not, see . 26 | // 27 | 28 | #include 29 | 30 | void setup() { 31 | Serial.begin(115200); 32 | while (!Serial); 33 | Serial.println((char *)"Scanning for BLE printer"); 34 | if (tpScan()) // Scan for any supported printer name 35 | { 36 | Serial.println((char *)"Found a printer!, connecting..."); 37 | if (tpConnect()) 38 | { 39 | int iWidth; 40 | char *szName = tpGetName(); 41 | Serial.println((char *)"Connected!"); 42 | iWidth = tpGetWidth(); 43 | Serial.print("Printer pixel width = "); 44 | Serial.println(iWidth, DEC); 45 | Serial.print("Reported printer name = "); 46 | Serial.println(szName); 47 | // optionally speed up BLE data throughput if your MCU supports it 48 | // tpSetWriteMode(MODE_WITHOUT_RESPONSE); 49 | tpAlign(ALIGN_LEFT); 50 | tpPrint("This should print a 2D QR code\n\rwith the URL of my website\n\r"); 51 | tpAlign(ALIGN_CENTER); 52 | tpQRCode((char *)"https://bitbanksoftware.com"); 53 | tpAlign(ALIGN_LEFT); 54 | tpPrint("\n\rThis should print a CODE128\n\rof the string '123456789'\n\r"); 55 | // The call below specifies that the code should be 64 pixels tall 56 | // and that the text encoded by the bars should be displayed below it 57 | // Not all text position options work on all printers. 58 | tpAlign(ALIGN_CENTER); 59 | tp1DBarcode(BARCODE_CODE128, 64, (char *)"123456789", BARCODE_TEXT_BELOW); 60 | tpAlign(ALIGN_LEFT); 61 | tpFeed(24); // feed the paper out a little from the print head to see what was printed 62 | Serial.println((char *)"Disconnecting"); 63 | tpDisconnect(); 64 | Serial.println((char *)"Done!"); 65 | while (1) {}; 66 | } // if connected 67 | } // successful scan 68 | else 69 | { 70 | Serial.println((char *)"Didn't find a printer :( "); 71 | } 72 | } /* setup() */ 73 | 74 | void loop() { 75 | // nothing going on here :) 76 | } 77 | -------------------------------------------------------------------------------- /src/Thermal_Printer.h: -------------------------------------------------------------------------------- 1 | // 2 | // Thermal Printer Library 3 | // written by Larry Bank 4 | // Copyright (c) 2020 BitBank Software, Inc. 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | // 19 | 20 | #ifndef __THERMAL_PRINTER_H__ 21 | #define __THERMAL_PRINTER_H__ 22 | 23 | #define FONT_SMALL 0 24 | #define FONT_LARGE 1 25 | #define FONT_12x24 0 26 | #define FONT_9x17 1 27 | 28 | enum { 29 | ALIGN_LEFT=0x30, 30 | ALIGN_CENTER=0x31, 31 | ALIGN_RIGHT=0x32 32 | }; 33 | 34 | enum { 35 | BARCODE_TEXT_NONE=0x30, 36 | BARCODE_TEXT_ABOVE=0x31, 37 | BARCODE_TEXT_BELOW=0x32, 38 | BARCODE_TEXT_BOTH=0x33 39 | }; 40 | 41 | enum { 42 | BARCODE_UPCA=0, 43 | BARCODE_UPCE=0x01, 44 | BARCODE_EAN13=0x02, 45 | BARCODE_EAN8=0x03, 46 | BARCODE_CODE39=0x04, 47 | BARCODE_ITF=0x05, 48 | BARCODE_CODABAR=0x06, 49 | BARCODE_CODE93=0x48, 50 | BARCODE_CODE128=0x49, 51 | BARCODE_GS1_128=0x50, 52 | BARCODE_GS1_DATABAR_OMNI=0x51, 53 | BARCODE_GS1_DATABAR_TRUNCATED=0x52, 54 | BARCODE_GS1_DATABAR_LIMITED=0x53, 55 | BARCODE_GS1_DATABAR_EXPANDED=0x54, 56 | BARCODE_CODE128_AUTO=0x55 57 | }; 58 | 59 | enum { 60 | PRINTER_MTP2=0, 61 | PRINTER_MTP3, 62 | PRINTER_CAT, 63 | PRINTER_PERIPAGEPLUS, 64 | PRINTER_PERIPAGE, 65 | PRINTER_FOMEMO, 66 | PRINTER_COUNT 67 | }; 68 | 69 | // Proportional font data taken from Adafruit_GFX library 70 | /// Font data stored PER GLYPH 71 | #if !defined( _ADAFRUIT_GFX_H ) && !defined( _GFXFONT_H_ ) 72 | #define _GFXFONT_H_ 73 | typedef struct { 74 | uint16_t bitmapOffset; ///< Pointer into GFXfont->bitmap 75 | uint8_t width; ///< Bitmap dimensions in pixels 76 | uint8_t height; ///< Bitmap dimensions in pixels 77 | uint8_t xAdvance; ///< Distance to advance cursor (x axis) 78 | int8_t xOffset; ///< X dist from cursor pos to UL corner 79 | int8_t yOffset; ///< Y dist from cursor pos to UL corner 80 | } GFXglyph; 81 | 82 | /// Data stored for FONT AS A WHOLE 83 | typedef struct { 84 | uint8_t *bitmap; ///< Glyph bitmaps, concatenated 85 | GFXglyph *glyph; ///< Glyph array 86 | uint8_t first; ///< ASCII extents (first char) 87 | uint8_t last; ///< ASCII extents (last char) 88 | uint8_t yAdvance; ///< Newline distance (y axis) 89 | } GFXfont; 90 | #endif // _ADAFRUIT_GFX_H 91 | // 92 | // Return the printer width in pixels 93 | // The printer needs to be connected to get this info 94 | // 95 | int tpGetWidth(void); 96 | // 97 | // Returns the BLE name of the connected printer 98 | // as a zero terminated c-string 99 | // Returns NULL if not connected 100 | // 101 | char *tpGetName(void); 102 | 103 | // Feed the paper in scanline increments 104 | // 105 | void tpFeed(int iLines); 106 | // 107 | // Return the measurements of a rectangle surrounding the given text string 108 | // rendered in the given font 109 | // 110 | void tpGetStringBox(GFXfont *pFont, char *szMsg, int *width, int *top, int *bottom); 111 | // 112 | // Draw a string of characters in a custom font into the gfx buffer 113 | // 114 | int tpDrawCustomText(GFXfont *pFont, int x, int y, char *szMsg); 115 | // 116 | // Print a string of characters in a custom font to the connected printer 117 | // 118 | int tpPrintCustomText(GFXfont *pFont, int x, char *szMsg); 119 | 120 | // 121 | // Send raw data to printer 122 | // 123 | void tpWriteRawData(uint8_t *pData, int iLen); 124 | 125 | // Select one of 2 available text fonts along with attributes 126 | // FONT_12x24 or FONT_9x17 127 | // Each option is either 0 (disabled) or 1 (enabled) 128 | // These are the text attributes offered by the standard printer spec 129 | // 130 | void tpSetFont(int iFont, int iUnderline, int iDoubleWide, int iDoubleTall, int iEmphasized); 131 | 132 | // 133 | // Provide a back buffer for your printer graphics 134 | // This allows you to manage the RAM used on 135 | // embedded platforms like Arduinos 136 | // The memory is laid out horizontally (384 pixels across = 48 bytes) 137 | // So a 384x384 buffer would need to be 48x384 = 18432 bytes 138 | // 139 | void tpSetBackBuffer(uint8_t *pBuffer, int iWidth, int iHeight); 140 | // 141 | // Print plain text immediately 142 | // 143 | // Pass a C-string (zero terminated char array) 144 | // If the text doesn't reach the end of the line 145 | // it will not be printed until the printer receives 146 | // a CR (carriage return) or new text which forces 147 | // it to wrap around 148 | // 149 | int tpPrint(char *pString); 150 | // 151 | // Print plain text immediately 152 | // Pass a C-string (zero terminated char array) 153 | // A CR (carriage return) will be added at the end 154 | // to cause the printer to print the text and advance 155 | // the paper one line 156 | // 157 | int tpPrintLine(char *pString); 158 | 159 | #define MODE_WITH_RESPONSE 1 160 | #define MODE_WITHOUT_RESPONSE 0 161 | // 162 | // Set the BLE write mode 163 | // MODE_WITH_RESPONSE asks the receiver to ack each packet 164 | // it will be slower, but might be necessary to successfully transmit 165 | // every packet. The default is to wait for a response for each write 166 | // 167 | void tpSetWriteMode(uint8_t bWriteMode); 168 | // 169 | // Draw text into the graphics buffer 170 | // 171 | int tpDrawText(int x, int y, char *pString, int iFontSize, int bInvert); 172 | // 173 | // Load a 1-bpp Windows bitmap into the back buffer 174 | // Pass the pointer to the beginning of the BMP file 175 | // along with a x and y offset (upper left corner) 176 | // 177 | int tpLoadBMP(uint8_t *pBMP, int bInvert, int iXOffset, int iYOffset); 178 | 179 | // 180 | // Fill the frame buffer with a byte pattern 181 | // e.g. all off (0x00) or all on (0xff) 182 | // 183 | void tpFill(unsigned char ucData); 184 | // 185 | // Set (or clear) an individual pixel 186 | // 187 | int tpSetPixel(int x, int y, uint8_t ucColor); 188 | // 189 | // Send the graphics to the printer (must be connected over BLE first) 190 | // 191 | void tpPrintBuffer(void); 192 | // 193 | // Draw a line between 2 points 194 | // 195 | void tpDrawLine(int x1, int y1, int x2, int y2, uint8_t ucColor); 196 | // 197 | // Scan for compatible printers 198 | // returns true if found 199 | // and stores the printer address internally 200 | // for use with the tpConnect() function 201 | // szName is the printer device name to match 202 | // iSeconds = how many seconds to scan for devices 203 | // 204 | int tpScan(const char *szName, int iSeconds); 205 | // 206 | // connect to a printer with a macaddress 207 | // returns 1 if successful, 0 for failure 208 | // 209 | int tpConnect(const char *szMacAddress); 210 | // 211 | // Set the text and barcode alignment 212 | // Use ALIGN_LEFT, ALIGN_CENTER or ALIGN_RIGHT 213 | // 214 | void tpAlign(uint8_t ucAlign); 215 | // 216 | // Print a 2D (QR) barcode 217 | // 218 | void tpQRCode(char *szText); 219 | // 220 | // Print a 2D (QR) barcode 221 | // iSize = starting from 1 / standard is 3 222 | // 223 | void tpQRCode(char *szText, int iSize); 224 | // 225 | // Print a 1D barcode 226 | // 227 | void tp1DBarcode(int iType, int iHeight, char *szData, int iTextPos); 228 | // 229 | // Parameterless version 230 | // finds supported printers automatically 231 | // 232 | int tpScan(void); 233 | // 234 | // After a successful scan, connect to the printer 235 | // returns 1 if successful, 0 for failure 236 | // 237 | int tpConnect(void); 238 | void tpDisconnect(void); 239 | int tpIsConnected(void); 240 | #endif // __THERMAL_PRINTER_H__ 241 | -------------------------------------------------------------------------------- /examples/telegram_bot/telegram_bot.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | A telegram bot for your ESP32 to print shopping or to-do lists 3 | on BLE Thermal Printers 4 | 5 | Arduino sketch written by Larry Bank 6 | 7 | Parts: 8 | Any ESP32, GOOJPRT PT-210, MPT-3, PeriPage+ (so far) 9 | 10 | Telegram Library written by Brian Lough 11 | YouTube: https://www.youtube.com/brianlough 12 | Tindie: https://www.tindie.com/stores/brianlough/ 13 | Twitter: https://twitter.com/witnessmenow 14 | 15 | Thermal Printer library written by Larry Bank 16 | Twitter: https://twitter.com/fast_code_r_us 17 | Github: https://github.com/bitbank2 18 | 19 | N.B.: The ESP32 partitioning (Tools menu) must be set to "No OTA" to fit this sketch 20 | in FLASH because it uses both the WiFi and BLE libraries which will pass 1MB 21 | 22 | *******************************************************************/ 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | // Proportional fonts for 203dpi and 304dpi output 29 | #include "Open_Sans_Bold_22.h" 30 | #include "Open_Sans_Bold_32.h" 31 | const char *APP_NAME = "Shopping_List"; // Preferences name 32 | 33 | // Wifi network station credentials 34 | // change these to your local AP credentials 35 | #define WIFI_SSID "my_ssid" 36 | #define WIFI_PASSWORD "my_password" 37 | // Telegram BOT Token (Get from Botfather) 38 | #define BOT_TOKEN "xxxxxxx" 39 | 40 | // List of user names that are authorized to use this bot 41 | // make sure the list terminates with NULL 42 | // For more security, this can be changed to use chat_id's that are unique 43 | char *szValidUsers[] {"Isabella", "Gabriella", "Marice", "Larry", "Brian", NULL}; 44 | 45 | const unsigned long BOT_MTBS = 1000; // mean time between scan messages 46 | 47 | Preferences preferences; 48 | WiFiClientSecure secured_client; 49 | UniversalTelegramBot bot(BOT_TOKEN, secured_client); 50 | unsigned long bot_lasttime; // last time messages' scan has been done 51 | bool Start = false; 52 | 53 | void ShowHelpMessage(String chat_id) 54 | { 55 | String welcome = "Welcome to the Thermal Printer Shopping List bot\n\n"; 56 | welcome += "This is an ESP32 listening for text and commands.\n\n"; 57 | welcome += "Type /help to see this message again.\n"; 58 | welcome += "The following commands are recognized:\n"; 59 | welcome += "/list - show current shopping list\n"; 60 | welcome += "/deleteall - delete the current shopping list\n"; 61 | welcome += "/delete - delete a specific item\n"; 62 | welcome += "/print - print the list on a local thermal printer\n"; 63 | welcome += "Any other text will be added to the list as an item\n"; 64 | welcome += "Enjoy!\n"; 65 | bot.sendMessage(chat_id, welcome); 66 | } /* ShowHelpMessage() */ 67 | 68 | void handleNewMessages(int numNewMessages) 69 | { 70 | int i, j; 71 | // Serial.println("handleNewMessages"); 72 | // Serial.println(String(numNewMessages)); 73 | 74 | for (i = 0; i < numNewMessages; i++) 75 | { 76 | String chat_id = bot.messages[i].chat_id; 77 | String text = bot.messages[i].text; 78 | 79 | // Serial.print("Got text: "); 80 | // Serial.println(text); 81 | 82 | String from_name = bot.messages[i].from_name; 83 | if (from_name == "") 84 | from_name = "Guest"; 85 | Serial.print("From user: "); 86 | Serial.println(from_name); 87 | // validate the user 88 | j = 0; 89 | while (szValidUsers[j] != NULL) { 90 | if (strcmp(from_name.c_str(), szValidUsers[j]) == 0) 91 | break; 92 | j++; 93 | } 94 | if (szValidUsers[j] == NULL) { // not found, don't act on command 95 | bot.sendMessage(chat_id, "Unauthorized user, ignoring\n"); 96 | continue; // process next msg in the queue 97 | } 98 | 99 | // if (text == "/send_test_action") 100 | // { 101 | // bot.sendChatAction(chat_id, "typing"); 102 | // delay(4000); 103 | // bot.sendMessage(chat_id, "Did you see the action message?"); 104 | 105 | // You can't use own message, just choose from one of bellow 106 | 107 | //typing for text messages 108 | //upload_photo for photos 109 | //record_video or upload_video for videos 110 | //record_audio or upload_audio for audio files 111 | //upload_document for general files 112 | //find_location for location data 113 | 114 | //more info here - https://core.telegram.org/bots/api#sendchataction 115 | // } 116 | if (text.charAt(0) == '/') { // it's a command 117 | if (text == "/list") { 118 | int i, iCount = GetStringCount(); 119 | char szMsg[128]; 120 | for (i=0; i iCount || iItem < 0) { 133 | sprintf(szMsg, "Invalid item number; list length = %d\n", iCount); 134 | bot.sendMessage(chat_id, szMsg); 135 | continue; 136 | } 137 | DeleteString(iItem-1); 138 | sprintf(szMsg, "Item %d deleted; list length = %d\n", iItem, iCount); 139 | bot.sendMessage(chat_id, szMsg); 140 | } else if (text == "/print") { 141 | int bSucceeded = 0; 142 | bot.sendMessage(chat_id, "Printing...\n"); 143 | // Need to temporarily disconnect WiFi or the system can 144 | // crash due to a stack overrun caused by WiFi & BLE being used simultaneously 145 | WiFi.disconnect(); 146 | // Search (scan), then connect to the BLE printer and send the text 147 | if (tpScan()) { 148 | Serial.println((char *)"Found a printer!, connecting..."); 149 | if (tpConnect()) { 150 | Serial.println((char *)"Connected!, ready to print"); 151 | GFXfont *pFont; 152 | int i, iCount = GetStringCount(); 153 | char szMsg[128]; 154 | if (tpGetWidth() == 384) // low res printer 155 | pFont = (GFXfont *)&Open_Sans_Bold_22; 156 | else // high res printer 157 | pFont = (GFXfont *)&Open_Sans_Bold_32; 158 | for (i=0; i= iCount) { 198 | preferences.end(); 199 | return; // invalid string to delete 200 | } 201 | sprintf(szName, "name%d", iCount-1); // get last string in the list 202 | preferences.getString(szName, szTemp, sizeof(szTemp)); 203 | sprintf(szName, "name%d", iString); // to replace the one we want to delete 204 | preferences.putString(szName, szTemp); 205 | iCount--; // delete the last name 206 | preferences.putInt("list_count", iCount); 207 | preferences.end(); 208 | 209 | } /* DeleteString() */ 210 | 211 | char * GetString(int iString) 212 | { 213 | static char szTemp[128]; 214 | char szName[32]; 215 | int iCount; 216 | 217 | preferences.begin(APP_NAME, false); 218 | iCount = preferences.getInt("list_count", 0); 219 | if (iString >= iCount) { // invalid 220 | return NULL; 221 | preferences.end(); 222 | } 223 | sprintf(szName, "name%d", iString); 224 | preferences.getString(szName, szTemp, sizeof(szTemp)); 225 | preferences.end(); 226 | return szTemp; 227 | } /* GetString() */ 228 | 229 | void DeleteAll(void) 230 | { 231 | preferences.begin(APP_NAME, false); 232 | preferences.putInt("list_count", 0); 233 | preferences.end(); 234 | } /* DeleteAll() */ 235 | 236 | int GetStringCount(void) 237 | { 238 | int iCount; 239 | 240 | preferences.begin(APP_NAME, false); 241 | iCount = preferences.getInt("list_count", 0); 242 | preferences.end(); 243 | return iCount; 244 | } /* GetStringCount() */ 245 | 246 | int AddString(char *newname) 247 | { 248 | int iCount; 249 | char szTemp[32]; 250 | 251 | preferences.begin(APP_NAME, false); 252 | iCount = preferences.getInt("list_count", 0); 253 | // save the data 254 | sprintf(szTemp, "name%d", iCount); 255 | preferences.putString(szTemp, newname); 256 | iCount++; 257 | preferences.putInt("list_count", iCount); 258 | preferences.end(); 259 | return iCount; // return new list length 260 | } /* AddString() */ 261 | 262 | void lightSleep(uint64_t time_in_us) 263 | { 264 | esp_sleep_enable_timer_wakeup(time_in_us); 265 | esp_light_sleep_start(); 266 | } /* lightSleep() */ 267 | 268 | void setup() 269 | { 270 | int iTimeout = 0; 271 | 272 | Serial.begin(115200); 273 | while (!Serial && iTimeout < 5) { 274 | delay(1000); 275 | iTimeout++; 276 | }; 277 | 278 | // Attempt to connect to Wifi network: 279 | Serial.print("\nConnecting to Wifi SSID "); 280 | Serial.print(WIFI_SSID); 281 | WiFi.begin(WIFI_SSID, WIFI_PASSWORD); 282 | secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org 283 | while (WiFi.status() != WL_CONNECTED) 284 | { 285 | Serial.print("."); 286 | delay(500); 287 | } 288 | Serial.print("\nWiFi connected. IP address: "); 289 | Serial.println(WiFi.localIP()); 290 | 291 | Serial.print("Retrieving time: "); 292 | configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP 293 | time_t now = time(nullptr); 294 | while (now < 24 * 3600) 295 | { 296 | Serial.print("."); 297 | delay(100); 298 | now = time(nullptr); 299 | } 300 | Serial.println(now); 301 | Serial.println("Starting Telegram bot..."); 302 | } /* setup() */ 303 | 304 | void loop() 305 | { 306 | if (millis() - bot_lasttime > BOT_MTBS) 307 | { 308 | int numNewMessages = bot.getUpdates(bot.last_message_received + 1); 309 | 310 | while (numNewMessages) 311 | { 312 | Serial.println("got response"); 313 | handleNewMessages(numNewMessages); 314 | numNewMessages = bot.getUpdates(bot.last_message_received + 1); 315 | } 316 | 317 | bot_lasttime = millis(); 318 | } else { 319 | // vTaskDelay(100 / portTICK_PERIOD_MS); // allow the CPU to cool off a little while we wait 320 | } 321 | } 322 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2020 BitBank Software, Inc. All rights reserved. 2 | 3 | Apache License 4 | Version 2.0, January 2004 5 | http://www.apache.org/licenses/ 6 | 7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 8 | 9 | 1. Definitions. 10 | 11 | "License" shall mean the terms and conditions for use, reproduction, 12 | and distribution as defined by Sections 1 through 9 of this document. 13 | 14 | "Licensor" shall mean the copyright owner or entity authorized by 15 | the copyright owner that is granting the License. 16 | 17 | "Legal Entity" shall mean the union of the acting entity and all 18 | other entities that control, are controlled by, or are under common 19 | control with that entity. For the purposes of this definition, 20 | "control" means (i) the power, direct or indirect, to cause the 21 | direction or management of such entity, whether by contract or 22 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 23 | outstanding shares, or (iii) beneficial ownership of such entity. 24 | 25 | "You" (or "Your") shall mean an individual or Legal Entity 26 | exercising permissions granted by this License. 27 | 28 | "Source" form shall mean the preferred form for making modifications, 29 | including but not limited to software source code, documentation 30 | source, and configuration files. 31 | 32 | "Object" form shall mean any form resulting from mechanical 33 | transformation or translation of a Source form, including but 34 | not limited to compiled object code, generated documentation, 35 | and conversions to other media types. 36 | 37 | "Work" shall mean the work of authorship, whether in Source or 38 | Object form, made available under the License, as indicated by a 39 | copyright notice that is included in or attached to the work 40 | (an example is provided in the Appendix below). 41 | 42 | "Derivative Works" shall mean any work, whether in Source or Object 43 | form, that is based on (or derived from) the Work and for which the 44 | editorial revisions, annotations, elaborations, or other modifications 45 | represent, as a whole, an original work of authorship. For the purposes 46 | of this License, Derivative Works shall not include works that remain 47 | separable from, or merely link (or bind by name) to the interfaces of, 48 | the Work and Derivative Works thereof. 49 | 50 | "Contribution" shall mean any work of authorship, including 51 | the original version of the Work and any modifications or additions 52 | to that Work or Derivative Works thereof, that is intentionally 53 | submitted to Licensor for inclusion in the Work by the copyright owner 54 | or by an individual or Legal Entity authorized to submit on behalf of 55 | the copyright owner. For the purposes of this definition, "submitted" 56 | means any form of electronic, verbal, or written communication sent 57 | to the Licensor or its representatives, including but not limited to 58 | communication on electronic mailing lists, source code control systems, 59 | and issue tracking systems that are managed by, or on behalf of, the 60 | Licensor for the purpose of discussing and improving the Work, but 61 | excluding communication that is conspicuously marked or otherwise 62 | designated in writing by the copyright owner as "Not a Contribution." 63 | 64 | "Contributor" shall mean Licensor and any individual or Legal Entity 65 | on behalf of whom a Contribution has been received by Licensor and 66 | subsequently incorporated within the Work. 67 | 68 | 2. Grant of Copyright License. Subject to the terms and conditions of 69 | this License, each Contributor hereby grants to You a perpetual, 70 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 71 | copyright license to reproduce, prepare Derivative Works of, 72 | publicly display, publicly perform, sublicense, and distribute the 73 | Work and such Derivative Works in Source or Object form. 74 | 75 | 3. Grant of Patent License. Subject to the terms and conditions of 76 | this License, each Contributor hereby grants to You a perpetual, 77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 78 | (except as stated in this section) patent license to make, have made, 79 | use, offer to sell, sell, import, and otherwise transfer the Work, 80 | where such license applies only to those patent claims licensable 81 | by such Contributor that are necessarily infringed by their 82 | Contribution(s) alone or by combination of their Contribution(s) 83 | with the Work to which such Contribution(s) was submitted. If You 84 | institute patent litigation against any entity (including a 85 | cross-claim or counterclaim in a lawsuit) alleging that the Work 86 | or a Contribution incorporated within the Work constitutes direct 87 | or contributory patent infringement, then any patent licenses 88 | granted to You under this License for that Work shall terminate 89 | as of the date such litigation is filed. 90 | 91 | 4. Redistribution. You may reproduce and distribute copies of the 92 | Work or Derivative Works thereof in any medium, with or without 93 | modifications, and in Source or Object form, provided that You 94 | meet the following conditions: 95 | 96 | (a) You must give any other recipients of the Work or 97 | Derivative Works a copy of this License; and 98 | 99 | (b) You must cause any modified files to carry prominent notices 100 | stating that You changed the files; and 101 | 102 | (c) You must retain, in the Source form of any Derivative Works 103 | that You distribute, all copyright, patent, trademark, and 104 | attribution notices from the Source form of the Work, 105 | excluding those notices that do not pertain to any part of 106 | the Derivative Works; and 107 | 108 | (d) If the Work includes a "NOTICE" text file as part of its 109 | distribution, then any Derivative Works that You distribute must 110 | include a readable copy of the attribution notices contained 111 | within such NOTICE file, excluding those notices that do not 112 | pertain to any part of the Derivative Works, in at least one 113 | of the following places: within a NOTICE text file distributed 114 | as part of the Derivative Works; within the Source form or 115 | documentation, if provided along with the Derivative Works; or, 116 | within a display generated by the Derivative Works, if and 117 | wherever such third-party notices normally appear. The contents 118 | of the NOTICE file are for informational purposes only and 119 | do not modify the License. You may add Your own attribution 120 | notices within Derivative Works that You distribute, alongside 121 | or as an addendum to the NOTICE text from the Work, provided 122 | that such additional attribution notices cannot be construed 123 | as modifying the License. 124 | 125 | You may add Your own copyright statement to Your modifications and 126 | may provide additional or different license terms and conditions 127 | for use, reproduction, or distribution of Your modifications, or 128 | for any such Derivative Works as a whole, provided Your use, 129 | reproduction, and distribution of the Work otherwise complies with 130 | the conditions stated in this License. 131 | 132 | 5. Submission of Contributions. Unless You explicitly state otherwise, 133 | any Contribution intentionally submitted for inclusion in the Work 134 | by You to the Licensor shall be under the terms and conditions of 135 | this License, without any additional terms or conditions. 136 | Notwithstanding the above, nothing herein shall supersede or modify 137 | the terms of any separate license agreement you may have executed 138 | with Licensor regarding such Contributions. 139 | 140 | 6. Trademarks. This License does not grant permission to use the trade 141 | names, trademarks, service marks, or product names of the Licensor, 142 | except as required for reasonable and customary use in describing the 143 | origin of the Work and reproducing the content of the NOTICE file. 144 | 145 | 7. Disclaimer of Warranty. Unless required by applicable law or 146 | agreed to in writing, Licensor provides the Work (and each 147 | Contributor provides its Contributions) on an "AS IS" BASIS, 148 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 149 | implied, including, without limitation, any warranties or conditions 150 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 151 | PARTICULAR PURPOSE. You are solely responsible for determining the 152 | appropriateness of using or redistributing the Work and assume any 153 | risks associated with Your exercise of permissions under this License. 154 | 155 | 8. Limitation of Liability. In no event and under no legal theory, 156 | whether in tort (including negligence), contract, or otherwise, 157 | unless required by applicable law (such as deliberate and grossly 158 | negligent acts) or agreed to in writing, shall any Contributor be 159 | liable to You for damages, including any direct, indirect, special, 160 | incidental, or consequential damages of any character arising as a 161 | result of this License or out of the use or inability to use the 162 | Work (including but not limited to damages for loss of goodwill, 163 | work stoppage, computer failure or malfunction, or any and all 164 | other commercial damages or losses), even if such Contributor 165 | has been advised of the possibility of such damages. 166 | 167 | 9. Accepting Warranty or Additional Liability. While redistributing 168 | the Work or Derivative Works thereof, You may choose to offer, 169 | and charge a fee for, acceptance of support, warranty, indemnity, 170 | or other liability obligations and/or rights consistent with this 171 | License. However, in accepting such obligations, You may act only 172 | on Your own behalf and on Your sole responsibility, not on behalf 173 | of any other Contributor, and only if You agree to indemnify, 174 | defend, and hold each Contributor harmless for any liability 175 | incurred by, or claims asserted against, such Contributor by reason 176 | of your accepting any such warranty or additional liability. 177 | 178 | END OF TERMS AND CONDITIONS 179 | 180 | APPENDIX: How to apply the Apache License to your work. 181 | 182 | To apply the Apache License to your work, attach the following 183 | boilerplate notice, with the fields enclosed by brackets "[]" 184 | replaced with your own identifying information. (Don't include 185 | the brackets!) The text should be enclosed in the appropriate 186 | comment syntax for the file format. We also recommend that a 187 | file or class name and description of purpose be included on the 188 | same "printed page" as the copyright notice for easier 189 | identification within third-party archives. 190 | 191 | Copyright [yyyy] [name of copyright owner] 192 | 193 | Licensed under the Apache License, Version 2.0 (the "License"); 194 | you may not use this file except in compliance with the License. 195 | You may obtain a copy of the License at 196 | 197 | http://www.apache.org/licenses/LICENSE-2.0 198 | 199 | Unless required by applicable law or agreed to in writing, software 200 | distributed under the License is distributed on an "AS IS" BASIS, 201 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 202 | See the License for the specific language governing permissions and 203 | limitations under the License. 204 | 205 | -------------------------------------------------------------------------------- /examples/telegram_bot/Open_Sans_Bold_22.h: -------------------------------------------------------------------------------- 1 | // Created by http://oleddisplay.squix.ch/ Consider a donation 2 | // In case of problems make sure that you are using the font file with the correct version! 3 | const uint8_t Open_Sans_Bold_22Bitmaps[] PROGMEM = { 4 | 5 | // Bitmap Data: 6 | 0x00, // ' ' 7 | 0xF7,0xBD,0xEF,0x39,0xCE,0x73,0x00,0x06,0x7B,0xCC, // '!' 8 | 0xE7,0x31,0x98,0xCC,0x66,0x33,0x18, // '"' 9 | 0x06,0x70,0x0C,0xE0,0x19,0x80,0x73,0x07,0xFF,0xCF,0xFF,0x83,0x38,0x06,0x60,0x1C,0xC1,0xFF,0xF3,0xFF,0xE0,0xCE,0x01,0x98,0x03,0x30,0x0E,0x60,0x1C,0xC0, // '#' 10 | 0x04,0x00,0x40,0x1F,0x87,0xFE,0xFF,0xCE,0x44,0xE4,0x0F,0xC0,0x7F,0x01,0xFC,0x07,0xE0,0x4E,0xC4,0xEF,0xFE,0xFF,0xC7,0xF0,0x04,0x00,0x40, // '$' 11 | 0x78,0x0C,0x1F,0x83,0x83,0xB8,0x60,0x77,0x1C,0x0C,0xE3,0x01,0x9C,0xE0,0x3B,0x99,0xC7,0x77,0x7C,0x7D,0xDD,0xC7,0x33,0xB8,0x0E,0x73,0x01,0x8E,0x60,0x71,0xCC,0x0C,0x3B,0x83,0x83,0xF0,0x60,0x3C, // '%' 12 | 0x1F,0x80,0x1F,0xE0,0x1F,0xF0,0x0E,0x38,0x07,0x1C,0x01,0xFE,0x00,0x7E,0x00,0x7C,0x1C,0x7F,0x9E,0x79,0xEE,0x38,0x7F,0x1C,0x1F,0x0F,0x0F,0x87,0xFF,0xE1,0xFF,0xF8,0x3F,0x3E, // '&' 13 | 0xE6,0x66,0x66, // ''' 14 | 0x1C,0x30,0xE1,0x87,0x0E,0x1C,0x30,0xE1,0xC3,0x83,0x07,0x0E,0x1C,0x18,0x38,0x30,0x70, // '(' 15 | 0xE0,0xC1,0xC1,0x83,0x87,0x0E,0x0C,0x1C,0x38,0x70,0xC3,0x87,0x0E,0x18,0x70,0xC3,0x80, // ')' 16 | 0x0C,0x01,0x80,0x30,0x76,0xEF,0xFC,0xFF,0x07,0x81,0xF8,0x73,0x86,0x60, // '*' 17 | 0x0E,0x00,0xE0,0x0E,0x00,0xE0,0xFF,0xEF,0xFE,0x0E,0x00,0xE0,0x0E,0x00,0xE0, // '+' 18 | 0x77,0xB9,0xCC,0x00, // ',' 19 | 0xFB,0xEF,0x80, // '-' 20 | 0x77,0xBC,0xC0, // '.' 21 | 0x03,0x81,0xC0,0x70,0x1C,0x0E,0x03,0x80,0xE0,0x70,0x1C,0x0E,0x03,0x80,0xE0,0x70,0x1C,0x07,0x03,0x80, // '/' 22 | 0x1F,0x03,0xF8,0x7F,0xCF,0x1E,0xF1,0xEE,0x0E,0xE0,0xEE,0x0E,0xE0,0xEE,0x0E,0xE0,0xEF,0x1E,0xF1,0xE7,0xFC,0x3F,0x81,0xF0, // '0' 23 | 0x0E,0x1E,0x7E,0xFE,0xEE,0x4E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E, // '1' 24 | 0x1F,0x07,0xFC,0xFF,0xC6,0x1E,0x00,0xE0,0x1E,0x01,0xC0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x70,0x0F,0xFE,0xFF,0xEF,0xFE, // '2' 25 | 0x3F,0x0F,0xFC,0xFF,0xC6,0x1E,0x01,0xE0,0x1C,0x01,0xC3,0xF8,0x3F,0x03,0xFC,0x01,0xE0,0x0E,0x81,0xEF,0xFE,0xFF,0xC7,0xF0, // '3' 26 | 0x01,0xE0,0x0F,0x80,0x3E,0x01,0xF8,0x0F,0xE0,0x37,0x81,0xDE,0x0E,0x78,0x31,0xE1,0xC7,0x8F,0xFF,0xBF,0xFE,0xFF,0xF8,0x07,0x80,0x1E,0x00,0x78, // '4' 27 | 0x7F,0xC7,0xFC,0x7F,0xC7,0x00,0x70,0x07,0x00,0x7F,0x07,0xFC,0xFF,0xE0,0x1E,0x00,0xE0,0x0E,0x81,0xEF,0xFC,0xFF,0x87,0xF0, // '5' 28 | 0x07,0xC1,0xFC,0x3F,0xC7,0x80,0x70,0x0E,0x00,0xEF,0x8F,0xFC,0xFF,0xEF,0x1E,0xE0,0xEE,0x0E,0xF1,0xE7,0xFE,0x3F,0xC1,0xF0, // '6' 29 | 0xFF,0xEF,0xFE,0xFF,0xE0,0x0E,0x01,0xC0,0x1C,0x03,0x80,0x38,0x07,0x00,0x70,0x0F,0x00,0xE0,0x1E,0x01,0xC0,0x3C,0x03,0x80, // '7' 30 | 0x1F,0x07,0xFC,0x71,0xCE,0x0E,0xF1,0xE7,0x1C,0x7F,0x81,0xF0,0x3F,0x87,0x3C,0xE0,0xEE,0x0E,0xE0,0xEF,0x1E,0x7F,0xC3,0xF0, // '8' 31 | 0x1F,0x07,0xF8,0xFF,0xCF,0x1E,0xE0,0xEE,0x0E,0xF1,0xEF,0xFE,0x7F,0xE3,0xEE,0x00,0xE0,0x1C,0x03,0xC7,0xF8,0x7F,0x07,0xC0, // '9' 32 | 0x77,0xBC,0xC0,0x00,0x00,0x77,0xBC,0xC0, // ':' 33 | 0x77,0xBC,0xC0,0x00,0x00,0x03,0xBD,0xCE,0x60, // ';' 34 | 0x00,0x20,0x0E,0x03,0xE0,0xF8,0x3E,0x0F,0x00,0xF8,0x07,0xE0,0x0F,0xC0,0x3E,0x00,0xE0,0x00, // '<' 35 | 0xFF,0xEF,0xFE,0x00,0x00,0x00,0x00,0x0F,0xFE,0xFF,0xE0, // '=' 36 | 0x80,0x0E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x1E,0x03,0xE0,0xFC,0x7E,0x0F,0x80,0xE0,0x00,0x00, // '>' 37 | 0x3F,0x1F,0xF9,0xFF,0x30,0xE0,0x1C,0x03,0x81,0xE0,0x70,0x1C,0x03,0x80,0x00,0x00,0x01,0xC0,0x3C,0x07,0x80,0xE0, // '?' 38 | 0x03,0xF8,0x01,0xFF,0xC0,0x78,0x3C,0x1C,0x01,0xC7,0x1F,0x98,0xC7,0xF3,0x99,0xC6,0x77,0x70,0xC6,0xEE,0x18,0xDD,0xC3,0x3B,0xB8,0xE7,0x73,0x1C,0xCE,0x7F,0xF8,0xC7,0x9E,0x1C,0x00,0x01,0xE0,0x60,0x1F,0xFC,0x00,0xFF,0x00, // '@' 39 | 0x07,0xC0,0x07,0xC0,0x06,0xC0,0x0E,0xE0,0x0E,0xE0,0x0E,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3F,0xF8,0x3F,0xF8,0x3F,0xF8,0x78,0x3C,0x70,0x1C,0x70,0x1C,0xF0,0x1E, // 'A' 40 | 0xFF,0x87,0xFF,0x3F,0xF9,0xC1,0xCE,0x0E,0x70,0x73,0xFF,0x9F,0xF0,0xFF,0xE7,0x07,0xB8,0x3D,0xC1,0xEE,0x0F,0x7F,0xF3,0xFF,0x9F,0xF0, // 'B' 41 | 0x07,0xE0,0xFF,0x8F,0xFC,0xF8,0x47,0x80,0x38,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x1C,0x00,0xE0,0x07,0xC1,0x1F,0xF8,0x7F,0xC1,0xFC, // 'C' 42 | 0xFF,0x03,0xFF,0x0F,0xFE,0x38,0x7C,0xE0,0xF3,0x81,0xCE,0x07,0xB8,0x1E,0xE0,0x7B,0x81,0xEE,0x07,0x38,0x3C,0xE1,0xF3,0xFF,0x8F,0xFC,0x3F,0xC0, // 'D' 43 | 0xFF,0xBF,0xEF,0xFB,0x80,0xE0,0x38,0x0F,0xF3,0xFC,0xFF,0x38,0x0E,0x03,0x80,0xE0,0x3F,0xEF,0xFB,0xFE, // 'E' 44 | 0xFF,0xBF,0xEF,0xFB,0x80,0xE0,0x38,0x0E,0x03,0xFE,0xFF,0xBF,0xEE,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80, // 'F' 45 | 0x07,0xF0,0x7F,0xE3,0xFF,0x9F,0x04,0x78,0x01,0xC0,0x0F,0x00,0x3C,0x7E,0xF1,0xFB,0xC7,0xE7,0x03,0x9E,0x0E,0x7C,0x38,0xFF,0xE1,0xFF,0x81,0xFC, // 'G' 46 | 0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEF,0xFF,0xBF,0xFE,0xFF,0xFB,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E, // 'H' 47 | 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, // 'I' 48 | 0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0xFE,0xFC,0xF8, // 'J' 49 | 0xE0,0x7B,0x83,0xCE,0x1E,0x38,0xF0,0xE3,0x83,0x9C,0x0E,0xF0,0x3F,0x80,0xFF,0x03,0xDE,0x0E,0x38,0x38,0xF0,0xE1,0xE3,0x83,0x8E,0x0F,0x38,0x1E, // 'K' 50 | 0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x3F,0xEF,0xFB,0xFE, // 'L' 51 | 0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xF0,0x7E,0xFC,0x1F,0xBF,0x06,0xEE,0xE3,0xBB,0xB8,0xEE,0xEE,0x33,0xB9,0x9C,0xEE,0x77,0x3B,0x9D,0x8E,0xE3,0xE3,0xB8,0xF8,0xEE,0x3C,0x3B,0x87,0x0E, // 'M' 52 | 0xF0,0x1D,0xF0,0x3B,0xF0,0x77,0xE0,0xEF,0xE1,0xDD,0xC3,0xBB,0xC7,0x73,0xCE,0xE7,0x9D,0xC7,0xBB,0x87,0x77,0x0F,0xEE,0x0F,0xDC,0x1F,0xB8,0x1F,0x70,0x3E, // 'N' 53 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x0F,0x87,0xC7,0x81,0xE3,0x80,0x73,0xC0,0x3D,0xE0,0x1E,0xF0,0x0F,0x78,0x07,0x9C,0x03,0x8F,0x03,0xC7,0xC3,0xE1,0xFF,0xE0,0x7F,0xE0,0x0F,0xC0, // 'O' 54 | 0xFF,0x0F,0xFC,0xFF,0xEE,0x1E,0xE0,0xEE,0x0E,0xE1,0xEF,0xFC,0xFF,0xCF,0xF0,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00, // 'P' 55 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x0F,0x87,0xC7,0x81,0xE3,0x80,0x73,0xC0,0x3D,0xE0,0x1E,0xF0,0x0F,0x78,0x07,0x9C,0x03,0x8F,0x03,0xC7,0xC3,0xE1,0xFF,0xE0,0x7F,0xE0,0x0F,0xE0,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x03,0xC0, // 'Q' 56 | 0xFF,0x03,0xFF,0x0F,0xFE,0x38,0x78,0xE0,0xE3,0x83,0x8E,0x1E,0x3F,0xF0,0xFF,0x83,0xFC,0x0E,0x38,0x38,0xF0,0xE1,0xC3,0x83,0x8E,0x0F,0x38,0x1E, // 'R' 57 | 0x1F,0x0F,0xF9,0xFF,0x78,0x4E,0x01,0xE0,0x1F,0x03,0xF8,0x1F,0x80,0xF8,0x0F,0x00,0xEC,0x3D,0xFF,0xBF,0xE3,0xF0, // 'S' 58 | 0xFF,0xEF,0xFE,0xFF,0xE0,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0, // 'T' 59 | 0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEE,0x03,0xBC,0x1E,0xF0,0x79,0xFF,0xC3,0xFE,0x07,0xF0, // 'U' 60 | 0xF0,0x3D,0xE0,0x79,0xC0,0xE3,0x81,0xC7,0x87,0x87,0x0E,0x0E,0x1C,0x1E,0x78,0x1C,0xE0,0x39,0xC0,0x73,0x80,0x7E,0x00,0xFC,0x01,0xF8,0x01,0xE0,0x03,0xC0, // 'V' 61 | 0xE0,0x70,0x3B,0xC1,0xC1,0xE7,0x0F,0x87,0x1C,0x3E,0x1C,0x70,0xD8,0x71,0xE3,0x61,0xC3,0x9D,0xCE,0x0E,0x77,0x38,0x39,0xDC,0xE0,0xE6,0x33,0x81,0xF8,0xFC,0x07,0xE3,0xF0,0x1F,0x8F,0xC0,0x7C,0x1F,0x00,0xF0,0x78,0x03,0xC1,0xE0, // 'W' 62 | 0x70,0x1C,0x78,0x3C,0x3C,0x38,0x1C,0x70,0x1E,0xF0,0x0E,0xE0,0x07,0xC0,0x07,0xC0,0x07,0xC0,0x0F,0xE0,0x0E,0xE0,0x1C,0xF0,0x3C,0x78,0x38,0x38,0x78,0x3C,0xF0,0x1E, // 'X' 63 | 0xF0,0x3C,0xE0,0x71,0xE1,0xE1,0xC3,0x83,0xCE,0x03,0x9C,0x03,0xF0,0x07,0xE0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0, // 'Y' 64 | 0xFF,0xEF,0xFE,0xFF,0xE0,0x1C,0x03,0xC0,0x78,0x07,0x00,0xF0,0x1E,0x01,0xC0,0x38,0x07,0x80,0xF0,0x0F,0xFE,0xFF,0xEF,0xFE, // 'Z' 65 | 0xFB,0xEE,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0xEF,0x80, // '[' 66 | 0xE0,0x1C,0x07,0x01,0xC0,0x38,0x0E,0x03,0x80,0x70,0x1C,0x03,0x80,0xE0,0x38,0x07,0x01,0xC0,0x70,0x0E, // '\' 67 | 0xFB,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x3B,0xEF,0x80, // ']' 68 | 0x06,0x00,0x70,0x03,0xC0,0x3E,0x01,0xB8,0x1C,0xC0,0xC7,0x0E,0x1C,0x60,0x67,0x03,0x80, // '^' 69 | 0xFF,0xBF,0xE0, // '_' 70 | 0x70,0x38,0x1C,0x0C, // '`' 71 | 0x1F,0x0F,0xF9,0xFF,0x10,0xE0,0x1C,0x7F,0x9F,0xF7,0x8E,0xE1,0xDF,0xFB,0xFB,0x3E,0x60, // 'a' 72 | 0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0xF8,0xFF,0xCF,0xFC,0xF1,0xEE,0x1E,0xE0,0xEE,0x0E,0xE1,0xEF,0x1E,0xFF,0xCF,0xFC,0xCF,0x80, // 'b' 73 | 0x1F,0x0F,0xE7,0xFB,0xC0,0xF0,0x38,0x0E,0x03,0xC0,0xF0,0x9F,0xE7,0xF8,0x7C, // 'c' 74 | 0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE3,0xEE,0x7F,0xE7,0xFE,0xF1,0xEF,0x0E,0xE0,0xEE,0x0E,0xF0,0xEF,0x1E,0x7F,0xE7,0xFE,0x3E,0x60, // 'd' 75 | 0x1F,0x03,0xFC,0x71,0xCF,0x0E,0xE0,0xEF,0xFE,0xFF,0xEE,0x00,0xF0,0x07,0xFC,0x3F,0xC1,0xF8, // 'e' 76 | 0x1F,0x8F,0xE3,0xF1,0xE0,0x78,0x1F,0xCF,0xF3,0xFC,0x78,0x1E,0x07,0x81,0xE0,0x78,0x1E,0x07,0x81,0xE0,0x78,0x00, // 'f' 77 | 0x1F,0xF1,0xFF,0x9C,0x70,0xE3,0x87,0x1C,0x3C,0xE0,0xFF,0x03,0xE0,0x30,0x03,0xFC,0x0F,0xF8,0xFF,0xCE,0x0F,0x70,0x3B,0x83,0x8F,0xF8,0x3F,0x80, // 'g' 78 | 0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xDF,0x3F,0xF7,0xFE,0xF1,0xDC,0x3B,0x87,0x70,0xEE,0x1D,0xC3,0xB8,0x77,0x0E,0xE1,0xC0, // 'h' 79 | 0xEE,0xE0,0x0E,0xEE,0xEE,0xEE,0xEE,0xEE,0xE0, // 'i' 80 | 0x1C,0x38,0x70,0x00,0x03,0x87,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0xF7,0xEF,0x9E,0x00, // 'j' 81 | 0xE0,0x07,0x00,0x38,0x01,0xC0,0x0E,0x00,0x70,0x73,0x87,0x1C,0x70,0xE7,0x07,0x70,0x3F,0x81,0xFE,0x0F,0x70,0x71,0xC3,0x8F,0x1C,0x3C,0xE0,0xF0, // 'k' 82 | 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xE0, // 'l' 83 | 0xCF,0x8F,0x9F,0xFB,0xFB,0xFF,0xFF,0x78,0xF8,0xEE,0x1E,0x1D,0xC3,0xC3,0xB8,0x78,0x77,0x0F,0x0E,0xE1,0xE1,0xDC,0x3C,0x3B,0x87,0x87,0x70,0xF0,0xE0, // 'm' 84 | 0xCF,0x9F,0xFB,0xFF,0x78,0xEE,0x1D,0xC3,0xB8,0x77,0x0E,0xE1,0xDC,0x3B,0x87,0x70,0xE0, // 'n' 85 | 0x1F,0x81,0xFE,0x1F,0xF9,0xE1,0xEF,0x0F,0x70,0x3B,0x81,0xDE,0x1E,0xF0,0xF3,0xFF,0x0F,0xF0,0x3F,0x00, // 'o' 86 | 0xEF,0x8F,0xFC,0xFF,0xCF,0x1E,0xE1,0xEE,0x0E,0xE0,0xEE,0x1E,0xF1,0xEF,0xFC,0xFF,0xCE,0xF0,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x00, // 'p' 87 | 0x3E,0xE7,0xFE,0x7F,0xEF,0x1E,0xF0,0xEE,0x0E,0xE0,0xEF,0x0E,0xF1,0xE7,0xFE,0x7F,0xE3,0xEE,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0, // 'q' 88 | 0xC7,0x7F,0x3F,0x9E,0x0E,0x07,0x03,0x81,0xC0,0xE0,0x70,0x38,0x1C,0x00, // 'r' 89 | 0x3F,0x1F,0xEF,0xFB,0x84,0xF0,0x1F,0x81,0xF8,0x1E,0x83,0xBF,0xEF,0xF1,0xF8, // 's' 90 | 0x30,0x18,0x0C,0x0F,0xEF,0xF7,0xF9,0xC0,0xE0,0x70,0x38,0x1C,0x0F,0x07,0xF1,0xF8,0x7C, // 't' 91 | 0xE1,0xDC,0x3B,0x87,0x70,0xEE,0x1D,0xC3,0xB8,0x77,0x0E,0xE3,0xDF,0xFB,0xFF,0x3E,0x60, // 'u' 92 | 0xF0,0x79,0xC1,0xC7,0x07,0x1E,0x3C,0x38,0xE0,0xE3,0x81,0xDC,0x07,0x70,0x1D,0xC0,0x3E,0x00,0xF8,0x01,0xC0, // 'v' 93 | 0xF0,0xE1,0xE7,0x1F,0x1C,0x71,0xB1,0xC7,0x1B,0x1C,0x39,0xB3,0x83,0xBB,0xB8,0x3B,0x3B,0x83,0xB1,0xB8,0x1B,0x1B,0x01,0xF1,0xF0,0x1F,0x1F,0x00,0xE0,0xE0, // 'w' 94 | 0x70,0x71,0xE3,0xC3,0xDE,0x07,0x70,0x1F,0xC0,0x3E,0x00,0xF8,0x07,0xF0,0x3D,0xC0,0xE3,0x87,0x8F,0x3C,0x1E, // 'x' 95 | 0xF0,0x79,0xC1,0xC7,0x07,0x1E,0x3C,0x38,0xE0,0xF3,0x81,0xDC,0x07,0x70,0x0D,0xC0,0x3E,0x00,0xF8,0x01,0xC0,0x07,0x00,0x3C,0x07,0xE0,0x1F,0x00,0x78,0x00, // 'y' 96 | 0xFF,0xBF,0xEF,0xF8,0x1C,0x0E,0x07,0x83,0xC1,0xE0,0x70,0x3F,0xEF,0xFB,0xFE, // 'z' 97 | 0x07,0x07,0x87,0x83,0x81,0xC0,0xE0,0x70,0x38,0xFC,0x78,0x3F,0x03,0x81,0xC0,0xE0,0x70,0x38,0x1E,0x07,0x81,0xC0, // '{' 98 | 0xDB,0x6D,0xB6,0xDB,0x6D,0xB6,0xDB,0x6D,0x80, // '|' 99 | 0xE0,0x78,0x1E,0x07,0x03,0x81,0xC0,0xE0,0x70,0x3F,0x07,0x8F,0xC7,0x03,0x81,0xC0,0xE0,0x70,0x78,0x78,0x38,0x00 // '}' 100 | }; 101 | const GFXglyph Open_Sans_Bold_22Glyphs[] PROGMEM = { 102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset 103 | { 0, 1, 1, 7, 0, 0 }, // ' ' 104 | { 1, 5, 16, 7, 1, -16 }, // '!' 105 | { 11, 9, 6, 11, 1, -16 }, // '"' 106 | { 18, 15, 16, 15, 0, -16 }, // '#' 107 | { 48, 12, 18, 14, 1, -17 }, // '$' 108 | { 75, 19, 16, 21, 1, -16 }, // '%' 109 | { 113, 17, 16, 18, 1, -16 }, // '&' 110 | { 147, 4, 6, 7, 1, -16 }, // ''' 111 | { 150, 7, 19, 8, 0, -16 }, // '(' 112 | { 167, 7, 19, 8, 1, -16 }, // ')' 113 | { 184, 11, 10, 13, 1, -17 }, // '*' 114 | { 198, 12, 10, 14, 1, -13 }, // '+' 115 | { 213, 5, 5, 7, 1, -3 }, // ',' 116 | { 217, 6, 3, 8, 1, -7 }, // '-' 117 | { 220, 5, 4, 7, 1, -4 }, // '.' 118 | { 223, 10, 16, 10, 0, -16 }, // '/' 119 | { 243, 12, 16, 14, 1, -16 }, // '0' 120 | { 267, 8, 16, 14, 2, -16 }, // '1' 121 | { 283, 12, 16, 14, 1, -16 }, // '2' 122 | { 307, 12, 16, 14, 1, -16 }, // '3' 123 | { 331, 14, 16, 14, 0, -16 }, // '4' 124 | { 359, 12, 16, 14, 1, -16 }, // '5' 125 | { 383, 12, 16, 14, 1, -16 }, // '6' 126 | { 407, 12, 16, 14, 1, -16 }, // '7' 127 | { 431, 12, 16, 14, 1, -16 }, // '8' 128 | { 455, 12, 16, 14, 1, -16 }, // '9' 129 | { 479, 5, 12, 7, 1, -12 }, // ':' 130 | { 487, 5, 14, 7, 1, -12 }, // ';' 131 | { 496, 12, 12, 14, 1, -14 }, // '<' 132 | { 514, 12, 7, 14, 1, -11 }, // '=' 133 | { 525, 12, 12, 14, 1, -14 }, // '>' 134 | { 543, 11, 16, 12, 0, -16 }, // '?' 135 | { 565, 19, 18, 21, 1, -16 }, // '@' 136 | { 608, 16, 16, 16, 0, -16 }, // 'A' 137 | { 640, 13, 16, 16, 2, -16 }, // 'B' 138 | { 666, 13, 16, 15, 1, -16 }, // 'C' 139 | { 692, 14, 16, 17, 2, -16 }, // 'D' 140 | { 720, 10, 16, 13, 2, -16 }, // 'E' 141 | { 740, 10, 16, 13, 2, -16 }, // 'F' 142 | { 760, 14, 16, 17, 1, -16 }, // 'G' 143 | { 788, 14, 16, 18, 2, -16 }, // 'H' 144 | { 816, 4, 16, 8, 2, -16 }, // 'I' 145 | { 824, 8, 20, 8, -2, -16 }, // 'J' 146 | { 844, 14, 16, 16, 2, -16 }, // 'K' 147 | { 872, 10, 16, 13, 2, -16 }, // 'L' 148 | { 892, 18, 16, 22, 2, -16 }, // 'M' 149 | { 928, 15, 16, 19, 2, -16 }, // 'N' 150 | { 958, 17, 16, 19, 1, -16 }, // 'O' 151 | { 992, 12, 16, 15, 2, -16 }, // 'P' 152 | { 1016, 17, 20, 19, 1, -16 }, // 'Q' 153 | { 1059, 14, 16, 16, 2, -16 }, // 'R' 154 | { 1087, 11, 16, 13, 1, -16 }, // 'S' 155 | { 1109, 12, 16, 14, 1, -16 }, // 'T' 156 | { 1133, 14, 16, 18, 2, -16 }, // 'U' 157 | { 1161, 15, 16, 15, 0, -16 }, // 'V' 158 | { 1191, 22, 16, 22, 0, -16 }, // 'W' 159 | { 1235, 16, 16, 16, 0, -16 }, // 'X' 160 | { 1267, 15, 16, 15, 0, -16 }, // 'Y' 161 | { 1297, 12, 16, 14, 1, -16 }, // 'Z' 162 | { 1321, 6, 19, 8, 1, -16 }, // '[' 163 | { 1336, 10, 16, 10, 0, -16 }, // '\' 164 | { 1356, 6, 19, 8, 1, -16 }, // ']' 165 | { 1371, 13, 10, 13, 0, -16 }, // '^' 166 | { 1388, 10, 2, 10, 0, 1 }, // '_' 167 | { 1391, 8, 4, 14, 3, -17 }, // '`' 168 | { 1395, 11, 12, 14, 1, -12 }, // 'a' 169 | { 1412, 12, 17, 15, 2, -17 }, // 'b' 170 | { 1438, 10, 12, 12, 1, -12 }, // 'c' 171 | { 1453, 12, 17, 15, 1, -17 }, // 'd' 172 | { 1479, 12, 12, 14, 1, -12 }, // 'e' 173 | { 1497, 10, 17, 10, 1, -17 }, // 'f' 174 | { 1519, 13, 17, 13, 0, -12 }, // 'g' 175 | { 1547, 11, 17, 15, 2, -17 }, // 'h' 176 | { 1571, 4, 17, 8, 2, -17 }, // 'i' 177 | { 1580, 7, 22, 8, -1, -17 }, // 'j' 178 | { 1600, 13, 17, 15, 2, -17 }, // 'k' 179 | { 1628, 4, 17, 8, 2, -17 }, // 'l' 180 | { 1637, 19, 12, 23, 2, -12 }, // 'm' 181 | { 1666, 11, 12, 15, 2, -12 }, // 'n' 182 | { 1683, 13, 12, 15, 1, -12 }, // 'o' 183 | { 1703, 12, 17, 15, 2, -12 }, // 'p' 184 | { 1729, 12, 17, 15, 1, -12 }, // 'q' 185 | { 1755, 9, 12, 11, 2, -12 }, // 'r' 186 | { 1769, 10, 12, 12, 1, -12 }, // 's' 187 | { 1784, 9, 15, 11, 1, -15 }, // 't' 188 | { 1801, 11, 12, 15, 2, -12 }, // 'u' 189 | { 1818, 14, 12, 14, 0, -12 }, // 'v' 190 | { 1839, 20, 12, 20, 0, -12 }, // 'w' 191 | { 1869, 14, 12, 14, 0, -12 }, // 'x' 192 | { 1890, 14, 17, 14, 0, -12 }, // 'y' 193 | { 1920, 10, 12, 12, 1, -12 }, // 'z' 194 | { 1935, 9, 19, 10, 0, -16 }, // '{' 195 | { 1957, 3, 22, 13, 5, -17 }, // '|' 196 | { 1966, 9, 19, 10, 1, -16 } // '}' 197 | }; 198 | const GFXfont Open_Sans_Bold_22 PROGMEM = { 199 | (uint8_t *)Open_Sans_Bold_22Bitmaps,(GFXglyph *)Open_Sans_Bold_22Glyphs,0x20, 0x7E, 31}; 200 | 201 | -------------------------------------------------------------------------------- /examples/m5stickc_telegram_bot/Open_Sans_Bold_22.h: -------------------------------------------------------------------------------- 1 | // Created by http://oleddisplay.squix.ch/ Consider a donation 2 | // In case of problems make sure that you are using the font file with the correct version! 3 | const uint8_t Open_Sans_Bold_22Bitmaps[] PROGMEM = { 4 | 5 | // Bitmap Data: 6 | 0x00, // ' ' 7 | 0xF7,0xBD,0xEF,0x39,0xCE,0x73,0x00,0x06,0x7B,0xCC, // '!' 8 | 0xE7,0x31,0x98,0xCC,0x66,0x33,0x18, // '"' 9 | 0x06,0x70,0x0C,0xE0,0x19,0x80,0x73,0x07,0xFF,0xCF,0xFF,0x83,0x38,0x06,0x60,0x1C,0xC1,0xFF,0xF3,0xFF,0xE0,0xCE,0x01,0x98,0x03,0x30,0x0E,0x60,0x1C,0xC0, // '#' 10 | 0x04,0x00,0x40,0x1F,0x87,0xFE,0xFF,0xCE,0x44,0xE4,0x0F,0xC0,0x7F,0x01,0xFC,0x07,0xE0,0x4E,0xC4,0xEF,0xFE,0xFF,0xC7,0xF0,0x04,0x00,0x40, // '$' 11 | 0x78,0x0C,0x1F,0x83,0x83,0xB8,0x60,0x77,0x1C,0x0C,0xE3,0x01,0x9C,0xE0,0x3B,0x99,0xC7,0x77,0x7C,0x7D,0xDD,0xC7,0x33,0xB8,0x0E,0x73,0x01,0x8E,0x60,0x71,0xCC,0x0C,0x3B,0x83,0x83,0xF0,0x60,0x3C, // '%' 12 | 0x1F,0x80,0x1F,0xE0,0x1F,0xF0,0x0E,0x38,0x07,0x1C,0x01,0xFE,0x00,0x7E,0x00,0x7C,0x1C,0x7F,0x9E,0x79,0xEE,0x38,0x7F,0x1C,0x1F,0x0F,0x0F,0x87,0xFF,0xE1,0xFF,0xF8,0x3F,0x3E, // '&' 13 | 0xE6,0x66,0x66, // ''' 14 | 0x1C,0x30,0xE1,0x87,0x0E,0x1C,0x30,0xE1,0xC3,0x83,0x07,0x0E,0x1C,0x18,0x38,0x30,0x70, // '(' 15 | 0xE0,0xC1,0xC1,0x83,0x87,0x0E,0x0C,0x1C,0x38,0x70,0xC3,0x87,0x0E,0x18,0x70,0xC3,0x80, // ')' 16 | 0x0C,0x01,0x80,0x30,0x76,0xEF,0xFC,0xFF,0x07,0x81,0xF8,0x73,0x86,0x60, // '*' 17 | 0x0E,0x00,0xE0,0x0E,0x00,0xE0,0xFF,0xEF,0xFE,0x0E,0x00,0xE0,0x0E,0x00,0xE0, // '+' 18 | 0x77,0xB9,0xCC,0x00, // ',' 19 | 0xFB,0xEF,0x80, // '-' 20 | 0x77,0xBC,0xC0, // '.' 21 | 0x03,0x81,0xC0,0x70,0x1C,0x0E,0x03,0x80,0xE0,0x70,0x1C,0x0E,0x03,0x80,0xE0,0x70,0x1C,0x07,0x03,0x80, // '/' 22 | 0x1F,0x03,0xF8,0x7F,0xCF,0x1E,0xF1,0xEE,0x0E,0xE0,0xEE,0x0E,0xE0,0xEE,0x0E,0xE0,0xEF,0x1E,0xF1,0xE7,0xFC,0x3F,0x81,0xF0, // '0' 23 | 0x0E,0x1E,0x7E,0xFE,0xEE,0x4E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E, // '1' 24 | 0x1F,0x07,0xFC,0xFF,0xC6,0x1E,0x00,0xE0,0x1E,0x01,0xC0,0x3C,0x07,0x80,0xF0,0x1E,0x03,0xC0,0x70,0x0F,0xFE,0xFF,0xEF,0xFE, // '2' 25 | 0x3F,0x0F,0xFC,0xFF,0xC6,0x1E,0x01,0xE0,0x1C,0x01,0xC3,0xF8,0x3F,0x03,0xFC,0x01,0xE0,0x0E,0x81,0xEF,0xFE,0xFF,0xC7,0xF0, // '3' 26 | 0x01,0xE0,0x0F,0x80,0x3E,0x01,0xF8,0x0F,0xE0,0x37,0x81,0xDE,0x0E,0x78,0x31,0xE1,0xC7,0x8F,0xFF,0xBF,0xFE,0xFF,0xF8,0x07,0x80,0x1E,0x00,0x78, // '4' 27 | 0x7F,0xC7,0xFC,0x7F,0xC7,0x00,0x70,0x07,0x00,0x7F,0x07,0xFC,0xFF,0xE0,0x1E,0x00,0xE0,0x0E,0x81,0xEF,0xFC,0xFF,0x87,0xF0, // '5' 28 | 0x07,0xC1,0xFC,0x3F,0xC7,0x80,0x70,0x0E,0x00,0xEF,0x8F,0xFC,0xFF,0xEF,0x1E,0xE0,0xEE,0x0E,0xF1,0xE7,0xFE,0x3F,0xC1,0xF0, // '6' 29 | 0xFF,0xEF,0xFE,0xFF,0xE0,0x0E,0x01,0xC0,0x1C,0x03,0x80,0x38,0x07,0x00,0x70,0x0F,0x00,0xE0,0x1E,0x01,0xC0,0x3C,0x03,0x80, // '7' 30 | 0x1F,0x07,0xFC,0x71,0xCE,0x0E,0xF1,0xE7,0x1C,0x7F,0x81,0xF0,0x3F,0x87,0x3C,0xE0,0xEE,0x0E,0xE0,0xEF,0x1E,0x7F,0xC3,0xF0, // '8' 31 | 0x1F,0x07,0xF8,0xFF,0xCF,0x1E,0xE0,0xEE,0x0E,0xF1,0xEF,0xFE,0x7F,0xE3,0xEE,0x00,0xE0,0x1C,0x03,0xC7,0xF8,0x7F,0x07,0xC0, // '9' 32 | 0x77,0xBC,0xC0,0x00,0x00,0x77,0xBC,0xC0, // ':' 33 | 0x77,0xBC,0xC0,0x00,0x00,0x03,0xBD,0xCE,0x60, // ';' 34 | 0x00,0x20,0x0E,0x03,0xE0,0xF8,0x3E,0x0F,0x00,0xF8,0x07,0xE0,0x0F,0xC0,0x3E,0x00,0xE0,0x00, // '<' 35 | 0xFF,0xEF,0xFE,0x00,0x00,0x00,0x00,0x0F,0xFE,0xFF,0xE0, // '=' 36 | 0x80,0x0E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x1E,0x03,0xE0,0xFC,0x7E,0x0F,0x80,0xE0,0x00,0x00, // '>' 37 | 0x3F,0x1F,0xF9,0xFF,0x30,0xE0,0x1C,0x03,0x81,0xE0,0x70,0x1C,0x03,0x80,0x00,0x00,0x01,0xC0,0x3C,0x07,0x80,0xE0, // '?' 38 | 0x03,0xF8,0x01,0xFF,0xC0,0x78,0x3C,0x1C,0x01,0xC7,0x1F,0x98,0xC7,0xF3,0x99,0xC6,0x77,0x70,0xC6,0xEE,0x18,0xDD,0xC3,0x3B,0xB8,0xE7,0x73,0x1C,0xCE,0x7F,0xF8,0xC7,0x9E,0x1C,0x00,0x01,0xE0,0x60,0x1F,0xFC,0x00,0xFF,0x00, // '@' 39 | 0x07,0xC0,0x07,0xC0,0x06,0xC0,0x0E,0xE0,0x0E,0xE0,0x0E,0xE0,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3F,0xF8,0x3F,0xF8,0x3F,0xF8,0x78,0x3C,0x70,0x1C,0x70,0x1C,0xF0,0x1E, // 'A' 40 | 0xFF,0x87,0xFF,0x3F,0xF9,0xC1,0xCE,0x0E,0x70,0x73,0xFF,0x9F,0xF0,0xFF,0xE7,0x07,0xB8,0x3D,0xC1,0xEE,0x0F,0x7F,0xF3,0xFF,0x9F,0xF0, // 'B' 41 | 0x07,0xE0,0xFF,0x8F,0xFC,0xF8,0x47,0x80,0x38,0x03,0xC0,0x1E,0x00,0xF0,0x07,0x80,0x1C,0x00,0xE0,0x07,0xC1,0x1F,0xF8,0x7F,0xC1,0xFC, // 'C' 42 | 0xFF,0x03,0xFF,0x0F,0xFE,0x38,0x7C,0xE0,0xF3,0x81,0xCE,0x07,0xB8,0x1E,0xE0,0x7B,0x81,0xEE,0x07,0x38,0x3C,0xE1,0xF3,0xFF,0x8F,0xFC,0x3F,0xC0, // 'D' 43 | 0xFF,0xBF,0xEF,0xFB,0x80,0xE0,0x38,0x0F,0xF3,0xFC,0xFF,0x38,0x0E,0x03,0x80,0xE0,0x3F,0xEF,0xFB,0xFE, // 'E' 44 | 0xFF,0xBF,0xEF,0xFB,0x80,0xE0,0x38,0x0E,0x03,0xFE,0xFF,0xBF,0xEE,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80, // 'F' 45 | 0x07,0xF0,0x7F,0xE3,0xFF,0x9F,0x04,0x78,0x01,0xC0,0x0F,0x00,0x3C,0x7E,0xF1,0xFB,0xC7,0xE7,0x03,0x9E,0x0E,0x7C,0x38,0xFF,0xE1,0xFF,0x81,0xFC, // 'G' 46 | 0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEF,0xFF,0xBF,0xFE,0xFF,0xFB,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E, // 'H' 47 | 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, // 'I' 48 | 0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1E,0xFE,0xFC,0xF8, // 'J' 49 | 0xE0,0x7B,0x83,0xCE,0x1E,0x38,0xF0,0xE3,0x83,0x9C,0x0E,0xF0,0x3F,0x80,0xFF,0x03,0xDE,0x0E,0x38,0x38,0xF0,0xE1,0xE3,0x83,0x8E,0x0F,0x38,0x1E, // 'K' 50 | 0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x38,0x0E,0x03,0x80,0xE0,0x3F,0xEF,0xFB,0xFE, // 'L' 51 | 0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xF0,0x7E,0xFC,0x1F,0xBF,0x06,0xEE,0xE3,0xBB,0xB8,0xEE,0xEE,0x33,0xB9,0x9C,0xEE,0x77,0x3B,0x9D,0x8E,0xE3,0xE3,0xB8,0xF8,0xEE,0x3C,0x3B,0x87,0x0E, // 'M' 52 | 0xF0,0x1D,0xF0,0x3B,0xF0,0x77,0xE0,0xEF,0xE1,0xDD,0xC3,0xBB,0xC7,0x73,0xCE,0xE7,0x9D,0xC7,0xBB,0x87,0x77,0x0F,0xEE,0x0F,0xDC,0x1F,0xB8,0x1F,0x70,0x3E, // 'N' 53 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x0F,0x87,0xC7,0x81,0xE3,0x80,0x73,0xC0,0x3D,0xE0,0x1E,0xF0,0x0F,0x78,0x07,0x9C,0x03,0x8F,0x03,0xC7,0xC3,0xE1,0xFF,0xE0,0x7F,0xE0,0x0F,0xC0, // 'O' 54 | 0xFF,0x0F,0xFC,0xFF,0xEE,0x1E,0xE0,0xEE,0x0E,0xE1,0xEF,0xFC,0xFF,0xCF,0xF0,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00, // 'P' 55 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x0F,0x87,0xC7,0x81,0xE3,0x80,0x73,0xC0,0x3D,0xE0,0x1E,0xF0,0x0F,0x78,0x07,0x9C,0x03,0x8F,0x03,0xC7,0xC3,0xE1,0xFF,0xE0,0x7F,0xE0,0x0F,0xE0,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x03,0xC0, // 'Q' 56 | 0xFF,0x03,0xFF,0x0F,0xFE,0x38,0x78,0xE0,0xE3,0x83,0x8E,0x1E,0x3F,0xF0,0xFF,0x83,0xFC,0x0E,0x38,0x38,0xF0,0xE1,0xC3,0x83,0x8E,0x0F,0x38,0x1E, // 'R' 57 | 0x1F,0x0F,0xF9,0xFF,0x78,0x4E,0x01,0xE0,0x1F,0x03,0xF8,0x1F,0x80,0xF8,0x0F,0x00,0xEC,0x3D,0xFF,0xBF,0xE3,0xF0, // 'S' 58 | 0xFF,0xEF,0xFE,0xFF,0xE0,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0, // 'T' 59 | 0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEE,0x03,0xB8,0x0E,0xE0,0x3B,0x80,0xEE,0x03,0xBC,0x1E,0xF0,0x79,0xFF,0xC3,0xFE,0x07,0xF0, // 'U' 60 | 0xF0,0x3D,0xE0,0x79,0xC0,0xE3,0x81,0xC7,0x87,0x87,0x0E,0x0E,0x1C,0x1E,0x78,0x1C,0xE0,0x39,0xC0,0x73,0x80,0x7E,0x00,0xFC,0x01,0xF8,0x01,0xE0,0x03,0xC0, // 'V' 61 | 0xE0,0x70,0x3B,0xC1,0xC1,0xE7,0x0F,0x87,0x1C,0x3E,0x1C,0x70,0xD8,0x71,0xE3,0x61,0xC3,0x9D,0xCE,0x0E,0x77,0x38,0x39,0xDC,0xE0,0xE6,0x33,0x81,0xF8,0xFC,0x07,0xE3,0xF0,0x1F,0x8F,0xC0,0x7C,0x1F,0x00,0xF0,0x78,0x03,0xC1,0xE0, // 'W' 62 | 0x70,0x1C,0x78,0x3C,0x3C,0x38,0x1C,0x70,0x1E,0xF0,0x0E,0xE0,0x07,0xC0,0x07,0xC0,0x07,0xC0,0x0F,0xE0,0x0E,0xE0,0x1C,0xF0,0x3C,0x78,0x38,0x38,0x78,0x3C,0xF0,0x1E, // 'X' 63 | 0xF0,0x3C,0xE0,0x71,0xE1,0xE1,0xC3,0x83,0xCE,0x03,0x9C,0x03,0xF0,0x07,0xE0,0x07,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x78,0x00,0xF0,0x01,0xE0,0x03,0xC0, // 'Y' 64 | 0xFF,0xEF,0xFE,0xFF,0xE0,0x1C,0x03,0xC0,0x78,0x07,0x00,0xF0,0x1E,0x01,0xC0,0x38,0x07,0x80,0xF0,0x0F,0xFE,0xFF,0xEF,0xFE, // 'Z' 65 | 0xFB,0xEE,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0xEF,0x80, // '[' 66 | 0xE0,0x1C,0x07,0x01,0xC0,0x38,0x0E,0x03,0x80,0x70,0x1C,0x03,0x80,0xE0,0x38,0x07,0x01,0xC0,0x70,0x0E, // '\' 67 | 0xFB,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x38,0xE3,0x8E,0x3B,0xEF,0x80, // ']' 68 | 0x06,0x00,0x70,0x03,0xC0,0x3E,0x01,0xB8,0x1C,0xC0,0xC7,0x0E,0x1C,0x60,0x67,0x03,0x80, // '^' 69 | 0xFF,0xBF,0xE0, // '_' 70 | 0x70,0x38,0x1C,0x0C, // '`' 71 | 0x1F,0x0F,0xF9,0xFF,0x10,0xE0,0x1C,0x7F,0x9F,0xF7,0x8E,0xE1,0xDF,0xFB,0xFB,0x3E,0x60, // 'a' 72 | 0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0xF8,0xFF,0xCF,0xFC,0xF1,0xEE,0x1E,0xE0,0xEE,0x0E,0xE1,0xEF,0x1E,0xFF,0xCF,0xFC,0xCF,0x80, // 'b' 73 | 0x1F,0x0F,0xE7,0xFB,0xC0,0xF0,0x38,0x0E,0x03,0xC0,0xF0,0x9F,0xE7,0xF8,0x7C, // 'c' 74 | 0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE3,0xEE,0x7F,0xE7,0xFE,0xF1,0xEF,0x0E,0xE0,0xEE,0x0E,0xF0,0xEF,0x1E,0x7F,0xE7,0xFE,0x3E,0x60, // 'd' 75 | 0x1F,0x03,0xFC,0x71,0xCF,0x0E,0xE0,0xEF,0xFE,0xFF,0xEE,0x00,0xF0,0x07,0xFC,0x3F,0xC1,0xF8, // 'e' 76 | 0x1F,0x8F,0xE3,0xF1,0xE0,0x78,0x1F,0xCF,0xF3,0xFC,0x78,0x1E,0x07,0x81,0xE0,0x78,0x1E,0x07,0x81,0xE0,0x78,0x00, // 'f' 77 | 0x1F,0xF1,0xFF,0x9C,0x70,0xE3,0x87,0x1C,0x3C,0xE0,0xFF,0x03,0xE0,0x30,0x03,0xFC,0x0F,0xF8,0xFF,0xCE,0x0F,0x70,0x3B,0x83,0x8F,0xF8,0x3F,0x80, // 'g' 78 | 0xE0,0x1C,0x03,0x80,0x70,0x0E,0x01,0xDF,0x3F,0xF7,0xFE,0xF1,0xDC,0x3B,0x87,0x70,0xEE,0x1D,0xC3,0xB8,0x77,0x0E,0xE1,0xC0, // 'h' 79 | 0xEE,0xE0,0x0E,0xEE,0xEE,0xEE,0xEE,0xEE,0xE0, // 'i' 80 | 0x1C,0x38,0x70,0x00,0x03,0x87,0x0E,0x1C,0x38,0x70,0xE1,0xC3,0x87,0x0E,0x1C,0x38,0xF7,0xEF,0x9E,0x00, // 'j' 81 | 0xE0,0x07,0x00,0x38,0x01,0xC0,0x0E,0x00,0x70,0x73,0x87,0x1C,0x70,0xE7,0x07,0x70,0x3F,0x81,0xFE,0x0F,0x70,0x71,0xC3,0x8F,0x1C,0x3C,0xE0,0xF0, // 'k' 82 | 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xE0, // 'l' 83 | 0xCF,0x8F,0x9F,0xFB,0xFB,0xFF,0xFF,0x78,0xF8,0xEE,0x1E,0x1D,0xC3,0xC3,0xB8,0x78,0x77,0x0F,0x0E,0xE1,0xE1,0xDC,0x3C,0x3B,0x87,0x87,0x70,0xF0,0xE0, // 'm' 84 | 0xCF,0x9F,0xFB,0xFF,0x78,0xEE,0x1D,0xC3,0xB8,0x77,0x0E,0xE1,0xDC,0x3B,0x87,0x70,0xE0, // 'n' 85 | 0x1F,0x81,0xFE,0x1F,0xF9,0xE1,0xEF,0x0F,0x70,0x3B,0x81,0xDE,0x1E,0xF0,0xF3,0xFF,0x0F,0xF0,0x3F,0x00, // 'o' 86 | 0xEF,0x8F,0xFC,0xFF,0xCF,0x1E,0xE1,0xEE,0x0E,0xE0,0xEE,0x1E,0xF1,0xEF,0xFC,0xFF,0xCE,0xF0,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0,0x00, // 'p' 87 | 0x3E,0xE7,0xFE,0x7F,0xEF,0x1E,0xF0,0xEE,0x0E,0xE0,0xEF,0x0E,0xF1,0xE7,0xFE,0x7F,0xE3,0xEE,0x00,0xE0,0x0E,0x00,0xE0,0x0E,0x00,0xE0, // 'q' 88 | 0xC7,0x7F,0x3F,0x9E,0x0E,0x07,0x03,0x81,0xC0,0xE0,0x70,0x38,0x1C,0x00, // 'r' 89 | 0x3F,0x1F,0xEF,0xFB,0x84,0xF0,0x1F,0x81,0xF8,0x1E,0x83,0xBF,0xEF,0xF1,0xF8, // 's' 90 | 0x30,0x18,0x0C,0x0F,0xEF,0xF7,0xF9,0xC0,0xE0,0x70,0x38,0x1C,0x0F,0x07,0xF1,0xF8,0x7C, // 't' 91 | 0xE1,0xDC,0x3B,0x87,0x70,0xEE,0x1D,0xC3,0xB8,0x77,0x0E,0xE3,0xDF,0xFB,0xFF,0x3E,0x60, // 'u' 92 | 0xF0,0x79,0xC1,0xC7,0x07,0x1E,0x3C,0x38,0xE0,0xE3,0x81,0xDC,0x07,0x70,0x1D,0xC0,0x3E,0x00,0xF8,0x01,0xC0, // 'v' 93 | 0xF0,0xE1,0xE7,0x1F,0x1C,0x71,0xB1,0xC7,0x1B,0x1C,0x39,0xB3,0x83,0xBB,0xB8,0x3B,0x3B,0x83,0xB1,0xB8,0x1B,0x1B,0x01,0xF1,0xF0,0x1F,0x1F,0x00,0xE0,0xE0, // 'w' 94 | 0x70,0x71,0xE3,0xC3,0xDE,0x07,0x70,0x1F,0xC0,0x3E,0x00,0xF8,0x07,0xF0,0x3D,0xC0,0xE3,0x87,0x8F,0x3C,0x1E, // 'x' 95 | 0xF0,0x79,0xC1,0xC7,0x07,0x1E,0x3C,0x38,0xE0,0xF3,0x81,0xDC,0x07,0x70,0x0D,0xC0,0x3E,0x00,0xF8,0x01,0xC0,0x07,0x00,0x3C,0x07,0xE0,0x1F,0x00,0x78,0x00, // 'y' 96 | 0xFF,0xBF,0xEF,0xF8,0x1C,0x0E,0x07,0x83,0xC1,0xE0,0x70,0x3F,0xEF,0xFB,0xFE, // 'z' 97 | 0x07,0x07,0x87,0x83,0x81,0xC0,0xE0,0x70,0x38,0xFC,0x78,0x3F,0x03,0x81,0xC0,0xE0,0x70,0x38,0x1E,0x07,0x81,0xC0, // '{' 98 | 0xDB,0x6D,0xB6,0xDB,0x6D,0xB6,0xDB,0x6D,0x80, // '|' 99 | 0xE0,0x78,0x1E,0x07,0x03,0x81,0xC0,0xE0,0x70,0x3F,0x07,0x8F,0xC7,0x03,0x81,0xC0,0xE0,0x70,0x78,0x78,0x38,0x00 // '}' 100 | }; 101 | const GFXglyph Open_Sans_Bold_22Glyphs[] PROGMEM = { 102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset 103 | { 0, 1, 1, 7, 0, 0 }, // ' ' 104 | { 1, 5, 16, 7, 1, -16 }, // '!' 105 | { 11, 9, 6, 11, 1, -16 }, // '"' 106 | { 18, 15, 16, 15, 0, -16 }, // '#' 107 | { 48, 12, 18, 14, 1, -17 }, // '$' 108 | { 75, 19, 16, 21, 1, -16 }, // '%' 109 | { 113, 17, 16, 18, 1, -16 }, // '&' 110 | { 147, 4, 6, 7, 1, -16 }, // ''' 111 | { 150, 7, 19, 8, 0, -16 }, // '(' 112 | { 167, 7, 19, 8, 1, -16 }, // ')' 113 | { 184, 11, 10, 13, 1, -17 }, // '*' 114 | { 198, 12, 10, 14, 1, -13 }, // '+' 115 | { 213, 5, 5, 7, 1, -3 }, // ',' 116 | { 217, 6, 3, 8, 1, -7 }, // '-' 117 | { 220, 5, 4, 7, 1, -4 }, // '.' 118 | { 223, 10, 16, 10, 0, -16 }, // '/' 119 | { 243, 12, 16, 14, 1, -16 }, // '0' 120 | { 267, 8, 16, 14, 2, -16 }, // '1' 121 | { 283, 12, 16, 14, 1, -16 }, // '2' 122 | { 307, 12, 16, 14, 1, -16 }, // '3' 123 | { 331, 14, 16, 14, 0, -16 }, // '4' 124 | { 359, 12, 16, 14, 1, -16 }, // '5' 125 | { 383, 12, 16, 14, 1, -16 }, // '6' 126 | { 407, 12, 16, 14, 1, -16 }, // '7' 127 | { 431, 12, 16, 14, 1, -16 }, // '8' 128 | { 455, 12, 16, 14, 1, -16 }, // '9' 129 | { 479, 5, 12, 7, 1, -12 }, // ':' 130 | { 487, 5, 14, 7, 1, -12 }, // ';' 131 | { 496, 12, 12, 14, 1, -14 }, // '<' 132 | { 514, 12, 7, 14, 1, -11 }, // '=' 133 | { 525, 12, 12, 14, 1, -14 }, // '>' 134 | { 543, 11, 16, 12, 0, -16 }, // '?' 135 | { 565, 19, 18, 21, 1, -16 }, // '@' 136 | { 608, 16, 16, 16, 0, -16 }, // 'A' 137 | { 640, 13, 16, 16, 2, -16 }, // 'B' 138 | { 666, 13, 16, 15, 1, -16 }, // 'C' 139 | { 692, 14, 16, 17, 2, -16 }, // 'D' 140 | { 720, 10, 16, 13, 2, -16 }, // 'E' 141 | { 740, 10, 16, 13, 2, -16 }, // 'F' 142 | { 760, 14, 16, 17, 1, -16 }, // 'G' 143 | { 788, 14, 16, 18, 2, -16 }, // 'H' 144 | { 816, 4, 16, 8, 2, -16 }, // 'I' 145 | { 824, 8, 20, 8, -2, -16 }, // 'J' 146 | { 844, 14, 16, 16, 2, -16 }, // 'K' 147 | { 872, 10, 16, 13, 2, -16 }, // 'L' 148 | { 892, 18, 16, 22, 2, -16 }, // 'M' 149 | { 928, 15, 16, 19, 2, -16 }, // 'N' 150 | { 958, 17, 16, 19, 1, -16 }, // 'O' 151 | { 992, 12, 16, 15, 2, -16 }, // 'P' 152 | { 1016, 17, 20, 19, 1, -16 }, // 'Q' 153 | { 1059, 14, 16, 16, 2, -16 }, // 'R' 154 | { 1087, 11, 16, 13, 1, -16 }, // 'S' 155 | { 1109, 12, 16, 14, 1, -16 }, // 'T' 156 | { 1133, 14, 16, 18, 2, -16 }, // 'U' 157 | { 1161, 15, 16, 15, 0, -16 }, // 'V' 158 | { 1191, 22, 16, 22, 0, -16 }, // 'W' 159 | { 1235, 16, 16, 16, 0, -16 }, // 'X' 160 | { 1267, 15, 16, 15, 0, -16 }, // 'Y' 161 | { 1297, 12, 16, 14, 1, -16 }, // 'Z' 162 | { 1321, 6, 19, 8, 1, -16 }, // '[' 163 | { 1336, 10, 16, 10, 0, -16 }, // '\' 164 | { 1356, 6, 19, 8, 1, -16 }, // ']' 165 | { 1371, 13, 10, 13, 0, -16 }, // '^' 166 | { 1388, 10, 2, 10, 0, 1 }, // '_' 167 | { 1391, 8, 4, 14, 3, -17 }, // '`' 168 | { 1395, 11, 12, 14, 1, -12 }, // 'a' 169 | { 1412, 12, 17, 15, 2, -17 }, // 'b' 170 | { 1438, 10, 12, 12, 1, -12 }, // 'c' 171 | { 1453, 12, 17, 15, 1, -17 }, // 'd' 172 | { 1479, 12, 12, 14, 1, -12 }, // 'e' 173 | { 1497, 10, 17, 10, 1, -17 }, // 'f' 174 | { 1519, 13, 17, 13, 0, -12 }, // 'g' 175 | { 1547, 11, 17, 15, 2, -17 }, // 'h' 176 | { 1571, 4, 17, 8, 2, -17 }, // 'i' 177 | { 1580, 7, 22, 8, -1, -17 }, // 'j' 178 | { 1600, 13, 17, 15, 2, -17 }, // 'k' 179 | { 1628, 4, 17, 8, 2, -17 }, // 'l' 180 | { 1637, 19, 12, 23, 2, -12 }, // 'm' 181 | { 1666, 11, 12, 15, 2, -12 }, // 'n' 182 | { 1683, 13, 12, 15, 1, -12 }, // 'o' 183 | { 1703, 12, 17, 15, 2, -12 }, // 'p' 184 | { 1729, 12, 17, 15, 1, -12 }, // 'q' 185 | { 1755, 9, 12, 11, 2, -12 }, // 'r' 186 | { 1769, 10, 12, 12, 1, -12 }, // 's' 187 | { 1784, 9, 15, 11, 1, -15 }, // 't' 188 | { 1801, 11, 12, 15, 2, -12 }, // 'u' 189 | { 1818, 14, 12, 14, 0, -12 }, // 'v' 190 | { 1839, 20, 12, 20, 0, -12 }, // 'w' 191 | { 1869, 14, 12, 14, 0, -12 }, // 'x' 192 | { 1890, 14, 17, 14, 0, -12 }, // 'y' 193 | { 1920, 10, 12, 12, 1, -12 }, // 'z' 194 | { 1935, 9, 19, 10, 0, -16 }, // '{' 195 | { 1957, 3, 22, 13, 5, -17 }, // '|' 196 | { 1966, 9, 19, 10, 1, -16 } // '}' 197 | }; 198 | const GFXfont Open_Sans_Bold_22 PROGMEM = { 199 | (uint8_t *)Open_Sans_Bold_22Bitmaps,(GFXglyph *)Open_Sans_Bold_22Glyphs,0x20, 0x7E, 31}; 200 | 201 | -------------------------------------------------------------------------------- /examples/custom_font/FreeSerif12pt7b.h: -------------------------------------------------------------------------------- 1 | const uint8_t FreeSerif12pt7bBitmaps[] PROGMEM = { 2 | 0xFF, 0xFE, 0xA8, 0x3F, 0xCF, 0x3C, 0xF3, 0x8A, 0x20, 0x0C, 0x40, 0xC4, 3 | 0x08, 0x40, 0x8C, 0x08, 0xC7, 0xFF, 0x18, 0x81, 0x88, 0x10, 0x81, 0x08, 4 | 0xFF, 0xE1, 0x18, 0x31, 0x03, 0x10, 0x31, 0x02, 0x10, 0x04, 0x07, 0xC6, 5 | 0x5B, 0x12, 0xC4, 0xB1, 0x0F, 0x41, 0xF0, 0x1E, 0x01, 0xE0, 0x58, 0x13, 6 | 0x84, 0xE1, 0x3C, 0x4F, 0x96, 0x3F, 0x01, 0x00, 0x00, 0x04, 0x03, 0x83, 7 | 0x03, 0x9F, 0x81, 0xC2, 0x20, 0x60, 0x90, 0x38, 0x24, 0x0C, 0x12, 0x03, 8 | 0x0D, 0x00, 0xC6, 0x47, 0x9E, 0x23, 0x10, 0x09, 0x84, 0x04, 0xE1, 0x03, 9 | 0x30, 0x40, 0x8C, 0x20, 0x43, 0x08, 0x10, 0xC4, 0x08, 0x1E, 0x00, 0x03, 10 | 0xC0, 0x02, 0x30, 0x03, 0x08, 0x01, 0x84, 0x00, 0xC4, 0x00, 0x7C, 0xF8, 11 | 0x1C, 0x38, 0x1E, 0x08, 0x33, 0x0C, 0x31, 0xC4, 0x10, 0x74, 0x18, 0x3A, 12 | 0x0C, 0x0E, 0x07, 0x03, 0x83, 0xC3, 0xE2, 0x7E, 0x3E, 0xFF, 0xA0, 0x04, 13 | 0x21, 0x08, 0x61, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC1, 0x04, 0x18, 0x20, 14 | 0x40, 0x81, 0x81, 0x02, 0x04, 0x18, 0x20, 0x83, 0x0C, 0x30, 0xC3, 0x0C, 15 | 0x30, 0x86, 0x10, 0x84, 0x20, 0x30, 0xB3, 0xD7, 0x54, 0x38, 0x7C, 0xD3, 16 | 0x30, 0x30, 0x10, 0x04, 0x00, 0x80, 0x10, 0x02, 0x00, 0x41, 0xFF, 0xC1, 17 | 0x00, 0x20, 0x04, 0x00, 0x80, 0x10, 0x00, 0xDF, 0x95, 0x00, 0xFC, 0xFC, 18 | 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C, 0x10, 0x60, 0xC1, 0x06, 0x0C, 19 | 0x10, 0x60, 0xC0, 0x1E, 0x0C, 0xC6, 0x19, 0x86, 0xC0, 0xB0, 0x3C, 0x0F, 20 | 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xD8, 0x66, 0x18, 0xCC, 0x1E, 21 | 0x00, 0x11, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 22 | 0x0C, 0xFC, 0x1E, 0x18, 0xC4, 0x1A, 0x06, 0x01, 0x80, 0x60, 0x10, 0x0C, 23 | 0x02, 0x01, 0x00, 0xC0, 0x60, 0x30, 0x18, 0x1F, 0xF8, 0x1E, 0x18, 0xE8, 24 | 0x18, 0x06, 0x01, 0x00, 0x80, 0xF0, 0x7E, 0x03, 0xC0, 0x70, 0x0C, 0x03, 25 | 0x00, 0xC0, 0x6E, 0x11, 0xF8, 0x01, 0x00, 0xC0, 0x70, 0x2C, 0x0B, 0x04, 26 | 0xC2, 0x30, 0x8C, 0x43, 0x20, 0xC8, 0x33, 0xFF, 0x03, 0x00, 0xC0, 0x30, 27 | 0x0C, 0x00, 0x03, 0xF1, 0x00, 0x40, 0x18, 0x0F, 0x80, 0xF8, 0x0E, 0x01, 28 | 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x20, 0x1B, 0x8C, 0x7C, 0x00, 0x01, 29 | 0xC3, 0xC1, 0xC0, 0xC0, 0x70, 0x18, 0x0E, 0xF3, 0xCE, 0xC1, 0xF0, 0x3C, 30 | 0x0F, 0x03, 0xC0, 0xD8, 0x36, 0x08, 0xC6, 0x1E, 0x00, 0x3F, 0xD0, 0x38, 31 | 0x08, 0x06, 0x01, 0x80, 0x40, 0x10, 0x0C, 0x02, 0x00, 0x80, 0x20, 0x10, 32 | 0x04, 0x01, 0x00, 0x80, 0x20, 0x1F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0xF8, 33 | 0x67, 0x30, 0xF0, 0x1E, 0x09, 0xE6, 0x3B, 0x07, 0xC0, 0xF0, 0x3C, 0x0D, 34 | 0x86, 0x1F, 0x00, 0x1E, 0x08, 0xC6, 0x1B, 0x02, 0xC0, 0xF0, 0x3C, 0x0F, 35 | 0x03, 0xE0, 0xDC, 0x73, 0xEC, 0x06, 0x01, 0x80, 0xC0, 0x70, 0x38, 0x38, 36 | 0x18, 0x00, 0xFC, 0x00, 0x3F, 0xCC, 0xC0, 0x00, 0x00, 0x06, 0x77, 0x12, 37 | 0x40, 0x00, 0x00, 0x07, 0x01, 0xE0, 0x78, 0x1E, 0x07, 0x00, 0xC0, 0x0F, 38 | 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x00, 0x10, 0xFF, 0xF0, 0x00, 39 | 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x0E, 0x00, 0x3C, 0x00, 0xF0, 40 | 0x03, 0xC0, 0x0F, 0x00, 0x30, 0x0E, 0x07, 0x81, 0xE0, 0x78, 0x0E, 0x00, 41 | 0x00, 0x00, 0x7C, 0x86, 0x83, 0xC3, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x08, 42 | 0x10, 0x10, 0x00, 0x00, 0x30, 0x30, 0x30, 0x03, 0xF0, 0x06, 0x06, 0x06, 43 | 0x00, 0x86, 0x00, 0x26, 0x0E, 0xD3, 0x0C, 0xC7, 0x0C, 0x63, 0x84, 0x31, 44 | 0xC6, 0x18, 0xE3, 0x08, 0x71, 0x8C, 0x4C, 0xC6, 0x46, 0x3D, 0xC1, 0x80, 45 | 0x00, 0x30, 0x10, 0x07, 0xF0, 0x00, 0x80, 0x00, 0x60, 0x00, 0x70, 0x00, 46 | 0x38, 0x00, 0x2E, 0x00, 0x13, 0x00, 0x19, 0xC0, 0x08, 0x60, 0x04, 0x38, 47 | 0x04, 0x0C, 0x03, 0xFF, 0x03, 0x03, 0x81, 0x00, 0xE1, 0x80, 0x70, 0xC0, 48 | 0x3D, 0xF0, 0x3F, 0xFF, 0x83, 0x0C, 0x30, 0x63, 0x06, 0x30, 0x63, 0x06, 49 | 0x30, 0xC3, 0xF0, 0x30, 0xE3, 0x06, 0x30, 0x33, 0x03, 0x30, 0x33, 0x07, 50 | 0x30, 0xEF, 0xFC, 0x07, 0xE2, 0x38, 0x3C, 0xC0, 0x3B, 0x00, 0x36, 0x00, 51 | 0x38, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x03, 52 | 0x00, 0x06, 0x00, 0x06, 0x00, 0x47, 0x03, 0x03, 0xF8, 0xFF, 0xC0, 0x30, 53 | 0x78, 0x30, 0x1C, 0x30, 0x0E, 0x30, 0x06, 0x30, 0x03, 0x30, 0x03, 0x30, 54 | 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x06, 0x30, 0x06, 0x30, 55 | 0x0C, 0x30, 0x78, 0xFF, 0xC0, 0xFF, 0xFC, 0xC0, 0x33, 0x00, 0x4C, 0x00, 56 | 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30, 0x30, 0xC0, 0x43, 0x00, 57 | 0x0C, 0x00, 0x30, 0x08, 0xC0, 0x23, 0x03, 0xBF, 0xFE, 0xFF, 0xFC, 0xC0, 58 | 0x33, 0x00, 0x4C, 0x00, 0x30, 0x00, 0xC0, 0x43, 0x03, 0x0F, 0xFC, 0x30, 59 | 0x30, 0xC0, 0x43, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x3F, 60 | 0x00, 0x07, 0xE4, 0x1C, 0x3C, 0x30, 0x0C, 0x60, 0x0C, 0x60, 0x04, 0xC0, 61 | 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x0C, 0xC0, 0x0C, 0xC0, 0x0C, 0x60, 62 | 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x1C, 0x1C, 0x07, 0xE0, 0xFC, 0x3F, 0x30, 63 | 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 64 | 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 65 | 0x0C, 0x30, 0x0C, 0xFC, 0x3F, 0xFC, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 66 | 0xC3, 0x0C, 0x30, 0xC3, 0x3F, 0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 67 | 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xC8, 0xF0, 0xFC, 0xFE, 0x30, 68 | 0x38, 0x30, 0x20, 0x30, 0x40, 0x30, 0x80, 0x33, 0x00, 0x36, 0x00, 0x3E, 69 | 0x00, 0x37, 0x00, 0x33, 0x80, 0x31, 0xC0, 0x30, 0xE0, 0x30, 0x70, 0x30, 70 | 0x38, 0x30, 0x3C, 0xFC, 0x7F, 0xFC, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 71 | 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 72 | 0xC0, 0x01, 0x80, 0x03, 0x00, 0x26, 0x00, 0x8C, 0x07, 0x7F, 0xFE, 0xF8, 73 | 0x01, 0xE7, 0x00, 0x70, 0xE0, 0x0E, 0x1E, 0x03, 0xC2, 0xC0, 0x58, 0x5C, 74 | 0x1B, 0x09, 0x82, 0x61, 0x38, 0x4C, 0x27, 0x11, 0x84, 0x72, 0x30, 0x8E, 75 | 0xC6, 0x10, 0xD0, 0xC2, 0x1E, 0x18, 0x41, 0x83, 0x1C, 0x30, 0x67, 0xC4, 76 | 0x3F, 0xF0, 0x1F, 0x78, 0x0E, 0x3C, 0x04, 0x3E, 0x04, 0x2E, 0x04, 0x27, 77 | 0x04, 0x23, 0x84, 0x23, 0xC4, 0x21, 0xE4, 0x20, 0xE4, 0x20, 0x74, 0x20, 78 | 0x3C, 0x20, 0x1C, 0x20, 0x0C, 0x70, 0x0C, 0xF8, 0x04, 0x07, 0xC0, 0x30, 79 | 0x60, 0xC0, 0x63, 0x00, 0x66, 0x00, 0xD8, 0x00, 0xF0, 0x01, 0xE0, 0x03, 80 | 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1B, 0x00, 0x66, 0x00, 0xC6, 0x03, 0x06, 81 | 0x0C, 0x03, 0xE0, 0xFF, 0x83, 0x0E, 0x30, 0x73, 0x03, 0x30, 0x33, 0x03, 82 | 0x30, 0x63, 0x0E, 0x3F, 0x83, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 83 | 0x30, 0x0F, 0xC0, 0x0F, 0xE0, 0x18, 0x30, 0x30, 0x18, 0x60, 0x0C, 0x60, 84 | 0x0C, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 0x06, 0xC0, 85 | 0x06, 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x03, 86 | 0xC0, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0xFF, 0x80, 0x61, 0xC0, 0xC1, 87 | 0xC1, 0x81, 0x83, 0x03, 0x06, 0x06, 0x0C, 0x1C, 0x18, 0x70, 0x3F, 0x80, 88 | 0x67, 0x00, 0xC7, 0x01, 0x8F, 0x03, 0x0F, 0x06, 0x0E, 0x0C, 0x0E, 0x7E, 89 | 0x0F, 0x1F, 0x46, 0x19, 0x81, 0x30, 0x27, 0x02, 0xF0, 0x0F, 0x00, 0xF8, 90 | 0x07, 0xC0, 0x38, 0x03, 0xC0, 0x34, 0x06, 0x80, 0xDC, 0x32, 0x7C, 0xFF, 91 | 0xFF, 0x86, 0x0E, 0x0C, 0x1C, 0x18, 0x10, 0x30, 0x00, 0x60, 0x00, 0xC0, 92 | 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 93 | 0x60, 0x00, 0xC0, 0x07, 0xE0, 0xFC, 0x1F, 0x30, 0x0E, 0x30, 0x04, 0x30, 94 | 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 95 | 0x04, 0x30, 0x04, 0x30, 0x04, 0x30, 0x04, 0x18, 0x08, 0x1C, 0x18, 0x07, 96 | 0xE0, 0xFE, 0x0F, 0x9C, 0x03, 0x0E, 0x01, 0x83, 0x00, 0x81, 0xC0, 0x40, 97 | 0x60, 0x40, 0x38, 0x20, 0x0C, 0x30, 0x07, 0x10, 0x01, 0x98, 0x00, 0xE8, 98 | 0x00, 0x34, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFC, 99 | 0xFC, 0x3D, 0xE1, 0xC0, 0x63, 0x83, 0x01, 0x86, 0x0E, 0x04, 0x1C, 0x18, 100 | 0x10, 0x70, 0x70, 0x80, 0xC3, 0xC2, 0x03, 0x8B, 0x08, 0x06, 0x6E, 0x40, 101 | 0x1D, 0x19, 0x00, 0x74, 0x78, 0x00, 0xE1, 0xE0, 0x03, 0x83, 0x80, 0x0E, 102 | 0x0C, 0x00, 0x10, 0x10, 0x00, 0x40, 0x40, 0x7F, 0x1F, 0x9E, 0x03, 0x07, 103 | 0x03, 0x01, 0xC3, 0x00, 0x71, 0x00, 0x19, 0x00, 0x0F, 0x00, 0x03, 0x80, 104 | 0x01, 0xE0, 0x01, 0xB0, 0x01, 0x9C, 0x00, 0x87, 0x00, 0x81, 0xC0, 0x80, 105 | 0xE0, 0xC0, 0x79, 0xF8, 0x7F, 0xFE, 0x1F, 0x78, 0x0C, 0x38, 0x08, 0x1C, 106 | 0x18, 0x0E, 0x10, 0x06, 0x20, 0x07, 0x60, 0x03, 0xC0, 0x01, 0x80, 0x01, 107 | 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 108 | 0xE0, 0x7F, 0xFB, 0x00, 0xC8, 0x07, 0x20, 0x38, 0x01, 0xC0, 0x07, 0x00, 109 | 0x38, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x05, 110 | 0xC0, 0x3E, 0x01, 0xBF, 0xFE, 0xFE, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 111 | 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xF0, 0xC1, 0x81, 0x03, 0x06, 0x04, 0x0C, 112 | 0x18, 0x10, 0x30, 0x60, 0x40, 0xC1, 0x81, 0x03, 0x06, 0xF8, 0xC6, 0x31, 113 | 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC7, 0xF0, 0x0C, 0x07, 114 | 0x01, 0x60, 0xD8, 0x23, 0x18, 0xC4, 0x1B, 0x06, 0x80, 0xC0, 0xFF, 0xF0, 115 | 0xC7, 0x0C, 0x30, 0x3E, 0x31, 0x8C, 0x30, 0x0C, 0x03, 0x07, 0xC6, 0x33, 116 | 0x0C, 0xC3, 0x31, 0xC7, 0xB8, 0x20, 0x38, 0x06, 0x01, 0x80, 0x60, 0x18, 117 | 0x06, 0xF1, 0xC6, 0x61, 0xD8, 0x36, 0x0D, 0x83, 0x60, 0xD8, 0x26, 0x19, 118 | 0x84, 0x3E, 0x00, 0x1E, 0x23, 0x63, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE1, 119 | 0x72, 0x3C, 0x00, 0x80, 0xE0, 0x18, 0x06, 0x01, 0x80, 0x61, 0xD8, 0x8E, 120 | 0x61, 0xB0, 0x6C, 0x1B, 0x06, 0xC1, 0xB0, 0x6E, 0x19, 0xCE, 0x3D, 0xC0, 121 | 0x1E, 0x08, 0xE4, 0x1B, 0xFE, 0xC0, 0x30, 0x0C, 0x03, 0x81, 0x60, 0x9C, 122 | 0x41, 0xE0, 0x0F, 0x08, 0xC4, 0x06, 0x03, 0x01, 0x81, 0xF0, 0x60, 0x30, 123 | 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0xFC, 0x00, 0x1F, 0x03, 124 | 0x1F, 0x60, 0xC6, 0x0C, 0x60, 0xC3, 0x18, 0x1F, 0x02, 0x00, 0x40, 0x07, 125 | 0xFC, 0x40, 0x24, 0x02, 0xC0, 0x2C, 0x04, 0xE0, 0x83, 0xF0, 0x30, 0x1E, 126 | 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0D, 0xE1, 0xCE, 0x30, 0xC6, 0x18, 127 | 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x79, 0xE0, 0x31, 0x80, 128 | 0x00, 0x09, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xDF, 0x0C, 0x30, 0x00, 0x00, 129 | 0x31, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xF2, 0xF0, 130 | 0x20, 0x1C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0xFB, 0x08, 0x62, 131 | 0x0C, 0x81, 0xE0, 0x3E, 0x06, 0xE0, 0xCE, 0x18, 0xC3, 0x0E, 0xF3, 0xE0, 132 | 0x13, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0xF8, 0xF7, 133 | 0x8F, 0x0E, 0x3C, 0xE3, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30, 134 | 0x63, 0x0C, 0x18, 0xC3, 0x06, 0x30, 0xC1, 0x8C, 0x30, 0x67, 0x9E, 0x3C, 135 | 0xF7, 0x87, 0x18, 0xC3, 0x18, 0x63, 0x0C, 0x61, 0x8C, 0x31, 0x86, 0x30, 136 | 0xC6, 0x19, 0xE7, 0x80, 0x1E, 0x18, 0xE4, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 137 | 0x0F, 0x03, 0x60, 0x9C, 0x41, 0xE0, 0x77, 0x87, 0x18, 0xC3, 0x98, 0x33, 138 | 0x06, 0x60, 0xCC, 0x19, 0x83, 0x30, 0xC7, 0x10, 0xDC, 0x18, 0x03, 0x00, 139 | 0x60, 0x0C, 0x07, 0xE0, 0x1E, 0x8C, 0xE6, 0x1B, 0x06, 0xC1, 0xB0, 0x6C, 140 | 0x1B, 0x06, 0xE1, 0x98, 0xE3, 0xD8, 0x06, 0x01, 0x80, 0x60, 0x18, 0x1F, 141 | 0x37, 0x7B, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x7C, 0x7B, 142 | 0x0E, 0x1C, 0x1E, 0x0F, 0x07, 0xC3, 0x87, 0x8A, 0xE0, 0x21, 0x8F, 0x98, 143 | 0x61, 0x86, 0x18, 0x61, 0x86, 0x19, 0x38, 0xE3, 0x98, 0x66, 0x19, 0x86, 144 | 0x61, 0x98, 0x66, 0x19, 0x86, 0x61, 0x9C, 0xE3, 0xDC, 0xF8, 0xEE, 0x08, 145 | 0xC1, 0x18, 0x41, 0x88, 0x32, 0x03, 0x40, 0x68, 0x06, 0x00, 0xC0, 0x10, 146 | 0x00, 0xF3, 0xE7, 0x61, 0x83, 0x70, 0xC2, 0x30, 0xC2, 0x30, 0xC4, 0x19, 147 | 0x64, 0x19, 0x68, 0x0E, 0x38, 0x0E, 0x38, 0x0C, 0x30, 0x04, 0x10, 0xFB, 148 | 0xC6, 0x30, 0x64, 0x0F, 0x00, 0xC0, 0x0C, 0x03, 0xC0, 0x98, 0x21, 0x8C, 149 | 0x3B, 0xCF, 0x80, 0xF8, 0xEE, 0x08, 0xC1, 0x18, 0x41, 0x88, 0x31, 0x03, 150 | 0x40, 0x68, 0x06, 0x00, 0xC0, 0x08, 0x02, 0x00, 0x40, 0x10, 0x1E, 0x03, 151 | 0x80, 0x7F, 0x90, 0xE0, 0x30, 0x18, 0x0E, 0x03, 0x01, 0xC0, 0xE0, 0x30, 152 | 0x5C, 0x3F, 0xF8, 0x19, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xB0, 0x63, 0x18, 153 | 0xC6, 0x31, 0x8C, 0x61, 0x80, 0xFF, 0xFF, 0x80, 0xC3, 0x18, 0xC6, 0x31, 154 | 0x8C, 0x63, 0x06, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xCC, 0x00, 0x38, 0x06, 155 | 0x62, 0x41, 0xC0}; 156 | 157 | const GFXglyph FreeSerif12pt7bGlyphs[] PROGMEM = { 158 | {0, 0, 0, 6, 0, 1}, // 0x20 ' ' 159 | {0, 2, 16, 8, 3, -15}, // 0x21 '!' 160 | {4, 6, 6, 10, 1, -15}, // 0x22 '"' 161 | {9, 12, 16, 12, 0, -15}, // 0x23 '#' 162 | {33, 10, 18, 12, 1, -16}, // 0x24 '$' 163 | {56, 18, 17, 20, 1, -16}, // 0x25 '%' 164 | {95, 17, 16, 19, 1, -15}, // 0x26 '&' 165 | {129, 2, 6, 5, 1, -15}, // 0x27 ''' 166 | {131, 6, 20, 8, 1, -15}, // 0x28 '(' 167 | {146, 6, 20, 8, 1, -15}, // 0x29 ')' 168 | {161, 8, 10, 12, 3, -14}, // 0x2A '*' 169 | {171, 11, 11, 14, 1, -10}, // 0x2B '+' 170 | {187, 3, 6, 6, 2, -2}, // 0x2C ',' 171 | {190, 6, 1, 8, 1, -5}, // 0x2D '-' 172 | {191, 2, 3, 6, 2, -2}, // 0x2E '.' 173 | {192, 7, 17, 7, 0, -16}, // 0x2F '/' 174 | {207, 10, 17, 12, 1, -16}, // 0x30 '0' 175 | {229, 6, 17, 12, 3, -16}, // 0x31 '1' 176 | {242, 10, 15, 12, 1, -14}, // 0x32 '2' 177 | {261, 10, 16, 12, 1, -15}, // 0x33 '3' 178 | {281, 10, 16, 12, 1, -15}, // 0x34 '4' 179 | {301, 10, 17, 12, 1, -16}, // 0x35 '5' 180 | {323, 10, 17, 12, 1, -16}, // 0x36 '6' 181 | {345, 10, 16, 12, 0, -15}, // 0x37 '7' 182 | {365, 10, 17, 12, 1, -16}, // 0x38 '8' 183 | {387, 10, 18, 12, 1, -16}, // 0x39 '9' 184 | {410, 2, 12, 6, 2, -11}, // 0x3A ':' 185 | {413, 4, 15, 6, 2, -11}, // 0x3B ';' 186 | {421, 12, 13, 14, 1, -12}, // 0x3C '<' 187 | {441, 12, 6, 14, 1, -8}, // 0x3D '=' 188 | {450, 12, 13, 14, 1, -11}, // 0x3E '>' 189 | {470, 8, 17, 11, 2, -16}, // 0x3F '?' 190 | {487, 17, 16, 21, 2, -15}, // 0x40 '@' 191 | {521, 17, 16, 17, 0, -15}, // 0x41 'A' 192 | {555, 12, 16, 15, 1, -15}, // 0x42 'B' 193 | {579, 15, 16, 16, 1, -15}, // 0x43 'C' 194 | {609, 16, 16, 17, 0, -15}, // 0x44 'D' 195 | {641, 14, 16, 15, 0, -15}, // 0x45 'E' 196 | {669, 14, 16, 14, 0, -15}, // 0x46 'F' 197 | {697, 16, 16, 17, 1, -15}, // 0x47 'G' 198 | {729, 16, 16, 17, 0, -15}, // 0x48 'H' 199 | {761, 6, 16, 8, 1, -15}, // 0x49 'I' 200 | {773, 8, 16, 9, 0, -15}, // 0x4A 'J' 201 | {789, 16, 16, 17, 1, -15}, // 0x4B 'K' 202 | {821, 15, 16, 15, 0, -15}, // 0x4C 'L' 203 | {851, 19, 16, 21, 1, -15}, // 0x4D 'M' 204 | {889, 16, 16, 17, 1, -15}, // 0x4E 'N' 205 | {921, 15, 16, 17, 1, -15}, // 0x4F 'O' 206 | {951, 12, 16, 14, 0, -15}, // 0x50 'P' 207 | {975, 16, 20, 17, 1, -15}, // 0x51 'Q' 208 | {1015, 15, 16, 16, 0, -15}, // 0x52 'R' 209 | {1045, 11, 16, 13, 0, -15}, // 0x53 'S' 210 | {1067, 15, 16, 15, 0, -15}, // 0x54 'T' 211 | {1097, 16, 16, 17, 1, -15}, // 0x55 'U' 212 | {1129, 17, 16, 17, 0, -15}, // 0x56 'V' 213 | {1163, 22, 16, 23, 0, -15}, // 0x57 'W' 214 | {1207, 17, 16, 17, 0, -15}, // 0x58 'X' 215 | {1241, 16, 16, 17, 0, -15}, // 0x59 'Y' 216 | {1273, 14, 16, 15, 1, -15}, // 0x5A 'Z' 217 | {1301, 5, 20, 8, 2, -15}, // 0x5B '[' 218 | {1314, 7, 17, 7, 0, -16}, // 0x5C '\' 219 | {1329, 5, 20, 8, 1, -15}, // 0x5D ']' 220 | {1342, 10, 9, 11, 1, -15}, // 0x5E '^' 221 | {1354, 12, 1, 12, 0, 3}, // 0x5F '_' 222 | {1356, 5, 4, 6, 0, -15}, // 0x60 '`' 223 | {1359, 10, 11, 10, 1, -10}, // 0x61 'a' 224 | {1373, 10, 17, 12, 1, -16}, // 0x62 'b' 225 | {1395, 8, 11, 11, 1, -10}, // 0x63 'c' 226 | {1406, 10, 17, 12, 1, -16}, // 0x64 'd' 227 | {1428, 10, 11, 11, 1, -10}, // 0x65 'e' 228 | {1442, 9, 17, 9, 0, -16}, // 0x66 'f' 229 | {1462, 12, 16, 11, 0, -10}, // 0x67 'g' 230 | {1486, 11, 17, 12, 0, -16}, // 0x68 'h' 231 | {1510, 5, 16, 7, 0, -15}, // 0x69 'i' 232 | {1520, 6, 21, 8, 0, -15}, // 0x6A 'j' 233 | {1536, 11, 17, 12, 1, -16}, // 0x6B 'k' 234 | {1560, 5, 17, 6, 0, -16}, // 0x6C 'l' 235 | {1571, 18, 11, 19, 0, -10}, // 0x6D 'm' 236 | {1596, 11, 11, 12, 0, -10}, // 0x6E 'n' 237 | {1612, 10, 11, 12, 1, -10}, // 0x6F 'o' 238 | {1626, 11, 16, 12, 0, -10}, // 0x70 'p' 239 | {1648, 10, 16, 12, 1, -10}, // 0x71 'q' 240 | {1668, 8, 11, 8, 0, -10}, // 0x72 'r' 241 | {1679, 7, 11, 9, 1, -10}, // 0x73 's' 242 | {1689, 6, 13, 7, 1, -12}, // 0x74 't' 243 | {1699, 10, 11, 12, 1, -10}, // 0x75 'u' 244 | {1713, 11, 11, 11, 0, -10}, // 0x76 'v' 245 | {1729, 16, 11, 16, 0, -10}, // 0x77 'w' 246 | {1751, 11, 11, 12, 0, -10}, // 0x78 'x' 247 | {1767, 11, 16, 11, 0, -10}, // 0x79 'y' 248 | {1789, 10, 11, 10, 0, -10}, // 0x7A 'z' 249 | {1803, 5, 21, 12, 2, -16}, // 0x7B '{' 250 | {1817, 1, 17, 5, 2, -16}, // 0x7C '|' 251 | {1820, 5, 21, 12, 5, -15}, // 0x7D '}' 252 | {1834, 12, 3, 12, 0, -6}}; // 0x7E '~' 253 | 254 | const GFXfont FreeSerif12pt7b PROGMEM = {(uint8_t *)FreeSerif12pt7bBitmaps, 255 | (GFXglyph *)FreeSerif12pt7bGlyphs, 256 | 0x20, 0x7E, 29}; 257 | 258 | // Approx. 2511 bytes 259 | -------------------------------------------------------------------------------- /examples/m5stickc_telegram_bot/m5stickc_telegram_bot.ino: -------------------------------------------------------------------------------- 1 | /******************************************************************* 2 | A telegram bot for your ESP32 to print shopping or to-do lists 3 | on BLE Thermal Printers 4 | 5 | Arduino sketch written by Larry Bank 6 | 7 | Parts: 8 | Any ESP32, GOOJPRT PT-210, MPT-3, PeriPage+ (so far) 9 | 10 | Telegram Library written by Brian Lough 11 | YouTube: https://www.youtube.com/brianlough 12 | Tindie: https://www.tindie.com/stores/brianlough/ 13 | Twitter: https://twitter.com/witnessmenow 14 | 15 | Thermal Printer library written by Larry Bank 16 | Twitter: https://twitter.com/fast_code_r_us 17 | Github: https://github.com/bitbank2 18 | 19 | N.B.: The ESP32 partitioning (Tools menu) must be set to "No OTA" to fit this sketch 20 | in FLASH because it uses both the WiFi and BLE libraries which will pass 1MB 21 | 22 | *******************************************************************/ 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | 31 | #define TFT_CS 5 32 | #define TFT_RST 18 33 | #define TFT_DC 23 34 | #define TFT_CLK 13 35 | #define TFT_MOSI 15 36 | #define BUTTON_A 37 37 | #define BUTTON_B 39 38 | 39 | // Proportional fonts for 203dpi and 304dpi output 40 | #include "Open_Sans_Bold_22.h" 41 | #include "Open_Sans_Bold_32.h" 42 | const char *APP_NAME = "Shopping_List"; // Preferences name 43 | const char *Spaces = " "; 44 | static int bPrint = 0; 45 | 46 | // Wifi network station credentials 47 | // Replace these with your actual credentials 48 | #define WIFI_SSID "my_ssid" 49 | #define WIFI_PASSWORD "my_password" 50 | // Telegram BOT Token (Get from Botfather) 51 | #define BOT_TOKEN "use_the_token_from_botfather" 52 | 53 | // List of user names that are authorized to use this bot 54 | // make sure the list terminates with NULL 55 | // For more security, this can be changed to use chat_id's that are unique 56 | char *szValidUsers[] {(char *)"Larry", (char *)"Brian", NULL}; 57 | static uint8_t txBuffer[4096]; 58 | const unsigned long BOT_MTBS = 1000; // mean time between scan messages 59 | SPILCD lcd; 60 | Preferences preferences; 61 | WiFiClientSecure secured_client; 62 | UniversalTelegramBot bot(BOT_TOKEN, secured_client); 63 | unsigned long bot_lasttime; // last time messages' scan has been done 64 | bool Start = false; 65 | 66 | // M5StickC-Plus init code 67 | void Write1Byte( uint8_t Addr , uint8_t Data ) 68 | { 69 | Wire1.beginTransmission(0x34); 70 | Wire1.write(Addr); 71 | Wire1.write(Data); 72 | Wire1.endTransmission(); 73 | } 74 | uint8_t Read8bit( uint8_t Addr ) 75 | { 76 | Wire1.beginTransmission(0x34); 77 | Wire1.write(Addr); 78 | Wire1.endTransmission(); 79 | Wire1.requestFrom(0x34, 1); 80 | return Wire1.read(); 81 | } 82 | void AxpBrightness(uint8_t brightness) 83 | { 84 | if (brightness > 12) 85 | { 86 | brightness = 12; 87 | } 88 | uint8_t buf = Read8bit( 0x28 ); 89 | Write1Byte( 0x28 , ((buf & 0x0f) | (brightness << 4)) ); 90 | } 91 | void AxpPowerUp() 92 | { 93 | Wire1.begin(21, 22); 94 | Wire1.setClock(400000); 95 | // Set LDO2 & LDO3(TFT_LED & TFT) 3.0V 96 | Write1Byte(0x28, 0xcc); 97 | 98 | // Set ADC sample rate to 200hz 99 | Write1Byte(0x84, 0b11110010); 100 | 101 | // Set ADC to All Enable 102 | Write1Byte(0x82, 0xff); 103 | 104 | // Bat charge voltage to 4.2, Current 100MA 105 | Write1Byte(0x33, 0xc0); 106 | 107 | // Depending on configuration enable LDO2, LDO3, DCDC1, DCDC3. 108 | byte buf = (Read8bit(0x12) & 0xef) | 0x4D; 109 | // if(disableLDO3) buf &= ~(1<<3); 110 | // if(disableLDO2) buf &= ~(1<<2); 111 | // if(disableDCDC3) buf &= ~(1<<1); 112 | // if(disableDCDC1) buf &= ~(1<<0); 113 | Write1Byte(0x12, buf); 114 | // 128ms power on, 4s power off 115 | Write1Byte(0x36, 0x0C); 116 | 117 | if (1) //if(!disableRTC) 118 | { 119 | // Set RTC voltage to 3.3V 120 | Write1Byte(0x91, 0xF0); 121 | 122 | // Set GPIO0 to LDO 123 | Write1Byte(0x90, 0x02); 124 | } 125 | 126 | // Disable vbus hold limit 127 | Write1Byte(0x30, 0x80); 128 | 129 | // Set temperature protection 130 | Write1Byte(0x39, 0xfc); 131 | 132 | // Enable RTC BAT charge 133 | // Write1Byte(0x35, 0xa2 & (disableRTC ? 0x7F : 0xFF)); 134 | Write1Byte(0x35, 0xa2); 135 | // Enable bat detection 136 | Write1Byte(0x32, 0x46); 137 | 138 | // Set Power off voltage 3.0v 139 | Write1Byte(0x31 , (Read8bit(0x31) & 0xf8) | (1 << 2)); 140 | 141 | } /* AxpPowerUp() */ 142 | 143 | void ShowHelpMessage(String chat_id) 144 | { 145 | String welcome = "Welcome to the Thermal Printer Shopping List bot\n\n"; 146 | welcome += "This is an ESP32 listening for text and commands.\n\n"; 147 | welcome += "Type /help to see this message again.\n"; 148 | welcome += "The following commands are recognized:\n"; 149 | welcome += "/list - show current shopping list\n"; 150 | welcome += "/deleteall - delete the current shopping list\n"; 151 | welcome += "/delete - delete a specific item\n"; 152 | welcome += "/print - print the list on a local thermal printer\n"; 153 | welcome += "Any other text will be added to the list as an item\n"; 154 | welcome += "Enjoy!\n"; 155 | bot.sendMessage(chat_id, welcome); 156 | } /* ShowHelpMessage() */ 157 | 158 | void PrintList(String chat_id) 159 | { 160 | int bSucceeded = 0; 161 | char szMsg[128]; 162 | 163 | if (chat_id.length()) bot.sendMessage(chat_id, "Printing...\n"); 164 | sprintf(szMsg, "Printing...%s", Spaces); 165 | spilcdWriteString(&lcd, 0,16,szMsg,0x07e0,0, FONT_12x16, DRAW_TO_LCD); 166 | sprintf(szMsg, "Looking for printers%s", Spaces); 167 | spilcdWriteString(&lcd, 0,40,szMsg,0x07e0,0, FONT_12x16, DRAW_TO_LCD); 168 | 169 | // Need to temporarily disconnect WiFi or the system can 170 | // crash due to a stack overrun caused by WiFi & BLE being used simultaneously 171 | WiFi.disconnect(); 172 | // Search (scan), then connect to the BLE printer and send the text 173 | if (tpScan()) { 174 | sprintf(szMsg, "Found a printer!%s", Spaces); 175 | spilcdWriteString(&lcd, 0,40,szMsg,0x07e0,0, FONT_12x16, DRAW_TO_LCD); 176 | Serial.println(szMsg); 177 | if (tpConnect()) { 178 | sprintf(szMsg, "Connected to %s%s", tpGetName(), Spaces); 179 | spilcdWriteString(&lcd, 0,40,szMsg,0x07e0,0, FONT_12x16, DRAW_TO_LCD); 180 | Serial.println(szMsg); 181 | GFXfont *pFont; 182 | int i, iCount = GetStringCount(); 183 | if (tpGetWidth() == 384) // low res printer 184 | pFont = (GFXfont *)&Open_Sans_Bold_22; 185 | else // high res printer 186 | pFont = (GFXfont *)&Open_Sans_Bold_32; 187 | for (i=0; i iCount || iItem < 0) { 282 | sprintf(szMsg, "Invalid item number; list length = %d\n", iCount); 283 | bot.sendMessage(chat_id, szMsg); 284 | continue; 285 | } 286 | DeleteString(iItem-1); 287 | sprintf(szMsg, "Item %d deleted; list length = %d\n", iItem, iCount); 288 | bot.sendMessage(chat_id, szMsg); 289 | ShowItemCount(); 290 | } else if (text == "/print") { 291 | bPrint = 1; // allow Telegram msg queue to finish, then print 292 | bot.sendMessage(chat_id, "Printing..."); 293 | } else if (text == "/start" || text == "/help") { 294 | ShowHelpMessage(chat_id); 295 | } else { 296 | String errormsg = "Unrecognized command: " + text + "\n"; 297 | errormsg += "Type /help for a list of valid commands\n"; 298 | bot.sendMessage(chat_id, errormsg); 299 | } 300 | } // commands 301 | else { // add to the list 302 | int i = AddString((char *)text.c_str()); 303 | sprintf(szMsg, "Item added; list length = %d\n", i); 304 | bot.sendMessage(chat_id, szMsg); 305 | sprintf(szMsg, "Added: %s%s", text.c_str(), Spaces); 306 | spilcdWriteString(&lcd, 0,40,szMsg,0x07e0,0, FONT_12x16, DRAW_TO_LCD); 307 | ShowItemCount(); 308 | } 309 | } // for each message 310 | } /* handleNewMessages() */ 311 | 312 | void DeleteString(int iString) 313 | { 314 | int iCount; 315 | char szName[32], szTemp[128]; 316 | 317 | preferences.begin(APP_NAME, false); 318 | iCount = preferences.getInt("list_count", 0); 319 | if (iString >= iCount) { 320 | preferences.end(); 321 | return; // invalid string to delete 322 | } 323 | sprintf(szName, "name%d", iCount-1); // get last string in the list 324 | preferences.getString(szName, szTemp, sizeof(szTemp)); 325 | sprintf(szName, "name%d", iString); // to replace the one we want to delete 326 | preferences.putString(szName, szTemp); 327 | iCount--; // delete the last name 328 | preferences.putInt("list_count", iCount); 329 | preferences.end(); 330 | 331 | } /* DeleteString() */ 332 | 333 | char * GetString(int iString) 334 | { 335 | static char szTemp[128]; 336 | char szName[32]; 337 | int iCount; 338 | 339 | preferences.begin(APP_NAME, false); 340 | iCount = preferences.getInt("list_count", 0); 341 | if (iString >= iCount) { // invalid 342 | return NULL; 343 | preferences.end(); 344 | } 345 | sprintf(szName, "name%d", iString); 346 | preferences.getString(szName, szTemp, sizeof(szTemp)); 347 | preferences.end(); 348 | return szTemp; 349 | } /* GetString() */ 350 | 351 | void DeleteAll(void) 352 | { 353 | preferences.begin(APP_NAME, false); 354 | preferences.putInt("list_count", 0); 355 | preferences.end(); 356 | } /* DeleteAll() */ 357 | 358 | int GetStringCount(void) 359 | { 360 | int iCount; 361 | 362 | preferences.begin(APP_NAME, false); 363 | iCount = preferences.getInt("list_count", 0); 364 | preferences.end(); 365 | return iCount; 366 | } /* GetStringCount() */ 367 | 368 | int AddString(char *newname) 369 | { 370 | int iCount; 371 | char szTemp[32]; 372 | 373 | preferences.begin(APP_NAME, false); 374 | iCount = preferences.getInt("list_count", 0); 375 | // save the data 376 | sprintf(szTemp, "name%d", iCount); 377 | preferences.putString(szTemp, newname); 378 | iCount++; 379 | preferences.putInt("list_count", iCount); 380 | preferences.end(); 381 | return iCount; // return new list length 382 | } /* AddString() */ 383 | 384 | void lightSleep(uint64_t time_in_us) 385 | { 386 | esp_sleep_enable_timer_wakeup(time_in_us); 387 | esp_light_sleep_start(); 388 | } /* lightSleep() */ 389 | 390 | void ShowReady(void) 391 | { 392 | spilcdWriteString(&lcd, 0,16,(char *)"Telegram bot ready! ", 0xffe0,0,FONT_12x16, DRAW_TO_LCD); 393 | spilcdWriteString(&lcd, 0,40,(char *)"Press A to print ", 0xffe0,0,FONT_12x16, DRAW_TO_LCD); 394 | } /* ShowReady() */ 395 | 396 | void ShowItemCount(void) 397 | { 398 | int iCount; 399 | char szTemp[32]; 400 | 401 | preferences.begin(APP_NAME, false); 402 | iCount = preferences.getInt("list_count", 0); 403 | preferences.end(); 404 | sprintf(szTemp, "Item Count: %d ", iCount); 405 | spilcdWriteString(&lcd, 0,112,szTemp, 0xffe0,0,FONT_12x16, DRAW_TO_LCD); 406 | } /* ShowItemCount() */ 407 | 408 | void setup() 409 | { 410 | int iTimeout = 0; 411 | char szTemp[32]; 412 | 413 | AxpPowerUp(); 414 | AxpBrightness(9); // turn on backlight (0-12) 415 | pinMode(BUTTON_A, INPUT); 416 | pinMode(BUTTON_B, INPUT); 417 | 418 | Serial.begin(115200); 419 | while (!Serial && iTimeout < 5) { 420 | delay(1000); 421 | iTimeout++; 422 | }; 423 | 424 | spilcdSetTXBuffer(txBuffer, sizeof(txBuffer)); 425 | spilcdInit(&lcd, LCD_ST7789_135, FLAGS_NONE, 40000000, TFT_CS, TFT_DC, TFT_RST, -1, -1, TFT_MOSI, TFT_CLK); // M5Stick-C plus pin numbering, 40Mhz 426 | spilcdSetOrientation(&lcd, LCD_ORIENTATION_90); 427 | spilcdFill(&lcd, 0, DRAW_TO_LCD); 428 | spilcdWriteString(&lcd, 16,2,(char *)"Telegram Bot Shopping List", 0xffff,0,FONT_8x8, DRAW_TO_LCD); 429 | spilcdWriteString(&lcd, 0,16,(char *)"Connecting to WiFi...", 0x7e0,0,FONT_8x8, DRAW_TO_LCD); 430 | // Attempt to connect to Wifi network: 431 | Serial.print("\nConnecting to Wifi SSID "); 432 | Serial.print(WIFI_SSID); 433 | WiFi.begin(WIFI_SSID, WIFI_PASSWORD); 434 | secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org 435 | while (WiFi.status() != WL_CONNECTED) 436 | { 437 | Serial.print("."); 438 | delay(500); 439 | } 440 | sprintf(szTemp, "WiFi addr: %s", WiFi.localIP().toString().c_str()); 441 | Serial.println("Connected!"); 442 | Serial.print(szTemp); 443 | spilcdWriteString(&lcd, 0,16,szTemp, 0xffe0,0,FONT_8x8, DRAW_TO_LCD); 444 | 445 | Serial.print("Retrieving time: "); 446 | configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP 447 | time_t now = time(nullptr); 448 | while (now < 24 * 3600) 449 | { 450 | Serial.print("."); 451 | delay(100); 452 | now = time(nullptr); 453 | } 454 | Serial.println(now); 455 | ShowReady(); 456 | ShowItemCount(); 457 | } /* setup() */ 458 | 459 | void loop() 460 | { 461 | String empty = ""; 462 | 463 | if (millis() - bot_lasttime > BOT_MTBS) 464 | { 465 | int numNewMessages = bot.getUpdates(bot.last_message_received + 1); 466 | 467 | while (numNewMessages) 468 | { 469 | Serial.println("got response"); 470 | handleNewMessages(numNewMessages); 471 | numNewMessages = bot.getUpdates(bot.last_message_received + 1); 472 | } 473 | 474 | bot_lasttime = millis(); 475 | } else { 476 | if (digitalRead(BUTTON_A) == LOW || bPrint) { // start printing 477 | bPrint = 0; 478 | PrintList(empty); 479 | delay(2000); 480 | ShowReady(); 481 | } 482 | } 483 | } 484 | -------------------------------------------------------------------------------- /examples/telegram_bot/Open_Sans_Bold_32.h: -------------------------------------------------------------------------------- 1 | // Created by http://oleddisplay.squix.ch/ Consider a donation 2 | // In case of problems make sure that you are using the font file with the correct version! 3 | const uint8_t Open_Sans_Bold_32Bitmaps[] PROGMEM = { 4 | 5 | // Bitmap Data: 6 | 0x00, // ' ' 7 | 0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0x79,0xE7,0x80,0x00,0x07,0x3E,0xFB,0xE7,0x00, // '!' 8 | 0xF1,0xEF,0x1E,0xF1,0xEF,0x1E,0xF1,0xE7,0x0E,0x70,0xE7,0x0E, // '"' 9 | 0x01,0xC7,0x80,0x3C,0x70,0x03,0xC7,0x00,0x38,0x70,0x03,0x8F,0x00,0x38,0xF0,0x7F,0xFF,0xE7,0xFF,0xFE,0x7F,0xFF,0xE0,0x71,0xE0,0x07,0x1E,0x00,0xF1,0xC0,0x0F,0x1C,0x0F,0xFF,0xFC,0xFF,0xFF,0xCF,0xFF,0xFC,0x1E,0x38,0x01,0xE3,0x80,0x1C,0x38,0x01,0xC7,0x80,0x1C,0x78,0x01,0xC7,0x80,0x3C,0x70,0x00, // '#' 10 | 0x01,0x80,0x00,0xC0,0x01,0xFE,0x03,0xFF,0xC7,0xFF,0xE3,0xFF,0xF3,0xF6,0x31,0xF3,0x00,0xF9,0x80,0x3F,0xC0,0x1F,0xE0,0x07,0xFC,0x01,0xFF,0x80,0x3F,0xE0,0x07,0xF8,0x03,0x7E,0x01,0x9F,0x40,0xCF,0xBC,0x6F,0xDF,0xFF,0xCF,0xFF,0xE7,0xFF,0xC0,0x7F,0x80,0x03,0x00,0x01,0x80,0x00,0xC0,0x00, // '$' 11 | 0x1F,0x00,0x38,0x03,0xF8,0x07,0x80,0x7F,0xC0,0x70,0x0F,0xBC,0x0F,0x00,0xF1,0xE1,0xE0,0x0F,0x1E,0x1E,0x00,0xF1,0xE3,0xC0,0x0F,0x1E,0x3C,0x00,0xF1,0xE7,0x80,0x0F,0x1E,0x71,0xF0,0xFB,0xCF,0x3F,0x87,0xFC,0xE7,0xFC,0x3F,0x9E,0x7B,0xC1,0xF3,0xCF,0x1E,0x00,0x3C,0xF1,0xE0,0x07,0x8F,0x1E,0x00,0x78,0xF1,0xE0,0x0F,0x0F,0x1E,0x00,0xE0,0xF1,0xE0,0x1E,0x07,0xBE,0x01,0xC0,0x7F,0xC0,0x3C,0x03,0xF8,0x07,0x80,0x1F,0x00, // '%' 12 | 0x03,0xF0,0x00,0x0F,0xFC,0x00,0x1F,0xFE,0x00,0x1F,0xFE,0x00,0x3E,0x3E,0x00,0x3E,0x1E,0x00,0x3E,0x1E,0x00,0x1E,0x3E,0x00,0x1F,0xFC,0x00,0x0F,0xF8,0x00,0x0F,0xF0,0x00,0x1F,0xE0,0x7C,0x3F,0xF0,0x7C,0x7F,0xF8,0xF8,0x7C,0xFC,0xF8,0xF8,0x3F,0xF0,0xF8,0x1F,0xF0,0xFC,0x0F,0xE0,0x7E,0x0F,0xC0,0x7F,0xFF,0xE0,0x3F,0xFF,0xF0,0x1F,0xFE,0xF8,0x07,0xF0,0x7C, // '&' 13 | 0xF7,0xBD,0xEF,0x39,0xCE, // ''' 14 | 0x07,0x83,0xC1,0xE0,0x78,0x3E,0x0F,0x03,0xC1,0xE0,0x78,0x1E,0x07,0x81,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0x78,0x1E,0x07,0x81,0xE0,0x78,0x0F,0x03,0xC0,0xF0,0x1E,0x07,0x80,0xF0,0x1E, // '(' 15 | 0xF0,0x1E,0x07,0xC0,0xF0,0x3E,0x07,0x81,0xE0,0x3C,0x0F,0x03,0xC0,0xF0,0x3C,0x0F,0x03,0xE0,0xF8,0x3E,0x0F,0x03,0xC0,0xF0,0x3C,0x0F,0x07,0x81,0xE0,0xF8,0x3C,0x0F,0x07,0x83,0xC0, // ')' 16 | 0x07,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0xC3,0x86,0xFB,0xBE,0xFF,0xFE,0xFF,0xFE,0x07,0xC0,0x0F,0xE0,0x0E,0xE0,0x1E,0xF0,0x3C,0x78,0x3C,0x78,0x0C,0x20, // '*' 17 | 0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x03,0xFF,0xFD,0xFF,0xFE,0xFF,0xFF,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00, // '+' 18 | 0x7C,0xF9,0xF3,0xC7,0x8E,0x3C,0x78, // ',' 19 | 0xFF,0x7F,0xBF,0xDF,0xE0, // '-' 20 | 0x73,0xEF,0xBE,0x70, // '.' 21 | 0x00,0xF8,0x03,0xC0,0x0F,0x00,0x7C,0x01,0xE0,0x07,0x80,0x3E,0x00,0xF0,0x07,0xC0,0x1E,0x00,0x78,0x03,0xE0,0x0F,0x00,0x3C,0x01,0xF0,0x07,0x80,0x1E,0x00,0xF8,0x03,0xC0,0x1F,0x00,0x78,0x01,0xE0,0x0F,0x80,0x00, // '/' 22 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x07,0xFF,0x87,0xE7,0xE3,0xE1,0xF1,0xE0,0x79,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBE,0x07,0xDF,0x03,0xEF,0x81,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x3E,0x78,0x1E,0x3E,0x1F,0x1F,0x1F,0x87,0xFF,0x83,0xFF,0xC0,0xFF,0xC0,0x1F,0x80, // '0' 23 | 0x03,0xE0,0x7E,0x0F,0xE1,0xFE,0x7F,0xEF,0xFE,0xFB,0xE7,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0, // '1' 24 | 0x07,0xE0,0x1F,0xFC,0x1F,0xFF,0x1F,0xFF,0xC7,0xC3,0xE1,0x81,0xF0,0x00,0x78,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0xFF,0xEF,0xFF,0xF7,0xFF,0xFB,0xFF,0xFC, // '2' 25 | 0x0F,0xE0,0x3F,0xFC,0x3F,0xFF,0x0F,0xFF,0xC3,0x87,0xE1,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x7C,0x07,0xFC,0x03,0xF8,0x01,0xFF,0x00,0xFF,0xC0,0x03,0xF0,0x00,0xFC,0x00,0x3E,0x00,0x1F,0x00,0x1F,0xB8,0x1F,0x9F,0xFF,0xCF,0xFF,0xC7,0xFF,0xC0,0x7F,0x80, // '3' 26 | 0x00,0x7C,0x00,0x3F,0x00,0x0F,0xC0,0x07,0xF0,0x03,0xFC,0x00,0xFF,0x00,0x7F,0xC0,0x3D,0xF0,0x0E,0x7C,0x07,0x9F,0x03,0xC7,0xC0,0xE1,0xF0,0x78,0x7C,0x3C,0x1F,0x0F,0xFF,0xFB,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xE0,0x07,0xC0,0x01,0xF0,0x00,0x7C,0x00,0x1F,0x00,0x07,0xC0, // '4' 27 | 0x7F,0xF8,0x7F,0xF8,0x7F,0xF8,0x7F,0xF8,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFF,0xC0,0xFF,0xF0,0xFF,0xF8,0xFF,0xFC,0x00,0xFC,0x00,0x7C,0x00,0x3E,0x00,0x3E,0x00,0x3C,0x00,0x7C,0xC0,0xFC,0xFF,0xF8,0xFF,0xF8,0xFF,0xF0,0x3F,0x80, // '5' 28 | 0x01,0xFC,0x03,0xFE,0x03,0xFF,0x03,0xFF,0x83,0xF0,0x03,0xE0,0x01,0xF0,0x00,0xF0,0x00,0x79,0xF0,0x7D,0xFE,0x3F,0xFF,0x9F,0xFF,0xCF,0xC3,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x3E,0xF8,0x1F,0x3E,0x0F,0x9F,0x8F,0x87,0xFF,0xC3,0xFF,0xC0,0xFF,0xC0,0x1F,0x80, // '6' 29 | 0xFF,0xFF,0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xE0,0x01,0xE0,0x01,0xF0,0x00,0xF8,0x00,0xF8,0x00,0x7C,0x00,0x7C,0x00,0x3E,0x00,0x1E,0x00,0x1F,0x00,0x0F,0x80,0x0F,0x80,0x07,0xC0,0x07,0xC0,0x03,0xE0,0x03,0xE0,0x01,0xF0,0x00,0xF8,0x00,0xF8,0x00,0x7C,0x00, // '7' 30 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x0F,0x87,0xC7,0xC3,0xE3,0xC0,0xF1,0xF0,0xF8,0xF8,0x7C,0x3E,0x7C,0x1F,0xFC,0x03,0xFC,0x01,0xFE,0x03,0xFF,0xC3,0xF3,0xF1,0xF0,0xF9,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBE,0x07,0xCF,0x87,0xC7,0xFF,0xE1,0xFF,0xE0,0x3F,0x80, // '8' 31 | 0x07,0xE0,0x0F,0xF8,0x0F,0xFF,0x0F,0xFF,0x87,0xC7,0xE7,0xC1,0xF3,0xE0,0x7D,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBF,0x0F,0xCF,0xFF,0xE7,0xFF,0xF1,0xFE,0xF8,0x3E,0x78,0x00,0x3C,0x00,0x3E,0x00,0x1F,0x00,0x3F,0x07,0xFF,0x03,0xFF,0x01,0xFF,0x00,0xFE,0x00, // '9' 32 | 0x73,0xEF,0xBE,0x70,0x00,0x00,0x00,0x00,0x00,0x73,0xEF,0xBE,0x70, // ':' 33 | 0x38,0xF9,0xF3,0xE3,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x9F,0x3E,0x78,0xF1,0xC7,0x8F,0x00, // ';' 34 | 0x00,0x03,0x00,0x07,0x80,0x0F,0xC0,0x1F,0xE0,0x3F,0xC0,0x7F,0x80,0xFE,0x01,0xFC,0x00,0xF8,0x00,0x7F,0x80,0x0F,0xF0,0x01,0xFE,0x00,0x3F,0xE0,0x03,0xF8,0x00,0x7C,0x00,0x0E,0x00,0x01,0x00, // '<' 35 | 0xFF,0xFF,0x7F,0xFF,0xBF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFD,0xFF,0xFE,0xFF,0xFF,0x00, // '=' 36 | 0xC0,0x00,0x78,0x00,0x3F,0x00,0x1F,0xE0,0x03,0xFC,0x00,0x7F,0x80,0x07,0xF0,0x00,0xFE,0x00,0x1F,0x00,0x7F,0x80,0xFF,0x01,0xFE,0x07,0xFC,0x07,0xF0,0x03,0xE0,0x01,0xC0,0x00,0x80,0x00,0x00, // '>' 37 | 0x0F,0xE0,0xFF,0xE3,0xFF,0xE3,0xFF,0xE7,0x07,0xC0,0x07,0x80,0x0F,0x00,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x01,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x01,0xC0,0x00, // '?' 38 | 0x00,0x7F,0x80,0x00,0x7F,0xFC,0x00,0x7F,0xFF,0x80,0x3F,0x01,0xF8,0x1E,0x00,0x1E,0x0F,0x00,0x03,0xC7,0x83,0xFC,0x79,0xE3,0xFF,0x9E,0xF1,0xFF,0xE3,0xBC,0xF8,0x78,0xEE,0x3C,0x1E,0x3B,0x8E,0x07,0x8E,0xE3,0x81,0xE3,0xB8,0xE0,0x78,0xEE,0x38,0x1E,0x7B,0x8F,0x0F,0x9E,0xE3,0xFF,0xFF,0x3C,0x7F,0xBF,0x87,0x07,0xC3,0xC1,0xE0,0x00,0x00,0x3C,0x00,0x00,0x0F,0xC0,0x1C,0x00,0xFF,0xFF,0x00,0x1F,0xFF,0xC0,0x00,0xFF,0x80,0x00, // '@' 39 | 0x00,0xFC,0x00,0x03,0xF8,0x00,0x07,0xF8,0x00,0x0F,0xF0,0x00,0x3F,0xF0,0x00,0x79,0xE0,0x00,0xF3,0xC0,0x03,0xE7,0xC0,0x07,0x87,0x80,0x0F,0x0F,0x00,0x3E,0x1F,0x00,0x7C,0x3E,0x00,0xF0,0x3C,0x03,0xFF,0xFC,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x3F,0xFF,0xF0,0x7C,0x03,0xE0,0xF0,0x03,0xC3,0xE0,0x07,0xC7,0xC0,0x0F,0x8F,0x80,0x1F,0x3E,0x00,0x1F,0x00, // 'A' 40 | 0xFF,0xF0,0x3F,0xFF,0x8F,0xFF,0xF3,0xFF,0xFC,0xF8,0x1F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x1F,0x3F,0xFF,0x8F,0xFF,0xC3,0xFF,0xF8,0xFF,0xFF,0x3E,0x07,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x81,0xFB,0xFF,0xFE,0xFF,0xFF,0x3F,0xFF,0x8F,0xFF,0x00, // 'B' 41 | 0x01,0xFC,0x01,0xFF,0xE1,0xFF,0xF8,0xFF,0xFC,0x3F,0x07,0x1F,0x80,0x07,0xC0,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0x7C,0x00,0x1F,0x80,0x07,0xF0,0x30,0xFF,0xFC,0x1F,0xFF,0x03,0xFF,0xC0,0x3F,0xC0, // 'C' 42 | 0xFF,0xE0,0x0F,0xFF,0xC0,0xFF,0xFE,0x0F,0xFF,0xF0,0xF8,0x3F,0x8F,0x80,0xFC,0xF8,0x07,0xCF,0x80,0x7E,0xF8,0x03,0xEF,0x80,0x3E,0xF8,0x03,0xEF,0x80,0x3E,0xF8,0x03,0xEF,0x80,0x3E,0xF8,0x03,0xEF,0x80,0x7E,0xF8,0x07,0xCF,0x80,0xFC,0xF8,0x3F,0x8F,0xFF,0xF0,0xFF,0xFE,0x0F,0xFF,0xC0,0xFF,0xE0,0x00, // 'D' 43 | 0xFF,0xFB,0xFF,0xEF,0xFF,0xBF,0xFE,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xFF,0xEF,0xFF,0xBF,0xFE,0xFF,0xFB,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3F,0xFE,0xFF,0xFB,0xFF,0xEF,0xFF,0x80, // 'E' 44 | 0xFF,0xFB,0xFF,0xEF,0xFF,0xBF,0xFE,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0xFF,0xBF,0xFE,0xFF,0xFB,0xFF,0xEF,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x00, // 'F' 45 | 0x00,0xFF,0x00,0xFF,0xF8,0x3F,0xFF,0x0F,0xFF,0xE3,0xF8,0x18,0xFC,0x00,0x1F,0x00,0x07,0xE0,0x00,0xF8,0x00,0x1F,0x00,0x03,0xE1,0xFF,0x7C,0x3F,0xEF,0x87,0xFD,0xF0,0xFF,0xBE,0x00,0xF7,0xC0,0x1E,0x7C,0x03,0xCF,0xC0,0x79,0xFC,0x0F,0x1F,0xFF,0xE1,0xFF,0xFC,0x1F,0xFF,0x80,0x7F,0x80, // 'G' 46 | 0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0xFF,0xFB,0xFF,0xFF,0x7F,0xFF,0xEF,0xFF,0xFD,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF0, // 'H' 47 | 0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0x80, // 'I' 48 | 0x07,0xC0,0xF8,0x1F,0x03,0xE0,0x7C,0x0F,0x81,0xF0,0x3E,0x07,0xC0,0xF8,0x1F,0x03,0xE0,0x7C,0x0F,0x81,0xF0,0x3E,0x07,0xC0,0xF8,0x1F,0x03,0xE0,0x7C,0x0F,0x81,0xF0,0x3E,0x0F,0x81,0xF3,0xFE,0x7F,0x8F,0xE1,0xF8,0x00, // 'J' 49 | 0xF8,0x0F,0xDF,0x03,0xF3,0xE0,0x7C,0x7C,0x1F,0x0F,0x87,0xE1,0xF1,0xF8,0x3E,0x3E,0x07,0xCF,0x80,0xFB,0xE0,0x1F,0xFC,0x03,0xFF,0x00,0x7F,0xF0,0x0F,0xFF,0x01,0xFB,0xE0,0x3E,0x7E,0x07,0xC7,0xC0,0xF8,0x7C,0x1F,0x0F,0xC3,0xE0,0xF8,0x7C,0x1F,0x8F,0x81,0xF1,0xF0,0x1F,0x3E,0x03,0xF0, // 'K' 50 | 0xF8,0x01,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x03,0xE0,0x07,0xFF,0xEF,0xFF,0xDF,0xFF,0xBF,0xFF,0x00, // 'L' 51 | 0xFE,0x00,0x7F,0x7F,0x00,0x3F,0xBF,0x80,0x1F,0xDF,0xE0,0x1F,0xEF,0xF0,0x0F,0xF7,0xF8,0x07,0xFB,0xDC,0x07,0xBD,0xEF,0x03,0xDE,0xF7,0x81,0xEF,0x7B,0xC1,0xE7,0xBC,0xF0,0xF3,0xDE,0x78,0x79,0xEF,0x3C,0x38,0xF7,0x8F,0x3C,0x7B,0xC7,0x9E,0x3D,0xE3,0xCE,0x1E,0xF0,0xEF,0x0F,0x78,0x7F,0x87,0xBC,0x3F,0x83,0xDE,0x1F,0xC1,0xEF,0x07,0xE0,0xF7,0x83,0xE0,0x7B,0xC1,0xF0,0x3C, // 'M' 52 | 0xFC,0x00,0xF7,0xF0,0x07,0xBF,0x80,0x3D,0xFE,0x01,0xEF,0xF8,0x0F,0x7F,0xC0,0x7B,0xDF,0x03,0xDE,0xF8,0x1E,0xF3,0xE0,0xF7,0x9F,0x07,0xBC,0x7C,0x3D,0xE3,0xF1,0xEF,0x0F,0x8F,0x78,0x3E,0x7B,0xC1,0xF3,0xDE,0x07,0xDE,0xF0,0x3E,0xF7,0x80,0xFF,0xBC,0x07,0xFD,0xE0,0x1F,0xEF,0x00,0x7F,0x78,0x03,0xFB,0xC0,0x0F,0xC0, // 'N' 53 | 0x01,0xFC,0x00,0x3F,0xFE,0x01,0xFF,0xFC,0x0F,0xFF,0xF8,0x7F,0x07,0xF1,0xF8,0x0F,0xC7,0xC0,0x1F,0x3F,0x00,0x7E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x3E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x7E,0x7C,0x01,0xF1,0xF8,0x0F,0xC7,0xF0,0x7F,0x0F,0xFF,0xF8,0x1F,0xFF,0xC0,0x3F,0xFE,0x00,0x1F,0xC0,0x00, // 'O' 54 | 0xFF,0xE0,0x7F,0xFC,0x3F,0xFF,0x1F,0xFF,0xCF,0x87,0xE7,0xC1,0xF3,0xE0,0x7D,0xF0,0x3E,0xF8,0x1E,0x7C,0x1F,0x3E,0x1F,0x9F,0xFF,0xCF,0xFF,0xC7,0xFF,0xC3,0xFF,0x81,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x00, // 'P' 55 | 0x01,0xFC,0x00,0x3F,0xFE,0x01,0xFF,0xFC,0x0F,0xFF,0xF8,0x7F,0x07,0xF1,0xF8,0x0F,0xC7,0xC0,0x1F,0x3F,0x00,0x7E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x3E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x7E,0x7C,0x01,0xF1,0xF8,0x0F,0xC7,0xF0,0x7F,0x0F,0xFF,0xF8,0x1F,0xFF,0xC0,0x3F,0xFE,0x00,0x1F,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0xFE, // 'Q' 56 | 0xFF,0xE0,0x1F,0xFF,0x03,0xFF,0xF0,0x7F,0xFF,0x0F,0x87,0xE1,0xF0,0x7C,0x3E,0x07,0xC7,0xC0,0xF8,0xF8,0x3E,0x1F,0x0F,0xC3,0xFF,0xF0,0x7F,0xFC,0x0F,0xFF,0x01,0xFF,0xE0,0x3E,0x3C,0x07,0xC7,0xC0,0xF8,0x7C,0x1F,0x0F,0x83,0xE0,0xF8,0x7C,0x0F,0x8F,0x81,0xF1,0xF0,0x1F,0x3E,0x03,0xF0, // 'R' 57 | 0x0F,0xE0,0x3F,0xFC,0x7F,0xFC,0xFF,0xFC,0xFC,0x18,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFC,0x00,0x7F,0x00,0x7F,0xC0,0x1F,0xF0,0x0F,0xF8,0x03,0xFC,0x00,0xFC,0x00,0x3E,0x00,0x3E,0x00,0x3E,0xE0,0x7C,0xFF,0xFC,0xFF,0xF8,0xFF,0xF0,0x3F,0xC0, // 'S' 58 | 0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xFB,0xFF,0xFE,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00, // 'T' 59 | 0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0x00,0xFB,0xF8,0x7E,0x3F,0xFF,0xC3,0xFF,0xF0,0x3F,0xFC,0x01,0xFE,0x00, // 'U' 60 | 0xF8,0x00,0xF9,0xE0,0x03,0xE7,0xC0,0x1F,0x1F,0x00,0x7C,0x3C,0x01,0xE0,0xF8,0x0F,0x83,0xE0,0x3E,0x07,0x80,0xF0,0x1F,0x07,0xC0,0x7C,0x1F,0x00,0xF0,0x78,0x03,0xE3,0xE0,0x0F,0x8F,0x80,0x1E,0x3C,0x00,0x79,0xF0,0x01,0xF7,0xC0,0x03,0xDE,0x00,0x0F,0x78,0x00,0x3D,0xE0,0x00,0x7F,0x00,0x01,0xFC,0x00,0x07,0xF0,0x00,0x0F,0x80,0x00, // 'V' 61 | 0xF8,0x07,0xC0,0x3E,0xF8,0x07,0xC0,0x3E,0x78,0x07,0xC0,0x3C,0x7C,0x0F,0xE0,0x7C,0x7C,0x0F,0xE0,0x7C,0x7C,0x0F,0xE0,0x7C,0x3C,0x0E,0xE0,0x78,0x3E,0x1E,0xF0,0xF8,0x3E,0x1E,0xF0,0xF8,0x3E,0x1E,0xF0,0xF8,0x1E,0x3E,0xF8,0xF0,0x1E,0x3C,0x78,0xF0,0x1F,0x3C,0x79,0xF0,0x1F,0x3C,0x79,0xF0,0x0F,0x7C,0x79,0xE0,0x0F,0x78,0x3D,0xE0,0x0F,0x78,0x3F,0xE0,0x0F,0xF8,0x3F,0xE0,0x07,0xF8,0x1F,0xC0,0x07,0xF0,0x1F,0xC0,0x07,0xF0,0x1F,0xC0,0x07,0xF0,0x1F,0xC0,0x03,0xE0,0x0F,0x80, // 'W' 62 | 0x7C,0x01,0xF1,0xF8,0x0F,0xC3,0xE0,0x3E,0x07,0xC1,0xF0,0x1F,0x07,0xC0,0x3E,0x3E,0x00,0x7C,0xF0,0x01,0xF7,0xC0,0x03,0xFE,0x00,0x0F,0xF8,0x00,0x1F,0xC0,0x00,0x7F,0x00,0x01,0xFC,0x00,0x0F,0xF8,0x00,0x7F,0xE0,0x01,0xF7,0xC0,0x0F,0x8F,0x80,0x7C,0x3E,0x01,0xF0,0x7C,0x0F,0x81,0xF8,0x3E,0x03,0xE1,0xF0,0x07,0xCF,0xC0,0x1F,0x80, // 'X' 63 | 0xFC,0x03,0xF3,0xE0,0x1F,0x1F,0x81,0xF8,0x7C,0x0F,0x83,0xF0,0xFC,0x0F,0x87,0xC0,0x7E,0x7C,0x01,0xF3,0xE0,0x07,0xFE,0x00,0x3F,0xF0,0x00,0xFF,0x00,0x07,0xF8,0x00,0x1F,0x80,0x00,0xFC,0x00,0x03,0xC0,0x00,0x1E,0x00,0x00,0xF0,0x00,0x07,0x80,0x00,0x3C,0x00,0x01,0xE0,0x00,0x0F,0x00,0x00,0x78,0x00,0x03,0xC0,0x00, // 'Y' 64 | 0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xFB,0xFF,0xFE,0x00,0x1F,0x00,0x0F,0x80,0x07,0xE0,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3F,0x00,0x0F,0x80,0x07,0xC0,0x03,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x80,0x07,0xC0,0x03,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xF8, // 'Z' 65 | 0xFF,0x7F,0xBF,0xDE,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x7F,0xBF,0xDF,0xE0, // '[' 66 | 0xF8,0x01,0xE0,0x07,0x80,0x1F,0x00,0x3C,0x00,0xF8,0x01,0xE0,0x07,0x80,0x1F,0x00,0x3C,0x00,0xF0,0x03,0xE0,0x07,0x80,0x1E,0x00,0x7C,0x00,0xF0,0x03,0xC0,0x0F,0x80,0x1E,0x00,0x7C,0x00,0xF0,0x03,0xC0,0x0F,0x80, // '\' 67 | 0xFF,0x7F,0xBF,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x7F,0xBF,0xDF,0xE0, // ']' 68 | 0x01,0x80,0x00,0xF0,0x00,0x3C,0x00,0x1F,0x80,0x07,0xF0,0x03,0xDC,0x00,0xE7,0x80,0x39,0xE0,0x1E,0x3C,0x07,0x0F,0x03,0xC1,0xE0,0xE0,0x78,0x78,0x0F,0x1C,0x03,0xCF,0x00,0x78, // '^' 69 | 0xFF,0xFB,0xFF,0xE0, // '_' 70 | 0xFC,0x1F,0x03,0xE0,0x3C,0x07,0x80, // '`' 71 | 0x07,0xF0,0x1F,0xFE,0x0F,0xFF,0x83,0xFF,0xC1,0x83,0xE0,0x00,0xF8,0x00,0x7C,0x1F,0xFE,0x3F,0xFF,0x3F,0xFF,0x9F,0x07,0xDF,0x03,0xEF,0xC3,0xF7,0xFF,0xF9,0xFF,0xBC,0x7F,0x9E,0x1F,0x0F,0x00, // 'a' 72 | 0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE3,0xE0,0xF7,0xF8,0x7F,0xFE,0x3F,0xFF,0x9F,0x8F,0xCF,0x83,0xE7,0x81,0xF3,0xC0,0x7D,0xE0,0x3E,0xF0,0x1F,0x78,0x1F,0x3E,0x0F,0x9F,0x8F,0xCF,0xFF,0xE7,0xFF,0xE3,0xDF,0xE1,0xC7,0xE0, // 'b' 73 | 0x07,0xF0,0x3F,0xF8,0xFF,0xF1,0xFF,0xC7,0xE1,0x8F,0x80,0x1F,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x01,0xF0,0x03,0xE0,0x07,0xE0,0x8F,0xFF,0x0F,0xFE,0x0F,0xFC,0x07,0xF0, // 'c' 74 | 0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x3F,0x3E,0x1F,0xEF,0x8F,0xFF,0xE7,0xFF,0xF9,0xF8,0x7E,0x7C,0x1F,0x9F,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0x9E,0x03,0xE7,0xC0,0xF9,0xF8,0x7E,0x7F,0xFF,0x8F,0xFF,0xE1,0xFE,0xF8,0x3E,0x1E, // 'd' 75 | 0x07,0xF0,0x03,0xFF,0x03,0xFF,0xE0,0xF8,0x7C,0x7C,0x0F,0x1F,0x03,0xC7,0x80,0xFB,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xE7,0x80,0x01,0xF0,0x00,0x7E,0x03,0x0F,0xFF,0xC3,0xFF,0xF0,0x3F,0xFC,0x03,0xFC,0x00, // 'e' 76 | 0x07,0xF0,0xFF,0x87,0xFC,0x7F,0xE3,0xE0,0x1F,0x00,0xF8,0x0F,0xFC,0xFF,0xE7,0xFF,0x3F,0xF8,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0, // 'f' 77 | 0x07,0xFF,0xC3,0xFF,0xF8,0xFF,0xFE,0x1F,0x1F,0x07,0xC1,0xF0,0xF8,0x3E,0x1F,0x07,0xC1,0xF1,0xF0,0x3F,0xFE,0x03,0xFF,0x80,0x3F,0xC0,0x0E,0x00,0x03,0xC0,0x00,0x7F,0xF8,0x07,0xFF,0xC0,0x7F,0xFC,0x3F,0xFF,0x8F,0x01,0xF3,0xC0,0x1E,0x78,0x03,0xCF,0x00,0x79,0xF0,0x3F,0x1F,0xFF,0xC1,0xFF,0xE0,0x0F,0xF0,0x00, // 'g' 78 | 0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE3,0xE0,0xF7,0xFC,0x7F,0xFF,0x3F,0xFF,0x9F,0x87,0xCF,0x83,0xF7,0xC0,0xFB,0xC0,0x7D,0xE0,0x3E,0xF0,0x1F,0x78,0x0F,0xBC,0x07,0xDE,0x03,0xEF,0x01,0xF7,0x80,0xFB,0xC0,0x7D,0xE0,0x3E, // 'h' 79 | 0x7B,0xEF,0xBE,0x78,0x00,0x3E,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE, // 'i' 80 | 0x07,0x83,0xE0,0xF8,0x3E,0x07,0x80,0x00,0x00,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0xFF,0xBF,0xCF,0xF3,0xF0, // 'j' 81 | 0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x7C,0xF0,0x3E,0x3C,0x1F,0x0F,0x0F,0x83,0xC7,0xC0,0xF3,0xE0,0x3D,0xF0,0x0F,0xFC,0x03,0xFF,0x00,0xFF,0xE0,0x3F,0x7C,0x0F,0x9F,0x83,0xC3,0xE0,0xF0,0x7C,0x3C,0x0F,0x8F,0x03,0xF3,0xC0,0x7E, // 'k' 82 | 0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE, // 'l' 83 | 0xE3,0xF0,0x7E,0x1E,0xFF,0x1F,0xE3,0xFF,0xF7,0xFE,0x7F,0xFF,0xFF,0xCF,0xC7,0xF0,0xF9,0xF0,0x7E,0x0F,0xBE,0x0F,0x81,0xF7,0x81,0xF0,0x3E,0xF0,0x3E,0x07,0xDE,0x07,0xC0,0xFB,0xC0,0xF8,0x1F,0x78,0x1F,0x03,0xEF,0x03,0xE0,0x7D,0xE0,0x7C,0x0F,0xBC,0x0F,0x81,0xF7,0x81,0xF0,0x3E,0xF0,0x3E,0x07,0xC0, // 'm' 84 | 0xE1,0xF0,0x7B,0xFE,0x3F,0xFF,0x9F,0xFF,0xCF,0xC3,0xE7,0xC1,0xFB,0xE0,0x7D,0xE0,0x3E,0xF0,0x1F,0x78,0x0F,0xBC,0x07,0xDE,0x03,0xEF,0x01,0xF7,0x80,0xFB,0xC0,0x7D,0xE0,0x3E,0xF0,0x1F,0x00, // 'n' 85 | 0x03,0xF0,0x01,0xFF,0x80,0xFF,0xF8,0x1F,0xFF,0x87,0xE1,0xF8,0xF8,0x1F,0x1F,0x03,0xE7,0xC0,0x3C,0xF8,0x07,0xDF,0x00,0xF9,0xF0,0x3E,0x3E,0x07,0xC7,0xE1,0xF8,0x7F,0xFE,0x07,0xFF,0xC0,0x7F,0xE0,0x03,0xF0,0x00, // 'o' 86 | 0xF0,0xF8,0x3E,0xFF,0x0F,0xFF,0xE3,0xFF,0xFC,0xFE,0x3F,0x3F,0x07,0xCF,0x80,0xF3,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x81,0xF3,0xF0,0x7C,0xFE,0x3F,0x3F,0xFF,0xCF,0xFF,0xE3,0xEF,0xF0,0xF9,0xF8,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x00, // 'p' 87 | 0x0F,0xCF,0x87,0xFB,0xE3,0xFF,0xF9,0xFF,0xFE,0x7E,0x1F,0x9F,0x07,0xE7,0xC0,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xE7,0x80,0xF9,0xF0,0x3E,0x7E,0x1F,0x9F,0xFF,0xE3,0xFF,0xF8,0x7F,0xBE,0x0F,0x8F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80, // 'q' 88 | 0xE1,0xEE,0x3E,0xF7,0xEF,0xFE,0xFF,0xAF,0xC0,0xF8,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x00, // 'r' 89 | 0x0F,0xE0,0x7F,0xF1,0xFF,0xE3,0xFF,0xCF,0x83,0x1F,0x00,0x1F,0xC0,0x3F,0xE0,0x1F,0xF0,0x0F,0xF0,0x03,0xF0,0x03,0xEE,0x07,0xDF,0xFF,0x3F,0xFE,0x7F,0xF8,0x3F,0xC0, // 's' 90 | 0x0E,0x00,0xF0,0x07,0x80,0x3C,0x03,0xFF,0x7F,0xFB,0xFF,0xDF,0xFE,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xFF,0x87,0xFC,0x3F,0xE0,0x7E,0x00, // 't' 91 | 0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x81,0xFB,0xE0,0x7E,0x7C,0x3F,0x9F,0xFF,0xE7,0xFF,0xF8,0xFF,0xBE,0x0F,0x87,0x80, // 'u' 92 | 0xF8,0x07,0xCF,0x01,0xF1,0xF0,0x3E,0x3E,0x07,0xC3,0xE1,0xF0,0x7C,0x3E,0x07,0x87,0xC0,0xF9,0xF0,0x1F,0x3E,0x01,0xE7,0x80,0x3F,0xF0,0x07,0xFE,0x00,0x7F,0x80,0x0F,0xF0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00, // 'v' 93 | 0xF8,0x1F,0x03,0xE7,0x81,0xF8,0x3C,0x7C,0x3F,0x87,0xC7,0xC3,0xF8,0x7C,0x3C,0x3B,0x87,0x83,0xC3,0xB8,0x78,0x3E,0x7B,0xCF,0x83,0xE7,0xBC,0xF8,0x1E,0x71,0xCF,0x01,0xE7,0x1C,0xF0,0x1F,0xF1,0xFF,0x00,0xFF,0x1F,0xE0,0x0F,0xE0,0xFE,0x00,0xFE,0x0F,0xE0,0x07,0xE0,0xFC,0x00,0x7E,0x0F,0xC0,0x07,0xC0,0xFC,0x00, // 'w' 94 | 0x7C,0x07,0xC3,0xE0,0xFC,0x3F,0x1F,0x81,0xF1,0xF0,0x0F,0xBE,0x00,0xFF,0xE0,0x07,0xFC,0x00,0x3F,0x80,0x03,0xF8,0x00,0x7F,0xC0,0x07,0xFC,0x00,0xFB,0xE0,0x1F,0xBF,0x01,0xF1,0xF0,0x3E,0x0F,0x87,0xE0,0xFC,0xFC,0x07,0xC0, // 'x' 95 | 0xF8,0x07,0xCF,0x81,0xF1,0xF0,0x3E,0x3E,0x07,0xC3,0xE1,0xF0,0x7C,0x3E,0x07,0x87,0xC0,0xF9,0xF0,0x1F,0x3E,0x01,0xE7,0x80,0x3F,0xF0,0x03,0xFE,0x00,0x7F,0x80,0x0F,0xF0,0x00,0xFE,0x00,0x1F,0x80,0x01,0xF0,0x00,0x3C,0x00,0x0F,0x80,0x01,0xF0,0x00,0x7C,0x00,0xFF,0x80,0x1F,0xE0,0x03,0xF8,0x00,0x7C,0x00,0x00, // 'y' 96 | 0xFF,0xFD,0xFF,0xFB,0xFF,0xF7,0xFF,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x1F,0x00,0x7C,0x01,0xF0,0x07,0xC0,0x1F,0xFF,0xBF,0xFF,0x7F,0xFE,0xFF,0xFC, // 'z' 97 | 0x03,0xE0,0x7E,0x0F,0xE0,0xFE,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x01,0xF0,0xFE,0x0F,0xC0,0xFC,0x0F,0xE0,0x3F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0xE0,0xFE,0x07,0xE0,0x3E, // '{' 98 | 0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xC0, // '|' 99 | 0xF8,0x0F,0xC0,0xFE,0x0F,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xF0,0x0F,0xE0,0x7E,0x07,0xE0,0xFE,0x1F,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0xFE,0x0F,0xE0,0xFC,0x0F,0x80 // '}' 100 | }; 101 | const GFXglyph Open_Sans_Bold_32Glyphs[] PROGMEM = { 102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset 103 | { 0, 1, 1, 9, 0, 0 }, // ' ' 104 | { 1, 6, 23, 10, 2, -23 }, // '!' 105 | { 19, 12, 8, 16, 2, -23 }, // '"' 106 | { 31, 20, 23, 22, 1, -23 }, // '#' 107 | { 89, 17, 26, 19, 1, -24 }, // '$' 108 | { 145, 28, 23, 30, 1, -23 }, // '%' 109 | { 226, 24, 23, 25, 1, -23 }, // '&' 110 | { 295, 5, 8, 10, 2, -23 }, // ''' 111 | { 300, 10, 28, 12, 1, -23 }, // '(' 112 | { 335, 10, 28, 12, 1, -23 }, // ')' 113 | { 370, 16, 15, 18, 1, -24 }, // '*' 114 | { 400, 17, 15, 19, 1, -19 }, // '+' 115 | { 432, 7, 8, 10, 1, -4 }, // ',' 116 | { 439, 9, 4, 11, 1, -11 }, // '-' 117 | { 444, 6, 5, 10, 2, -5 }, // '.' 118 | { 448, 14, 23, 14, 0, -23 }, // '/' 119 | { 489, 17, 23, 19, 1, -23 }, // '0' 120 | { 538, 12, 23, 19, 2, -23 }, // '1' 121 | { 573, 17, 23, 19, 1, -23 }, // '2' 122 | { 622, 17, 23, 19, 1, -23 }, // '3' 123 | { 671, 18, 23, 19, 1, -23 }, // '4' 124 | { 723, 16, 23, 19, 2, -23 }, // '5' 125 | { 769, 17, 23, 19, 1, -23 }, // '6' 126 | { 818, 17, 23, 19, 1, -23 }, // '7' 127 | { 867, 17, 23, 19, 1, -23 }, // '8' 128 | { 916, 17, 23, 19, 1, -23 }, // '9' 129 | { 965, 6, 17, 10, 2, -17 }, // ':' 130 | { 978, 7, 21, 10, 1, -17 }, // ';' 131 | { 997, 17, 17, 19, 1, -20 }, // '<' 132 | { 1034, 17, 9, 19, 1, -16 }, // '=' 133 | { 1054, 17, 17, 19, 1, -20 }, // '>' 134 | { 1091, 15, 23, 16, 0, -23 }, // '?' 135 | { 1135, 26, 25, 30, 2, -23 }, // '@' 136 | { 1217, 23, 23, 23, 0, -23 }, // 'A' 137 | { 1284, 18, 23, 23, 3, -23 }, // 'B' 138 | { 1336, 18, 23, 21, 2, -23 }, // 'C' 139 | { 1388, 20, 23, 25, 3, -23 }, // 'D' 140 | { 1446, 14, 23, 19, 3, -23 }, // 'E' 141 | { 1487, 14, 23, 19, 3, -23 }, // 'F' 142 | { 1528, 19, 23, 24, 2, -23 }, // 'G' 143 | { 1583, 19, 23, 25, 3, -23 }, // 'H' 144 | { 1638, 6, 23, 12, 3, -23 }, // 'I' 145 | { 1656, 11, 30, 12, -2, -23 }, // 'J' 146 | { 1698, 19, 23, 22, 3, -23 }, // 'K' 147 | { 1753, 15, 23, 19, 3, -23 }, // 'L' 148 | { 1797, 25, 23, 31, 3, -23 }, // 'M' 149 | { 1869, 21, 23, 27, 3, -23 }, // 'N' 150 | { 1930, 22, 23, 26, 2, -23 }, // 'O' 151 | { 1994, 17, 23, 21, 3, -23 }, // 'P' 152 | { 2043, 22, 28, 26, 2, -23 }, // 'Q' 153 | { 2120, 19, 23, 22, 3, -23 }, // 'R' 154 | { 2175, 16, 23, 19, 2, -23 }, // 'S' 155 | { 2221, 18, 23, 20, 1, -23 }, // 'T' 156 | { 2273, 19, 23, 25, 3, -23 }, // 'U' 157 | { 2328, 22, 23, 22, 0, -23 }, // 'V' 158 | { 2392, 32, 23, 32, 0, -23 }, // 'W' 159 | { 2484, 22, 23, 22, 0, -23 }, // 'X' 160 | { 2548, 21, 23, 21, 0, -23 }, // 'Y' 161 | { 2609, 18, 23, 20, 1, -23 }, // 'Z' 162 | { 2661, 9, 28, 12, 2, -23 }, // '[' 163 | { 2693, 14, 23, 14, 0, -23 }, // '\' 164 | { 2734, 9, 28, 12, 1, -23 }, // ']' 165 | { 2766, 18, 15, 18, 0, -23 }, // '^' 166 | { 2800, 14, 2, 14, 0, 3 }, // '_' 167 | { 2804, 10, 5, 20, 5, -24 }, // '`' 168 | { 2811, 17, 17, 20, 1, -17 }, // 'a' 169 | { 2848, 17, 24, 21, 3, -24 }, // 'b' 170 | { 2899, 15, 17, 17, 1, -17 }, // 'c' 171 | { 2931, 18, 24, 21, 1, -24 }, // 'd' 172 | { 2985, 18, 17, 20, 1, -17 }, // 'e' 173 | { 3024, 13, 24, 13, 1, -24 }, // 'f' 174 | { 3063, 19, 25, 19, 0, -17 }, // 'g' 175 | { 3123, 17, 24, 22, 3, -24 }, // 'h' 176 | { 3174, 6, 24, 11, 2, -24 }, // 'i' 177 | { 3192, 10, 32, 11, -2, -24 }, // 'j' 178 | { 3232, 18, 24, 21, 3, -24 }, // 'k' 179 | { 3286, 5, 24, 11, 3, -24 }, // 'l' 180 | { 3301, 27, 17, 32, 3, -17 }, // 'm' 181 | { 3359, 17, 17, 22, 3, -17 }, // 'n' 182 | { 3396, 19, 17, 21, 1, -17 }, // 'o' 183 | { 3437, 18, 25, 21, 2, -17 }, // 'p' 184 | { 3494, 18, 25, 21, 1, -17 }, // 'q' 185 | { 3551, 12, 17, 16, 3, -17 }, // 'r' 186 | { 3577, 15, 17, 17, 1, -17 }, // 's' 187 | { 3609, 13, 21, 15, 1, -21 }, // 't' 188 | { 3644, 18, 17, 22, 2, -17 }, // 'u' 189 | { 3683, 19, 17, 19, 0, -17 }, // 'v' 190 | { 3724, 28, 17, 28, 0, -17 }, // 'w' 191 | { 3784, 20, 17, 20, 0, -17 }, // 'x' 192 | { 3827, 19, 25, 19, 0, -17 }, // 'y' 193 | { 3887, 15, 17, 17, 1, -17 }, // 'z' 194 | { 3919, 12, 28, 14, 1, -23 }, // '{' 195 | { 3961, 5, 31, 19, 7, -24 }, // '|' 196 | { 3981, 12, 28, 14, 1, -23 } // '}' 197 | }; 198 | const GFXfont Open_Sans_Bold_32 PROGMEM = { 199 | (uint8_t *)Open_Sans_Bold_32Bitmaps,(GFXglyph *)Open_Sans_Bold_32Glyphs,0x20, 0x7E, 45}; 200 | 201 | -------------------------------------------------------------------------------- /examples/m5stickc_telegram_bot/Open_Sans_Bold_32.h: -------------------------------------------------------------------------------- 1 | // Created by http://oleddisplay.squix.ch/ Consider a donation 2 | // In case of problems make sure that you are using the font file with the correct version! 3 | const uint8_t Open_Sans_Bold_32Bitmaps[] PROGMEM = { 4 | 5 | // Bitmap Data: 6 | 0x00, // ' ' 7 | 0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0x79,0xE7,0x80,0x00,0x07,0x3E,0xFB,0xE7,0x00, // '!' 8 | 0xF1,0xEF,0x1E,0xF1,0xEF,0x1E,0xF1,0xE7,0x0E,0x70,0xE7,0x0E, // '"' 9 | 0x01,0xC7,0x80,0x3C,0x70,0x03,0xC7,0x00,0x38,0x70,0x03,0x8F,0x00,0x38,0xF0,0x7F,0xFF,0xE7,0xFF,0xFE,0x7F,0xFF,0xE0,0x71,0xE0,0x07,0x1E,0x00,0xF1,0xC0,0x0F,0x1C,0x0F,0xFF,0xFC,0xFF,0xFF,0xCF,0xFF,0xFC,0x1E,0x38,0x01,0xE3,0x80,0x1C,0x38,0x01,0xC7,0x80,0x1C,0x78,0x01,0xC7,0x80,0x3C,0x70,0x00, // '#' 10 | 0x01,0x80,0x00,0xC0,0x01,0xFE,0x03,0xFF,0xC7,0xFF,0xE3,0xFF,0xF3,0xF6,0x31,0xF3,0x00,0xF9,0x80,0x3F,0xC0,0x1F,0xE0,0x07,0xFC,0x01,0xFF,0x80,0x3F,0xE0,0x07,0xF8,0x03,0x7E,0x01,0x9F,0x40,0xCF,0xBC,0x6F,0xDF,0xFF,0xCF,0xFF,0xE7,0xFF,0xC0,0x7F,0x80,0x03,0x00,0x01,0x80,0x00,0xC0,0x00, // '$' 11 | 0x1F,0x00,0x38,0x03,0xF8,0x07,0x80,0x7F,0xC0,0x70,0x0F,0xBC,0x0F,0x00,0xF1,0xE1,0xE0,0x0F,0x1E,0x1E,0x00,0xF1,0xE3,0xC0,0x0F,0x1E,0x3C,0x00,0xF1,0xE7,0x80,0x0F,0x1E,0x71,0xF0,0xFB,0xCF,0x3F,0x87,0xFC,0xE7,0xFC,0x3F,0x9E,0x7B,0xC1,0xF3,0xCF,0x1E,0x00,0x3C,0xF1,0xE0,0x07,0x8F,0x1E,0x00,0x78,0xF1,0xE0,0x0F,0x0F,0x1E,0x00,0xE0,0xF1,0xE0,0x1E,0x07,0xBE,0x01,0xC0,0x7F,0xC0,0x3C,0x03,0xF8,0x07,0x80,0x1F,0x00, // '%' 12 | 0x03,0xF0,0x00,0x0F,0xFC,0x00,0x1F,0xFE,0x00,0x1F,0xFE,0x00,0x3E,0x3E,0x00,0x3E,0x1E,0x00,0x3E,0x1E,0x00,0x1E,0x3E,0x00,0x1F,0xFC,0x00,0x0F,0xF8,0x00,0x0F,0xF0,0x00,0x1F,0xE0,0x7C,0x3F,0xF0,0x7C,0x7F,0xF8,0xF8,0x7C,0xFC,0xF8,0xF8,0x3F,0xF0,0xF8,0x1F,0xF0,0xFC,0x0F,0xE0,0x7E,0x0F,0xC0,0x7F,0xFF,0xE0,0x3F,0xFF,0xF0,0x1F,0xFE,0xF8,0x07,0xF0,0x7C, // '&' 13 | 0xF7,0xBD,0xEF,0x39,0xCE, // ''' 14 | 0x07,0x83,0xC1,0xE0,0x78,0x3E,0x0F,0x03,0xC1,0xE0,0x78,0x1E,0x07,0x81,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0x78,0x1E,0x07,0x81,0xE0,0x78,0x0F,0x03,0xC0,0xF0,0x1E,0x07,0x80,0xF0,0x1E, // '(' 15 | 0xF0,0x1E,0x07,0xC0,0xF0,0x3E,0x07,0x81,0xE0,0x3C,0x0F,0x03,0xC0,0xF0,0x3C,0x0F,0x03,0xE0,0xF8,0x3E,0x0F,0x03,0xC0,0xF0,0x3C,0x0F,0x07,0x81,0xE0,0xF8,0x3C,0x0F,0x07,0x83,0xC0, // ')' 16 | 0x07,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0xC3,0x86,0xFB,0xBE,0xFF,0xFE,0xFF,0xFE,0x07,0xC0,0x0F,0xE0,0x0E,0xE0,0x1E,0xF0,0x3C,0x78,0x3C,0x78,0x0C,0x20, // '*' 17 | 0x03,0xC0,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x03,0xFF,0xFD,0xFF,0xFE,0xFF,0xFF,0x01,0xE0,0x00,0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00, // '+' 18 | 0x7C,0xF9,0xF3,0xC7,0x8E,0x3C,0x78, // ',' 19 | 0xFF,0x7F,0xBF,0xDF,0xE0, // '-' 20 | 0x73,0xEF,0xBE,0x70, // '.' 21 | 0x00,0xF8,0x03,0xC0,0x0F,0x00,0x7C,0x01,0xE0,0x07,0x80,0x3E,0x00,0xF0,0x07,0xC0,0x1E,0x00,0x78,0x03,0xE0,0x0F,0x00,0x3C,0x01,0xF0,0x07,0x80,0x1E,0x00,0xF8,0x03,0xC0,0x1F,0x00,0x78,0x01,0xE0,0x0F,0x80,0x00, // '/' 22 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x07,0xFF,0x87,0xE7,0xE3,0xE1,0xF1,0xE0,0x79,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBE,0x07,0xDF,0x03,0xEF,0x81,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x3E,0x78,0x1E,0x3E,0x1F,0x1F,0x1F,0x87,0xFF,0x83,0xFF,0xC0,0xFF,0xC0,0x1F,0x80, // '0' 23 | 0x03,0xE0,0x7E,0x0F,0xE1,0xFE,0x7F,0xEF,0xFE,0xFB,0xE7,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0,0x3E,0x03,0xE0, // '1' 24 | 0x07,0xE0,0x1F,0xFC,0x1F,0xFF,0x1F,0xFF,0xC7,0xC3,0xE1,0x81,0xF0,0x00,0x78,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0xFF,0xEF,0xFF,0xF7,0xFF,0xFB,0xFF,0xFC, // '2' 25 | 0x0F,0xE0,0x3F,0xFC,0x3F,0xFF,0x0F,0xFF,0xC3,0x87,0xE1,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x7C,0x07,0xFC,0x03,0xF8,0x01,0xFF,0x00,0xFF,0xC0,0x03,0xF0,0x00,0xFC,0x00,0x3E,0x00,0x1F,0x00,0x1F,0xB8,0x1F,0x9F,0xFF,0xCF,0xFF,0xC7,0xFF,0xC0,0x7F,0x80, // '3' 26 | 0x00,0x7C,0x00,0x3F,0x00,0x0F,0xC0,0x07,0xF0,0x03,0xFC,0x00,0xFF,0x00,0x7F,0xC0,0x3D,0xF0,0x0E,0x7C,0x07,0x9F,0x03,0xC7,0xC0,0xE1,0xF0,0x78,0x7C,0x3C,0x1F,0x0F,0xFF,0xFB,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xE0,0x07,0xC0,0x01,0xF0,0x00,0x7C,0x00,0x1F,0x00,0x07,0xC0, // '4' 27 | 0x7F,0xF8,0x7F,0xF8,0x7F,0xF8,0x7F,0xF8,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFF,0xC0,0xFF,0xF0,0xFF,0xF8,0xFF,0xFC,0x00,0xFC,0x00,0x7C,0x00,0x3E,0x00,0x3E,0x00,0x3C,0x00,0x7C,0xC0,0xFC,0xFF,0xF8,0xFF,0xF8,0xFF,0xF0,0x3F,0x80, // '5' 28 | 0x01,0xFC,0x03,0xFE,0x03,0xFF,0x03,0xFF,0x83,0xF0,0x03,0xE0,0x01,0xF0,0x00,0xF0,0x00,0x79,0xF0,0x7D,0xFE,0x3F,0xFF,0x9F,0xFF,0xCF,0xC3,0xF7,0xC0,0xFB,0xE0,0x7D,0xF0,0x3E,0xF8,0x1F,0x3E,0x0F,0x9F,0x8F,0x87,0xFF,0xC3,0xFF,0xC0,0xFF,0xC0,0x1F,0x80, // '6' 29 | 0xFF,0xFF,0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xE0,0x01,0xE0,0x01,0xF0,0x00,0xF8,0x00,0xF8,0x00,0x7C,0x00,0x7C,0x00,0x3E,0x00,0x1E,0x00,0x1F,0x00,0x0F,0x80,0x0F,0x80,0x07,0xC0,0x07,0xC0,0x03,0xE0,0x03,0xE0,0x01,0xF0,0x00,0xF8,0x00,0xF8,0x00,0x7C,0x00, // '7' 30 | 0x07,0xE0,0x0F,0xFC,0x0F,0xFF,0x0F,0x87,0xC7,0xC3,0xE3,0xC0,0xF1,0xF0,0xF8,0xF8,0x7C,0x3E,0x7C,0x1F,0xFC,0x03,0xFC,0x01,0xFE,0x03,0xFF,0xC3,0xF3,0xF1,0xF0,0xF9,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBE,0x07,0xCF,0x87,0xC7,0xFF,0xE1,0xFF,0xE0,0x3F,0x80, // '8' 31 | 0x07,0xE0,0x0F,0xF8,0x0F,0xFF,0x0F,0xFF,0x87,0xC7,0xE7,0xC1,0xF3,0xE0,0x7D,0xF0,0x3E,0xF8,0x1F,0x7C,0x0F,0xBF,0x0F,0xCF,0xFF,0xE7,0xFF,0xF1,0xFE,0xF8,0x3E,0x78,0x00,0x3C,0x00,0x3E,0x00,0x1F,0x00,0x3F,0x07,0xFF,0x03,0xFF,0x01,0xFF,0x00,0xFE,0x00, // '9' 32 | 0x73,0xEF,0xBE,0x70,0x00,0x00,0x00,0x00,0x00,0x73,0xEF,0xBE,0x70, // ':' 33 | 0x38,0xF9,0xF3,0xE3,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x9F,0x3E,0x78,0xF1,0xC7,0x8F,0x00, // ';' 34 | 0x00,0x03,0x00,0x07,0x80,0x0F,0xC0,0x1F,0xE0,0x3F,0xC0,0x7F,0x80,0xFE,0x01,0xFC,0x00,0xF8,0x00,0x7F,0x80,0x0F,0xF0,0x01,0xFE,0x00,0x3F,0xE0,0x03,0xF8,0x00,0x7C,0x00,0x0E,0x00,0x01,0x00, // '<' 35 | 0xFF,0xFF,0x7F,0xFF,0xBF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFD,0xFF,0xFE,0xFF,0xFF,0x00, // '=' 36 | 0xC0,0x00,0x78,0x00,0x3F,0x00,0x1F,0xE0,0x03,0xFC,0x00,0x7F,0x80,0x07,0xF0,0x00,0xFE,0x00,0x1F,0x00,0x7F,0x80,0xFF,0x01,0xFE,0x07,0xFC,0x07,0xF0,0x03,0xE0,0x01,0xC0,0x00,0x80,0x00,0x00, // '>' 37 | 0x0F,0xE0,0xFF,0xE3,0xFF,0xE3,0xFF,0xE7,0x07,0xC0,0x07,0x80,0x0F,0x00,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x01,0xE0,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x01,0xC0,0x00, // '?' 38 | 0x00,0x7F,0x80,0x00,0x7F,0xFC,0x00,0x7F,0xFF,0x80,0x3F,0x01,0xF8,0x1E,0x00,0x1E,0x0F,0x00,0x03,0xC7,0x83,0xFC,0x79,0xE3,0xFF,0x9E,0xF1,0xFF,0xE3,0xBC,0xF8,0x78,0xEE,0x3C,0x1E,0x3B,0x8E,0x07,0x8E,0xE3,0x81,0xE3,0xB8,0xE0,0x78,0xEE,0x38,0x1E,0x7B,0x8F,0x0F,0x9E,0xE3,0xFF,0xFF,0x3C,0x7F,0xBF,0x87,0x07,0xC3,0xC1,0xE0,0x00,0x00,0x3C,0x00,0x00,0x0F,0xC0,0x1C,0x00,0xFF,0xFF,0x00,0x1F,0xFF,0xC0,0x00,0xFF,0x80,0x00, // '@' 39 | 0x00,0xFC,0x00,0x03,0xF8,0x00,0x07,0xF8,0x00,0x0F,0xF0,0x00,0x3F,0xF0,0x00,0x79,0xE0,0x00,0xF3,0xC0,0x03,0xE7,0xC0,0x07,0x87,0x80,0x0F,0x0F,0x00,0x3E,0x1F,0x00,0x7C,0x3E,0x00,0xF0,0x3C,0x03,0xFF,0xFC,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x3F,0xFF,0xF0,0x7C,0x03,0xE0,0xF0,0x03,0xC3,0xE0,0x07,0xC7,0xC0,0x0F,0x8F,0x80,0x1F,0x3E,0x00,0x1F,0x00, // 'A' 40 | 0xFF,0xF0,0x3F,0xFF,0x8F,0xFF,0xF3,0xFF,0xFC,0xF8,0x1F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x1F,0x3F,0xFF,0x8F,0xFF,0xC3,0xFF,0xF8,0xFF,0xFF,0x3E,0x07,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x81,0xFB,0xFF,0xFE,0xFF,0xFF,0x3F,0xFF,0x8F,0xFF,0x00, // 'B' 41 | 0x01,0xFC,0x01,0xFF,0xE1,0xFF,0xF8,0xFF,0xFC,0x3F,0x07,0x1F,0x80,0x07,0xC0,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0x7C,0x00,0x1F,0x80,0x07,0xF0,0x30,0xFF,0xFC,0x1F,0xFF,0x03,0xFF,0xC0,0x3F,0xC0, // 'C' 42 | 0xFF,0xE0,0x0F,0xFF,0xC0,0xFF,0xFE,0x0F,0xFF,0xF0,0xF8,0x3F,0x8F,0x80,0xFC,0xF8,0x07,0xCF,0x80,0x7E,0xF8,0x03,0xEF,0x80,0x3E,0xF8,0x03,0xEF,0x80,0x3E,0xF8,0x03,0xEF,0x80,0x3E,0xF8,0x03,0xEF,0x80,0x7E,0xF8,0x07,0xCF,0x80,0xFC,0xF8,0x3F,0x8F,0xFF,0xF0,0xFF,0xFE,0x0F,0xFF,0xC0,0xFF,0xE0,0x00, // 'D' 43 | 0xFF,0xFB,0xFF,0xEF,0xFF,0xBF,0xFE,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xFF,0xEF,0xFF,0xBF,0xFE,0xFF,0xFB,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3F,0xFE,0xFF,0xFB,0xFF,0xEF,0xFF,0x80, // 'E' 44 | 0xFF,0xFB,0xFF,0xEF,0xFF,0xBF,0xFE,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0xFF,0xBF,0xFE,0xFF,0xFB,0xFF,0xEF,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x00, // 'F' 45 | 0x00,0xFF,0x00,0xFF,0xF8,0x3F,0xFF,0x0F,0xFF,0xE3,0xF8,0x18,0xFC,0x00,0x1F,0x00,0x07,0xE0,0x00,0xF8,0x00,0x1F,0x00,0x03,0xE1,0xFF,0x7C,0x3F,0xEF,0x87,0xFD,0xF0,0xFF,0xBE,0x00,0xF7,0xC0,0x1E,0x7C,0x03,0xCF,0xC0,0x79,0xFC,0x0F,0x1F,0xFF,0xE1,0xFF,0xFC,0x1F,0xFF,0x80,0x7F,0x80, // 'G' 46 | 0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0xFF,0xFB,0xFF,0xFF,0x7F,0xFF,0xEF,0xFF,0xFD,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF0, // 'H' 47 | 0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0x80, // 'I' 48 | 0x07,0xC0,0xF8,0x1F,0x03,0xE0,0x7C,0x0F,0x81,0xF0,0x3E,0x07,0xC0,0xF8,0x1F,0x03,0xE0,0x7C,0x0F,0x81,0xF0,0x3E,0x07,0xC0,0xF8,0x1F,0x03,0xE0,0x7C,0x0F,0x81,0xF0,0x3E,0x0F,0x81,0xF3,0xFE,0x7F,0x8F,0xE1,0xF8,0x00, // 'J' 49 | 0xF8,0x0F,0xDF,0x03,0xF3,0xE0,0x7C,0x7C,0x1F,0x0F,0x87,0xE1,0xF1,0xF8,0x3E,0x3E,0x07,0xCF,0x80,0xFB,0xE0,0x1F,0xFC,0x03,0xFF,0x00,0x7F,0xF0,0x0F,0xFF,0x01,0xFB,0xE0,0x3E,0x7E,0x07,0xC7,0xC0,0xF8,0x7C,0x1F,0x0F,0xC3,0xE0,0xF8,0x7C,0x1F,0x8F,0x81,0xF1,0xF0,0x1F,0x3E,0x03,0xF0, // 'K' 50 | 0xF8,0x01,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x03,0xE0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x03,0xE0,0x07,0xFF,0xEF,0xFF,0xDF,0xFF,0xBF,0xFF,0x00, // 'L' 51 | 0xFE,0x00,0x7F,0x7F,0x00,0x3F,0xBF,0x80,0x1F,0xDF,0xE0,0x1F,0xEF,0xF0,0x0F,0xF7,0xF8,0x07,0xFB,0xDC,0x07,0xBD,0xEF,0x03,0xDE,0xF7,0x81,0xEF,0x7B,0xC1,0xE7,0xBC,0xF0,0xF3,0xDE,0x78,0x79,0xEF,0x3C,0x38,0xF7,0x8F,0x3C,0x7B,0xC7,0x9E,0x3D,0xE3,0xCE,0x1E,0xF0,0xEF,0x0F,0x78,0x7F,0x87,0xBC,0x3F,0x83,0xDE,0x1F,0xC1,0xEF,0x07,0xE0,0xF7,0x83,0xE0,0x7B,0xC1,0xF0,0x3C, // 'M' 52 | 0xFC,0x00,0xF7,0xF0,0x07,0xBF,0x80,0x3D,0xFE,0x01,0xEF,0xF8,0x0F,0x7F,0xC0,0x7B,0xDF,0x03,0xDE,0xF8,0x1E,0xF3,0xE0,0xF7,0x9F,0x07,0xBC,0x7C,0x3D,0xE3,0xF1,0xEF,0x0F,0x8F,0x78,0x3E,0x7B,0xC1,0xF3,0xDE,0x07,0xDE,0xF0,0x3E,0xF7,0x80,0xFF,0xBC,0x07,0xFD,0xE0,0x1F,0xEF,0x00,0x7F,0x78,0x03,0xFB,0xC0,0x0F,0xC0, // 'N' 53 | 0x01,0xFC,0x00,0x3F,0xFE,0x01,0xFF,0xFC,0x0F,0xFF,0xF8,0x7F,0x07,0xF1,0xF8,0x0F,0xC7,0xC0,0x1F,0x3F,0x00,0x7E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x3E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x7E,0x7C,0x01,0xF1,0xF8,0x0F,0xC7,0xF0,0x7F,0x0F,0xFF,0xF8,0x1F,0xFF,0xC0,0x3F,0xFE,0x00,0x1F,0xC0,0x00, // 'O' 54 | 0xFF,0xE0,0x7F,0xFC,0x3F,0xFF,0x1F,0xFF,0xCF,0x87,0xE7,0xC1,0xF3,0xE0,0x7D,0xF0,0x3E,0xF8,0x1E,0x7C,0x1F,0x3E,0x1F,0x9F,0xFF,0xCF,0xFF,0xC7,0xFF,0xC3,0xFF,0x81,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x00,0x0F,0x80,0x07,0xC0,0x03,0xE0,0x00, // 'P' 55 | 0x01,0xFC,0x00,0x3F,0xFE,0x01,0xFF,0xFC,0x0F,0xFF,0xF8,0x7F,0x07,0xF1,0xF8,0x0F,0xC7,0xC0,0x1F,0x3F,0x00,0x7E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x3E,0xF8,0x00,0xFB,0xE0,0x03,0xEF,0x80,0x0F,0xBE,0x00,0x7E,0x7C,0x01,0xF1,0xF8,0x0F,0xC7,0xF0,0x7F,0x0F,0xFF,0xF8,0x1F,0xFF,0xC0,0x3F,0xFE,0x00,0x1F,0xF0,0x00,0x07,0xE0,0x00,0x0F,0xC0,0x00,0x1F,0x80,0x00,0x3F,0x00,0x00,0xFE, // 'Q' 56 | 0xFF,0xE0,0x1F,0xFF,0x03,0xFF,0xF0,0x7F,0xFF,0x0F,0x87,0xE1,0xF0,0x7C,0x3E,0x07,0xC7,0xC0,0xF8,0xF8,0x3E,0x1F,0x0F,0xC3,0xFF,0xF0,0x7F,0xFC,0x0F,0xFF,0x01,0xFF,0xE0,0x3E,0x3C,0x07,0xC7,0xC0,0xF8,0x7C,0x1F,0x0F,0x83,0xE0,0xF8,0x7C,0x0F,0x8F,0x81,0xF1,0xF0,0x1F,0x3E,0x03,0xF0, // 'R' 57 | 0x0F,0xE0,0x3F,0xFC,0x7F,0xFC,0xFF,0xFC,0xFC,0x18,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFC,0x00,0x7F,0x00,0x7F,0xC0,0x1F,0xF0,0x0F,0xF8,0x03,0xFC,0x00,0xFC,0x00,0x3E,0x00,0x3E,0x00,0x3E,0xE0,0x7C,0xFF,0xFC,0xFF,0xF8,0xFF,0xF0,0x3F,0xC0, // 'S' 58 | 0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xFB,0xFF,0xFE,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00, // 'T' 59 | 0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0x00,0xFB,0xE0,0x1F,0x7C,0x03,0xEF,0x80,0x7D,0xF0,0x0F,0xBE,0x01,0xF7,0xC0,0x3E,0xF8,0x07,0xDF,0x00,0xFB,0xF8,0x7E,0x3F,0xFF,0xC3,0xFF,0xF0,0x3F,0xFC,0x01,0xFE,0x00, // 'U' 60 | 0xF8,0x00,0xF9,0xE0,0x03,0xE7,0xC0,0x1F,0x1F,0x00,0x7C,0x3C,0x01,0xE0,0xF8,0x0F,0x83,0xE0,0x3E,0x07,0x80,0xF0,0x1F,0x07,0xC0,0x7C,0x1F,0x00,0xF0,0x78,0x03,0xE3,0xE0,0x0F,0x8F,0x80,0x1E,0x3C,0x00,0x79,0xF0,0x01,0xF7,0xC0,0x03,0xDE,0x00,0x0F,0x78,0x00,0x3D,0xE0,0x00,0x7F,0x00,0x01,0xFC,0x00,0x07,0xF0,0x00,0x0F,0x80,0x00, // 'V' 61 | 0xF8,0x07,0xC0,0x3E,0xF8,0x07,0xC0,0x3E,0x78,0x07,0xC0,0x3C,0x7C,0x0F,0xE0,0x7C,0x7C,0x0F,0xE0,0x7C,0x7C,0x0F,0xE0,0x7C,0x3C,0x0E,0xE0,0x78,0x3E,0x1E,0xF0,0xF8,0x3E,0x1E,0xF0,0xF8,0x3E,0x1E,0xF0,0xF8,0x1E,0x3E,0xF8,0xF0,0x1E,0x3C,0x78,0xF0,0x1F,0x3C,0x79,0xF0,0x1F,0x3C,0x79,0xF0,0x0F,0x7C,0x79,0xE0,0x0F,0x78,0x3D,0xE0,0x0F,0x78,0x3F,0xE0,0x0F,0xF8,0x3F,0xE0,0x07,0xF8,0x1F,0xC0,0x07,0xF0,0x1F,0xC0,0x07,0xF0,0x1F,0xC0,0x07,0xF0,0x1F,0xC0,0x03,0xE0,0x0F,0x80, // 'W' 62 | 0x7C,0x01,0xF1,0xF8,0x0F,0xC3,0xE0,0x3E,0x07,0xC1,0xF0,0x1F,0x07,0xC0,0x3E,0x3E,0x00,0x7C,0xF0,0x01,0xF7,0xC0,0x03,0xFE,0x00,0x0F,0xF8,0x00,0x1F,0xC0,0x00,0x7F,0x00,0x01,0xFC,0x00,0x0F,0xF8,0x00,0x7F,0xE0,0x01,0xF7,0xC0,0x0F,0x8F,0x80,0x7C,0x3E,0x01,0xF0,0x7C,0x0F,0x81,0xF8,0x3E,0x03,0xE1,0xF0,0x07,0xCF,0xC0,0x1F,0x80, // 'X' 63 | 0xFC,0x03,0xF3,0xE0,0x1F,0x1F,0x81,0xF8,0x7C,0x0F,0x83,0xF0,0xFC,0x0F,0x87,0xC0,0x7E,0x7C,0x01,0xF3,0xE0,0x07,0xFE,0x00,0x3F,0xF0,0x00,0xFF,0x00,0x07,0xF8,0x00,0x1F,0x80,0x00,0xFC,0x00,0x03,0xC0,0x00,0x1E,0x00,0x00,0xF0,0x00,0x07,0x80,0x00,0x3C,0x00,0x01,0xE0,0x00,0x0F,0x00,0x00,0x78,0x00,0x03,0xC0,0x00, // 'Y' 64 | 0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xFB,0xFF,0xFE,0x00,0x1F,0x00,0x0F,0x80,0x07,0xE0,0x01,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3F,0x00,0x0F,0x80,0x07,0xC0,0x03,0xF0,0x00,0xF8,0x00,0x7C,0x00,0x3E,0x00,0x1F,0x80,0x07,0xC0,0x03,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xEF,0xFF,0xF8, // 'Z' 65 | 0xFF,0x7F,0xBF,0xDE,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x7F,0xBF,0xDF,0xE0, // '[' 66 | 0xF8,0x01,0xE0,0x07,0x80,0x1F,0x00,0x3C,0x00,0xF8,0x01,0xE0,0x07,0x80,0x1F,0x00,0x3C,0x00,0xF0,0x03,0xE0,0x07,0x80,0x1E,0x00,0x7C,0x00,0xF0,0x03,0xC0,0x0F,0x80,0x1E,0x00,0x7C,0x00,0xF0,0x03,0xC0,0x0F,0x80, // '\' 67 | 0xFF,0x7F,0xBF,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x07,0x83,0xC1,0xE0,0xF0,0x78,0x3C,0x1E,0x0F,0x7F,0xBF,0xDF,0xE0, // ']' 68 | 0x01,0x80,0x00,0xF0,0x00,0x3C,0x00,0x1F,0x80,0x07,0xF0,0x03,0xDC,0x00,0xE7,0x80,0x39,0xE0,0x1E,0x3C,0x07,0x0F,0x03,0xC1,0xE0,0xE0,0x78,0x78,0x0F,0x1C,0x03,0xCF,0x00,0x78, // '^' 69 | 0xFF,0xFB,0xFF,0xE0, // '_' 70 | 0xFC,0x1F,0x03,0xE0,0x3C,0x07,0x80, // '`' 71 | 0x07,0xF0,0x1F,0xFE,0x0F,0xFF,0x83,0xFF,0xC1,0x83,0xE0,0x00,0xF8,0x00,0x7C,0x1F,0xFE,0x3F,0xFF,0x3F,0xFF,0x9F,0x07,0xDF,0x03,0xEF,0xC3,0xF7,0xFF,0xF9,0xFF,0xBC,0x7F,0x9E,0x1F,0x0F,0x00, // 'a' 72 | 0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE3,0xE0,0xF7,0xF8,0x7F,0xFE,0x3F,0xFF,0x9F,0x8F,0xCF,0x83,0xE7,0x81,0xF3,0xC0,0x7D,0xE0,0x3E,0xF0,0x1F,0x78,0x1F,0x3E,0x0F,0x9F,0x8F,0xCF,0xFF,0xE7,0xFF,0xE3,0xDF,0xE1,0xC7,0xE0, // 'b' 73 | 0x07,0xF0,0x3F,0xF8,0xFF,0xF1,0xFF,0xC7,0xE1,0x8F,0x80,0x1F,0x00,0x7C,0x00,0xF8,0x01,0xF0,0x01,0xF0,0x03,0xE0,0x07,0xE0,0x8F,0xFF,0x0F,0xFE,0x0F,0xFC,0x07,0xF0, // 'c' 74 | 0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x3F,0x3E,0x1F,0xEF,0x8F,0xFF,0xE7,0xFF,0xF9,0xF8,0x7E,0x7C,0x1F,0x9F,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0x9E,0x03,0xE7,0xC0,0xF9,0xF8,0x7E,0x7F,0xFF,0x8F,0xFF,0xE1,0xFE,0xF8,0x3E,0x1E, // 'd' 75 | 0x07,0xF0,0x03,0xFF,0x03,0xFF,0xE0,0xF8,0x7C,0x7C,0x0F,0x1F,0x03,0xC7,0x80,0xFB,0xFF,0xFE,0xFF,0xFF,0xBF,0xFF,0xE7,0x80,0x01,0xF0,0x00,0x7E,0x03,0x0F,0xFF,0xC3,0xFF,0xF0,0x3F,0xFC,0x03,0xFC,0x00, // 'e' 76 | 0x07,0xF0,0xFF,0x87,0xFC,0x7F,0xE3,0xE0,0x1F,0x00,0xF8,0x0F,0xFC,0xFF,0xE7,0xFF,0x3F,0xF8,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0, // 'f' 77 | 0x07,0xFF,0xC3,0xFF,0xF8,0xFF,0xFE,0x1F,0x1F,0x07,0xC1,0xF0,0xF8,0x3E,0x1F,0x07,0xC1,0xF1,0xF0,0x3F,0xFE,0x03,0xFF,0x80,0x3F,0xC0,0x0E,0x00,0x03,0xC0,0x00,0x7F,0xF8,0x07,0xFF,0xC0,0x7F,0xFC,0x3F,0xFF,0x8F,0x01,0xF3,0xC0,0x1E,0x78,0x03,0xCF,0x00,0x79,0xF0,0x3F,0x1F,0xFF,0xC1,0xFF,0xE0,0x0F,0xF0,0x00, // 'g' 78 | 0xF0,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x0F,0x00,0x07,0x80,0x03,0xC0,0x01,0xE3,0xE0,0xF7,0xFC,0x7F,0xFF,0x3F,0xFF,0x9F,0x87,0xCF,0x83,0xF7,0xC0,0xFB,0xC0,0x7D,0xE0,0x3E,0xF0,0x1F,0x78,0x0F,0xBC,0x07,0xDE,0x03,0xEF,0x01,0xF7,0x80,0xFB,0xC0,0x7D,0xE0,0x3E, // 'h' 79 | 0x7B,0xEF,0xBE,0x78,0x00,0x3E,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE,0xFB,0xEF,0xBE, // 'i' 80 | 0x07,0x83,0xE0,0xF8,0x3E,0x07,0x80,0x00,0x00,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0x0F,0x83,0xE0,0xF8,0x3E,0xFF,0xBF,0xCF,0xF3,0xF0, // 'j' 81 | 0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x00,0xF0,0x00,0x3C,0x00,0x0F,0x00,0x03,0xC0,0x7C,0xF0,0x3E,0x3C,0x1F,0x0F,0x0F,0x83,0xC7,0xC0,0xF3,0xE0,0x3D,0xF0,0x0F,0xFC,0x03,0xFF,0x00,0xFF,0xE0,0x3F,0x7C,0x0F,0x9F,0x83,0xC3,0xE0,0xF0,0x7C,0x3C,0x0F,0x8F,0x03,0xF3,0xC0,0x7E, // 'k' 82 | 0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE, // 'l' 83 | 0xE3,0xF0,0x7E,0x1E,0xFF,0x1F,0xE3,0xFF,0xF7,0xFE,0x7F,0xFF,0xFF,0xCF,0xC7,0xF0,0xF9,0xF0,0x7E,0x0F,0xBE,0x0F,0x81,0xF7,0x81,0xF0,0x3E,0xF0,0x3E,0x07,0xDE,0x07,0xC0,0xFB,0xC0,0xF8,0x1F,0x78,0x1F,0x03,0xEF,0x03,0xE0,0x7D,0xE0,0x7C,0x0F,0xBC,0x0F,0x81,0xF7,0x81,0xF0,0x3E,0xF0,0x3E,0x07,0xC0, // 'm' 84 | 0xE1,0xF0,0x7B,0xFE,0x3F,0xFF,0x9F,0xFF,0xCF,0xC3,0xE7,0xC1,0xFB,0xE0,0x7D,0xE0,0x3E,0xF0,0x1F,0x78,0x0F,0xBC,0x07,0xDE,0x03,0xEF,0x01,0xF7,0x80,0xFB,0xC0,0x7D,0xE0,0x3E,0xF0,0x1F,0x00, // 'n' 85 | 0x03,0xF0,0x01,0xFF,0x80,0xFF,0xF8,0x1F,0xFF,0x87,0xE1,0xF8,0xF8,0x1F,0x1F,0x03,0xE7,0xC0,0x3C,0xF8,0x07,0xDF,0x00,0xF9,0xF0,0x3E,0x3E,0x07,0xC7,0xE1,0xF8,0x7F,0xFE,0x07,0xFF,0xC0,0x7F,0xE0,0x03,0xF0,0x00, // 'o' 86 | 0xF0,0xF8,0x3E,0xFF,0x0F,0xFF,0xE3,0xFF,0xFC,0xFE,0x3F,0x3F,0x07,0xCF,0x80,0xF3,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x81,0xF3,0xF0,0x7C,0xFE,0x3F,0x3F,0xFF,0xCF,0xFF,0xE3,0xEF,0xF0,0xF9,0xF8,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x00, // 'p' 87 | 0x0F,0xCF,0x87,0xFB,0xE3,0xFF,0xF9,0xFF,0xFE,0x7E,0x1F,0x9F,0x07,0xE7,0xC0,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xE7,0x80,0xF9,0xF0,0x3E,0x7E,0x1F,0x9F,0xFF,0xE3,0xFF,0xF8,0x7F,0xBE,0x0F,0x8F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80,0x03,0xE0,0x00,0xF8,0x00,0x3E,0x00,0x0F,0x80, // 'q' 88 | 0xE1,0xEE,0x3E,0xF7,0xEF,0xFE,0xFF,0xAF,0xC0,0xF8,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x00, // 'r' 89 | 0x0F,0xE0,0x7F,0xF1,0xFF,0xE3,0xFF,0xCF,0x83,0x1F,0x00,0x1F,0xC0,0x3F,0xE0,0x1F,0xF0,0x0F,0xF0,0x03,0xF0,0x03,0xEE,0x07,0xDF,0xFF,0x3F,0xFE,0x7F,0xF8,0x3F,0xC0, // 's' 90 | 0x0E,0x00,0xF0,0x07,0x80,0x3C,0x03,0xFF,0x7F,0xFB,0xFF,0xDF,0xFE,0x3E,0x01,0xF0,0x0F,0x80,0x7C,0x03,0xE0,0x1F,0x00,0xF8,0x07,0xC0,0x3E,0x01,0xFF,0x87,0xFC,0x3F,0xE0,0x7E,0x00, // 't' 91 | 0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x80,0xFB,0xE0,0x3E,0xF8,0x0F,0xBE,0x03,0xEF,0x81,0xFB,0xE0,0x7E,0x7C,0x3F,0x9F,0xFF,0xE7,0xFF,0xF8,0xFF,0xBE,0x0F,0x87,0x80, // 'u' 92 | 0xF8,0x07,0xCF,0x01,0xF1,0xF0,0x3E,0x3E,0x07,0xC3,0xE1,0xF0,0x7C,0x3E,0x07,0x87,0xC0,0xF9,0xF0,0x1F,0x3E,0x01,0xE7,0x80,0x3F,0xF0,0x07,0xFE,0x00,0x7F,0x80,0x0F,0xF0,0x00,0xFC,0x00,0x1F,0x80,0x03,0xF0,0x00, // 'v' 93 | 0xF8,0x1F,0x03,0xE7,0x81,0xF8,0x3C,0x7C,0x3F,0x87,0xC7,0xC3,0xF8,0x7C,0x3C,0x3B,0x87,0x83,0xC3,0xB8,0x78,0x3E,0x7B,0xCF,0x83,0xE7,0xBC,0xF8,0x1E,0x71,0xCF,0x01,0xE7,0x1C,0xF0,0x1F,0xF1,0xFF,0x00,0xFF,0x1F,0xE0,0x0F,0xE0,0xFE,0x00,0xFE,0x0F,0xE0,0x07,0xE0,0xFC,0x00,0x7E,0x0F,0xC0,0x07,0xC0,0xFC,0x00, // 'w' 94 | 0x7C,0x07,0xC3,0xE0,0xFC,0x3F,0x1F,0x81,0xF1,0xF0,0x0F,0xBE,0x00,0xFF,0xE0,0x07,0xFC,0x00,0x3F,0x80,0x03,0xF8,0x00,0x7F,0xC0,0x07,0xFC,0x00,0xFB,0xE0,0x1F,0xBF,0x01,0xF1,0xF0,0x3E,0x0F,0x87,0xE0,0xFC,0xFC,0x07,0xC0, // 'x' 95 | 0xF8,0x07,0xCF,0x81,0xF1,0xF0,0x3E,0x3E,0x07,0xC3,0xE1,0xF0,0x7C,0x3E,0x07,0x87,0xC0,0xF9,0xF0,0x1F,0x3E,0x01,0xE7,0x80,0x3F,0xF0,0x03,0xFE,0x00,0x7F,0x80,0x0F,0xF0,0x00,0xFE,0x00,0x1F,0x80,0x01,0xF0,0x00,0x3C,0x00,0x0F,0x80,0x01,0xF0,0x00,0x7C,0x00,0xFF,0x80,0x1F,0xE0,0x03,0xF8,0x00,0x7C,0x00,0x00, // 'y' 96 | 0xFF,0xFD,0xFF,0xFB,0xFF,0xF7,0xFF,0xE0,0x0F,0x80,0x3E,0x00,0xF8,0x03,0xE0,0x0F,0x80,0x1F,0x00,0x7C,0x01,0xF0,0x07,0xC0,0x1F,0xFF,0xBF,0xFF,0x7F,0xFE,0xFF,0xFC, // 'z' 97 | 0x03,0xE0,0x7E,0x0F,0xE0,0xFE,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x01,0xF0,0xFE,0x0F,0xC0,0xFC,0x0F,0xE0,0x3F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0x00,0xF0,0x0F,0xE0,0xFE,0x07,0xE0,0x3E, // '{' 98 | 0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7,0xBD,0xEF,0x7B,0xC0, // '|' 99 | 0xF8,0x0F,0xC0,0xFE,0x0F,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xF0,0x0F,0xE0,0x7E,0x07,0xE0,0xFE,0x1F,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0x1E,0x01,0xE0,0xFE,0x0F,0xE0,0xFC,0x0F,0x80 // '}' 100 | }; 101 | const GFXglyph Open_Sans_Bold_32Glyphs[] PROGMEM = { 102 | // bitmapOffset, width, height, xAdvance, xOffset, yOffset 103 | { 0, 1, 1, 9, 0, 0 }, // ' ' 104 | { 1, 6, 23, 10, 2, -23 }, // '!' 105 | { 19, 12, 8, 16, 2, -23 }, // '"' 106 | { 31, 20, 23, 22, 1, -23 }, // '#' 107 | { 89, 17, 26, 19, 1, -24 }, // '$' 108 | { 145, 28, 23, 30, 1, -23 }, // '%' 109 | { 226, 24, 23, 25, 1, -23 }, // '&' 110 | { 295, 5, 8, 10, 2, -23 }, // ''' 111 | { 300, 10, 28, 12, 1, -23 }, // '(' 112 | { 335, 10, 28, 12, 1, -23 }, // ')' 113 | { 370, 16, 15, 18, 1, -24 }, // '*' 114 | { 400, 17, 15, 19, 1, -19 }, // '+' 115 | { 432, 7, 8, 10, 1, -4 }, // ',' 116 | { 439, 9, 4, 11, 1, -11 }, // '-' 117 | { 444, 6, 5, 10, 2, -5 }, // '.' 118 | { 448, 14, 23, 14, 0, -23 }, // '/' 119 | { 489, 17, 23, 19, 1, -23 }, // '0' 120 | { 538, 12, 23, 19, 2, -23 }, // '1' 121 | { 573, 17, 23, 19, 1, -23 }, // '2' 122 | { 622, 17, 23, 19, 1, -23 }, // '3' 123 | { 671, 18, 23, 19, 1, -23 }, // '4' 124 | { 723, 16, 23, 19, 2, -23 }, // '5' 125 | { 769, 17, 23, 19, 1, -23 }, // '6' 126 | { 818, 17, 23, 19, 1, -23 }, // '7' 127 | { 867, 17, 23, 19, 1, -23 }, // '8' 128 | { 916, 17, 23, 19, 1, -23 }, // '9' 129 | { 965, 6, 17, 10, 2, -17 }, // ':' 130 | { 978, 7, 21, 10, 1, -17 }, // ';' 131 | { 997, 17, 17, 19, 1, -20 }, // '<' 132 | { 1034, 17, 9, 19, 1, -16 }, // '=' 133 | { 1054, 17, 17, 19, 1, -20 }, // '>' 134 | { 1091, 15, 23, 16, 0, -23 }, // '?' 135 | { 1135, 26, 25, 30, 2, -23 }, // '@' 136 | { 1217, 23, 23, 23, 0, -23 }, // 'A' 137 | { 1284, 18, 23, 23, 3, -23 }, // 'B' 138 | { 1336, 18, 23, 21, 2, -23 }, // 'C' 139 | { 1388, 20, 23, 25, 3, -23 }, // 'D' 140 | { 1446, 14, 23, 19, 3, -23 }, // 'E' 141 | { 1487, 14, 23, 19, 3, -23 }, // 'F' 142 | { 1528, 19, 23, 24, 2, -23 }, // 'G' 143 | { 1583, 19, 23, 25, 3, -23 }, // 'H' 144 | { 1638, 6, 23, 12, 3, -23 }, // 'I' 145 | { 1656, 11, 30, 12, -2, -23 }, // 'J' 146 | { 1698, 19, 23, 22, 3, -23 }, // 'K' 147 | { 1753, 15, 23, 19, 3, -23 }, // 'L' 148 | { 1797, 25, 23, 31, 3, -23 }, // 'M' 149 | { 1869, 21, 23, 27, 3, -23 }, // 'N' 150 | { 1930, 22, 23, 26, 2, -23 }, // 'O' 151 | { 1994, 17, 23, 21, 3, -23 }, // 'P' 152 | { 2043, 22, 28, 26, 2, -23 }, // 'Q' 153 | { 2120, 19, 23, 22, 3, -23 }, // 'R' 154 | { 2175, 16, 23, 19, 2, -23 }, // 'S' 155 | { 2221, 18, 23, 20, 1, -23 }, // 'T' 156 | { 2273, 19, 23, 25, 3, -23 }, // 'U' 157 | { 2328, 22, 23, 22, 0, -23 }, // 'V' 158 | { 2392, 32, 23, 32, 0, -23 }, // 'W' 159 | { 2484, 22, 23, 22, 0, -23 }, // 'X' 160 | { 2548, 21, 23, 21, 0, -23 }, // 'Y' 161 | { 2609, 18, 23, 20, 1, -23 }, // 'Z' 162 | { 2661, 9, 28, 12, 2, -23 }, // '[' 163 | { 2693, 14, 23, 14, 0, -23 }, // '\' 164 | { 2734, 9, 28, 12, 1, -23 }, // ']' 165 | { 2766, 18, 15, 18, 0, -23 }, // '^' 166 | { 2800, 14, 2, 14, 0, 3 }, // '_' 167 | { 2804, 10, 5, 20, 5, -24 }, // '`' 168 | { 2811, 17, 17, 20, 1, -17 }, // 'a' 169 | { 2848, 17, 24, 21, 3, -24 }, // 'b' 170 | { 2899, 15, 17, 17, 1, -17 }, // 'c' 171 | { 2931, 18, 24, 21, 1, -24 }, // 'd' 172 | { 2985, 18, 17, 20, 1, -17 }, // 'e' 173 | { 3024, 13, 24, 13, 1, -24 }, // 'f' 174 | { 3063, 19, 25, 19, 0, -17 }, // 'g' 175 | { 3123, 17, 24, 22, 3, -24 }, // 'h' 176 | { 3174, 6, 24, 11, 2, -24 }, // 'i' 177 | { 3192, 10, 32, 11, -2, -24 }, // 'j' 178 | { 3232, 18, 24, 21, 3, -24 }, // 'k' 179 | { 3286, 5, 24, 11, 3, -24 }, // 'l' 180 | { 3301, 27, 17, 32, 3, -17 }, // 'm' 181 | { 3359, 17, 17, 22, 3, -17 }, // 'n' 182 | { 3396, 19, 17, 21, 1, -17 }, // 'o' 183 | { 3437, 18, 25, 21, 2, -17 }, // 'p' 184 | { 3494, 18, 25, 21, 1, -17 }, // 'q' 185 | { 3551, 12, 17, 16, 3, -17 }, // 'r' 186 | { 3577, 15, 17, 17, 1, -17 }, // 's' 187 | { 3609, 13, 21, 15, 1, -21 }, // 't' 188 | { 3644, 18, 17, 22, 2, -17 }, // 'u' 189 | { 3683, 19, 17, 19, 0, -17 }, // 'v' 190 | { 3724, 28, 17, 28, 0, -17 }, // 'w' 191 | { 3784, 20, 17, 20, 0, -17 }, // 'x' 192 | { 3827, 19, 25, 19, 0, -17 }, // 'y' 193 | { 3887, 15, 17, 17, 1, -17 }, // 'z' 194 | { 3919, 12, 28, 14, 1, -23 }, // '{' 195 | { 3961, 5, 31, 19, 7, -24 }, // '|' 196 | { 3981, 12, 28, 14, 1, -23 } // '}' 197 | }; 198 | const GFXfont Open_Sans_Bold_32 PROGMEM = { 199 | (uint8_t *)Open_Sans_Bold_32Bitmaps,(GFXglyph *)Open_Sans_Bold_32Glyphs,0x20, 0x7E, 45}; 200 | 201 | -------------------------------------------------------------------------------- /examples/Thermal_Printer_Demo/Thermal_Printer_Demo.ino: -------------------------------------------------------------------------------- 1 | // 2 | // Thermal Printer Demo 3 | // written by Larry Bank 4 | // Copyright (c) 2020 BitBank Software, Inc. 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | // 19 | 20 | #include 21 | static uint8_t ucBuf[48 * 384]; 22 | #define WIDTH 384 23 | #define HEIGHT 240 24 | 25 | // Arduino logo 26 | const byte logo_bmp[] = { 27 | 0x42,0x4d,0xe2,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x6c,0x00, 28 | 0x00,0x00,0xdc,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00, 29 | 0x00,0x00,0x60,0x12,0x00,0x00,0x23,0x2e,0x00,0x00,0x23,0x2e,0x00,0x00,0x02,0x00, 30 | 0x00,0x00,0x02,0x00,0x00,0x00,0x42,0x47,0x52,0x73,0x00,0x00,0x00,0x00,0x00,0x00, 31 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 32 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 33 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00, 34 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, 35 | 0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 36 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 37 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 38 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 39 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 40 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 41 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 42 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 43 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 44 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 45 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 46 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 47 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 48 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 49 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 50 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 51 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 52 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 53 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 54 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 55 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 56 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 57 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 58 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 59 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 60 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 61 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 62 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 63 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 64 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 65 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 66 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 67 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 68 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 69 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 70 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 71 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 72 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 73 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 74 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 75 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 76 | 0xff,0xff,0xff,0xc0,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x07,0xff,0xff, 77 | 0xff,0xf0,0xff,0xff,0xfc,0x0f,0xfc,0x0f,0x81,0xfc,0x07,0xc0,0x00,0xff,0xfe,0x00, 78 | 0x0f,0xf8,0x00,0x00,0x7c,0x0f,0xf0,0x1f,0xf0,0x00,0xff,0xff,0xff,0xf0,0xff,0xff, 79 | 0xfc,0x07,0xfc,0x0f,0x81,0xf8,0x07,0xc0,0x00,0x3f,0xfc,0x00,0x07,0xf8,0x00,0x00, 80 | 0x7c,0x0f,0xf0,0x1f,0xe0,0x00,0x7f,0xff,0xff,0xf0,0xff,0xff,0xfe,0x07,0xf8,0x0f, 81 | 0x81,0xf8,0x0f,0xc0,0x00,0x0f,0xf8,0x00,0x03,0xf8,0x00,0x00,0x7c,0x0f,0xe0,0x1f, 82 | 0xc0,0x00,0x3f,0xff,0xff,0xf0,0xff,0xff,0xfe,0x07,0xf8,0x0f,0x81,0xf0,0x1f,0xc0, 83 | 0x00,0x0f,0xf8,0x00,0x01,0xf8,0x00,0x00,0x7c,0x0f,0xe0,0x1f,0x80,0x00,0x1f,0xff, 84 | 0xff,0xf0,0xff,0xff,0xfe,0x07,0xf8,0x1f,0x81,0xf0,0x1f,0xc0,0x00,0x07,0xf0,0x0e, 85 | 0x01,0xf8,0x00,0x00,0x7c,0x0f,0xc0,0x1f,0x80,0x70,0x1f,0xff,0xff,0xf0,0xff,0xff, 86 | 0xfe,0x00,0x00,0x1f,0x81,0xe0,0x3f,0xc0,0xfc,0x03,0xf0,0x1f,0x81,0xff,0xf0,0x3f, 87 | 0xfc,0x0f,0xc0,0x1f,0x01,0xf8,0x0f,0xff,0xff,0xf0,0xff,0xff,0xff,0x00,0x00,0x1f, 88 | 0x81,0xe0,0x3f,0xc0,0xfe,0x03,0xf0,0x3f,0x80,0xff,0xf0,0x3f,0xfc,0x0f,0x80,0x1f, 89 | 0x01,0xfc,0x0f,0xff,0xff,0xf0,0xff,0xff,0xff,0x00,0x00,0x3f,0x81,0xc0,0x7f,0xc0, 90 | 0xff,0x03,0xf0,0x3f,0x80,0xff,0xf0,0x3f,0xfc,0x0f,0x00,0x1f,0x03,0xfc,0x0f,0xff, 91 | 0xff,0xf0,0xff,0xff,0xff,0x00,0x00,0x3f,0x80,0x00,0x7f,0xc0,0xff,0x01,0xf0,0x3f, 92 | 0xc0,0xff,0xf0,0x3f,0xfc,0x0f,0x00,0x1f,0x03,0xfc,0x07,0xff,0xff,0xf0,0xff,0xff, 93 | 0xff,0x80,0x00,0x3f,0x80,0x00,0x3f,0xc0,0xff,0x01,0xf0,0x3f,0xc0,0xff,0xf0,0x3f, 94 | 0xfc,0x0e,0x00,0x1e,0x03,0xfc,0x07,0xff,0xff,0xf0,0xff,0xff,0xff,0x81,0xe0,0x7f, 95 | 0x80,0x00,0x1f,0xc0,0xff,0x01,0xf0,0x3f,0xc0,0xff,0xf0,0x3f,0xfc,0x0e,0x00,0x1e, 96 | 0x03,0xfc,0x07,0xff,0xff,0xf0,0xff,0xff,0xff,0x81,0xe0,0x7f,0x80,0x00,0x1f,0xc0, 97 | 0xff,0x01,0xf0,0x3f,0xc0,0xff,0xf0,0x3f,0xfc,0x0c,0x08,0x1e,0x03,0xfc,0x07,0xff, 98 | 0xff,0xf0,0xff,0xff,0xff,0xc1,0xe0,0x7f,0x80,0x00,0x0f,0xc0,0xff,0x01,0xf0,0x3f, 99 | 0xc0,0xff,0xf0,0x3f,0xfc,0x0c,0x08,0x1e,0x03,0xfc,0x07,0xff,0xff,0xf0,0xff,0xff, 100 | 0xff,0xc0,0xc0,0xff,0x81,0xf8,0x0f,0xc0,0xff,0x01,0xf0,0x3f,0xc0,0xff,0xf0,0x3f, 101 | 0xfc,0x08,0x18,0x1e,0x03,0xfc,0x07,0xff,0xff,0xf0,0xff,0xff,0xff,0xc0,0xc0,0xff, 102 | 0x81,0xfc,0x07,0xc0,0xff,0x01,0xf0,0x3f,0xc0,0xff,0xf0,0x3f,0xfc,0x08,0x18,0x1e, 103 | 0x03,0xfc,0x07,0xff,0xff,0xf0,0xff,0xff,0xff,0xe0,0xc0,0xff,0x81,0xfc,0x07,0xc0, 104 | 0xff,0x01,0xf0,0x3f,0xc0,0xff,0xf0,0x3f,0xfc,0x00,0x38,0x1f,0x03,0xfc,0x07,0xff, 105 | 0xff,0xf0,0xff,0xff,0xff,0xe0,0xc1,0xff,0x81,0xfc,0x07,0xc0,0xff,0x01,0xf0,0x3f, 106 | 0xc0,0xff,0xf0,0x3f,0xfc,0x00,0x38,0x1f,0x03,0xfc,0x07,0xff,0xff,0xf0,0xff,0xff, 107 | 0xff,0xe0,0x01,0xff,0x81,0xfc,0x07,0xc0,0xfe,0x03,0xf0,0x3f,0xc0,0xff,0xf0,0x3f, 108 | 0xfc,0x00,0x78,0x1f,0x03,0xfc,0x0f,0xff,0xff,0xf0,0xff,0xff,0xff,0xf0,0x01,0xff, 109 | 0x81,0xfc,0x07,0xc0,0xfe,0x03,0xf0,0x3f,0xc0,0xff,0xf0,0x3f,0xfc,0x00,0xf8,0x1f, 110 | 0x01,0xf8,0x0f,0xff,0xff,0xf0,0xff,0xff,0xff,0xf0,0x03,0xff,0x81,0xf8,0x0f,0xc0, 111 | 0xf8,0x03,0xf0,0x3f,0xc0,0xff,0xf0,0x3f,0xfc,0x00,0xf8,0x1f,0x80,0xf8,0x0f,0xff, 112 | 0xff,0xf0,0xff,0xff,0xff,0xf0,0x03,0xff,0x80,0x00,0x0f,0xc0,0x00,0x07,0xf0,0x3f, 113 | 0xc0,0xf8,0x00,0x00,0x7c,0x01,0xf8,0x1f,0x80,0x00,0x1f,0xff,0xff,0xf0,0xff,0xff, 114 | 0xff,0xf0,0x03,0xff,0x80,0x00,0x1f,0xc0,0x00,0x0f,0xf0,0x3f,0xc0,0xf8,0x00,0x00, 115 | 0x7c,0x01,0xf8,0x1f,0xc0,0x00,0x1f,0xff,0xff,0xf0,0xff,0xff,0xff,0xf8,0x07,0xff, 116 | 0x80,0x00,0x1f,0xc0,0x00,0x1f,0xf0,0x3f,0xc0,0xf8,0x00,0x00,0x7c,0x03,0xf8,0x1f, 117 | 0xe0,0x00,0x3f,0xff,0xff,0xf0,0xff,0xff,0xff,0xf8,0x07,0xff,0x80,0x00,0x7f,0xc0, 118 | 0x00,0x3f,0xf0,0x3f,0xc0,0xf8,0x00,0x00,0x7c,0x03,0xf8,0x1f,0xf0,0x00,0x7f,0xff, 119 | 0xff,0xf0,0xff,0xff,0xff,0xf8,0x07,0xff,0x80,0x01,0xff,0xc0,0x01,0xff,0xf0,0x3f, 120 | 0xc0,0xf8,0x00,0x00,0x7c,0x07,0xf8,0x1f,0xf8,0x01,0xff,0xff,0xff,0xf0,0xff,0xff, 121 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 122 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 123 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 124 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 125 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 126 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 127 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 128 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 129 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 130 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 131 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 132 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 133 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 134 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 135 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 136 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 137 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 138 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 139 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 140 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 141 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 142 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 143 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 144 | 0xff,0x80,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x3f,0xff, 145 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00,0x3f, 146 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x01,0xff,0xff,0xff,0xff,0xff, 147 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff, 148 | 0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 149 | 0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0, 150 | 0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xe0, 151 | 0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00, 152 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00, 153 | 0x07,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff, 154 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff, 155 | 0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 156 | 0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xc0,0x00, 157 | 0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xf0,0x00, 158 | 0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00, 159 | 0x01,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00, 160 | 0x00,0x1f,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff, 161 | 0xff,0xf0,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff, 162 | 0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xf0,0xff,0xff, 163 | 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xf8,0x00,0x00, 164 | 0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xfe,0x00,0x00, 165 | 0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 166 | 0x00,0x0f,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, 167 | 0x00,0x00,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff, 168 | 0xff,0xf0,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff, 169 | 0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xf0,0xff,0xff, 170 | 0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0x00,0x00,0x00, 171 | 0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xe0,0x00,0x00, 172 | 0x01,0xff,0xf8,0x00,0x00,0x00,0x1f,0xff,0xfe,0x00,0x00,0x00,0x07,0xff,0xe0,0x00, 173 | 0x00,0x00,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xc0,0x00,0x00,0x0f,0xff,0xff,0x80, 174 | 0x00,0x00,0x0f,0xff,0xfc,0x00,0x00,0x00,0x3f,0xff,0xfe,0x00,0x00,0x00,0xff,0xff, 175 | 0xff,0xf0,0xff,0xff,0xff,0x80,0x00,0x00,0x3f,0xff,0xff,0xe0,0x00,0x00,0x07,0xff, 176 | 0xf8,0x00,0x00,0x01,0xff,0xff,0xff,0x80,0x00,0x00,0x7f,0xff,0xff,0xf0,0xff,0xff, 177 | 0xff,0x00,0x00,0x01,0xff,0xff,0xff,0xfc,0x00,0x00,0x03,0xff,0xf0,0x00,0x00,0x07, 178 | 0xff,0xff,0xff,0xe0,0x00,0x00,0x3f,0xff,0xff,0xf0,0xff,0xff,0xff,0x00,0x00,0x03, 179 | 0xff,0xff,0xff,0xfe,0x00,0x00,0x01,0xff,0xe0,0x00,0x00,0x1f,0xff,0xff,0xff,0xf8, 180 | 0x00,0x00,0x1f,0xff,0xff,0xf0,0xff,0xff,0xfe,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, 181 | 0x80,0x00,0x00,0xff,0xc0,0x00,0x00,0x3f,0xff,0xff,0xff,0xfc,0x00,0x00,0x1f,0xff, 182 | 0xff,0xf0,0xff,0xff,0xfe,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x7f, 183 | 0xc0,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0f,0xff,0xff,0xf0,0xff,0xff, 184 | 0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x3f,0x80,0x00,0x01,0xff, 185 | 0xff,0xff,0xff,0xff,0x80,0x00,0x0f,0xff,0xff,0xf0,0xff,0xff,0xf8,0x00,0x00,0x7f, 186 | 0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x3f,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xff, 187 | 0xc0,0x00,0x07,0xff,0xff,0xf0,0xff,0xff,0xf8,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 188 | 0xfc,0x00,0x00,0x1e,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x07,0xff, 189 | 0xff,0xf0,0xff,0xff,0xf0,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x0e, 190 | 0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x03,0xff,0xff,0xf0,0xff,0xff, 191 | 0xf0,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x04,0x00,0x00,0x3f,0xff, 192 | 0xff,0xff,0xff,0xff,0xf0,0x00,0x03,0xff,0xff,0xf0,0xff,0xff,0xf0,0x00,0x07,0xff, 193 | 0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff, 194 | 0xf8,0x00,0x01,0xff,0xff,0xf0,0xff,0xff,0xe0,0x00,0x07,0xff,0xff,0xff,0xff,0xff, 195 | 0xff,0xc0,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x01,0xff, 196 | 0xff,0xf0,0xff,0xff,0xe0,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00, 197 | 0x00,0x01,0xff,0xff,0xfe,0x01,0xff,0xff,0xfe,0x00,0x00,0xff,0xff,0xf0,0xff,0xff, 198 | 0xe0,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x03,0xff,0xff, 199 | 0xfc,0x01,0xff,0xff,0xfe,0x00,0x00,0xff,0xff,0xf0,0xff,0xff,0xc0,0x00,0x1f,0xff, 200 | 0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x03,0xff,0xff,0xfc,0x01,0xff,0xff, 201 | 0xff,0x00,0x00,0xff,0xff,0xf0,0xff,0xff,0xc0,0x00,0x3f,0xff,0xff,0xff,0xff,0xff, 202 | 0xff,0xfc,0x00,0x00,0x00,0x07,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0x00,0x00,0xff, 203 | 0xff,0xf0,0xff,0xff,0xc0,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00, 204 | 0x00,0x0f,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0x00,0x00,0x7f,0xff,0xf0,0xff,0xff, 205 | 0xc0,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x1f,0xff,0xff, 206 | 0xfc,0x01,0xff,0xff,0xff,0x80,0x00,0x7f,0xff,0xf0,0xff,0xff,0x80,0x00,0x7f,0xff, 207 | 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x1f,0xff,0xff,0xfc,0x01,0xff,0xff, 208 | 0xff,0x80,0x00,0x7f,0xff,0xf0,0xff,0xff,0x80,0x00,0x7f,0xff,0xff,0xff,0xff,0xff, 209 | 0xff,0xff,0x80,0x00,0x00,0x3f,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0x80,0x00,0x7f, 210 | 0xff,0xf0,0xff,0xff,0x80,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00, 211 | 0x00,0x7f,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0xc0,0x00,0x7f,0xff,0xf0,0xff,0xff, 212 | 0x80,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x7f,0xff,0xff, 213 | 0xfc,0x00,0xff,0xff,0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff,0x80,0x00,0x7f,0xff, 214 | 0xc0,0x00,0x00,0x07,0xff,0xff,0xc0,0x00,0x00,0xff,0xff,0xf8,0x00,0x00,0x00,0x7f, 215 | 0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff,0x80,0x00,0xff,0xff,0xc0,0x00,0x00,0x07, 216 | 0xff,0xff,0xe0,0x00,0x01,0xff,0xff,0xf8,0x00,0x00,0x00,0x7f,0xff,0xc0,0x00,0x3f, 217 | 0xff,0xf0,0xff,0xff,0x80,0x00,0xff,0xff,0xc0,0x00,0x00,0x07,0xff,0xff,0xf0,0x00, 218 | 0x01,0xff,0xff,0xf8,0x00,0x00,0x00,0x7f,0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff, 219 | 0x80,0x00,0xff,0xff,0xc0,0x00,0x00,0x07,0xff,0xff,0xf0,0x00,0x03,0xff,0xff,0xf8, 220 | 0x00,0x00,0x00,0x7f,0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff,0x80,0x00,0xff,0xff, 221 | 0xc0,0x00,0x00,0x07,0xff,0xff,0xf0,0x00,0x03,0xff,0xff,0xf8,0x00,0x00,0x00,0x7f, 222 | 0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff,0x80,0x00,0xff,0xff,0xc0,0x00,0x00,0x07, 223 | 0xff,0xff,0xf0,0x00,0x01,0xff,0xff,0xf8,0x00,0x00,0x00,0x7f,0xff,0xc0,0x00,0x3f, 224 | 0xff,0xf0,0xff,0xff,0x80,0x00,0xff,0xff,0xc0,0x00,0x00,0x07,0xff,0xff,0xe0,0x00, 225 | 0x01,0xff,0xff,0xf8,0x00,0x00,0x00,0x7f,0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff, 226 | 0x80,0x00,0xff,0xff,0xc0,0x00,0x00,0x07,0xff,0xff,0xe0,0x00,0x00,0xff,0xff,0xf8, 227 | 0x00,0x00,0x00,0x7f,0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff,0x80,0x00,0x7f,0xff, 228 | 0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0xff,0xff,0xff,0xfc,0x00,0xff,0xff, 229 | 0xff,0xc0,0x00,0x3f,0xff,0xf0,0xff,0xff,0x80,0x00,0x7f,0xff,0xff,0xff,0xff,0xff, 230 | 0xff,0xff,0x80,0x00,0x00,0x7f,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0xc0,0x00,0x7f, 231 | 0xff,0xf0,0xff,0xff,0x80,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00, 232 | 0x00,0x3f,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0x80,0x00,0x7f,0xff,0xf0,0xff,0xff, 233 | 0x80,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x3f,0xff,0xff, 234 | 0xfc,0x01,0xff,0xff,0xff,0x80,0x00,0x7f,0xff,0xf0,0xff,0xff,0x80,0x00,0x3f,0xff, 235 | 0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x1f,0xff,0xff,0xfc,0x01,0xff,0xff, 236 | 0xff,0x80,0x00,0x7f,0xff,0xf0,0xff,0xff,0xc0,0x00,0x3f,0xff,0xff,0xff,0xff,0xff, 237 | 0xff,0xfe,0x00,0x00,0x00,0x0f,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0x80,0x00,0x7f, 238 | 0xff,0xf0,0xff,0xff,0xc0,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00, 239 | 0x00,0x07,0xff,0xff,0xfc,0x01,0xff,0xff,0xff,0x00,0x00,0x7f,0xff,0xf0,0xff,0xff, 240 | 0xc0,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x07,0xff,0xff, 241 | 0xfc,0x01,0xff,0xff,0xff,0x00,0x00,0xff,0xff,0xf0,0xff,0xff,0xc0,0x00,0x1f,0xff, 242 | 0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x03,0xff,0xff,0xfc,0x01,0xff,0xff, 243 | 0xfe,0x00,0x00,0xff,0xff,0xf0,0xff,0xff,0xe0,0x00,0x0f,0xff,0xff,0xff,0xff,0xff, 244 | 0xff,0xe0,0x00,0x00,0x00,0x01,0xff,0xff,0xfe,0x01,0xff,0xff,0xfe,0x00,0x00,0xff, 245 | 0xff,0xf0,0xff,0xff,0xe0,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x00, 246 | 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x01,0xff,0xff,0xf0,0xff,0xff, 247 | 0xf0,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x7f,0xff, 248 | 0xff,0xff,0xff,0xff,0xf8,0x00,0x01,0xff,0xff,0xf0,0xff,0xff,0xf0,0x00,0x03,0xff, 249 | 0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x04,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0xff, 250 | 0xf8,0x00,0x01,0xff,0xff,0xf0,0xff,0xff,0xf0,0x00,0x01,0xff,0xff,0xff,0xff,0xff, 251 | 0xff,0x00,0x00,0x0c,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x03,0xff, 252 | 0xff,0xf0,0xff,0xff,0xf8,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x1e, 253 | 0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xe0,0x00,0x03,0xff,0xff,0xf0,0xff,0xff, 254 | 0xf8,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0x00,0x00,0x07,0xff, 255 | 0xff,0xff,0xff,0xff,0xc0,0x00,0x07,0xff,0xff,0xf0,0xff,0xff,0xfc,0x00,0x00,0x7f, 256 | 0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x3f,0x80,0x00,0x03,0xff,0xff,0xff,0xff,0xff, 257 | 0x80,0x00,0x07,0xff,0xff,0xf0,0xff,0xff,0xfc,0x00,0x00,0x3f,0xff,0xff,0xff,0xff, 258 | 0xe0,0x00,0x00,0x7f,0x80,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0f,0xff, 259 | 0xff,0xf0,0xff,0xff,0xfe,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0xff, 260 | 0xc0,0x00,0x00,0x7f,0xff,0xff,0xff,0xfe,0x00,0x00,0x1f,0xff,0xff,0xf0,0xff,0xff, 261 | 0xff,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xe0,0x00,0x00,0x1f, 262 | 0xff,0xff,0xff,0xf8,0x00,0x00,0x1f,0xff,0xff,0xf0,0xff,0xff,0xff,0x00,0x00,0x01, 263 | 0xff,0xff,0xff,0xfc,0x00,0x00,0x01,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xf0, 264 | 0x00,0x00,0x3f,0xff,0xff,0xf0,0xff,0xff,0xff,0x80,0x00,0x00,0x7f,0xff,0xff,0xf0, 265 | 0x00,0x00,0x03,0xff,0xf8,0x00,0x00,0x03,0xff,0xff,0xff,0xc0,0x00,0x00,0x7f,0xff, 266 | 0xff,0xf0,0xff,0xff,0xff,0xc0,0x00,0x00,0x1f,0xff,0xff,0xc0,0x00,0x00,0x07,0xff, 267 | 0xfc,0x00,0x00,0x00,0x7f,0xff,0xfe,0x00,0x00,0x00,0x7f,0xff,0xff,0xf0,0xff,0xff, 268 | 0xff,0xe0,0x00,0x00,0x03,0xff,0xfe,0x00,0x00,0x00,0x0f,0xff,0xfe,0x00,0x00,0x00, 269 | 0x0f,0xff,0xf0,0x00,0x00,0x00,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xe0,0x00,0x00, 270 | 0x00,0x0f,0x80,0x00,0x00,0x00,0x1f,0xff,0xff,0x00,0x00,0x00,0x00,0x3c,0x00,0x00, 271 | 0x00,0x01,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, 272 | 0x00,0x00,0x3f,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff, 273 | 0xff,0xf0,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff, 274 | 0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xf0,0xff,0xff, 275 | 0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xe0,0x00,0x00, 276 | 0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xfe,0x00,0x00, 277 | 0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00, 278 | 0x00,0x1f,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x00,0x00,0x00, 279 | 0x00,0x07,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xec,0xff, 280 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff, 281 | 0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xcd,0x7f,0xff,0xf0,0xff,0xff, 282 | 0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xff,0x00,0x00, 283 | 0x00,0x00,0x00,0x00,0x01,0xff,0xa1,0x7f,0xff,0xf0,0xff,0xff,0xff,0xff,0xf8,0x00, 284 | 0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x00, 285 | 0x03,0xff,0xa1,0x7f,0xff,0xf0,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x00,0x00, 286 | 0x01,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xad,0x7f, 287 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xff,0xff, 288 | 0xff,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0xe1,0x7f,0xff,0xf0,0xff,0xff, 289 | 0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0xfe,0x00, 290 | 0x00,0x00,0x00,0x00,0x7f,0xff,0xce,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xf0, 291 | 0x00,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x00,0x03, 292 | 0xff,0xff,0xf1,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x03, 293 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff, 294 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x1f,0xff,0xff,0xff,0xff, 295 | 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 296 | 0xff,0xff,0xff,0xff,0xfc,0x00,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 297 | 0xf0,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 298 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 299 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 300 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 301 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 302 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 303 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 304 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 305 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 306 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 307 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 308 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 309 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 310 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 311 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 312 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 313 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 314 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 315 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 316 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 317 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 318 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 319 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 320 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 321 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 322 | 0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 323 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff, 324 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 325 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff, 326 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 327 | 0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 328 | 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 329 | 0xff,0xf0}; 330 | 331 | void setup() { 332 | int i; 333 | // put your setup code here, to run once: 334 | Serial.begin(115200); 335 | while (!Serial); 336 | Serial.println((char *)"Preparing image buffer..."); 337 | tpSetBackBuffer(ucBuf, WIDTH, HEIGHT); 338 | tpFill(0); 339 | for (i=0; i