This commit is contained in:
e2002
2022-06-22 11:58:37 +03:00
parent 630dce0c9a
commit 26f49101be
15 changed files with 1158 additions and 23 deletions

View File

@@ -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 };

View File

@@ -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
}

View File

@@ -19,7 +19,7 @@ class Network {
void begin();
void requestTimeSync(bool withTelnetOutput=false);
private:
Ticker ntimer, stimer;
Ticker ntimer, stimer, rtimer;
void raiseSoftAP();
};

View File

@@ -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

View File

@@ -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();

View File

@@ -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"

View File

@@ -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;

View File

@@ -0,0 +1,436 @@
#include "../../options.h"
#if DSP_MODEL==DSP_ILI9225
#include "displayILI9225.h"
#include <SPI.h>
#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

View File

@@ -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

View File

@@ -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);

View File

@@ -0,0 +1,278 @@
#include "../../../options.h"
#if DSP_MODEL==DSP_ILI9225
#ifndef YOFONT10X14_H
#define YOFONT10X14_H
#ifdef __AVR__
#include <avr/io.h>
#include <avr/pgmspace.h>
#elif defined(ESP8266)
#include <pgmspace.h>
#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

View File

@@ -0,0 +1,275 @@
#include "../../../options.h"
#if DSP_MODEL==DSP_ILI9225
#ifndef YOFONTFONT5X7_H
#define YOFONTFONT5X7_H
#ifdef __AVR__
#include <avr/io.h>
#include <avr/pgmspace.h>
#elif defined(ESP8266)
#include <pgmspace.h>
#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

View File

@@ -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
}
}