From 26f49101be7110e17d14a7bab86ee966767a7cd9 Mon Sep 17 00:00:00 2001 From: e2002 Date: Wed, 22 Jun 2022 11:58:37 +0300 Subject: [PATCH] v0.6.313 --- README.md | 12 +- exsamples/myoptions.h | 6 +- yoRadio/display.h | 2 + yoRadio/network.cpp | 8 + yoRadio/network.h | 2 +- yoRadio/options.h | 9 +- yoRadio/player.cpp | 9 +- yoRadio/player.h | 2 +- yoRadio/src/audioI2S/Audio.cpp | 18 +- yoRadio/src/displays/displayILI9225.cpp | 436 +++++++++++++++++++++++ yoRadio/src/displays/displayILI9225.h | 111 ++++++ yoRadio/src/displays/displayILI9341.cpp | 10 +- yoRadio/src/displays/fonts/yofont10x14.c | 278 +++++++++++++++ yoRadio/src/displays/fonts/yofont5x7.c | 275 ++++++++++++++ yoRadio/yoRadio.ino | 3 + 15 files changed, 1158 insertions(+), 23 deletions(-) create mode 100644 yoRadio/src/displays/displayILI9225.cpp create mode 100644 yoRadio/src/displays/displayILI9225.h create mode 100644 yoRadio/src/displays/fonts/yofont10x14.c create mode 100644 yoRadio/src/displays/fonts/yofont5x7.c diff --git a/README.md b/README.md index 3e34fbb..fd2909c 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ https://aliexpress.com/item/32965676064.html - or **GC9106** 0.96' 160x80 SPI (looks like ST7735S, but it's not him) https://aliexpress.com/item/32947890530.html - or **LCD2004** 20x4 I2C https://aliexpress.com/item/32783128355.html - or **LCD2004** 20x4 without I2C https://aliexpress.com/item/32783128355.html +- or **ILI9225** 2.0' 220x176 SPI https://aliexpress.com/item/32952021835.html ##### Controls - Three tact buttons https://www.aliexpress.com/item/32907144687.html @@ -142,7 +143,7 @@ _\** GPIO 16 and 17 are used by PSRAM on the WROVER modules._ --- ## Dependencies #### Libraries: -**Library Manager**: Adafruit_GFX, Adafruit_ST7735\*, Adafruit_SSD1306\*, Adafruit_PCD8544\*, Adafruit_SH110X\*, Adafruit_SSD1327\*, Adafruit_ILI9341\*, Adafruit_SSD1305\*, (\* depending on display model), OneButton, IRremoteESP8266, XPT2046_Touchscreen \ +**Library Manager**: Adafruit_GFX, Adafruit_ST7735\*, Adafruit_SSD1306\*, Adafruit_PCD8544\*, Adafruit_SH110X\*, Adafruit_SSD1327\*, Adafruit_ILI9341\*, Adafruit_SSD1305\*, TFT_22_ILI9225\* (\* depending on display model), OneButton, IRremoteESP8266, XPT2046_Touchscreen \ **Github**: [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer), [AsyncTCP](https://github.com/me-no-dev/AsyncTCP), [async-mqtt-client](https://github.com/marvinroger/async-mqtt-client)* \ \* _if you need MQTT support_ @@ -293,6 +294,15 @@ Work is in progress... --- ## Version history +#### v0.6.313 +- added support for ILI9225 220x176 SPI displays +- added support for I2S internal DAC, option I2S_INTERNAL (see [myoptions.h](exsamples/myoptions.h) for exsample) \ + _(this option worked only with esp32 core version==2.0.0)_ +- new option SOFT_AP_REBOOT_DELAY (see [myoptions.h](exsamples/myoptions.h) for exsample) +- fixed MQTT connection when WiFi reconnected +- fixed date display for ILI9341 displays +- fixed garbage on volume control with displays ILI9341 + #### v0.6.290 - fixed interface blocking error when synchronizing time - time sync optimization diff --git a/exsamples/myoptions.h b/exsamples/myoptions.h index eb4d8fb..9511597 100644 --- a/exsamples/myoptions.h +++ b/exsamples/myoptions.h @@ -19,7 +19,7 @@ The connection tables are located here https://github.com/e2002/yoradio#connecti SDA(MOSI, DIN, SDI) must be connected to pin 23 */ //#define TFT_CS 5 /* SPI CS pin */ //#define TFT_RST 15 /* SPI RST pin. set to -1 and connect to Esp EN pin */ -//#define TFT_DC 4 /* SPI DC pin */ +//#define TFT_DC 4 /* SPI DC/RS pin */ /******************************************/ /* I2C PINS */ @@ -107,7 +107,9 @@ The connection tables are located here https://github.com/e2002/yoradio#connecti //#define MUTE_VAL HIGH /* Write this to MUTE_PIN when player is stopped */ //#define PL_WITH_NUMBERS /* show the number of station in the playlist */ //#define PLAYER_FORCE_MONO false /* mono option on boot - false stereo, true mono */ -//#define SNTP_SERVER "pool.ntp.org", "0.ru.pool.ntp.org" // custom ntp servers min 1 max 3 comma separated values +//#define SNTP_SERVER "pool.ntp.org", "0.ru.pool.ntp.org" /* custom ntp servers min 1 max 3 comma separated values */ +//#define I2S_INTERNAL false /* If true - use esp32 internal DAC */ +//#define SOFT_AP_REBOOT_DELAY 0 /* Delay in milliseconds after which ESP is rebooting if it is in softAP mode (0 - disabled) */ /******************************************/ diff --git a/yoRadio/display.h b/yoRadio/display.h index bf623fe..81974da 100644 --- a/yoRadio/display.h +++ b/yoRadio/display.h @@ -34,6 +34,8 @@ #include "src/displays/displayGC9106.h" #elif DSP_MODEL==DSP_CUSTOM #include "src/displays/displayCustom.h" +#elif DSP_MODEL==DSP_ILI9225 +#include "src/displays/displayILI9225.h" #endif enum displayMode_e { PLAYER, VOL, STATIONS, NUMBERS, LOST, UPDATING }; diff --git a/yoRadio/network.cpp b/yoRadio/network.cpp index bbf2091..f57b834 100644 --- a/yoRadio/network.cpp +++ b/yoRadio/network.cpp @@ -15,6 +15,10 @@ void getFirstTime() { getLocalTime(&network.timeinfo); } +void rebootTime() { + ESP.restart(); +} + void Network::begin() { config.initNetwork(); if (config.ssidsCount == 0) { @@ -57,6 +61,7 @@ void Network::begin() { } digitalWrite(LED_BUILTIN, LOW); status = CONNECTED; + WiFi.setSleep(false); configTime(config.store.tzHour * 3600 + config.store.tzMin * 60, config.getTimezoneOffset(), SNTP_SERVER); //getLocalTime(&timeinfo); stimer.once_ms(200,getFirstTime); @@ -83,4 +88,7 @@ void Network::raiseSoftAP() { WiFi.softAP(apSsid, apPassword); Serial.printf("\n\nRunning in AP mode.\nConnect to AP %s with password %s for settings.\n\n", apSsid, apPassword); status = SOFT_AP; +#if SOFT_AP_REBOOT_DELAY>0 + rtimer.attach_ms(SOFT_AP_REBOOT_DELAY, rebootTime); +#endif } diff --git a/yoRadio/network.h b/yoRadio/network.h index 1b44ef2..0a97ce1 100644 --- a/yoRadio/network.h +++ b/yoRadio/network.h @@ -19,7 +19,7 @@ class Network { void begin(); void requestTimeSync(bool withTelnetOutput=false); private: - Ticker ntimer, stimer; + Ticker ntimer, stimer, rtimer; void raiseSoftAP(); }; diff --git a/yoRadio/options.h b/yoRadio/options.h index b077112..7ab52a0 100644 --- a/yoRadio/options.h +++ b/yoRadio/options.h @@ -1,7 +1,7 @@ #ifndef options_h #define options_h -#define VERSION "0.6.290" +#define VERSION "0.6.313" /******************************************************* DO NOT EDIT THIS FILE. @@ -36,6 +36,7 @@ The connection tables are located here https://github.com/e2002/yoradio#connecti #define DSP_2004I2C 14 // https://aliexpress.com/item/32783128355.html #define DSP_2004 15 // https://aliexpress.com/item/32783128355.html #define DSP_SSD1305I2C 16 // SSD1305 and SSD1309 128x64 I2C https://aliexpress.com/item/32950307344.html +#define DSP_ILI9225 17 // 2.0' 220x176 SPI https://aliexpress.com/item/32952021835.html #define DSP_CUSTOM 101 // your display #ifndef DSP_MODEL @@ -215,6 +216,12 @@ The connection tables are located here https://github.com/e2002/yoradio#connecti #ifndef SNTP_SERVER #define SNTP_SERVER "pool.ntp.org", "0.ru.pool.ntp.org" // custom ntp servers min 1 max 3 comma separated values #endif +#ifndef I2S_INTERNAL + #define I2S_INTERNAL false // If true - use esp32 internal DAC +#endif +#ifndef SOFT_AP_REBOOT_DELAY + #define SOFT_AP_REBOOT_DELAY 0 // Delay in ms after which ESP is rebooting if it is in softAP mode (0 - disabled) +#endif /* *** ST7735 display submodel *** INITR_BLACKTAB // 1.8' https://aliexpress.ru/item/1005002822797745.html diff --git a/yoRadio/player.cpp b/yoRadio/player.cpp index 8d5236c..af0b1a9 100644 --- a/yoRadio/player.cpp +++ b/yoRadio/player.cpp @@ -10,7 +10,7 @@ Player player; -#if VS1053_CS!=255 +#if VS1053_CS!=255 && !I2S_INTERNAL Player::Player(): Audio(VS1053_CS, VS1053_DCS, VS1053_DREQ) { } @@ -22,15 +22,20 @@ void ResetChip(){ delay(100); } #else +#if !I2S_INTERNAL Player::Player() {} +#else +Player::Player(): Audio(true, I2S_DAC_CHANNEL_BOTH_EN) {} +#endif #endif - void Player::init() { if(MUTE_PIN!=255) pinMode(MUTE_PIN, OUTPUT); #if I2S_DOUT!=255 +#if !I2S_INTERNAL setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); +#endif #else SPI.begin(); if(VS1053_RST>0) ResetChip(); diff --git a/yoRadio/player.h b/yoRadio/player.h index ac4e20e..482a490 100644 --- a/yoRadio/player.h +++ b/yoRadio/player.h @@ -2,7 +2,7 @@ #define player_h #include "options.h" -#if I2S_DOUT!=255 +#if I2S_DOUT!=255 || I2S_INTERNAL #include "src/audioI2S/AudioEx.h" #else #include "src/audioVS1053/audioVS1053Ex.h" diff --git a/yoRadio/src/audioI2S/Audio.cpp b/yoRadio/src/audioI2S/Audio.cpp index e48a148..49e1b3e 100644 --- a/yoRadio/src/audioI2S/Audio.cpp +++ b/yoRadio/src/audioI2S/Audio.cpp @@ -509,7 +509,7 @@ bool Audio::connecttohost(const char* host, const char* user, const char* pwd) { strcat(resp, "GET "); strcat(resp, extension); - strcat(resp, " HTTP/1.0\r\n"); + strcat(resp, " HTTP/1.1\r\n"); strcat(resp, "Host: "); strcat(resp, hostwoext); strcat(resp, "\r\n"); @@ -517,7 +517,7 @@ bool Audio::connecttohost(const char* host, const char* user, const char* pwd) { strcat(resp, "Authorization: Basic "); strcat(resp, authorization); strcat(resp, "\r\n"); - strcat(resp, "User-Agent: ESP32 audioI2S\r\n"); + strcat(resp, "User-Agent: Mozilla/5.0\r\n"); // strcat(resp, "Accept-Encoding: gzip;q=0\r\n"); // otherwise the server assumes gzip compression // strcat(resp, "Transfer-Encoding: \r\n"); // otherwise the server assumes gzip compression strcat(resp, "Connection: keep-alive\r\n\r\n"); @@ -541,7 +541,7 @@ bool Audio::connecttohost(const char* host, const char* user, const char* pwd) { wtf = millis(); while(!client.connected()){ if(millis()-wtf>TIMEOUT_MS * 2){ - sprintf(chbuf, "Request %s failed! with WTF", m_lastHost); + sprintf(chbuf, "Request %s failed with timeout!", m_lastHost); if(audio_info) audio_info(chbuf); return false; break; @@ -556,7 +556,7 @@ bool Audio::connecttohost(const char* host, const char* user, const char* pwd) { if(m_f_ssl == true) { uint32_t t = millis(); if(clientsecure.connect(hostwoext, port, TIMEOUT_MS_SSL)) { -// clientsecure.setNoDelay(true); + clientsecure.setNoDelay(true); // if(audio_info) audio_info("SSL/TLS Connected to server"); clientsecure.print(resp); uint32_t dt = millis() - t; @@ -571,16 +571,8 @@ bool Audio::connecttohost(const char* host, const char* user, const char* pwd) { //while(!clientsecure.connected()){;} // wait until the connection is established wtf = millis(); while(!clientsecure.connected()){ - /*wtf++; - if(wtf>1000){ - wtf=0; - sprintf(chbuf, "Request %s failed! with WTF", m_lastHost); - if(audio_info) audio_info(chbuf); - return false; - break; - }*/ if(millis()-wtf>TIMEOUT_MS_SSL){ - sprintf(chbuf, "Request %s failed! with WTF", m_lastHost); + sprintf(chbuf, "Request %s failed with timeout!", m_lastHost); if(audio_info) audio_info(chbuf); return false; break; diff --git a/yoRadio/src/displays/displayILI9225.cpp b/yoRadio/src/displays/displayILI9225.cpp new file mode 100644 index 0000000..cec6922 --- /dev/null +++ b/yoRadio/src/displays/displayILI9225.cpp @@ -0,0 +1,436 @@ +#include "../../options.h" +#if DSP_MODEL==DSP_ILI9225 + +#include "displayILI9225.h" +#include +#include "fonts/bootlogo.h" +#include "../../player.h" +#include "../../config.h" +#include "../../network.h" + +const char *dow[7] = {"вс","пн","вт","ср","чт","пт","сб"}; +const char *mnths[12] = {"января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"}; +extern unsigned char yofont5x7[]; +extern unsigned char yofont10x14[]; + +SPIClass hspi(VSPI); + +DspCore::DspCore(): TFT_22_ILI9225(TFT_RST, TFT_DC, TFT_CS, 0) { + +} + +char* DspCore::utf8Rus(const char* str, bool uppercase) { + int index = 0; + static char strn[BUFLEN]; + bool E = false; + strlcpy(strn, str, BUFLEN); + if (uppercase) { + bool next = false; + for (char *iter = strn; *iter != '\0'; ++iter) + { + if (E) { + E = false; + continue; + } + byte rus = (byte) * iter; + if (rus == 208 && (byte) * (iter + 1) == 129) { + *iter = (char)209; + *(iter + 1) = (char)145; + E = true; + continue; + } + if (rus == 209 && (byte) * (iter + 1) == 145) { + *iter = (char)209; + *(iter + 1) = (char)145; + E = true; + continue; + } + if (next) { + if (rus >= 128 && rus <= 143) *iter = (char)(rus + 32); + if (rus >= 176 && rus <= 191) *iter = (char)(rus - 32); + next = false; + } + if (rus == 208) next = true; + if (rus == 209) { + *iter = (char)208; + next = true; + } + *iter = toupper(*iter); + } + } + while (strn[index]) + { + if (strn[index] >= 0xBF) + { + switch (strn[index]) { + case 0xD0: { + if (strn[index + 1] == 0x81) { + strn[index] = 0xA8; + break; + } + if (strn[index + 1] >= 0x90 && strn[index + 1] <= 0xBF) strn[index] = strn[index + 1] + 0x30; + break; + } + case 0xD1: { + if (strn[index + 1] == 0x91) { + //strn[index] = 0xB7; + strn[index] = 0xB8; + break; + } + if (strn[index + 1] >= 0x80 && strn[index + 1] <= 0x8F) strn[index] = strn[index + 1] + 0x70; + break; + } + } + int sind = index + 2; + while (strn[sind]) { + strn[sind - 1] = strn[sind]; + sind++; + } + strn[sind - 1] = 0; + } + index++; + } + return strn; +} + +void DspCore::apScreen() { + setTextSize(TITLE_SIZE1); + setTextColor(TFT_FG, TFT_BG); + setCursor(TFT_FRAMEWDT, TITLE_TOP1); + print("AP NAME: "); + print(apSsid); + setCursor(TFT_FRAMEWDT, TITLE_TOP2); + print("PASSWORD: "); + print(apPassword); + setTextColor(SILVER, TFT_BG); + setCursor(TFT_FRAMEWDT, sheight-TFT_FRAMEWDT-TFT_LINEHGHT*4); + print("SETTINGS PAGE ON: "); + setCursor(TFT_FRAMEWDT, sheight-TFT_FRAMEWDT-TFT_LINEHGHT*2); + print("http://"); + print(WiFi.softAPIP().toString().c_str()); + print("/"); + drawLine(TFT_FRAMEWDT, TITLE_TOP1-8, swidth-TFT_FRAMEWDT*2, TITLE_TOP1-8, SILVER); +} + +void DspCore::setTextSize(uint8_t s){ + if(s==2){ + setFont(yofont10x14, true); + }else{ + setFont(yofont5x7, true); + } +} + +void DspCore::setTextColor(uint16_t fg, uint16_t bg){ + bgcolor=bg; + setBackgroundColor(bgcolor); + fgcolor=fg; +} + +void DspCore::setCursor(int16_t x, int16_t y){ + cursorx=x; + cursory=y; +} + +uint16_t DspCore::print(const char* s){ + if(gFont){ + drawGFXText(cursorx, cursory, s, fgcolor); + return 0; + }else{ + cursorx=drawText(cursorx, cursory, s, fgcolor); + return cursorx; + } +} + +void DspCore::getTextBounds(const char *string, int16_t x, int16_t y, int16_t *x1, + int16_t *y1, uint16_t *w, uint16_t *h){ + if(!gFont){ + _currentFont cfont = getFont(); + *w = getTextWidth(string); + *h = cfont.height; + }else{ + int16_t iw, ih; + getGFXTextExtent(string, x, y, &iw, &ih); + *w = (uint16_t)iw; + *h = (uint16_t)ih; + } +} + +void DspCore::setFont(uint8_t* font, bool monoSp) { + gFont = false; + TFT_22_ILI9225::setFont(font, monoSp); +} + +void DspCore::setFont(const GFXfont *f) { + if (f) { + gFont = true; + setGFXFont(f); + } else { + setFont(yofont5x7, false); + } +} + +void DspCore::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + if(y<0){ + h=h+y; + y=0; + } + fillRectangle(x, y, x+w, y+h, color); +} + +void DspCore::initD(uint16_t &screenwidth, uint16_t &screenheight) { + hspi.begin(); + begin(hspi); + invert(TFT_INVERT); + setBackgroundColor(TFT_BG); + clear(); + setOrientation(TFT_ROTATE); + setTextSize(1); + screenwidth = maxX(); + screenheight = maxY(); + swidth = screenwidth; + sheight = screenheight; +} + +void DspCore::drawLogo() { + drawBitmap((swidth - 99) / 2, (sheight-64)/2 - TFT_LINEHGHT*2, bootlogo2, 99, 64); +} + +// http://greekgeeks.net/#maker-tools_convertColor +uint16_t iclrs[] = { 0x738E /*707070*/, 0x52AA /*575757*/, 0x39C7, 0x18E3 }; +void DspCore::drawPlaylist(uint16_t currentItem, char* currentItemText) { + for (byte i = 0; i < PLMITEMS; i++) { + plMenu[i][0] = '\0'; + } + config.fillPlMenu(plMenu, currentItem - 4, PLMITEMS); + setTextSize(2); + int yStart = (sheight / 2 - PLMITEMHEIGHT / 2) - PLMITEMHEIGHT * (PLMITEMS - 1) / 2 + 3; + fillRect(0, (sheight / 2 - PLMITEMHEIGHT / 2) - 1, swidth, PLMITEMHEIGHT, TFT_LOGO); + for (byte i = 0; i < PLMITEMS; i++) { + if (i == 4) { + strlcpy(currentItemText, plMenu[i], PLMITEMLENGHT - 1); + } else { + setTextColor(iclrs[abs(i - 4)-1], TFT_BG); + setCursor(TFT_FRAMEWDT, yStart + i * PLMITEMHEIGHT); + fillRect(0, yStart + i * PLMITEMHEIGHT-1, swidth, PLMITEMHEIGHT-7, TFT_BG); + print(utf8Rus(plMenu[i], true)); + } + } +} + +void DspCore::clearDsp() { + //fillScreen(TFT_BG); + clear(); +} + +void DspCore::drawScrollFrame(uint16_t texttop, uint16_t textheight, uint16_t bg) { + if (TFT_FRAMEWDT==0) return; + fillRect(swidth - TFT_FRAMEWDT, texttop, TFT_FRAMEWDT, textheight, bg); + fillRect(0, texttop, TFT_FRAMEWDT-1, textheight, bg); +} + +void DspCore::getScrolBbounds(const char* text, const char* separator, byte textsize, uint16_t &tWidth, uint16_t &tHeight, uint16_t &sWidth) { + int16_t x1, y1; + uint16_t w, h; + setTextSize(textsize); + getTextBounds(text, 0, 0, &x1, &y1, &w, &h); + tWidth = w; + tHeight = h; + getTextBounds(separator, 0, 0, &x1, &y1, &w, &h); + sWidth = w; +} + +void DspCore::clearScroll(uint16_t texttop, uint16_t textheight, uint16_t bg) { + fillRect(0, texttop, swidth, textheight, bg); +} + +void DspCore::centerText(const char* text, uint16_t y, uint16_t fg, uint16_t bg) { + int16_t x1, y1; + uint16_t w, h; + const char* txt = text; + if(y==90) y=(sheight-64)/2 + 64 + TFT_LINEHGHT; + if(y==110) y=(sheight-64)/2 + 64 + TFT_LINEHGHT*3; + getTextBounds(txt, 0, 0, &x1, &y1, &w, &h); + setTextColor(fg); + setCursor((swidth - w) / 2, y); + fillRect((swidth-w)/2-5, y, w+10, h, bg); + print(txt); +} + +void DspCore::rightText(const char* text, uint16_t y, uint16_t fg, uint16_t bg, bool fliprect, uint16_t delta) { + int16_t x1, y1; + uint16_t w, h; + getTextBounds(text, 0, 0, &x1, &y1, &w, &h); + setTextColor(fg,bg); + setCursor(swidth - w - TFT_FRAMEWDT - delta, y); + print(text); +} + +void DspCore::displayHeapForDebug() { + int16_t vTop = sheight - TFT_FRAMEWDT * 2 - TFT_LINEHGHT * 2 - 2; + char buf[50]; + setTextSize(1); + setTextColor(DARK_GRAY, TFT_BG); + setCursor(TFT_FRAMEWDT, vTop); + fillRect(TFT_FRAMEWDT, vTop, swidth - TFT_FRAMEWDT / 2, 7, TFT_BG); + sprintf(buf, "%d / %d", ESP.getFreeHeap(), ESP.getMaxAllocHeap()); + print(buf); +#if VS1053_CS==255 + // audio buffer; + fillRect(0, sheight - 2, swidth, 2, TFT_BG); + int astored = player.inBufferFilled(); + int afree = player.inBufferFree(); + int aprcnt = 100 * astored / (astored + afree); + byte sbw = map(aprcnt, 0, 100 , 0, swidth); + fillRect(0, sheight - 2, sbw, 2, SILVER); +#endif +} + +void DspCore::printClock(const char* timestr) { + +} + +uint16_t cltop = 0; +uint8_t clsp = 24; +uint16_t clleft = 0; +uint16_t clwidth = 0; + +void DspCore::printClock(struct tm timeinfo, bool dots, bool redraw){ + char timeBuf[50] = { 0 }; + strftime(timeBuf, sizeof(timeBuf), "%H:%M", &timeinfo); + if(strstr(oldTimeBuf, timeBuf)==NULL || redraw){ + int16_t x1, y1; + gFont=true; + setGFXFont(&DS_DIGI28pt7b); + getTextBounds(oldTimeBuf, 0, 0, &x1, &y1, &wot, &hot); + if(cltop==0){ + cltop=sheight-(TFT_FRAMEWDT * 2 + TFT_LINEHGHT + 38) - hot; + } + clwidth = wot+clsp+34; + clleft=swidth-TFT_FRAMEWDT-clwidth; + setCursor(clleft, cltop); + setTextColor(TFT_BG); + print(oldTimeBuf); + strlcpy(oldTimeBuf, timeBuf, 20); + getTextBounds(timeBuf, 0, 0, &x1, &y1, &wot, &hot); + clwidth = wot+clsp+34; + clleft=swidth-TFT_FRAMEWDT-clwidth; + setTextColor(TFT_LOGO, TFT_BG); + setCursor(clleft, cltop); + print(timeBuf); + gFont=false; + setTextSize(2); + setTextColor(TFT_FG, TFT_BG); + setCursor(clleft+wot+clsp, cltop-hot+22); + print(utf8Rus(dow[timeinfo.tm_wday], false)); + drawLine(clleft+wot+clsp/2, cltop-34, clleft+wot+clsp/2, cltop+1, SILVER); //vert + drawLine(clleft+wot+clsp/2, cltop-hot+20, clleft+wot+clsp/2+35, cltop-hot+20, SILVER); //hor + drawLine(TFT_FRAMEWDT, TITLE_TOP1-8, swidth-TFT_FRAMEWDT*2, TITLE_TOP1-8, SILVER); + + sprintf(timeBuf, "%2d %s %d", timeinfo.tm_mday,mnths[timeinfo.tm_mon], timeinfo.tm_year+1900); + uint16_t wdate, hdate; + getTextBounds(timeBuf, 0, 0, &x1, &y1, &wdate, &hdate); + fillRect(swidth - wdate - TFT_FRAMEWDT-20, cltop+10, wdate+20, hdate, TFT_BG); + setTextSize(1); + rightText(utf8Rus(timeBuf,true), cltop+10, TFT_FG, TFT_BG, false, 12); + } + setTextSize(2); + setTextColor(TFT_LOGO, TFT_BG); + setCursor(clleft+wot+clsp, cltop-hot+1); + sprintf(timeBuf, "%02d", timeinfo.tm_sec); + print(timeBuf); +} + +void DspCore::drawVolumeBar(bool withNumber) { + int16_t vTop = sheight - TFT_FRAMEWDT * 2; + int16_t volTop = sheight - TFT_FRAMEWDT * 2 - TFT_LINEHGHT - 2; + int16_t vWidth = swidth - TFT_FRAMEWDT *2; + uint16_t ww = map(config.store.volume, 0, 254, 0, vWidth - 2); + fillRect(TFT_FRAMEWDT, vTop - 2, vWidth, 6, TFT_BG); + drawRectangle(TFT_FRAMEWDT, vTop - 2, TFT_FRAMEWDT+vWidth, 6+vTop - 2, TFT_LOGO); + fillRect(TFT_FRAMEWDT + 1, vTop - 1, ww, 5, TFT_LOGO); + if (withNumber) { + setTextSize(1); + setTextColor(TFT_FG); + setFont(&DS_DIGI28pt7b); + char volstr[4]; + uint16_t wv, hv; + int16_t x1, y1; + + /*setTextColor(TFT_BG); + sprintf(volstr, "%d", oldVolume); + getTextBounds(volstr, 0, 0, &x1, &y1, &wv, &hv); + setCursor((swidth - wv) / 2, (sheight-hv)/2 + hv); + print(volstr);*/ + sprintf(volstr, "%d", oldVolume); + getTextBounds(volstr, 0, 0, &x1, &y1, &wv, &hv); + fillRect((swidth - wv) / 2 - 12, (sheight-hv)/2, wv+24, hv, TFT_BG); + + setTextColor(TFT_FG); + sprintf(volstr, "%d", config.store.volume); + getTextBounds(volstr, 0, 0, &x1, &y1, &wv, &hv); + setCursor((swidth - wv) / 2, (sheight-hv)/2 + hv); + print(volstr); + oldVolume=config.store.volume; + } +} + +void DspCore::drawNextStationNum(uint16_t num) { + setTextSize(1); + setTextColor(TFT_FG); + setFont(&DS_DIGI28pt7b); + char numstr[7]; + uint16_t wv, hv; + int16_t x1, y1; + sprintf(numstr, "%d", num); + getTextBounds(numstr, 0, 0, &x1, &y1, &wv, &hv); + fillRect(TFT_FRAMEWDT, (sheight-hv)/2, swidth - TFT_FRAMEWDT / 2, hv + 3, TFT_BG); + setCursor((swidth - wv) / 2, (sheight-hv)/2 + hv); + print(numstr); +} + +void DspCore::frameTitle(const char* str) { + setTextSize(META_SIZE); + centerText(str, TFT_FRAMEWDT, TFT_LOGO, TFT_BG); + drawLine(TFT_FRAMEWDT, TITLE_TOP1-8, swidth-TFT_FRAMEWDT*2, TITLE_TOP1-8, SILVER); +} + +void DspCore::rssi(const char* str) { + int16_t vTop = sheight - TFT_FRAMEWDT * 2 - TFT_LINEHGHT - 2; + char buf[20]; + sprintf(buf, "RSSI:%s", str); + setTextSize(1); + rightText(buf, vTop, SILVER, TFT_BG); +} + +void DspCore::ip(const char* str) { + int16_t vTop = sheight - TFT_FRAMEWDT * 2 - TFT_LINEHGHT - 2; + char buf[30]; + sprintf(buf, "IP: %s", str); + setTextSize(1); + setTextColor(SILVER, TFT_BG); + setCursor(TFT_FRAMEWDT, vTop); + print(buf); +} + +void DspCore::set_TextSize(uint8_t s) { + setTextSize(s); +} + +void DspCore::set_TextColor(uint16_t fg, uint16_t bg) { + setTextColor(fg, bg); +} + +void DspCore::set_Cursor(int16_t x, int16_t y) { + setCursor(x, y); +} + +void DspCore::printText(const char* txt) { + print(txt); +} + +void DspCore::loop(bool force) { + +} + +#endif diff --git a/yoRadio/src/displays/displayILI9225.h b/yoRadio/src/displays/displayILI9225.h new file mode 100644 index 0000000..a564b3b --- /dev/null +++ b/yoRadio/src/displays/displayILI9225.h @@ -0,0 +1,111 @@ +#ifndef displayILI9225_h +#define displayILI9225_h + +#include "Arduino.h" +#include "TFT_22_ILI9225.h" +#include "fonts/DS_DIGI28pt7b.h" + +#define TFT_LINEHGHT 10 +#define TFT_FRAMEWDT 4 +#define META_SIZE 2 +#define TITLE_SIZE1 1 +#define TITLE_SIZE2 1 + +#if !defined(SCROLLDELTA) || !defined(SCROLLTIME) +#define SCROLLDELTA 3 +#define SCROLLTIME 30 +#endif + +#define PLMITEMS 9 +#define PLMITEMLENGHT 40 +#define PLMITEMHEIGHT 22 +#define TFT_FULLTIME 1 + +#define TITLE_TOP1 TFT_FRAMEWDT + META_SIZE * TFT_LINEHGHT + 8 +#define TITLE_TOP2 TFT_FRAMEWDT + (META_SIZE+2) * TFT_LINEHGHT +#define TITLE_FG2 SILVER + +class DspCore: public TFT_22_ILI9225 { + public: + DspCore(); + char plMenu[PLMITEMS][PLMITEMLENGHT]; + uint16_t clockY; + void initD(uint16_t &screenwidth, uint16_t &screenheight); + void apScreen(); + void drawLogo(); + void clearDsp(); + void centerText(const char* text, uint16_t y, uint16_t fg, uint16_t bg); + void rightText(const char* text, uint16_t y, uint16_t fg, uint16_t bg, bool fliprect=false, uint16_t delta = 0); + void set_TextSize(uint8_t s); + void set_TextColor(uint16_t fg, uint16_t bg); + void set_Cursor(int16_t x, int16_t y); + void printText(const char* txt); + void printClock(const char* timestr); + void printClock(struct tm timeinfo, bool dots, bool redraw = false); + void displayHeapForDebug(); + void drawVolumeBar(bool withNumber); + void drawNextStationNum(uint16_t num); + char* utf8Rus(const char* str, bool uppercase); + void drawScrollFrame(uint16_t texttop, uint16_t textheight, uint16_t bg); + void getScrolBbounds(const char* text, const char* separator, byte textsize, uint16_t &tWidth, uint16_t &tHeight, uint16_t &sWidth); + void clearScroll(uint16_t texttop, uint16_t textheight, uint16_t bg); + void frameTitle(const char* str); + void rssi(const char* str); + void ip(const char* str); + void drawPlaylist(uint16_t currentItem, char* currentItemText); + void loop(bool force=false); + void setFont(uint8_t* font, bool monoSp=false ); + void setFont(const GFXfont *f = NULL); + private: + uint16_t swidth, sheight; + uint16_t bgcolor, fgcolor; + int16_t cursorx, cursory; + bool gFont; + char oldTimeBuf[20]; + uint8_t oldVolume; + uint16_t wot, hot; + void setTextSize(uint8_t s); + void setTextColor(uint16_t fg, uint16_t bg=0x0000); + void setCursor(int16_t x, int16_t y); + uint16_t print(const char* s); + void getTextBounds(const char *string, int16_t x, int16_t y, int16_t *x1, + int16_t *y1, uint16_t *w, uint16_t *h); + void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); +}; + +extern DspCore dsp; + +/* + * TFT COLORS + */ +#define BLACK 0x0000 +#define BLUE 0x001F +#define RED 0xF800 +#define GREEN 0x07E0 +#define MAGENTA 0xF81F +#define YELLOW 0xFFE0 +#define WHITE 0xFFFF +#define GRAY 0x7BEF +#define DARK_GRAY 0x2945 +#define LIGHT_GRAY 0xC618 +#define LIME 0x87E0 +#define AQUA 0x5D1C +#define CYAN 0x07FF +#define DARK_CYAN 0x03EF +#define ORANGE 0xFCA0 +#define PINK 0xF97F +#define BROWN 0x8200 +#define VIOLET 0x9199 +#define SILVER 0xA510 +#define GOLD 0xA508 +#define NAVY 0x000F +#define MAROON 0x7800 +#define PURPLE 0x780F +#define OLIVE 0x7BE0 + +#define TFT_BG BLACK +#define TFT_FG WHITE +#define TFT_LOGO 0xE68B // 224, 209, 92 + +#endif diff --git a/yoRadio/src/displays/displayILI9341.cpp b/yoRadio/src/displays/displayILI9341.cpp index 19347e2..69acbf7 100644 --- a/yoRadio/src/displays/displayILI9341.cpp +++ b/yoRadio/src/displays/displayILI9341.cpp @@ -258,6 +258,9 @@ void DspCore::printClock(struct tm timeinfo, bool dots, bool redraw){ sprintf(timeBuf, "%2d %s %d", timeinfo.tm_mday,mnths[timeinfo.tm_mon], timeinfo.tm_year+1900); setTextSize(1); + uint16_t wdate, hdate; + getTextBounds(timeBuf, 0, 0, &x1, &y1, &wdate, &hdate); + fillRect(swidth - wdate - TFT_FRAMEWDT-20, cltop+10, wdate+20, hdate, TFT_BG); rightText(utf8Rus(timeBuf,true), cltop+10, TFT_FG, TFT_BG, false, swidth>240?12:0); drawFastVLine(clleft+wot+clsp/2+3, cltop-hot, hot+3, SILVER); drawFastHLine(clleft+wot+clsp/2+3, cltop-hot+29, 42, SILVER); @@ -293,11 +296,14 @@ void DspCore::drawVolumeBar(bool withNumber) { uint16_t wv, hv; int16_t x1, y1; - setTextColor(TFT_BG); + /*setTextColor(TFT_BG); sprintf(volstr, "%d", oldVolume); getTextBounds(volstr, 0, 0, &x1, &y1, &wv, &hv); setCursor((swidth - wv) / 2, (sheight-hv)/2 + hv); - print(volstr); + print(volstr);*/ + sprintf(volstr, "%d", oldVolume); + getTextBounds(volstr, 0, 0, &x1, &y1, &wv, &hv); + fillRect((swidth - wv) / 2 - 12, (sheight-hv)/2, wv+24, hv, TFT_BG); setTextColor(TFT_FG); sprintf(volstr, "%d", config.store.volume); diff --git a/yoRadio/src/displays/fonts/yofont10x14.c b/yoRadio/src/displays/fonts/yofont10x14.c new file mode 100644 index 0000000..89f8b11 --- /dev/null +++ b/yoRadio/src/displays/fonts/yofont10x14.c @@ -0,0 +1,278 @@ +#include "../../../options.h" +#if DSP_MODEL==DSP_ILI9225 +#ifndef YOFONT10X14_H +#define YOFONT10X14_H + +#ifdef __AVR__ +#include +#include +#elif defined(ESP8266) +#include +#else +#define PROGMEM +#endif + +// Standard ASCII 10x14 font + +const unsigned char yofont10x14[] PROGMEM = { +0x0A, 0x0E, 0x00, 0xFF, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x33, 0x33, 0x33, 0x33, 0x03, 0x33, 0x03, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0xCF, 0x3C, 0xCF, 0x3C, 0xFF, 0x3C, 0xFF, 0x3C, 0xCF, 0x3C, 0xCF, 0x3C, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0xF0, 0x00, 0xF0, 0x00, 0xFC, 0x03, 0xFC, 0x03, 0xF0, 0x0F, 0xF0, 0x0F, 0xFC, 0x03, 0xFC, 0x03, 0xF0, 0x00, 0xF0, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0xFC, 0x0F, 0xFC, 0x0F, 0xF0, 0x03, 0xF0, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xF0, 0x03, 0xF0, 0x03, 0xCC, 0x30, 0xCC, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0xCC, 0x30, 0xCC, 0x30, 0xF0, 0x03, 0xF0, 0x03, +0x0A, 0xC0, 0x03, 0xC0, 0x03, 0xF0, 0x33, 0xF0, 0x33, 0xFF, 0x3F, 0xFF, 0x3F, 0xF0, 0x33, 0xF0, 0x33, 0xC0, 0x03, 0xC0, 0x03, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0x30, 0x03, 0x30, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x0F, 0x3C, 0x0F, 0x3C, 0xCF, 0x3C, 0xCF, 0x3C, 0x0F, 0x3C, 0x0F, 0x3C, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0x00, 0x0F, 0x00, 0x0F, 0xC0, 0x30, 0xC0, 0x30, 0xF3, 0x30, 0xF3, 0x30, 0x0F, 0x0F, 0x0F, 0x0F, 0x3F, 0x00, 0x3F, 0x00, +0x0A, 0x3C, 0x00, 0x3C, 0x00, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x3F, 0xC3, 0x3F, 0xC3, 0x0C, 0xC3, 0x0C, 0x3C, 0x00, 0x3C, 0x00, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x33, 0x00, 0x33, 0xFF, 0x0F, 0xFF, 0x0F, 0x0C, 0x00, 0x0C, 0x00, 0xF0, 0x00, 0xF0, 0x00, +0x0A, 0x00, 0x3C, 0x00, 0x3C, 0xFF, 0x3F, 0xFF, 0x3F, 0x33, 0x00, 0x33, 0x00, 0x33, 0x0F, 0x33, 0x0F, 0xFF, 0x0F, 0xFF, 0x0F, +0x0A, 0xCC, 0x0C, 0xCC, 0x0C, 0xF0, 0x03, 0xF0, 0x03, 0x3F, 0x3F, 0x3F, 0x3F, 0xF0, 0x03, 0xF0, 0x03, 0xCC, 0x0C, 0xCC, 0x0C, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0xFC, 0x0F, 0xFC, 0x0F, 0xF0, 0x03, 0xF0, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0xFC, 0x0F, 0xFC, 0x0F, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x30, 0x03, 0x30, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0xFF, 0x3F, 0xFF, 0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x30, 0x03, 0x30, 0x03, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x33, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x33, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x3C, 0x00, 0x3C, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xCC, 0x30, 0xCC, 0x30, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xC3, 0x0C, 0xC3, 0x0C, +0x0A, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, +0x0A, 0x30, 0x33, 0x30, 0x33, 0x0C, 0x3C, 0x0C, 0x3C, 0xFF, 0x3F, 0xFF, 0x3F, 0x0C, 0x3C, 0x0C, 0x3C, 0x30, 0x33, 0x30, 0x33, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFF, 0x0F, 0xFF, 0x0F, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xCC, 0x0C, 0xCC, 0x0C, 0xF0, 0x03, 0xF0, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0xCC, 0x0C, 0xCC, 0x0C, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xF0, 0x03, 0xF0, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, +0x0A, 0xF0, 0x03, 0xF0, 0x03, 0xFC, 0x0F, 0xFC, 0x0F, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x0F, 0xFC, 0x0F, 0xF0, 0x03, 0xF0, 0x03, +0x0A, 0x00, 0x0F, 0x00, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xFF, 0x0F, 0xFF, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0x0F, 0x00, 0x0F, +0x0A, 0x3C, 0x00, 0x3C, 0x00, 0xFC, 0x03, 0xFC, 0x03, 0xFC, 0x3F, 0xFC, 0x3F, 0xFC, 0x03, 0xFC, 0x03, 0x3C, 0x00, 0x3C, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x33, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x30, 0x03, 0x30, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x30, 0x03, 0x30, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x30, 0x03, 0x30, 0x03, +0x0A, 0x30, 0x0C, 0x30, 0x0C, 0xCC, 0x0C, 0xCC, 0x0C, 0xFF, 0x3F, 0xFF, 0x3F, 0xCC, 0x0C, 0xCC, 0x0C, 0x0C, 0x03, 0x0C, 0x03, +0x0A, 0x0F, 0x0C, 0x0F, 0x0C, 0x0F, 0x03, 0x0F, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x3C, 0x30, 0x3C, 0x0C, 0x3C, 0x0C, 0x3C, +0x0A, 0x3C, 0x0F, 0x3C, 0x0F, 0xC3, 0x30, 0xC3, 0x30, 0x3C, 0x33, 0x3C, 0x33, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x33, 0x00, 0x33, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0xF0, 0x03, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x0F, 0xFC, 0x0F, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x0F, 0xFC, 0x0F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x33, 0x03, 0x33, 0xC3, 0x30, 0xC3, 0x30, 0x33, 0x30, 0x33, 0x30, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0x30, 0x30, 0x30, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, +0x0A, 0x0C, 0x30, 0x0C, 0x30, 0x03, 0x3C, 0x03, 0x3C, 0x03, 0x33, 0x03, 0x33, 0xC3, 0x30, 0xC3, 0x30, 0x3C, 0x30, 0x3C, 0x30, +0x0A, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0x30, 0x03, 0x30, 0x33, 0x30, 0x33, 0x30, 0xCF, 0x30, 0xCF, 0x30, 0x03, 0x0F, 0x03, 0x0F, +0x0A, 0xC0, 0x03, 0xC0, 0x03, 0x30, 0x03, 0x30, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x03, 0x00, 0x03, +0x0A, 0x3F, 0x0C, 0x3F, 0x0C, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0xC3, 0x0F, 0xC3, 0x0F, +0x0A, 0xF0, 0x0F, 0xF0, 0x0F, 0xCC, 0x30, 0xCC, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x00, 0x0F, 0x00, 0x0F, +0x0A, 0x03, 0x00, 0x03, 0x00, 0x03, 0x3F, 0x03, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x0A, 0x3C, 0x0F, 0x3C, 0x0F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x3C, 0x0F, 0x3C, 0x0F, +0x0A, 0x3C, 0x00, 0x3C, 0x00, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x0C, 0xC3, 0x0C, 0xFC, 0x03, 0xFC, 0x03, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0xF0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xCC, 0xF0, 0xCC, 0xF0, 0x3C, 0xF0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x33, 0x03, 0x33, 0xC3, 0x00, 0xC3, 0x00, 0x3C, 0x00, 0x3C, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0xF3, 0x33, 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0xFC, 0x33, 0xFC, 0x33, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x0C, 0x03, 0x0C, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0C, 0x03, 0x0C, 0x03, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x3C, 0x0F, 0x3C, 0x0F, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, 0xF0, 0x03, 0xF0, 0x03, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x30, 0x03, 0x30, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x03, 0x00, 0x03, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xCC, 0x3F, 0xCC, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x0F, 0xFF, 0x0F, 0x03, 0x00, 0x03, 0x00, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x03, 0x30, 0x03, 0x30, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x3C, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x0C, 0x00, 0x0C, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x3C, 0x00, 0x3C, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x33, 0x03, 0x33, 0x03, 0x0C, 0x03, 0x0C, 0xFC, 0x33, 0xFC, 0x33, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x03, 0xC3, 0x03, 0xC3, 0x0C, 0xC3, 0x0C, 0x3C, 0x30, 0x3C, 0x30, +0x0A, 0x3C, 0x30, 0x3C, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x0F, 0x03, 0x0F, +0x0A, 0x0F, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x0A, 0xFF, 0x0F, 0xFF, 0x0F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0xFF, 0x0F, 0xFF, 0x0F, +0x0A, 0xFF, 0x03, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0xFF, 0x03, 0xFF, 0x03, +0x0A, 0xFF, 0x0F, 0xFF, 0x0F, 0x00, 0x30, 0x00, 0x30, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0x30, 0x00, 0x30, 0xFF, 0x0F, 0xFF, 0x0F, +0x0A, 0x0F, 0x3C, 0x0F, 0x3C, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x0F, 0x3C, 0x0F, 0x3C, +0x0A, 0x3F, 0x00, 0x3F, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x3F, 0x00, 0x3F, 0x00, +0x0A, 0x03, 0x3C, 0x03, 0x3C, 0x03, 0x33, 0x03, 0x33, 0xC3, 0x30, 0xC3, 0x30, 0x33, 0x30, 0x33, 0x30, 0x0F, 0x30, 0x0F, 0x30, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x0C, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x00, +0x0A, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x3F, 0xC0, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x30, 0xC0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x0F, 0xC0, 0x0F, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x30, 0xC0, 0x30, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x03, 0xC0, 0x03, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x0C, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x33, 0xC0, 0x33, 0xF0, 0x0F, 0xF0, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0xF3, 0x3F, 0xF3, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xF3, 0x0F, 0xF3, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x0C, 0xC0, 0x0C, 0x30, 0x30, 0x30, 0x30, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x0F, 0xC0, 0x0F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xC0, 0x30, 0xC0, 0x30, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x0C, 0x30, 0x0C, +0x0A, 0x30, 0x00, 0x30, 0x00, 0xFF, 0x0F, 0xFF, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, +0x0A, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x03, 0xF0, 0x03, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0xF0, 0x03, 0xF0, 0x03, +0x0A, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0x30, 0x00, 0x30, 0xC0, 0x0F, 0xC0, 0x0F, 0x00, 0x30, 0x00, 0x30, 0xF0, 0x0F, 0xF0, 0x0F, +0x0A, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x0C, 0xC0, 0x0C, 0x30, 0x30, 0x30, 0x30, +0x0A, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0xF0, 0x0F, 0xF0, 0x0F, +0x0A, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x30, 0x3C, 0x30, 0x33, 0x30, 0x33, 0xF0, 0x30, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x3C, 0x0F, 0x3C, 0x0F, 0x03, 0x30, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x03, 0x30, 0x3C, 0x0F, 0x3C, 0x0F, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0x00, +0x0A, 0x00, 0x3F, 0x00, 0x3F, 0xC0, 0x30, 0xC0, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0x00, 0x3F, 0x00, 0x3F, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x03, 0x03, 0x03, 0x03, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x0C, 0x03, 0xFF, 0x03, 0xFF, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x0C, 0x03, 0xC3, 0x03, 0xC3, 0x03, 0x3C, 0x03, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x33, 0x03, 0x33, 0x03, 0xCF, 0x00, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0xFF, 0x03, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x03, 0x3F, 0x03, 0x33, 0x03, 0x33, 0x03, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x33, 0x03, 0x33, 0x03, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0xF3, 0x03, 0xF3, 0x03, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0x33, 0x03, 0x33, 0x03, 0xCC, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x03, 0x0C, 0x03, 0x33, 0x03, 0x33, 0x03, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0xC0, 0x33, 0xC0, 0x33, 0x30, 0x3C, 0x30, 0x3C, 0x30, 0x00, 0x30, 0x00, 0x30, 0x3C, 0x30, 0x3C, 0xC0, 0x33, 0xC0, 0x33, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xFC, 0x0F, 0xFC, 0x0F, 0xF0, 0x03, 0xF0, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0xFC, 0x0F, 0xFC, 0x0F, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x0F, 0xFC, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, +0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xFC, 0x0F, 0xFC, 0x0F, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, +0x0A, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, +0x0A, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, +0x0A, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0xC0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xF0, 0x03, 0xF0, 0x03, 0x3F, 0x3F, 0x3F, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, +0x0A, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, +0x0A, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xF0, 0x03, 0xF0, 0x03, 0x3F, 0x3F, 0x3F, 0x3F, 0x03, 0x30, 0x03, 0x30, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, +0x0A, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, +0x0A, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0x03, 0x30, 0x03, 0x30, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, +0x0A, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0xF0, 0x03, 0xF0, 0x03, 0x30, 0x03, 0x30, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, +0x0A, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x03, 0xF0, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x3C, 0x30, 0x3C, 0x30, 0xF3, 0x33, 0xF3, 0x33, 0x33, 0x33, 0x33, 0x33, 0xF3, 0x33, 0xF3, 0x33, 0x03, 0x0F, 0x03, 0x0F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x33, 0x33, 0x33, 0x33, 0x30, 0x33, 0x30, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, 0x30, 0x30, 0x30, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xCC, 0x0C, 0xCC, 0x0C, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x3F, 0x03, 0x3F, 0x03, 0x0F, 0x03, 0x0F, 0xFF, 0x03, 0xFF, 0x03, +0x0A, 0x0F, 0x00, 0x0F, 0x00, 0x33, 0x00, 0x33, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x33, 0x00, 0x33, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x30, 0x03, 0x30, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x33, 0x33, 0x33, 0x33, 0x0C, 0x0C, 0x0C, 0x0C, +0x0A, 0x0C, 0x00, 0x0C, 0x00, 0x33, 0x33, 0x33, 0x33, 0xF3, 0x3F, 0xF3, 0x3F, 0x33, 0x00, 0x33, 0x00, 0x0C, 0x00, 0x0C, 0x00, +0x0A, 0x3C, 0x00, 0x3C, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFF, 0x33, 0xFF, 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, +0x0A, 0xF0, 0x03, 0xF0, 0x03, 0x30, 0x03, 0x30, 0x03, 0xF0, 0x03, 0xF0, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x3C, 0x03, 0x3C, 0xFC, 0x0F, 0xFC, 0x0F, 0x00, 0x0C, 0x00, 0x0C, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x33, 0x00, 0x33, 0xFF, 0x0F, 0xFF, 0x0F, 0x0C, 0x00, 0x0C, 0x00, 0xF0, 0x00, 0xF0, 0x00, +0x0A, 0x00, 0xC0, 0x00, 0xC0, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x0C, 0x00, 0x0C, 0xF0, 0x0F, 0xF0, 0x0F, 0x00, 0x30, 0x00, 0x30, +0x0A, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x0F, 0xF0, 0x0F, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x30, 0x30, 0x30, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x33, 0x33, 0x33, 0x33, 0x30, 0x33, 0x30, 0x33, 0x33, 0x33, 0x33, 0x33, 0xC0, 0x03, 0xC0, 0x03, +0x0A, 0xFC, 0x3F, 0xFC, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0x00, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, +0x0A, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0x00, +0x0A, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xFC, 0x00, 0xFC, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x0C, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0xCC, 0x00, 0xCC, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0xFC, 0x00, 0xFC, 0x00, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0xC0, 0x0C, 0xC0, 0x0C, 0x30, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x0C, 0x00, +0x0A, 0x0C, 0x00, 0x0C, 0x00, 0x30, 0x00, 0x30, 0x00, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x0F, 0x00, 0x0F, 0xC0, 0x0F, 0xC0, 0x0F, +0x0A, 0xFC, 0x3F, 0xFC, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xFC, 0x3F, 0xFC, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x0F, 0x03, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x3C, 0x0F, 0x3C, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x0A, 0x00, 0xF0, 0x00, 0xF0, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x30, 0x03, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0xF0, 0x00, 0xF0, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x30, 0x03, 0x30, +0x0A, 0x3F, 0x3F, 0x3F, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x3F, 0x3F, 0x3F, 0x3F, +0x0A, 0x03, 0x30, 0x03, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x3C, 0x0F, 0x3C, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x30, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x03, 0x0C, 0x03, 0x0C, 0x0C, 0x03, 0x0C, 0x03, 0xC3, 0x00, 0xC3, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x03, 0x30, 0x03, 0x30, +0x0A, 0x00, 0x30, 0x00, 0x30, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x0C, 0x00, 0x0C, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x3C, 0x00, 0x3C, 0x00, +0x0A, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x0C, 0x0C, 0x0C, 0x0C, +0x0A, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, +0x0A, 0x3F, 0x00, 0x3F, 0x00, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xFF, 0x0F, 0xFF, 0x0F, +0x0A, 0xFC, 0x00, 0xFC, 0x00, 0x03, 0x03, 0x03, 0x03, 0xFF, 0x3F, 0xFF, 0x3F, 0x03, 0x03, 0x03, 0x03, 0xFC, 0x00, 0xFC, 0x00, +0x0A, 0x0F, 0x3C, 0x0F, 0x3C, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0x30, 0x03, 0x30, 0x03, 0x0F, 0x3C, 0x0F, 0x3C, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0xF0, 0x00, 0xF0, +0x0A, 0x3F, 0x00, 0x3F, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xFF, 0x3F, 0xFF, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, +0x0A, 0x03, 0x00, 0x03, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0x00, 0x0F, 0x00, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0x00, 0x0F, 0x00, 0x0F, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0x00, 0x0F, 0x00, 0x0F, +0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x03, 0x30, 0x03, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0xFF, 0x3F, 0xFF, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xFC, 0x0F, 0xFC, 0x0F, 0x03, 0x30, 0x03, 0x30, 0xFC, 0x0F, 0xFC, 0x0F, +0x0A, 0x3C, 0x30, 0x3C, 0x30, 0xC3, 0x0C, 0xC3, 0x0C, 0xC3, 0x03, 0xC3, 0x03, 0xC3, 0x00, 0xC3, 0x00, 0xFF, 0x3F, 0xFF, 0x3F, +0x0A, 0x00, 0x0C, 0x00, 0x0C, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x3F, 0xC0, 0x3F, +0x0A, 0xF0, 0x0F, 0xF0, 0x0F, 0xCC, 0x30, 0xCC, 0x30, 0xCC, 0x30, 0xCC, 0x30, 0xC3, 0x30, 0xC3, 0x30, 0x03, 0x0F, 0x03, 0x0F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x0C, 0xC0, 0x0C, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x00, 0xF0, 0x00, +0x0A, 0x00, 0xF0, 0x00, 0xF0, 0xC0, 0x3F, 0xC0, 0x3F, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0xF0, 0x00, 0xF0, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x03, 0xC0, 0x03, +0x0A, 0xF0, 0x3C, 0xF0, 0x3C, 0x00, 0x03, 0x00, 0x03, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x03, 0x00, 0x03, 0xF0, 0x3C, 0xF0, 0x3C, +0x0A, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x0C, 0xC0, 0x0C, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x3C, 0x0C, 0x3C, 0x0C, 0x00, 0x03, 0x00, 0x03, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x0C, 0xC0, 0x0C, 0x30, 0x30, 0x30, 0x30, +0x0A, 0x00, 0x30, 0x00, 0x30, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x0F, 0xC0, 0x0F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0xC0, 0x00, 0xC0, 0x00, +0x0A, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x30, 0xC0, 0x30, +0x0A, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, +0x0A, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0xF0, 0x0F, 0xF0, 0x0F, +0x0A, 0xC0, 0x03, 0xC0, 0x03, 0x30, 0x0C, 0x30, 0x0C, 0xF0, 0xFF, 0xF0, 0xFF, 0x30, 0x0C, 0x30, 0x0C, 0xC0, 0x03, 0xC0, 0x03, +0x0A, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x0C, 0xC0, 0x0C, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x0C, 0xC0, 0x0C, 0x30, 0x30, 0x30, 0x30, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0xF0, 0x00, 0xF0, +0x0A, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x30, 0x00, 0x30, 0xF0, 0xFF, 0xF0, 0xFF, +0x0A, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0C, 0x00, 0x0C, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0C, 0x00, 0x0C, 0xF0, 0x3F, 0xF0, 0x3F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0C, 0x00, 0x0C, +0x0A, 0xC0, 0x0C, 0xC0, 0x0C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0xC0, 0x0F, 0xC0, 0x0F, +0x0A, 0xF0, 0x3F, 0xF0, 0x3F, 0x00, 0x03, 0x00, 0x03, 0xC0, 0x0F, 0xC0, 0x0F, 0x30, 0x30, 0x30, 0x30, 0xC0, 0x0F, 0xC0, 0x0F, +0x0A, 0xC0, 0x30, 0xC0, 0x30, 0x30, 0x0F, 0x30, 0x0F, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0x30, 0x03, 0xF0, 0x3F, 0xF0, 0x3F +}; +#endif // YOFONT10X14_H + +#endif //DSP_ILI9225 diff --git a/yoRadio/src/displays/fonts/yofont5x7.c b/yoRadio/src/displays/fonts/yofont5x7.c new file mode 100644 index 0000000..28162be --- /dev/null +++ b/yoRadio/src/displays/fonts/yofont5x7.c @@ -0,0 +1,275 @@ +#include "../../../options.h" +#if DSP_MODEL==DSP_ILI9225 +#ifndef YOFONTFONT5X7_H +#define YOFONTFONT5X7_H + +#ifdef __AVR__ + #include + #include +#elif defined(ESP8266) + #include +#else + #define PROGMEM +#endif + +const unsigned char yofont5x7[] PROGMEM = { +0x05, 0x07, 0x00, 0xFF, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x3E, 0x55, 0x51, 0x55, 0x3E, +0x05, 0x3E, 0x6B, 0x6F, 0x6B, 0x3E, +0x05, 0x0C, 0x1E, 0x3C, 0x1E, 0x0C, +0x05, 0x08, 0x1C, 0x3E, 0x1C, 0x08, +0x05, 0x1C, 0x4A, 0x7F, 0x4A, 0x1C, +0x05, 0x18, 0x5C, 0x7F, 0x5C, 0x18, +0x05, 0x00, 0x1C, 0x1C, 0x1C, 0x00, +0x05, 0x7F, 0x63, 0x63, 0x63, 0x7F, +0x05, 0x00, 0x1C, 0x14, 0x1C, 0x00, +0x05, 0x7F, 0x63, 0x6B, 0x63, 0x7F, +0x05, 0x30, 0x48, 0x4D, 0x33, 0x07, +0x05, 0x06, 0x29, 0x79, 0x29, 0x06, +0x05, 0x20, 0x50, 0x3F, 0x02, 0x0C, +0x05, 0x60, 0x7F, 0x05, 0x35, 0x3F, +0x05, 0x2A, 0x1C, 0x77, 0x1C, 0x2A, +0x05, 0x00, 0x7F, 0x3E, 0x1C, 0x08, +0x05, 0x08, 0x1C, 0x3E, 0x7F, 0x00, +0x05, 0x14, 0x22, 0x7F, 0x22, 0x14, +0x05, 0x00, 0x5F, 0x00, 0x5F, 0x00, +0x05, 0x06, 0x09, 0x7F, 0x01, 0x7F, +0x05, 0x4A, 0x55, 0x55, 0x55, 0x29, +0x05, 0x60, 0x60, 0x60, 0x60, 0x60, +0x05, 0x54, 0x62, 0x7F, 0x62, 0x54, +0x05, 0x08, 0x04, 0x7E, 0x04, 0x08, +0x05, 0x08, 0x10, 0x3F, 0x10, 0x08, +0x05, 0x08, 0x08, 0x2A, 0x1C, 0x08, +0x05, 0x08, 0x1C, 0x2A, 0x08, 0x08, +0x05, 0x1C, 0x10, 0x10, 0x10, 0x10, +0x05, 0x1C, 0x3E, 0x08, 0x3E, 0x1C, +0x05, 0x30, 0x3C, 0x3F, 0x3C, 0x30, +0x05, 0x06, 0x1E, 0x7E, 0x1E, 0x06, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x5F, 0x00, 0x00, +0x05, 0x00, 0x07, 0x00, 0x07, 0x00, +0x05, 0x14, 0x7F, 0x14, 0x7F, 0x14, +0x05, 0x24, 0x2A, 0x7F, 0x2A, 0x12, +0x05, 0x23, 0x13, 0x08, 0x64, 0x62, +0x05, 0x36, 0x49, 0x56, 0x20, 0x50, +0x05, 0x00, 0x00, 0x07, 0x00, 0x00, +0x05, 0x00, 0x1C, 0x22, 0x41, 0x00, +0x05, 0x00, 0x41, 0x22, 0x1C, 0x00, +0x05, 0x14, 0x08, 0x3E, 0x08, 0x14, +0x05, 0x08, 0x08, 0x3E, 0x08, 0x08, +0x05, 0x00, 0xA0, 0x60, 0x00, 0x00, +0x05, 0x08, 0x08, 0x08, 0x08, 0x08, +0x05, 0x00, 0x60, 0x60, 0x00, 0x00, +0x05, 0x20, 0x10, 0x08, 0x04, 0x02, +0x05, 0x3E, 0x51, 0x49, 0x45, 0x3E, +0x05, 0x44, 0x42, 0x7F, 0x40, 0x40, +0x05, 0x42, 0x61, 0x51, 0x49, 0x46, +0x05, 0x21, 0x41, 0x45, 0x4B, 0x31, +0x05, 0x18, 0x14, 0x12, 0x7F, 0x10, +0x05, 0x27, 0x45, 0x45, 0x45, 0x39, +0x05, 0x3C, 0x4A, 0x49, 0x49, 0x30, +0x05, 0x01, 0x71, 0x09, 0x05, 0x03, +0x05, 0x36, 0x49, 0x49, 0x49, 0x36, +0x05, 0x06, 0x49, 0x49, 0x29, 0x1E, +0x05, 0x00, 0x6C, 0x6C, 0x00, 0x00, +0x05, 0x00, 0xAC, 0x6C, 0x00, 0x00, +0x05, 0x08, 0x14, 0x22, 0x41, 0x00, +0x05, 0x14, 0x14, 0x14, 0x14, 0x14, +0x05, 0x00, 0x41, 0x22, 0x14, 0x08, +0x05, 0x02, 0x01, 0x51, 0x09, 0x06, +0x05, 0x3E, 0x41, 0x5D, 0x55, 0x5E, +0x05, 0x7C, 0x12, 0x11, 0x12, 0x7C, +0x05, 0x7F, 0x49, 0x49, 0x49, 0x36, +0x05, 0x3E, 0x41, 0x41, 0x41, 0x22, +0x05, 0x7F, 0x41, 0x41, 0x22, 0x1C, +0x05, 0x7F, 0x49, 0x49, 0x49, 0x41, +0x05, 0x7F, 0x09, 0x09, 0x09, 0x01, +0x05, 0x3E, 0x41, 0x49, 0x49, 0x7A, +0x05, 0x7F, 0x08, 0x08, 0x08, 0x7F, +0x05, 0x00, 0x41, 0x7F, 0x41, 0x00, +0x05, 0x20, 0x40, 0x41, 0x3F, 0x01, +0x05, 0x7F, 0x08, 0x14, 0x22, 0x41, +0x05, 0x7F, 0x40, 0x40, 0x40, 0x60, +0x05, 0x7F, 0x02, 0x0C, 0x02, 0x7F, +0x05, 0x7F, 0x04, 0x08, 0x10, 0x7F, +0x05, 0x3E, 0x41, 0x41, 0x41, 0x3E, +0x05, 0x7F, 0x09, 0x09, 0x09, 0x06, +0x05, 0x3E, 0x41, 0x51, 0x21, 0x5E, +0x05, 0x7F, 0x09, 0x19, 0x29, 0x46, +0x05, 0x46, 0x49, 0x49, 0x49, 0x31, +0x05, 0x03, 0x01, 0x7F, 0x01, 0x03, +0x05, 0x3F, 0x40, 0x40, 0x40, 0x3F, +0x05, 0x1F, 0x20, 0x40, 0x20, 0x1F, +0x05, 0x3F, 0x40, 0x3C, 0x40, 0x3F, +0x05, 0x63, 0x14, 0x08, 0x14, 0x63, +0x05, 0x07, 0x08, 0x70, 0x08, 0x07, +0x05, 0x61, 0x51, 0x49, 0x45, 0x43, +0x05, 0x00, 0x7F, 0x41, 0x41, 0x00, +0x05, 0x02, 0x04, 0x08, 0x10, 0x20, +0x05, 0x00, 0x41, 0x41, 0x7F, 0x00, +0x05, 0x04, 0x02, 0x01, 0x02, 0x04, +0x05, 0x40, 0x40, 0x40, 0x40, 0x40, +0x05, 0x00, 0x01, 0x02, 0x04, 0x00, +0x05, 0x20, 0x54, 0x54, 0x54, 0x78, +0x05, 0x7F, 0x48, 0x44, 0x44, 0x38, +0x05, 0x38, 0x44, 0x44, 0x44, 0x48, +0x05, 0x38, 0x44, 0x44, 0x48, 0x7F, +0x05, 0x38, 0x54, 0x54, 0x54, 0x18, +0x05, 0x08, 0x7E, 0x09, 0x01, 0x02, +0x05, 0x08, 0x54, 0x54, 0x58, 0x3C, +0x05, 0x7F, 0x08, 0x04, 0x04, 0x78, +0x05, 0x00, 0x44, 0x7D, 0x40, 0x00, +0x05, 0x20, 0x40, 0x44, 0x3D, 0x00, +0x05, 0x7F, 0x10, 0x10, 0x28, 0x44, +0x05, 0x00, 0x41, 0x7F, 0x40, 0x00, +0x05, 0x7C, 0x04, 0x78, 0x04, 0x78, +0x05, 0x7C, 0x08, 0x04, 0x04, 0x78, +0x05, 0x38, 0x44, 0x44, 0x44, 0x38, +0x05, 0x7C, 0x14, 0x14, 0x14, 0x08, +0x05, 0x08, 0x14, 0x14, 0x0C, 0x7C, +0x05, 0x7C, 0x08, 0x04, 0x04, 0x08, +0x05, 0x48, 0x54, 0x54, 0x54, 0x24, +0x05, 0x04, 0x3F, 0x44, 0x40, 0x20, +0x05, 0x3C, 0x40, 0x40, 0x20, 0x7C, +0x05, 0x1C, 0x20, 0x40, 0x20, 0x1C, +0x05, 0x3C, 0x40, 0x38, 0x40, 0x3C, +0x05, 0x44, 0x28, 0x10, 0x28, 0x44, +0x05, 0x0C, 0x50, 0x50, 0x50, 0x3C, +0x05, 0x44, 0x64, 0x54, 0x4C, 0x44, +0x05, 0x00, 0x08, 0x36, 0x41, 0x00, +0x05, 0x00, 0x00, 0x7F, 0x00, 0x00, +0x05, 0x00, 0x41, 0x36, 0x08, 0x00, +0x05, 0x02, 0x01, 0x02, 0x04, 0x02, +0x05, 0x70, 0x48, 0x44, 0x48, 0x70, +0x05, 0x00, 0x0E, 0x11, 0x0E, 0x00, +0x05, 0x00, 0x12, 0x1F, 0x10, 0x00, +0x05, 0x00, 0x12, 0x19, 0x16, 0x00, +0x05, 0x00, 0x11, 0x15, 0x0B, 0x00, +0x05, 0x00, 0x07, 0x04, 0x1F, 0x00, +0x05, 0x00, 0x17, 0x15, 0x09, 0x00, +0x05, 0x00, 0x0E, 0x15, 0x09, 0x00, +0x05, 0x00, 0x01, 0x1D, 0x03, 0x00, +0x05, 0x00, 0x0A, 0x15, 0x0A, 0x00, +0x05, 0x00, 0x12, 0x15, 0x0E, 0x00, +0x05, 0x00, 0x04, 0x04, 0x04, 0x00, +0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x05, 0x3E, 0x00, 0x00, 0x00, 0x00, +0x05, 0x3E, 0x3E, 0x00, 0x00, 0x00, +0x05, 0x3E, 0x3E, 0x00, 0x3E, 0x00, +0x05, 0x3E, 0x3E, 0x00, 0x3E, 0x3E, +0x05, 0x58, 0x64, 0x04, 0x64, 0x58, +0x05, 0x7F, 0x3E, 0x1C, 0x08, 0x7F, +0x05, 0x7F, 0x08, 0x1C, 0x3E, 0x7F, +0x05, 0x7F, 0x7F, 0x00, 0x7F, 0x7F, +0x05, 0x08, 0x3E, 0x22, 0x22, 0x22, +0x05, 0x22, 0x22, 0x22, 0x3E, 0x08, +0x05, 0x40, 0x00, 0x40, 0x00, 0x40, +0x05, 0x60, 0x00, 0x40, 0x00, 0x40, +0x05, 0x60, 0x00, 0x70, 0x00, 0x40, +0x05, 0x60, 0x00, 0x70, 0x00, 0x78, +0x05, 0x7C, 0x00, 0x40, 0x00, 0x40, +0x05, 0x7C, 0x00, 0x7E, 0x00, 0x40, +0x05, 0x7C, 0x00, 0x7E, 0x00, 0x7F, +0x05, 0x1C, 0x77, 0x41, 0x41, 0x41, +0x05, 0x41, 0x41, 0x41, 0x41, 0x41, +0x05, 0x41, 0x41, 0x41, 0x7F, 0x00, +0x05, 0x1C, 0x77, 0x41, 0x5D, 0x5D, +0x05, 0x41, 0x41, 0x41, 0x5D, 0x5D, +0x05, 0x5D, 0x5D, 0x41, 0x5D, 0x5D, +0x05, 0x5D, 0x5D, 0x41, 0x7F, 0x00, +0x05, 0x22, 0x1C, 0x14, 0x1C, 0x22, +0x05, 0x00, 0x08, 0x1C, 0x08, 0x00, +0x05, 0x00, 0x00, 0x77, 0x00, 0x00, +0x05, 0x46, 0x5D, 0x55, 0x5D, 0x31, +0x05, 0x7C, 0x55, 0x54, 0x55, 0x44, +0x05, 0x08, 0x08, 0x2A, 0x08, 0x08, +0x05, 0x00, 0x14, 0x08, 0x14, 0x00, +0x05, 0x08, 0x14, 0x22, 0x08, 0x14, +0x05, 0x7F, 0x41, 0x71, 0x31, 0x1F, +0x05, 0x03, 0x05, 0x7F, 0x05, 0x03, +0x05, 0x22, 0x14, 0x7F, 0x55, 0x22, +0x05, 0x02, 0x55, 0x7D, 0x05, 0x02, +0x05, 0x06, 0x09, 0x09, 0x06, 0x00, +0x05, 0x44, 0x44, 0x5F, 0x44, 0x44, +0x05, 0x1C, 0x14, 0x1C, 0x22, 0x7F, +0x05, 0x20, 0x3E, 0x61, 0x3E, 0x20, +0x05, 0x20, 0x50, 0x3F, 0x02, 0x0C, +0x05, 0x80, 0x7C, 0x20, 0x3C, 0x40, +0x05, 0x44, 0x3C, 0x04, 0x7C, 0x44, +0x05, 0x00, 0x00, 0x08, 0x00, 0x00, +0x05, 0x38, 0x55, 0x54, 0x55, 0x18, +0x05, 0x7E, 0x08, 0x10, 0x7F, 0x01, +0x05, 0x08, 0x10, 0x08, 0x04, 0x02, +0x05, 0x14, 0x08, 0x22, 0x14, 0x08, +0x05, 0x0E, 0x06, 0x0A, 0x10, 0x20, +0x05, 0x20, 0x10, 0x0A, 0x06, 0x0E, +0x05, 0x38, 0x30, 0x28, 0x04, 0x02, +0x05, 0x02, 0x04, 0x28, 0x30, 0x38, +0x05, 0x7E, 0x11, 0x11, 0x11, 0x7E, +0x05, 0x7F, 0x49, 0x49, 0x49, 0x31, +0x05, 0x7F, 0x49, 0x49, 0x49, 0x36, +0x05, 0x7F, 0x01, 0x01, 0x01, 0x03, +0x05, 0xC0, 0x7F, 0x41, 0x7F, 0xC0, +0x05, 0x7F, 0x49, 0x49, 0x49, 0x41, +0x05, 0x77, 0x08, 0x7F, 0x08, 0x77, +0x05, 0x41, 0x49, 0x49, 0x49, 0x36, +0x05, 0x7F, 0x10, 0x08, 0x04, 0x7F, +0x05, 0x7C, 0x21, 0x12, 0x09, 0x7C, +0x05, 0x7F, 0x08, 0x14, 0x22, 0x41, +0x05, 0x40, 0x3E, 0x01, 0x01, 0x7F, +0x05, 0x7F, 0x02, 0x0C, 0x02, 0x7F, +0x05, 0x7F, 0x08, 0x08, 0x08, 0x7F, +0x05, 0x3E, 0x41, 0x41, 0x41, 0x3E, +0x05, 0x7F, 0x01, 0x01, 0x01, 0x7F, +0x05, 0x7F, 0x09, 0x09, 0x09, 0x06, +0x05, 0x3E, 0x41, 0x41, 0x41, 0x22, +0x05, 0x01, 0x01, 0x7F, 0x01, 0x01, +0x05, 0x07, 0x48, 0x48, 0x48, 0x3F, +0x05, 0x0E, 0x11, 0x7F, 0x11, 0x0E, +0x05, 0x63, 0x14, 0x08, 0x14, 0x63, +0x05, 0x7F, 0x40, 0x40, 0x7F, 0xC0, +0x05, 0x07, 0x08, 0x08, 0x08, 0x7F, +0x05, 0x7F, 0x40, 0x7F, 0x40, 0x7F, +0x05, 0x7F, 0x40, 0x7F, 0x40, 0xFF, +0x05, 0x01, 0x7F, 0x48, 0x48, 0x30, +0x05, 0x7F, 0x48, 0x48, 0x30, 0x7F, +0x05, 0x7F, 0x48, 0x48, 0x48, 0x30, +0x05, 0x22, 0x41, 0x49, 0x49, 0x3E, +0x05, 0x7F, 0x08, 0x3E, 0x41, 0x3E, +0x05, 0x46, 0x29, 0x19, 0x09, 0x7F, +0x05, 0x20, 0x54, 0x54, 0x54, 0x78, +0x05, 0x3C, 0x4A, 0x4A, 0x49, 0x31, +0x05, 0x7C, 0x54, 0x54, 0x54, 0x28, +0x05, 0x7C, 0x04, 0x04, 0x04, 0x0C, +0x05, 0xC0, 0x78, 0x44, 0x7C, 0xC0, +0x05, 0x38, 0x54, 0x54, 0x54, 0x18, +0x05, 0x6C, 0x10, 0x7C, 0x10, 0x6C, +0x05, 0x44, 0x54, 0x54, 0x54, 0x28, +0x05, 0x7C, 0x20, 0x10, 0x08, 0x7C, +0x05, 0x7C, 0x40, 0x26, 0x10, 0x7C, +0x05, 0x7C, 0x10, 0x10, 0x28, 0x44, +0x05, 0x40, 0x38, 0x04, 0x04, 0x7C, +0x05, 0x7C, 0x08, 0x10, 0x08, 0x7C, +0x05, 0x7C, 0x10, 0x10, 0x10, 0x7C, +0x05, 0x38, 0x44, 0x44, 0x44, 0x38, +0x05, 0x7C, 0x04, 0x04, 0x04, 0x7C, +0x05, 0x7C, 0x14, 0x14, 0x14, 0x08, +0x05, 0x38, 0x44, 0x44, 0x44, 0x48, +0x05, 0x04, 0x04, 0x7C, 0x04, 0x04, +0x05, 0x0C, 0x50, 0x50, 0x50, 0x3C, +0x05, 0x18, 0x24, 0xFC, 0x24, 0x18, +0x05, 0x44, 0x28, 0x10, 0x28, 0x44, +0x05, 0x7C, 0x40, 0x40, 0x7C, 0xC0, +0x05, 0x0C, 0x10, 0x10, 0x10, 0x7C, +0x05, 0x7C, 0x40, 0x7C, 0x40, 0x7C, +0x05, 0x7C, 0x40, 0x7C, 0x40, 0xFC, +0x05, 0x04, 0x7C, 0x50, 0x50, 0x20, +0x05, 0x7C, 0x50, 0x50, 0x20, 0x7C, +0x05, 0x7C, 0x50, 0x50, 0x50, 0x20, +0x05, 0x28, 0x44, 0x54, 0x54, 0x38, +0x05, 0x7C, 0x10, 0x38, 0x44, 0x38, +0x05, 0x48, 0x34, 0x14, 0x14, 0x7C +}; +#endif // YOFONTFONT5X7_H +#endif //DSP_ILI9225 diff --git a/yoRadio/yoRadio.ino b/yoRadio/yoRadio.ino index 42b424c..e1f0d7f 100644 --- a/yoRadio/yoRadio.ino +++ b/yoRadio/yoRadio.ino @@ -71,5 +71,8 @@ void checkConnection(){ display.putRequest({NEWMODE, PLAYER}); if (playing) player.request.station = config.store.lastStation; checkMillis = millis(); +#ifdef MQTT_HOST + connectToMqtt(); +#endif } }