Version 1.4.1.

This commit is contained in:
GuruSR 2022-02-09 20:26:43 -05:00 committed by GitHub
parent c55efa7b3e
commit fbbe3f72df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 898 additions and 218 deletions

View File

@ -10,9 +10,9 @@
// WiFi // WiFi
#define WiFi_AP_SSID "Watchy Connect" #define WiFi_AP_SSID "Watchy Connect"
#define WiFi_AP_PSWD "Watchy123" #define WiFi_AP_PSWD "Watchy123"
#define WiFi_AP_HIDE false #define WiFi_AP_HIDE false // Hide "WiFi_AP_SSID" so it doesn't show up in the normal scan list. IS NOT A SECURITY METHOD!
#define WiFi_AP_MAXC 4 #define WiFi_AP_MAXC 4 // Maximum user connections (default is 4).
#define WiFi_SSID_MAX 32 #define WiFi_SSID_MAX 32 // Do not change these two values.
#define WiFi_PASS_MAX 63 #define WiFi_PASS_MAX 63
// Use instead of Watchy Connect (if necessary) // Use instead of Watchy Connect (if necessary)
#define WiFi_DEF_SSID "" #define WiFi_DEF_SSID ""
@ -36,11 +36,8 @@
#define MenuWidth 200 #define MenuWidth 200
#define MenuHeight 83 #define MenuHeight 83
// BMA For Tilt/DTap // Max number of WatchStyles
#define BMA432_INT1_PIN 14 #define MaxStyles 1
#define BMA432_INT2_PIN 12
#define BMA432_INT1_MASK (1<<BMA432_INT1_PIN)
#define BMA432_INT2_MASK (1<<BMA432_INT2_PIN)
// Menu offsets so I don't have to statically entere them everywhere. // Menu offsets so I don't have to statically entere them everywhere.
#define MENU_STEPS 0 #define MENU_STEPS 0
@ -54,27 +51,28 @@
#define MENU_TONES 8 #define MENU_TONES 8
#define MENU_TIMEDN 9 #define MENU_TIMEDN 9
#define MENU_TIMEUP 10 #define MENU_TIMEUP 10
#define MENU_DISP 11 #define MENU_STYL 11
#define MENU_BRDR 12 #define MENU_DISP 12
#define MENU_SIDE 13 #define MENU_BRDR 13
#define MENU_SWAP 14 #define MENU_SIDE 14
#define MENU_ORNT 15 #define MENU_SWAP 15
#define MENU_MODE 16 #define MENU_ORNT 16
#define MENU_FEED 17 #define MENU_MODE 17
#define MENU_TRBO 18 #define MENU_FEED 18
#define MENU_DARK 19 #define MENU_TRBO 19
#define MENU_SAVE 20 #define MENU_DARK 20
#define MENU_TPWR 21 #define MENU_SAVE 21
#define MENU_INFO 22 #define MENU_TPWR 22
#define MENU_TRBL 23 #define MENU_INFO 23
#define MENU_SYNC 24 #define MENU_TRBL 24
#define MENU_WIFI 25 #define MENU_SYNC 25
#define MENU_OTAU 26 #define MENU_WIFI 26
#define MENU_OTAM 27 #define MENU_OTAU 27
#define MENU_SCRN 28 #define MENU_OTAM 28
#define MENU_RSET 29 #define MENU_SCRN 29
#define MENU_TOFF 30 // Time Diff offset. #define MENU_RSET 30
#define MENU_UNVS 31 #define MENU_TOFF 31 // Time Diff offset.
#define MENU_UNVS 32
// Menu segments. // Menu segments.
#define MENU_INNORMAL 0 #define MENU_INNORMAL 0
@ -98,11 +96,11 @@
#define AlarmSetup 1234567890 #define AlarmSetup 1234567890
//pins //pins
#define RTC_PIN GPIO_NUM_27 #define RTC_INT_PIN GPIO_NUM_27
#define CS 5 #define EPD_CS 5
#define DC 10 #define EPD_DC 10
#define RESET 9 #define EPD_RESET 9
//#define BUSY 19 #define EPD_BUSY 19
#define VIB_MOTOR_PIN 13 #define VIB_MOTOR_PIN 13
#define MENU_BTN_PIN 26 #define MENU_BTN_PIN 26
#define BACK_BTN_PIN 25 #define BACK_BTN_PIN 25

View File

@ -64,6 +64,7 @@ RTC_DATA_ATTR struct Optional final {
uint8_t Performance; // Performance style, "Turbo", "Normal", "Battery Saving" uint8_t Performance; // Performance style, "Turbo", "Normal", "Battery Saving"
bool NeedsSaving; // NVS code to tell it things have been updated, so save to NVS. bool NeedsSaving; // NVS code to tell it things have been updated, so save to NVS.
bool BedTimeOrientation; // Make Buttons only work while Watch is in normal orientation. bool BedTimeOrientation; // Make Buttons only work while Watch is in normal orientation.
uint8_t WatchFaceStyle; // Using the Style values from Defines_GSR.
} Options; } Options;
RTC_DATA_ATTR struct Designing final { RTC_DATA_ATTR struct Designing final {
@ -71,6 +72,7 @@ RTC_DATA_ATTR struct Designing final {
byte Top; // MenuTop 72 byte Top; // MenuTop 72
byte Header; // HeaderY 97 byte Header; // HeaderY 97
byte Data; // DataY 138 byte Data; // DataY 138
const GFXfont *Font; // Menu Font.
} Menu; } Menu;
struct FacePOS { struct FacePOS {
byte Time; // TimeY 56 byte Time; // TimeY 56
@ -119,6 +121,7 @@ RTC_DATA_ATTR struct TimeData final {
int64_t WatchyRTC; // Counts Microseconds from boot. int64_t WatchyRTC; // Counts Microseconds from boot.
bool DeadRTC; // Set when Drift fails to get a good count less than 30 seconds. bool DeadRTC; // Set when Drift fails to get a good count less than 30 seconds.
uint8_t NextAlarm; // Next index that will need to wake the Watchy from sleep to fire. uint8_t NextAlarm; // Next index that will need to wake the Watchy from sleep to fire.
bool BedTime; // If the hour is within the Bed Time settings.
} WatchTime; } WatchTime;
RTC_DATA_ATTR struct Countdown final { RTC_DATA_ATTR struct Countdown final {
@ -180,14 +183,11 @@ RTC_DATA_ATTR struct dispUpdate final {
bool Tapped; bool Tapped;
} Updates; } Updates;
#ifndef WATCHY_H
RTC_DATA_ATTR BMA423 sensor;
#endif
//WatchyRTC WatchyGSR::SRTC; //WatchyRTC WatchyGSR::SRTC;
SmallRTC WatchyGSR::SRTC; SmallRTC WatchyGSR::SRTC;
SmallNTP WatchyGSR::SNTP; SmallNTP WatchyGSR::SNTP;
GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> WatchyGSR::display(GxEPD2_154_D67(CS, DC, RESET, BUSY)); RTC_DATA_ATTR StableBMA SBMA;
GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> WatchyGSR::display(GxEPD2_154_D67(EPD_CS, EPD_DC, EPD_RESET, EPD_BUSY));
volatile uint8_t Button; volatile uint8_t Button;
@ -286,6 +286,7 @@ void WatchyGSR::init(String datetime){
UpdateClock(); UpdateClock();
detectBattery(); detectBattery();
UpdateDisp=Showing(); UpdateDisp=Showing();
InsertOnMinute();
break; break;
case ESP_SLEEP_WAKEUP_EXT1: //button Press case ESP_SLEEP_WAKEUP_EXT1: //button Press
RefreshCPU(CPUDEF); RefreshCPU(CPUDEF);
@ -298,24 +299,26 @@ void WatchyGSR::init(String datetime){
if (Options.SleepMode == 0) Options.SleepMode = 2; // Do this to avoid someone accidentally not setting this before usage. if (Options.SleepMode == 0) Options.SleepMode = 2; // Do this to avoid someone accidentally not setting this before usage.
UpdateClock(); // Make sure these are done during times when it won't. UpdateClock(); // Make sure these are done during times when it won't.
Darkness.Woke=true; Updates.Tapped=true; Darkness.Last=millis(); UpdateDisp = true; // Update Screen to new state. Darkness.Woke=true; Updates.Tapped=true; Darkness.Last=millis(); UpdateDisp = true; // Update Screen to new state.
}else if (Button == 6){ // Wrist. }else if (Button == 6 && !WatchTime.BedTime){ // Wrist.
UpdateClock(); // Make sure these are done during times when it won't. UpdateClock(); // Make sure these are done during times when it won't.
Darkness.Woke=true; Darkness.Last=millis(); UpdateDisp = true; // Do this anyways, always. Darkness.Woke=true; Darkness.Last=millis(); UpdateDisp = true; // Do this anyways, always.
} }
} }
InsertOnMinute(); SRTC.resetWake();
break; break;
default: //reset default: //reset
SRTC.init(); SRTC.init();
initZeros(); initZeros();
setupDefaults(); setupDefaults();
Rebooted=true; Rebooted=true;
Darkness.Woke=true;
_bmaConfig(); _bmaConfig();
UpdateUTC(); UpdateUTC();
if (OkNVS(GName)) B = NVS.getString(GTZ,S); if (OkNVS(GName)) B = NVS.getString(GTZ,S);
OP.setCurrentPOSIX(S); OP.setCurrentPOSIX(S);
RetrieveSettings(); RetrieveSettings();
RefreshCPU(CPUDEF); RefreshCPU(CPUDEF);
initWatchFaceStyle();
WatchTime.WatchyRTC = esp_timer_get_time() + ((60 - WatchTime.UTC.Second) * 1000000); WatchTime.WatchyRTC = esp_timer_get_time() + ((60 - WatchTime.UTC.Second) * 1000000);
WatchTime.EPSMS = (millis() + (1000 * (60 - WatchTime.UTC.Second))); WatchTime.EPSMS = (millis() + (1000 * (60 - WatchTime.UTC.Second)));
UpdateClock(); UpdateClock();
@ -330,7 +333,7 @@ void WatchyGSR::init(String datetime){
} }
if ((Battery.Last > LowBattery || Button != 0 || Updates.Tapped) && !(Options.SleepStyle == 4 && Darkness.Went && !Updates.Tapped)){ if ((Battery.Last > LowBattery || Button != 0 || Updates.Tapped || Darkness.Woke) && !(Options.SleepStyle == 4 && Darkness.Went && !Updates.Tapped)){
//Init interrupts. //Init interrupts.
attachInterrupt(digitalPinToInterrupt(MENU_BTN_PIN), std::bind(&WatchyGSR::handleInterrupt,this), HIGH); attachInterrupt(digitalPinToInterrupt(MENU_BTN_PIN), std::bind(&WatchyGSR::handleInterrupt,this), HIGH);
attachInterrupt(digitalPinToInterrupt(BACK_BTN_PIN), std::bind(&WatchyGSR::handleInterrupt,this), HIGH); attachInterrupt(digitalPinToInterrupt(BACK_BTN_PIN), std::bind(&WatchyGSR::handleInterrupt,this), HIGH);
@ -340,10 +343,10 @@ void WatchyGSR::init(String datetime){
// Sometimes BMA crashes - simply try to reinitialize bma... // Sometimes BMA crashes - simply try to reinitialize bma...
if (sensor.getErrorCode() != 0) { if (SBMA.getErrorCode() != 0) {
sensor.shutDown(); SBMA.shutDown();
sensor.wakeUp(); SBMA.wakeUp();
sensor.softReset(); SBMA.softReset();
_bmaConfig(); _bmaConfig();
} }
@ -364,10 +367,10 @@ void WatchyGSR::init(String datetime){
while (ActiveMode == true) { // Here, we hijack the init and LOOP until the NTP is done, watching for the proper time when we *SHOULD* update the screen to keep time with everything. while (ActiveMode == true) { // Here, we hijack the init and LOOP until the NTP is done, watching for the proper time when we *SHOULD* update the screen to keep time with everything.
Since=millis(); Since=millis();
ManageTime(); // Handle Time method. ManageTime(); // Handle Time method.
Up=IsUp(); Up=SBMA.IsUp();
// Wrist Tilt delay, keep screen on during this until you put your wrist down. // Wrist Tilt delay, keep screen on during this until you put your wrist down.
if (Darkness.Woke && Up) Darkness.Last = millis(); if (Darkness.Woke && Up) Darkness.Last = millis();
if ((Options.SleepStyle == 1 || Options.SleepStyle > 2) && Darkness.Went && Up) { Darkness.Last = millis(); Darkness.Woke = true; UpdateDisp=Showing(); } if ((Options.SleepStyle == 1 || Options.SleepStyle > 2) && Darkness.Went && Up && !WatchTime.BedTime) { Darkness.Last = millis(); Darkness.Woke = true; UpdateDisp=Showing(); }
processWiFiRequest(); // Process any WiFi requests. processWiFiRequest(); // Process any WiFi requests.
if (!Sensitive){ if (!Sensitive){
if (currentWiFi() == WL_CONNECTED && NTPData.State == 0 && !OTAUpdate && !WatchyAPOn && !NTPData.TimeTest) InsertWiFi(); if (currentWiFi() == WL_CONNECTED && NTPData.State == 0 && !OTAUpdate && !WatchyAPOn && !NTPData.TimeTest) InsertWiFi();
@ -679,16 +682,12 @@ void WatchyGSR::drawWatchFace(){
InsertBitmap(); InsertBitmap();
display.setTextColor(ForeColor()); display.setTextColor(ForeColor());
if (!(OTAUpdate || WatchyAPOn || (Menu.Item == MENU_TOFF && Menu.SubItem == 2))){ drawWatchFaceStyle();
drawTime();
drawDay();
drawYear();
}
if (GuiMode == WATCHON) drawDate();
else if (GuiMode == MENUON) drawMenu();
drawChargeMe(); drawChargeMe();
// Show WiFi/AP/TZ/NTP if in progress. // Show WiFi/AP/TZ/NTP if in progress.
drawStatus(); drawStatus();
if (GuiMode == MENUON) drawMenu();
UpdateDisp = false; UpdateDisp = false;
} }
@ -726,8 +725,7 @@ void WatchyGSR::drawMenu(){
uint16_t w, h; uint16_t w, h;
String O, S; String O, S;
display.setFont(&aAntiCorona12pt7b); display.setFont(Design.Menu.Font);
//display.fillRect(0, Design.Menu.Top, MenuWidth, MenuHeight, BackColor());
display.drawBitmap(0, Design.Menu.Top, (Menu.Style == MENU_INOPTIONS) ? OptionsMenuBackground : MenuBackground, MenuWidth, MenuHeight, ForeColor(), BackColor()); display.drawBitmap(0, Design.Menu.Top, (Menu.Style == MENU_INOPTIONS) ? OptionsMenuBackground : MenuBackground, MenuWidth, MenuHeight, ForeColor(), BackColor());
display.setTextColor(Options.LightMode && Menu.Style != MENU_INNORMAL ? GxEPD_WHITE : GxEPD_BLACK); display.setTextColor(Options.LightMode && Menu.Style != MENU_INNORMAL ? GxEPD_WHITE : GxEPD_BLACK);
switch (Menu.Item){ switch (Menu.Item){
@ -778,6 +776,9 @@ void WatchyGSR::drawMenu(){
case MENU_TIMEUP: case MENU_TIMEUP:
O = "Elapsed Timer"; O = "Elapsed Timer";
break; break;
case MENU_STYL:
O = "Watch Style";
break;
case MENU_DISP: case MENU_DISP:
O = "Display Style"; O = "Display Style";
break; break;
@ -869,16 +870,16 @@ void WatchyGSR::drawMenu(){
break; break;
} }
} }
display.getTextBounds(O, 0, Design.Menu.Header, &x1, &y1, &w, &h); display.getTextBounds(O, 0, Design.Menu.Header + Design.Menu.Top, &x1, &y1, &w, &h);
w = (196 - w) /2; w = (196 - w) /2;
display.setCursor(w + 2, Design.Menu.Header); display.setCursor(w + 2, Design.Menu.Header + Design.Menu.Top);
display.print(O); display.print(O);
display.setTextColor(GxEPD_BLACK); // Only show menu in Light mode display.setTextColor(GxEPD_BLACK); // Only show menu in Light mode
if (Menu.Item == MENU_STEPS){ //Steps if (Menu.Item == MENU_STEPS){ //Steps
switch (Menu.SubItem){ switch (Menu.SubItem){
case 0: // Steps. case 0: // Steps.
S = ""; if (Steps.Yesterday > 0) S = " (" + MakeSteps(Steps.Yesterday) + ")"; S = ""; if (Steps.Yesterday > 0) S = " (" + MakeSteps(Steps.Yesterday) + ")";
O = MakeSteps(sensor.getCounter()) + S; O = MakeSteps(SBMA.getCounter()) + S;
break; break;
case 1: // Hour. case 1: // Hour.
O="[" + MakeHour(Steps.Hour) + "]:" + MakeMinutes(Steps.Minutes) + MakeTOD(Steps.Hour, true); O="[" + MakeHour(Steps.Hour) + "]:" + MakeMinutes(Steps.Minutes) + MakeTOD(Steps.Hour, true);
@ -988,6 +989,15 @@ void WatchyGSR::drawMenu(){
} }
}else if (Menu.Item == MENU_OPTIONS){ // Options Menu }else if (Menu.Item == MENU_OPTIONS){ // Options Menu
O = "MENU to Enter"; O = "MENU to Enter";
}else if (Menu.Item == MENU_STYL){ // Switch Watch Style
switch (Options.WatchFaceStyle){
case 1:
O = "Ballsy";
break;
default:
O = "Original";
break;
}
}else if (Menu.Item == MENU_DISP){ // Switch Mode }else if (Menu.Item == MENU_DISP){ // Switch Mode
if (Options.LightMode){ if (Options.LightMode){
O = "Light"; O = "Light";
@ -1152,9 +1162,9 @@ void WatchyGSR::drawMenu(){
} }
if (O > ""){ if (O > ""){
display.getTextBounds(O, 0, Design.Menu.Data, &x1, &y1, &w, &h); display.getTextBounds(O, 0, Design.Menu.Data + Design.Menu.Top, &x1, &y1, &w, &h);
w = (196 - w) /2; w = (196 - w) /2;
display.setCursor(w + 2, Design.Menu.Data); display.setCursor(w + 2, Design.Menu.Data + Design.Menu.Top);
display.print(O); display.print(O);
} }
} }
@ -1192,12 +1202,13 @@ void WatchyGSR::drawData(String dData, byte Left, byte Bottom, WatchyGSR::DesOps
void WatchyGSR::deepSleep(){ void WatchyGSR::deepSleep(){
uint8_t I, N, D; uint8_t I, N, D;
bool BatOk = (Battery.Last == 0 || Battery.Last > LowBattery); bool BatOk, BT,B, DM;
bool BT = (Options.SleepStyle == 2 && BedTime()); UpdateUTC(); UpdateClock();
bool B = (((Options.SleepStyle == 1 || Options.SleepStyle > 2) || BT) && BatOk); BatOk = (Battery.Last == 0 || Battery.Last > LowBattery);
bool DM; BT = (Options.SleepStyle == 2 && WatchTime.BedTime);
B = (((Options.SleepStyle == 1 || Options.SleepStyle > 2) || BT) && BatOk);
UpdateUTC(); UpdateClock(); UpdateBMA(); GoDark(); UpdateBMA(); GoDark();
DM = (Darkness.Went && !TimerDown.Active); DM = (Darkness.Went && !TimerDown.Active);
D = WatchTime.Local.Wday + 1; D = WatchTime.Local.Wday + 1;
@ -1212,8 +1223,8 @@ void WatchyGSR::deepSleep(){
if (Options.NeedsSaving) RecordSettings(); if (Options.NeedsSaving) RecordSettings();
DisplaySleep(); DisplaySleep();
for(I = 0; I < 40; I++) { pinMode(I, INPUT); } for(I = 0; I < 40; I++) { pinMode(I, INPUT); }
esp_sleep_enable_ext1_wakeup((B ? (BMA432_INT1_MASK | BMA432_INT2_MASK) : 0) | BTN_PIN_MASK, ESP_EXT1_WAKEUP_ANY_HIGH); //enable deep sleep wake on button press ... |ACC_INT_MASK esp_sleep_enable_ext1_wakeup((B ? SBMA.WakeMask() : 0) | BTN_PIN_MASK, ESP_EXT1_WAKEUP_ANY_HIGH); //enable deep sleep wake on button press ... |ACC_INT_MASK
esp_sleep_enable_ext0_wakeup(RTC_PIN, 0); //enable deep sleep wake on RTC interrupt esp_sleep_enable_ext0_wakeup(RTC_INT_PIN, 0); //enable deep sleep wake on RTC interrupt
if (DM) SRTC.atMinuteWake(N % 60, WatchTime.Local.Hour, D); if (DM) SRTC.atMinuteWake(N % 60, WatchTime.Local.Hour, D);
else SRTC.nextMinuteWake(); else SRTC.nextMinuteWake();
esp_deep_sleep_start(); esp_deep_sleep_start();
@ -1453,12 +1464,12 @@ void WatchyGSR::setStatus(String Status){
void WatchyGSR::VibeTo(bool Mode){ void WatchyGSR::VibeTo(bool Mode){
if (Mode != VibeMode){ if (Mode != VibeMode){
if (Mode){ if (Mode){
sensor.enableFeature(BMA423_WAKEUP, false); SBMA.enableFeature(BMA423_WAKEUP, false);
pinMode(VIB_MOTOR_PIN, OUTPUT); pinMode(VIB_MOTOR_PIN, OUTPUT);
digitalWrite(VIB_MOTOR_PIN, true); digitalWrite(VIB_MOTOR_PIN, true);
}else{ }else{
digitalWrite(VIB_MOTOR_PIN, false); digitalWrite(VIB_MOTOR_PIN, false);
sensor.enableFeature(BMA423_WAKEUP,(Options.SleepStyle > 2 && BedTime())); SBMA.enableFeature(BMA423_WAKEUP,(Options.SleepStyle == 2 && WatchTime.BedTime) || (Options.SleepStyle > 2));
} }
VibeMode = Mode; VibeMode = Mode;
} }
@ -1470,8 +1481,8 @@ void WatchyGSR::handleButtonPress(uint8_t Pressed){
if (Darkness.Went && Options.SleepStyle == 4 && !WatchTime.DeadRTC && !Updates.Tapped) return; // No buttons unless a tapped happened. if (Darkness.Went && Options.SleepStyle == 4 && !WatchTime.DeadRTC && !Updates.Tapped) return; // No buttons unless a tapped happened.
if (!UpRight()) return; // Don't do buttons if not upright. if (!UpRight()) return; // Don't do buttons if not upright.
if (LastButton > 0 && (millis() - LastButton) < KEYPAUSE) return; if (Pressed < 5 && LastButton > 0 && (millis() - LastButton) < KEYPAUSE) return;
if (Darkness.Went) { Darkness.Woke=true; Darkness.Last=millis(); UpdateClock(); UpdateDisp=true; return; } // Don't do the button, just exit. if (Darkness.Went) { Darkness.Woke=true; Darkness.Last=millis(); UpdateUTC(); UpdateClock(); UpdateDisp=true; return; } // Don't do the button, just exit.
if ((NTPData.TimeTest || OTAUpdate) && (Pressed == 3 || Pressed == 4)) return; // Up/Down don't work in these modes. if ((NTPData.TimeTest || OTAUpdate) && (Pressed == 3 || Pressed == 4)) return; // Up/Down don't work in these modes.
switch (Pressed){ switch (Pressed){
@ -1483,7 +1494,7 @@ void WatchyGSR::handleButtonPress(uint8_t Pressed){
SetTurbo(); SetTurbo();
}else if (GuiMode == MENUON){ }else if (GuiMode == MENUON){
if (Menu.Item == MENU_OPTIONS && Menu.SubItem == 0){ // Options if (Menu.Item == MENU_OPTIONS && Menu.SubItem == 0){ // Options
Menu.Item = MENU_DISP; Menu.Item = MENU_STYL;
Menu.Style = MENU_INOPTIONS; Menu.Style = MENU_INOPTIONS;
DoHaptic = true; DoHaptic = true;
UpdateDisp = true; // Quick Update. UpdateDisp = true; // Quick Update.
@ -1496,7 +1507,7 @@ void WatchyGSR::handleButtonPress(uint8_t Pressed){
SetTurbo(); SetTurbo();
}else if (Menu.Item == MENU_STEPS){ // Steps }else if (Menu.Item == MENU_STEPS){ // Steps
if (Menu.SubItem == 4){ if (Menu.SubItem == 4){
sensor.resetStepCounter(); SBMA.resetStepCounter();
Menu.SubItem = 0; Menu.SubItem = 0;
DoHaptic = true; DoHaptic = true;
UpdateDisp = true; // Quick Update. UpdateDisp = true; // Quick Update.
@ -1638,13 +1649,20 @@ void WatchyGSR::handleButtonPress(uint8_t Pressed){
NTPData.UpdateUTC = true; NTPData.UpdateUTC = true;
} }
GuiMode = WATCHON; GuiMode = WATCHON;
Menu.Item = MENU_DISP; Menu.Item = MENU_STYL;
Menu.SubItem = 0; Menu.SubItem = 0;
DoHaptic = true; DoHaptic = true;
UpdateDisp = true; // Quick Update. UpdateDisp = true; // Quick Update.
SetTurbo(); SetTurbo();
AskForWiFi(); AskForWiFi();
} }
}else if (Menu.Item == MENU_STYL){ // Switch Watch Face
Options.WatchFaceStyle = roller(Options.WatchFaceStyle + 1,0,MaxStyles);
initWatchFaceStyle();
Options.NeedsSaving = true;
DoHaptic = true;
UpdateDisp = true; // Quick Update.
SetTurbo();
}else if (Menu.Item == MENU_DISP){ // Switch Mode }else if (Menu.Item == MENU_DISP){ // Switch Mode
Options.LightMode = !Options.LightMode; Options.LightMode = !Options.LightMode;
Options.NeedsSaving = true; Options.NeedsSaving = true;
@ -2015,7 +2033,7 @@ void WatchyGSR::handleButtonPress(uint8_t Pressed){
return; return;
}else{ }else{
if (Menu.Style == MENU_INOPTIONS){ if (Menu.Style == MENU_INOPTIONS){
Menu.Item = roller(Menu.Item - 1, MENU_DISP, (NTPData.State > 0 || WatchyAPOn || OTAUpdate || Battery.Last < MinBattery) ? MENU_TRBL : MENU_OTAM); Menu.Item = roller(Menu.Item - 1, MENU_STYL, (NTPData.State > 0 || WatchyAPOn || OTAUpdate || Battery.Last < MinBattery) ? MENU_TRBL : MENU_OTAM);
}else if (Menu.Style == MENU_INALARMS){ }else if (Menu.Style == MENU_INALARMS){
Menu.Item = roller(Menu.Item - 1, MENU_ALARM1, MENU_TONES); Menu.Item = roller(Menu.Item - 1, MENU_ALARM1, MENU_TONES);
}else if (Menu.Style == MENU_INTIMERS){ }else if (Menu.Style == MENU_INTIMERS){
@ -2193,7 +2211,7 @@ void WatchyGSR::handleButtonPress(uint8_t Pressed){
return; return;
}else{ }else{
if (Menu.Style == MENU_INOPTIONS){ if (Menu.Style == MENU_INOPTIONS){
Menu.Item = roller(Menu.Item + 1, MENU_DISP, (NTPData.State > 0 || WatchyAPOn || OTAUpdate || Battery.Last < MinBattery) ? MENU_TRBL : MENU_OTAM); Menu.Item = roller(Menu.Item + 1, MENU_STYL, (NTPData.State > 0 || WatchyAPOn || OTAUpdate || Battery.Last < MinBattery) ? MENU_TRBL : MENU_OTAM);
}else if (Menu.Style == MENU_INALARMS){ }else if (Menu.Style == MENU_INALARMS){
Menu.Item = roller(Menu.Item + 1, MENU_ALARM1, MENU_TONES); Menu.Item = roller(Menu.Item + 1, MENU_ALARM1, MENU_TONES);
}else if (Menu.Style == MENU_INTIMERS){ }else if (Menu.Style == MENU_INTIMERS){
@ -2233,6 +2251,8 @@ void WatchyGSR::UpdateClock(){
WatchTime.Local.Day = TM->tm_mday; WatchTime.Local.Day = TM->tm_mday;
WatchTime.Local.Month = TM->tm_mon + 1; WatchTime.Local.Month = TM->tm_mon + 1;
WatchTime.Local.Year = TM->tm_year; WatchTime.Local.Year = TM->tm_year;
if (Options.SleepEnd > Options.SleepStart) WatchTime.BedTime = (WatchTime.Local.Hour >= Options.SleepStart && WatchTime.Local.Hour < Options.SleepEnd);
else WatchTime.BedTime = (WatchTime.Local.Hour >= Options.SleepStart || WatchTime.Local.Hour < Options.SleepEnd);
CalculateTones(); monitorSteps(); // Moved here for accuracy during Deep Sleep. CalculateTones(); monitorSteps(); // Moved here for accuracy during Deep Sleep.
} }
@ -2296,109 +2316,33 @@ void WatchyGSR::ManageTime(){
void WatchyGSR::_bmaConfig() { void WatchyGSR::_bmaConfig() {
if (sensor.begin(_readRegister, _writeRegister, delay) == false) { if (SBMA.begin(_readRegister, _writeRegister, delay, SRTC.getType()) == false) {
//fail to init BMA //fail to init BMA
return; return;
} }
// Accel parameter structure if (!SBMA.defaultConfig()) return; // Failed.
Acfg cfg;
/*!
Output data rate in Hz, Optional parameters:
- BMA4_OUTPUT_DATA_RATE_0_78HZ
- BMA4_OUTPUT_DATA_RATE_1_56HZ
- BMA4_OUTPUT_DATA_RATE_3_12HZ
- BMA4_OUTPUT_DATA_RATE_6_25HZ
- BMA4_OUTPUT_DATA_RATE_12_5HZ
- BMA4_OUTPUT_DATA_RATE_25HZ
- BMA4_OUTPUT_DATA_RATE_50HZ
- BMA4_OUTPUT_DATA_RATE_100HZ
- BMA4_OUTPUT_DATA_RATE_200HZ
- BMA4_OUTPUT_DATA_RATE_400HZ
- BMA4_OUTPUT_DATA_RATE_800HZ
- BMA4_OUTPUT_DATA_RATE_1600HZ
*/
cfg.odr = BMA4_OUTPUT_DATA_RATE_100HZ;
/*!
G-range, Optional parameters:
- BMA4_ACCEL_RANGE_2G
- BMA4_ACCEL_RANGE_4G
- BMA4_ACCEL_RANGE_8G
- BMA4_ACCEL_RANGE_16G
*/
cfg.range = BMA4_ACCEL_RANGE_2G;
/*!
Bandwidth parameter, determines filter configuration, Optional parameters:
- BMA4_ACCEL_OSR4_AVG1
- BMA4_ACCEL_OSR2_AVG2
- BMA4_ACCEL_NORMAL_AVG4
- BMA4_ACCEL_CIC_AVG8
- BMA4_ACCEL_RES_AVG16
- BMA4_ACCEL_RES_AVG32
- BMA4_ACCEL_RES_AVG64
- BMA4_ACCEL_RES_AVG128
*/
cfg.bandwidth = BMA4_ACCEL_NORMAL_AVG4;
/*! Filter performance mode , Optional parameters:
- BMA4_CIC_AVG_MODE
- BMA4_CONTINUOUS_MODE
*/
cfg.perf_mode = BMA4_CONTINUOUS_MODE;
// Configure the BMA423 accelerometer
sensor.setAccelConfig(cfg);
// Enable BMA423 accelerometer
// Warning : Need to use feature, you must first enable the accelerometer
sensor.enableAccel();
struct bma4_int_pin_config config ;
config.edge_ctrl = BMA4_LEVEL_TRIGGER;
config.lvl = BMA4_ACTIVE_HIGH;
config.od = BMA4_PUSH_PULL;
config.output_en = BMA4_OUTPUT_ENABLE;
config.input_en = BMA4_INPUT_DISABLE;
// The correct trigger interrupt needs to be configured as needed
sensor.setINTPinConfig(config, BMA4_INTR1_MAP);
struct bma423_axes_remap remap_data;
remap_data.x_axis = 1;
remap_data.x_axis_sign = 1;
remap_data.y_axis = 0;
remap_data.y_axis_sign = 1;
remap_data.z_axis = 2;
remap_data.z_axis_sign = 1;
// Need to raise the wrist function, need to set the correct axis
sensor.setRemapAxes(&remap_data);
// Enable BMA423 isStepCounter feature // Enable BMA423 isStepCounter feature
sensor.enableFeature(BMA423_STEP_CNTR, true); SBMA.enableFeature(BMA423_STEP_CNTR, true);
// Enable BMA423 isTilt feature // Enable isTilt feature
//sensor.enableFeature(BMA423_TILT, true); //SBMA.enableTiltWake();
// Enable BMA423 isDoubleClick feature // Enable isDoubleClick feature
// sensor.enableFeature(BMA423_WAKEUP, true); // SBMA.enableDoubleClickWake();
// Reset steps // Reset steps
//sensor.resetStepCounter(); //SBMA.resetStepCounter();
// Turn on feature interrupt // Turn on feature interrupt
//sensor.enableStepCountInterrupt(); //SBMA.enableStepCountInterrupt();
//sensor.enableTiltInterrupt();
// It corresponds to isDoubleClick interrupt
// sensor.enableWakeupInterrupt();
} }
void WatchyGSR::UpdateBMA(){ void WatchyGSR::UpdateBMA(){
bool BT = (Options.SleepStyle == 2 && BedTime()); bool BT = (Options.SleepStyle == 2 && WatchTime.BedTime);
bool B = (Options.SleepStyle > 2); bool B = (Options.SleepStyle > 2);
bool A = (Options.SleepStyle == 1); bool A = (Options.SleepStyle == 1);
sensor.enableFeature(BMA423_WAKEUP,B | BT); SBMA.enableDoubleClickWake(B | BT);
sensor.enableWakeupInterrupt(B | BT); SBMA.enableTiltWake((A | B) & !WatchTime.BedTime);
sensor.enableFeature(BMA423_TILT,A | B);
sensor.enableTiltInterrupt(A | B);
} }
float WatchyGSR::getBatteryVoltage(){ return ((BatteryRead() - 0.0125) + (BatteryRead() - 0.0125) + (BatteryRead() - 0.0125) + (BatteryRead() - 0.0125)) / 4; } float WatchyGSR::getBatteryVoltage(){ return ((BatteryRead() - 0.0125) + (BatteryRead() - 0.0125) + (BatteryRead() - 0.0125) + (BatteryRead() - 0.0125)) / 4; }
@ -2617,8 +2561,8 @@ String WatchyGSR::getReduce(uint8_t Amount){
void WatchyGSR::monitorSteps(){ void WatchyGSR::monitorSteps(){
if (Steps.Hour == WatchTime.Local.Hour && Steps.Minutes == WatchTime.Local.Minute){ if (Steps.Hour == WatchTime.Local.Hour && Steps.Minutes == WatchTime.Local.Minute){
if (!Steps.Reset){ if (!Steps.Reset){
Steps.Yesterday=sensor.getCounter(); Steps.Yesterday=SBMA.getCounter();
sensor.resetStepCounter(); SBMA.resetStepCounter();
Steps.Reset=true; Steps.Reset=true;
} }
}else if (Steps.Reset) Steps.Reset=false; }else if (Steps.Reset) Steps.Reset=false;
@ -2648,11 +2592,9 @@ uint8_t WatchyGSR::getButtonMaskToID(uint64_t HW){
else if (HW & BACK_BTN_MASK) return Options.Lefty ? 3 : getSwapped(2); // Back Button [SW2] else if (HW & BACK_BTN_MASK) return Options.Lefty ? 3 : getSwapped(2); // Back Button [SW2]
else if (HW & UP_BTN_MASK) return Options.Lefty ? getSwapped(2) : 3; // Up Button [SW3] else if (HW & UP_BTN_MASK) return Options.Lefty ? getSwapped(2) : 3; // Up Button [SW3]
else if (HW & DOWN_BTN_MASK) return Options.Lefty ? getSwapped(1) : 4; // Down Button [SW4] else if (HW & DOWN_BTN_MASK) return Options.Lefty ? getSwapped(1) : 4; // Down Button [SW4]
else if ((HW & BMA432_INT1_MASK) || (HW & BMA432_INT2_MASK)) { // Acccelerometer. else if (SBMA.didBMAWakeUp(HW)) { // Acccelerometer.
sensor.getINT(); if (SBMA.isDoubleClick()) return 5; // Double Tap.
int IRQMask = sensor.getIRQMASK(); else if (SBMA.isTilt()) return 6; // Wrist Tilt.
if (IRQMask & BMA423_WAKEUP_INT) return 5; // Double Tap.
else if (IRQMask & BMA423_TILT_INT) return 6; // Wrist Tilt.
} }
return 0; return 0;
} }
@ -2857,31 +2799,6 @@ String WatchyGSR::PASStoString(uint8_t Index){
void WatchyGSR::initZeros(){ void WatchyGSR::initZeros(){
String S = ""; String S = "";
uint8_t I; uint8_t I;
Design.Menu.Top = 72;
Design.Menu.Header = 97;
Design.Menu.Data = 138;
Design.Face.Time = 56;
Design.Face.TimeHeight = 45;
Design.Face.TimeColor = GxEPD_BLACK;
Design.Face.TimeFont = &aAntiCorona36pt7b;
Design.Face.TimeStyle = WatchyGSR::dCENTER;
Design.Face.Day = 101;
Design.Face.DayColor = GxEPD_BLACK;
Design.Face.DayFont = &aAntiCorona16pt7b;
Design.Face.DayStyle = WatchyGSR::dCENTER;
Design.Face.Date = 143;
Design.Face.DateColor = GxEPD_BLACK;
Design.Face.DateFont = &aAntiCorona15pt7b;
Design.Face.DateStyle = WatchyGSR::dCENTER;
Design.Face.Year = 186;
Design.Face.YearLeft = 99;
Design.Face.YearColor = GxEPD_BLACK;
Design.Face.YearFont = &aAntiCorona16pt7b;
Design.Face.YearStyle = WatchyGSR::dCENTER;
Design.Status.WIFIx = 5;
Design.Status.WIFIy = 193;
Design.Status.BATTx = 155;
Design.Status.BATTy = 178;
GuiMode = WATCHON; GuiMode = WATCHON;
VibeMode = 0; VibeMode = 0;
WatchyStatus = ""; WatchyStatus = "";
@ -2986,7 +2903,7 @@ String WatchyGSR::GetSettings(){
// Retrieve the settings from the current state into a base64 string. // Retrieve the settings from the current state into a base64 string.
I[J] = 130; J++; // New Version. I[J] = 131; J++; // New Version.
I[J] = (Steps.Hour); J++; I[J] = (Steps.Hour); J++;
I[J] = (Steps.Minutes); J++; I[J] = (Steps.Minutes); J++;
K = Options.TwentyFour ? 1 : 0; K = Options.TwentyFour ? 1 : 0;
@ -3012,6 +2929,9 @@ String WatchyGSR::GetSettings(){
K = Options.BedTimeOrientation ? 1 : 0; K = Options.BedTimeOrientation ? 1 : 0;
I[J] = (K); J++; I[J] = (K); J++;
// Emd Version 130. // Emd Version 130.
// Version 131.
I[J] = Options.WatchFaceStyle; J++;
// End Version 131.
V = (Options.MasterRepeats << 5); I[J] = (Options.Turbo | V); J++; V = (Options.MasterRepeats << 5); I[J] = (Options.Turbo | V); J++;
@ -3103,6 +3023,9 @@ void WatchyGSR::StoreSettings(String FromUser){
J++; if (L > J){ V = constrain(O[J],0,10); GSRWiFi.TransmitPower = RawWiFiTX[V]; } J++; if (L > J){ V = constrain(O[J],0,10); GSRWiFi.TransmitPower = RawWiFiTX[V]; }
J++; if (L > J){ V = O[J]; Options.BedTimeOrientation = (V & 1) ? true : false; } J++; if (L > J){ V = O[J]; Options.BedTimeOrientation = (V & 1) ? true : false; }
} }
if (NewV > 130){
J++; if (L > J){ V = constrain(O[J],0,MaxStyles); Options.WatchFaceStyle = V; }
}
} }
if (WatchTime.DeadRTC) Options.Feedback = false; if (WatchTime.DeadRTC) Options.Feedback = false;
J++; if (L > J){ J++; if (L > J){
@ -3215,25 +3138,15 @@ void WatchyGSR::SetTurbo(){
bool WatchyGSR::InTurbo() { return (!WatchTime.DeadRTC && Options.Turbo > 0 && TurboTime != 0 && millis() - TurboTime < (Options.Turbo * 1000)); } bool WatchyGSR::InTurbo() { return (!WatchTime.DeadRTC && Options.Turbo > 0 && TurboTime != 0 && millis() - TurboTime < (Options.Turbo * 1000)); }
bool WatchyGSR::BedTime() {
if (Options.SleepEnd > Options.SleepStart) return (WatchTime.Local.Hour >= Options.SleepStart && WatchTime.Local.Hour < Options.SleepEnd);
return (WatchTime.Local.Hour >= Options.SleepStart || WatchTime.Local.Hour < Options.SleepEnd);
}
bool WatchyGSR::UpRight() { bool WatchyGSR::UpRight() {
if (Options.Orientated || (BedTime() && Options.BedTimeOrientation)) return IsUp(); if (Options.Orientated || (WatchTime.BedTime && Options.BedTimeOrientation)) return SBMA.IsUp();
return true; // Fake it til you make it. return true; // Fake it til you make it.
} }
bool WatchyGSR::IsUp() {
uint8_t Direction = sensor.getDirection();
return (Direction == DIRECTION_DISP_UP || Direction == DIRECTION_BOTTOM_EDGE); // Return whether or not it is up.
}
bool WatchyGSR::DarkWait(){ bool WatchyGSR::DarkWait(){
bool B = ((Options.SleepStyle > 0 || WatchTime.DeadRTC) && Darkness.Last != 0 && (millis() - Darkness.Last) < (Options.SleepMode * 1000)); bool B = ((Options.SleepStyle > 0 || WatchTime.DeadRTC) && Darkness.Last != 0 && (millis() - Darkness.Last) < (Options.SleepMode * 1000));
if (Options.SleepStyle == 2){ if (Options.SleepStyle == 2){
if (!BedTime()) return false; if (!WatchTime.BedTime) return false;
return B; return B;
}else if (Options.SleepStyle > 0 || WatchTime.DeadRTC) return B; }else if (Options.SleepStyle > 0 || WatchTime.DeadRTC) return B;
return false; return false;
@ -3286,3 +3199,126 @@ void WatchyGSR::DisplayInit(bool ForceDark){
} }
void WatchyGSR::DisplaySleep(){ if (!Updates.Init) { Updates.Init = true; display.hibernate(); } } void WatchyGSR::DisplaySleep(){ if (!Updates.Init) { Updates.Init = true; display.hibernate(); } }
bool WatchyGSR::SafeToDraw() { return (!(OTAUpdate || WatchyAPOn || (Menu.Item == MENU_TOFF && Menu.SubItem == 2))); }
void WatchyGSR::getAngle(uint16_t Angle, uint8_t Away, uint8_t &X, uint8_t &Y){
uint8_t S = 200 - (Away * 2);
float fX, fY, fA;
if (Angle > 44 && Angle < 135){ // Right
fA = Angle - 45; fA /= 90;
fY = Away + (fA * S);
fX = 200 - Away;
}else if (Angle > 134 && Angle < 225){ // Bottom
fA = Angle - 135; fA /= 90;
fX = 200 - (Away + (fA * S));
fY = 200 - Away;
}else if (Angle > 224 && Angle < 315){ // Left.
fA = Angle - 225; fA /= 90;
fY = 200 - (Away + (fA * S));
fX = Away;
}else { // Top
if (Angle > 314) Angle -= 315;
else Angle += 45;
fA = Angle; fA /= 90;
fX = Away + (fA * S);
fY = Away;
}
X = fX;
Y = fY;
}
// Watch Face designs are here.
void WatchyGSR::initWatchFaceStyle(){
switch (Options.WatchFaceStyle){
case 1: // Ballsy
Design.Menu.Top = 117;
Design.Menu.Header = 25;
Design.Menu.Data = 66;
Design.Menu.Font = &aAntiCorona12pt7b;
Design.Face.Time = 56;
Design.Face.TimeHeight = 45;
Design.Face.TimeColor = GxEPD_BLACK;
Design.Face.TimeFont = &aAntiCorona36pt7b;
Design.Face.TimeStyle = WatchyGSR::dCENTER;
Design.Face.Day = 54;
Design.Face.DayColor = GxEPD_BLACK;
Design.Face.DayFont = &aAntiCorona14pt7b;
Design.Face.DayStyle = WatchyGSR::dCENTER;
Design.Face.Date = 106;
Design.Face.DateColor = GxEPD_BLACK;
Design.Face.DateFont = &aAntiCorona13pt7b;
Design.Face.DateStyle = WatchyGSR::dCENTER;
Design.Face.Year = 160;
Design.Face.YearLeft = 99;
Design.Face.YearColor = GxEPD_BLACK;
Design.Face.YearFont = &aAntiCorona14pt7b;
Design.Face.YearStyle = WatchyGSR::dCENTER;
Design.Status.WIFIx = 40;
Design.Status.WIFIy = 82;
Design.Status.BATTx = 120;
Design.Status.BATTy = 66;
break;
default:
Design.Menu.Top = 72;
Design.Menu.Header = 25;
Design.Menu.Data = 66;
Design.Menu.Font = &aAntiCorona12pt7b;
Design.Face.Time = 56;
Design.Face.TimeHeight = 45;
Design.Face.TimeColor = GxEPD_BLACK;
Design.Face.TimeFont = &aAntiCorona36pt7b;
Design.Face.TimeStyle = WatchyGSR::dCENTER;
Design.Face.Day = 101;
Design.Face.DayColor = GxEPD_BLACK;
Design.Face.DayFont = &aAntiCorona16pt7b;
Design.Face.DayStyle = WatchyGSR::dCENTER;
Design.Face.Date = 143;
Design.Face.DateColor = GxEPD_BLACK;
Design.Face.DateFont = &aAntiCorona15pt7b;
Design.Face.DateStyle = WatchyGSR::dCENTER;
Design.Face.Year = 186;
Design.Face.YearLeft = 99;
Design.Face.YearColor = GxEPD_BLACK;
Design.Face.YearFont = &aAntiCorona16pt7b;
Design.Face.YearStyle = WatchyGSR::dCENTER;
Design.Status.WIFIx = 5;
Design.Status.WIFIy = 193;
Design.Status.BATTx = 155;
Design.Status.BATTy = 178;
break;
}
}
void WatchyGSR::drawWatchFaceStyle(){
uint8_t X, Y;
uint16_t A;
switch (Options.WatchFaceStyle){
case 1: // Ballsy
drawDay();
drawDate();
if (SafeToDraw()){
for (A = 0; A < 60; A++){
getAngle(A * 6, 5, X, Y);
display.fillCircle(X, Y, (A == WatchTime.Local.Minute ? 5 : (A % 5 == 0 ? 3 : 1)), ForeColor());
}
X = WatchTime.Local.Hour;
if (X > 11) X -= 12;
A = (X * 30) + (WatchTime.Local.Minute / 2);
getAngle(A, 22, X, Y);
display.fillCircle(X, Y, 9, ForeColor());
if (WatchTime.Local.Hour < 12) display.fillCircle(X, Y, 3, BackColor());
}
if (GuiMode == WATCHON) drawYear();
break;
default:
if (SafeToDraw()){
drawTime();
drawDay();
drawYear();
}
if (GuiMode == WATCHON) drawDate();
break;
}
}

View File

@ -20,23 +20,25 @@
#include "GxEPD2_BW.h" #include "GxEPD2_BW.h"
#include <mbedtls/base64.h> #include <mbedtls/base64.h>
#include <Wire.h> #include <Wire.h>
#include <bma.h> #include <StableBMA.h>
#include "Icons_GSR.h" #include "Icons_GSR.h"
#include "ArduinoNvs.h" #include "ArduinoNvs.h"
#include "aAntiCorona15pt7b.h"
#include "Bronova_Regular13pt7b.h" #include "Bronova_Regular13pt7b.h"
#include "aAntiCorona12pt7b.h"
#include "aAntiCorona13pt7b.h"
#include "aAntiCorona14pt7b.h"
#include "aAntiCorona15pt7b.h"
#include "aAntiCorona16pt7b.h" #include "aAntiCorona16pt7b.h"
#include "aAntiCorona36pt7b.h" #include "aAntiCorona36pt7b.h"
#include "aAntiCorona12pt7b.h"
class WatchyGSR{ class WatchyGSR{
public: public:
static SmallRTC SRTC; static SmallRTC SRTC;
static SmallNTP SNTP; static SmallNTP SNTP;
static GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display; static GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display;
static constexpr const char* Build = "1.4"; static constexpr const char* Build = "1.4.1";
enum DesOps {dSTATIC, dLEFT, dRIGHT, dCENTER}; enum DesOps {dSTATIC, dLEFT, dRIGHT, dCENTER};
public: public:
WatchyGSR(); WatchyGSR();
@ -70,6 +72,10 @@ class WatchyGSR{
virtual void AskForWiFi() final; virtual void AskForWiFi() final;
virtual wl_status_t currentWiFi() final; virtual wl_status_t currentWiFi() final;
virtual void endWiFi() final; virtual void endWiFi() final;
virtual void getAngle(uint16_t Angle, uint8_t Away, uint8_t &X, uint8_t &Y) final;
virtual bool SafeToDraw() final;
void initWatchFaceStyle();
void drawWatchFaceStyle();
private: private:
void setStatus(String Status); void setStatus(String Status);
void drawMenu(); void drawMenu();
@ -122,7 +128,6 @@ class WatchyGSR{
bool InTurbo(); bool InTurbo();
bool BedTime(); bool BedTime();
bool UpRight(); bool UpRight();
bool IsUp();
bool DarkWait(); bool DarkWait();
bool Showing(); bool Showing();
void RefreshCPU(); void RefreshCPU();
@ -131,6 +136,5 @@ class WatchyGSR{
void DisplayInit(bool ForceDark = false); void DisplayInit(bool ForceDark = false);
void DisplaySleep(); void DisplaySleep();
}; };
extern RTC_DATA_ATTR StableBMA SBMA;
extern RTC_DATA_ATTR BMA423 sensor;
#endif #endif

305
src/aAntiCorona13pt7b.h Normal file
View File

@ -0,0 +1,305 @@
const uint8_t aAntiCorona13pt7bBitmaps[] PROGMEM = {
0x00, 0x6E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEC, 0x00, 0x6F, 0xF6, 0x63,
0xE7, 0xE7, 0xE7, 0xE7, 0xC6, 0x46, 0x01, 0x8C, 0x07, 0x38, 0x1C, 0x70,
0x39, 0xC0, 0x73, 0x87, 0xFF, 0xDF, 0xFF, 0xBF, 0xFE, 0x1C, 0x60, 0x39,
0xC1, 0xFF, 0xF7, 0xFF, 0xEF, 0xFF, 0x8E, 0x30, 0x1C, 0xE0, 0x39, 0xC0,
0xE3, 0x00, 0x86, 0x00, 0x03, 0x00, 0x7E, 0x07, 0xFC, 0x7F, 0xE7, 0xFF,
0x3B, 0xB1, 0xFC, 0x0F, 0xE0, 0x3F, 0xE1, 0xFF, 0x83, 0xFE, 0x0F, 0xF0,
0x73, 0x93, 0x9D, 0xFF, 0xDF, 0xFE, 0x7F, 0xE0, 0xFC, 0x01, 0x80, 0x1E,
0x03, 0x00, 0x7F, 0x06, 0x01, 0xFE, 0x1C, 0x03, 0x9E, 0x78, 0x0E, 0x1C,
0xE0, 0x1C, 0x3B, 0x80, 0x38, 0x77, 0x00, 0x70, 0xFC, 0x78, 0xF3, 0xBB,
0xF8, 0xFF, 0xEF, 0xF9, 0xFD, 0xDC, 0x78, 0xF7, 0x70, 0x70, 0x0E, 0xE0,
0xE0, 0x39, 0xC1, 0xC0, 0x73, 0xC3, 0x81, 0xC7, 0x8E, 0x03, 0x87, 0xFC,
0x0E, 0x07, 0xF0, 0x18, 0x07, 0x80, 0x0F, 0x80, 0x7F, 0x03, 0xFE, 0x1C,
0x78, 0x70, 0xE1, 0xC3, 0x87, 0x9C, 0x1F, 0xF0, 0x3F, 0x80, 0xFC, 0x07,
0xFB, 0x1F, 0xFC, 0xE7, 0xF3, 0x8F, 0xCE, 0x1F, 0xBC, 0x3F, 0xFF, 0xFD,
0xFF, 0x61, 0xF8, 0x00, 0x7F, 0xFF, 0x90, 0x06, 0x1E, 0x1E, 0x38, 0x70,
0x70, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0,
0xF0, 0x70, 0x78, 0x7C, 0x3E, 0x1E, 0x0E, 0x70, 0x78, 0x7C, 0x3E, 0x1E,
0x0E, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06,
0x0E, 0x0E, 0x0C, 0x1C, 0x78, 0x78, 0x60, 0x06, 0x00, 0xE0, 0x7E, 0x0F,
0xFF, 0xFF, 0xF7, 0xFE, 0x1F, 0x03, 0xF8, 0x77, 0x86, 0x38, 0x03, 0x00,
0x06, 0x01, 0xC0, 0x38, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, 0x0E,
0x01, 0xC0, 0x30, 0x00, 0xEF, 0xF7, 0x6C, 0x7F, 0xFF, 0xFF, 0xFF, 0x00,
0x6F, 0xF6, 0x01, 0x81, 0xC0, 0xC0, 0xE0, 0x70, 0x70, 0x38, 0x1C, 0x1C,
0x0E, 0x07, 0x07, 0x03, 0x83, 0x81, 0xC0, 0xE0, 0xE0, 0x70, 0x30, 0x00,
0x03, 0xC0, 0x1F, 0xE0, 0x7F, 0xE1, 0xC3, 0xE7, 0x03, 0xCE, 0x03, 0xD8,
0x07, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7F, 0x00,
0xDE, 0x03, 0x9E, 0x07, 0x3E, 0x1C, 0x3F, 0xF0, 0x3F, 0xC0, 0x1E, 0x00,
0x19, 0xDF, 0xFF, 0xDC, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCC,
0x1F, 0x83, 0xFE, 0x3F, 0xF8, 0x83, 0xE0, 0x0F, 0x00, 0x38, 0x01, 0xC0,
0x1E, 0x00, 0xE0, 0x0F, 0x01, 0xF0, 0x1F, 0x01, 0xF0, 0x0F, 0x00, 0xF0,
0x0F, 0x00, 0x7F, 0xFB, 0xFF, 0xDF, 0xFC, 0x3E, 0x0F, 0xF3, 0xFE, 0x23,
0xE0, 0x3C, 0x03, 0x80, 0x70, 0x1C, 0x1F, 0x87, 0xF8, 0xFF, 0x01, 0xF0,
0x1E, 0x01, 0xC0, 0x3B, 0x0E, 0xFF, 0xDF, 0xF1, 0xF8, 0x00, 0x00, 0xC0,
0x1C, 0x01, 0xC0, 0x38, 0x07, 0x00, 0x73, 0x0E, 0x71, 0xC7, 0x1C, 0x73,
0x87, 0x78, 0x77, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x70, 0x07, 0x00, 0x70,
0x07, 0x00, 0x60, 0x3F, 0xE7, 0xFE, 0x7F, 0xE7, 0x00, 0x70, 0x07, 0x00,
0x7F, 0x07, 0xFC, 0x7F, 0xE0, 0x1F, 0x00, 0xF0, 0x07, 0x00, 0x70, 0x07,
0x00, 0x66, 0x0E, 0xFF, 0xCF, 0xF8, 0x7E, 0x00, 0x07, 0xC0, 0x7F, 0x07,
0xFC, 0x71, 0xC7, 0x06, 0x38, 0x03, 0x9F, 0x1F, 0xFC, 0xFF, 0xF7, 0xC7,
0xFC, 0x1F, 0xE0, 0x7F, 0x03, 0xF8, 0x1D, 0xE1, 0xCF, 0xFE, 0x3F, 0xE0,
0xFE, 0x03, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x0E, 0x00, 0xE0, 0x1C,
0x01, 0xC0, 0x1C, 0x03, 0x80, 0x38, 0x07, 0x00, 0x70, 0x07, 0x00, 0xE0,
0x0E, 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x18, 0x00, 0x0F, 0x81, 0xFC, 0x3F,
0xE7, 0x1E, 0x70, 0xE7, 0x0E, 0x78, 0xE7, 0xFC, 0x3F, 0xC3, 0xFE, 0x7F,
0xF7, 0x1F, 0xE0, 0xFE, 0x07, 0xE0, 0x7F, 0x06, 0x7F, 0xE7, 0xFC, 0x1F,
0x00, 0x0F, 0x80, 0x7F, 0x83, 0xFF, 0x1F, 0xFC, 0x70, 0xFB, 0x81, 0xEE,
0x07, 0xB8, 0x0E, 0xF0, 0x7B, 0xE3, 0xE7, 0xFF, 0x8F, 0xFE, 0x1F, 0x38,
0x00, 0xE3, 0x07, 0x1E, 0x3C, 0x7F, 0xE0, 0xFF, 0x01, 0xF0, 0x00, 0x6F,
0xF6, 0x00, 0x00, 0x06, 0xFF, 0x60, 0x6F, 0xF6, 0x00, 0x00, 0x0E, 0xFF,
0x76, 0xC0, 0x00, 0x1C, 0x01, 0xF0, 0x3F, 0x83, 0xFC, 0x7F, 0x83, 0xF8,
0x0F, 0xF0, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF0, 0x0F, 0xC0, 0x0E, 0x7F,
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xC0,
0x70, 0x03, 0xF0, 0x0F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x0F, 0xF0, 0x1F,
0xC1, 0xFE, 0x3F, 0xC1, 0xFC, 0x0F, 0x80, 0x38, 0x00, 0x3F, 0x8F, 0xFC,
0xFF, 0xEC, 0x1F, 0x00, 0xF0, 0x07, 0x00, 0x70, 0x0E, 0x01, 0xE0, 0x3C,
0x07, 0x80, 0x70, 0x0E, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x1E, 0x01, 0xE0,
0x0C, 0x00, 0x01, 0xF8, 0x01, 0xFF, 0x81, 0xFF, 0xF0, 0xF0, 0x7E, 0x38,
0x0F, 0x9C, 0x3D, 0xF6, 0x3F, 0x3F, 0x8F, 0xC7, 0xE7, 0x71, 0xF9, 0xDC,
0x7E, 0x7F, 0x1F, 0x9F, 0xC7, 0xF3, 0xF9, 0x9E, 0xFF, 0xE7, 0xC7, 0xF0,
0xF8, 0xF8, 0x1F, 0xE0, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x01, 0x80, 0x07,
0x80, 0x0F, 0x00, 0x1E, 0x00, 0x7E, 0x00, 0xFC, 0x03, 0xB8, 0x07, 0x78,
0x0E, 0xF0, 0x38, 0xE0, 0x71, 0xE0, 0xFF, 0xC3, 0xFF, 0xC7, 0xFF, 0x9C,
0x07, 0x38, 0x0F, 0x70, 0x1F, 0xC0, 0x1D, 0x80, 0x30, 0x7F, 0x87, 0xFE,
0x3F, 0xF9, 0xC3, 0xEE, 0x0F, 0x70, 0x7B, 0x81, 0xDC, 0x1C, 0xFF, 0xE7,
0xFF, 0xBF, 0xFD, 0xC1, 0xFE, 0x07, 0xF0, 0x1F, 0x80, 0xFE, 0x0E, 0xFF,
0xE7, 0xFE, 0x3F, 0xC0, 0x01, 0xF8, 0x0F, 0xFC, 0x7F, 0xF9, 0xE0, 0xE3,
0x80, 0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80,
0x07, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x1F, 0x07, 0x3F, 0xFE,
0x1F, 0xF8, 0x0F, 0xC0, 0x7F, 0x81, 0xFF, 0xC3, 0xFF, 0xE7, 0x07, 0xEE,
0x07, 0xDC, 0x07, 0xF8, 0x07, 0xF0, 0x0F, 0xE0, 0x0F, 0xC0, 0x1F, 0x80,
0x3F, 0x00, 0x7E, 0x00, 0xDC, 0x03, 0xB8, 0x0E, 0x78, 0x38, 0xFF, 0xE1,
0xFF, 0x83, 0xFC, 0x00, 0x7F, 0xF7, 0xFF, 0xBF, 0xF9, 0xC0, 0x0E, 0x00,
0x70, 0x03, 0x80, 0x1C, 0x00, 0xFE, 0x07, 0xF0, 0x3F, 0x01, 0xC0, 0x0E,
0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x7F,
0xFF, 0xFF, 0xFF, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xFE, 0x3F, 0x8F,
0xC3, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0C, 0x00, 0x01,
0xF8, 0x0F, 0xFC, 0x3F, 0xF8, 0xE0, 0xF3, 0x80, 0x0E, 0x00, 0x18, 0x00,
0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x81, 0xFF, 0x87, 0xFF, 0x0F, 0xFF,
0x01, 0xDF, 0x03, 0x9F, 0x07, 0x3F, 0xFE, 0x1F, 0xFC, 0x0F, 0xF0, 0x60,
0x0F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8,
0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E,
0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7C, 0x01, 0x80, 0x7F, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x60, 0x1C, 0x03, 0x80, 0x70, 0x0E,
0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01,
0xC0, 0x33, 0x0E, 0xFF, 0x9F, 0xE1, 0xF0, 0x00, 0x60, 0x33, 0x81, 0xCE,
0x0F, 0x38, 0x78, 0xE3, 0xC3, 0xBE, 0x0F, 0xE0, 0x3F, 0x00, 0xF8, 0x03,
0xE0, 0x0F, 0xC0, 0x3F, 0xC0, 0xFF, 0x83, 0xBF, 0x0E, 0x7F, 0x38, 0x7E,
0xE0, 0xFB, 0x81, 0xEC, 0x03, 0x80, 0x60, 0x38, 0x0E, 0x03, 0x80, 0xE0,
0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E,
0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFC, 0x60, 0x07, 0xE0, 0x1F, 0xC0, 0x3F,
0x80, 0xFF, 0x81, 0xFF, 0x07, 0xFF, 0x0F, 0xFE, 0x3F, 0xFE, 0x7F, 0xFC,
0xFF, 0xFB, 0xBF, 0x7F, 0x7E, 0xFC, 0xFC, 0xF9, 0xF9, 0xF3, 0xF3, 0xC7,
0xE3, 0x0F, 0xC0, 0x1F, 0x00, 0x30, 0x60, 0x0F, 0xC0, 0x7F, 0x81, 0xFF,
0x07, 0xFC, 0x1F, 0xF8, 0x7F, 0xF1, 0xFF, 0xE7, 0xEF, 0xDF, 0x9F, 0x7E,
0x3F, 0xF8, 0x7F, 0xE0, 0xFF, 0x83, 0xFE, 0x07, 0xF8, 0x0F, 0xE0, 0x1F,
0x80, 0x7C, 0x01, 0x80, 0x01, 0xF8, 0x01, 0xFF, 0x81, 0xFF, 0xF0, 0xF0,
0x7E, 0x38, 0x0F, 0x9C, 0x01, 0xF6, 0x00, 0x3F, 0x80, 0x07, 0xE0, 0x01,
0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x01, 0x9E, 0x00, 0xE7,
0xC0, 0x70, 0xF8, 0x3C, 0x3F, 0xFE, 0x03, 0xFE, 0x00, 0x7E, 0x00, 0x7F,
0xC7, 0xFF, 0x3F, 0xFD, 0xC1, 0xFE, 0x07, 0xF0, 0x1F, 0x80, 0xFC, 0x0E,
0xFF, 0xE7, 0xFE, 0x3F, 0xE1, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C,
0x00, 0xE0, 0x07, 0x00, 0x30, 0x00, 0x01, 0xF8, 0x01, 0xFF, 0x81, 0xFF,
0xF0, 0xF0, 0x7E, 0x38, 0x0F, 0x9C, 0x01, 0xF6, 0x00, 0x3F, 0x80, 0x07,
0xE0, 0x01, 0xF8, 0x00, 0x7E, 0x00, 0x1F, 0x80, 0x07, 0xF0, 0x01, 0x9E,
0x00, 0xE7, 0xC0, 0x70, 0xF8, 0x3C, 0x3F, 0xFE, 0x03, 0xFE, 0x00, 0x7E,
0x00, 0x7F, 0x83, 0xFF, 0x8F, 0xFF, 0x38, 0x3E, 0xE0, 0x7B, 0x80, 0xEE,
0x03, 0xB8, 0x1C, 0xFF, 0xF3, 0xFF, 0x8F, 0xF8, 0x3F, 0xC0, 0xFF, 0x83,
0xBF, 0x0E, 0x7F, 0x38, 0xFE, 0xE0, 0xFB, 0x81, 0xEC, 0x03, 0x00, 0x07,
0xC0, 0x7F, 0xE3, 0xFF, 0x9C, 0x3E, 0x70, 0x01, 0xC0, 0x07, 0xC0, 0x1F,
0xF0, 0x3F, 0xF0, 0xFF, 0xE0, 0xFF, 0xC0, 0x3F, 0x00, 0x3C, 0x00, 0x72,
0x01, 0xDE, 0x0E, 0xFF, 0xF9, 0xFF, 0xC1, 0xFC, 0x00, 0x7F, 0xFF, 0xFF,
0xFF, 0xFC, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00,
0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07,
0x00, 0x38, 0x01, 0x80, 0x60, 0x1F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03,
0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E,
0x03, 0xF8, 0x1F, 0xC0, 0xCF, 0x0E, 0x7F, 0xE1, 0xFE, 0x03, 0xC0, 0x60,
0x0F, 0xC0, 0x1F, 0xC0, 0x77, 0x80, 0xE7, 0x01, 0xCF, 0x07, 0x1E, 0x0E,
0x1E, 0x38, 0x3C, 0x70, 0x38, 0xE0, 0x7B, 0x80, 0xF7, 0x00, 0xEE, 0x01,
0xF8, 0x03, 0xF0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x0C, 0x00, 0x60,
0x00, 0x1F, 0x00, 0x01, 0xFC, 0x0C, 0x0F, 0xE0, 0xE0, 0xE7, 0x07, 0x87,
0x38, 0x7C, 0x39, 0xE3, 0xE1, 0x8F, 0x1F, 0x9C, 0x39, 0xFC, 0xE1, 0xEE,
0xE7, 0x0F, 0x77, 0xF0, 0x3F, 0x3F, 0x81, 0xF8, 0xFC, 0x0F, 0xC7, 0xC0,
0x7C, 0x3E, 0x01, 0xE1, 0xF0, 0x0F, 0x07, 0x80, 0x70, 0x38, 0x01, 0x81,
0xC0, 0x60, 0x07, 0xE0, 0x1F, 0xE0, 0x73, 0xC1, 0xE7, 0xC3, 0x87, 0xCE,
0x07, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x0F, 0x80, 0x1F, 0x80, 0x7F, 0x00,
0xFF, 0x03, 0x9F, 0x0E, 0x1F, 0x3C, 0x1E, 0x70, 0x3F, 0xC0, 0x3F, 0x00,
0x30, 0x60, 0x07, 0xE0, 0x1F, 0xE0, 0x73, 0xC1, 0xE7, 0xC3, 0x87, 0xCE,
0x07, 0xF8, 0x07, 0xF0, 0x0F, 0xC0, 0x0F, 0x00, 0x0E, 0x00, 0x1C, 0x00,
0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0C,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xE0, 0x07, 0x80, 0x0E,
0x00, 0x38, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0x00, 0x1E, 0x00, 0x78, 0x01,
0xE0, 0x03, 0x80, 0x0F, 0x00, 0x3C, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xF0, 0x7F, 0xFF, 0xF7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E,
0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1F, 0xFF, 0xFE, 0x60, 0x70,
0x3C, 0x1E, 0x07, 0x83, 0xC1, 0xE0, 0x78, 0x3C, 0x0E, 0x07, 0x83, 0xC0,
0xF0, 0x78, 0x3C, 0x0F, 0x07, 0x81, 0xC0, 0xC0, 0x7F, 0xFF, 0xF8, 0x70,
0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
0x38, 0x70, 0xEF, 0xFF, 0xFE, 0x00, 0x00, 0x70, 0x07, 0x80, 0xF8, 0x1F,
0xC1, 0xFC, 0x39, 0xE3, 0x9F, 0x70, 0xF6, 0x0F, 0x60, 0x60, 0x7F, 0xFF,
0xFF, 0xFF, 0x00, 0x61, 0xE3, 0xE3, 0xC3, 0xC3, 0xC3, 0x00, 0x1F, 0x87,
0xF9, 0xFF, 0xB0, 0xF0, 0x0E, 0x0F, 0xCF, 0xFB, 0xFF, 0x7E, 0xFE, 0x1F,
0x83, 0xF8, 0x7F, 0xFE, 0xFF, 0xCF, 0xB0, 0x60, 0x0E, 0x00, 0xE0, 0x0E,
0x00, 0xE0, 0x0F, 0xF0, 0xFF, 0xCF, 0xFE, 0xE1, 0xEE, 0x0F, 0xE0, 0xFE,
0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x0E, 0xF0, 0xEF, 0xFC, 0xFF, 0x8F,
0xE0, 0x07, 0xC1, 0xFE, 0x3F, 0xE7, 0x0C, 0x70, 0x0E, 0x00, 0xE0, 0x0E,
0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x07, 0xC6, 0x7F, 0xE3, 0xFE, 0x0F, 0x80,
0x00, 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x7F, 0x1F, 0xF3, 0xFF,
0x70, 0xF6, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x7F, 0x07,
0xF8, 0x77, 0xFF, 0x3F, 0xF0, 0xFE, 0x07, 0xC1, 0xFE, 0x3F, 0xF7, 0x87,
0x70, 0x7E, 0x0F, 0xE7, 0xEF, 0xFE, 0xFF, 0x8F, 0xF0, 0xF0, 0x07, 0xC3,
0x7F, 0xF3, 0xFE, 0x0F, 0x80, 0x0F, 0x87, 0xF3, 0xFC, 0xC6, 0x70, 0x1C,
0x07, 0x01, 0xF8, 0xFE, 0x3F, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01,
0xC0, 0x70, 0x1C, 0x07, 0x01, 0x80, 0x07, 0xF1, 0xFF, 0x3F, 0xF7, 0x0F,
0x60, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7F, 0x07, 0xF0, 0x77, 0x87,
0x7F, 0xF3, 0xFF, 0x1F, 0xF0, 0x06, 0x30, 0xE7, 0xFC, 0x7F, 0x83, 0xE0,
0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x7C, 0xFF, 0xEF, 0xFF,
0xF0, 0xFF, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07,
0xE0, 0x7E, 0x07, 0xE0, 0x7C, 0x06, 0x6F, 0xF6, 0x03, 0x77, 0x77, 0x77,
0x77, 0x77, 0x77, 0x76, 0x00, 0x60, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x00,
0x06, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0,
0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC3,
0x1C, 0x7F, 0x87, 0xF0, 0x3E, 0x00, 0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00,
0xE0, 0x0E, 0x0C, 0xE3, 0xCE, 0xFC, 0xFF, 0x0F, 0xC0, 0xF8, 0x0F, 0xC0,
0xFE, 0x0F, 0xF0, 0xFF, 0x8E, 0xFC, 0xE7, 0xEE, 0x3F, 0xE0, 0xFC, 0x06,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x6F, 0x1E, 0x7F, 0xFF,
0xBF, 0xFF, 0xFE, 0x7C, 0xFE, 0x1C, 0x3F, 0x0E, 0x1F, 0x87, 0x0F, 0xC3,
0x87, 0xE1, 0xC3, 0xF0, 0xE1, 0xF8, 0x70, 0xFC, 0x38, 0x7E, 0x1C, 0x3F,
0x0E, 0x1F, 0x06, 0x0C, 0x6F, 0x9F, 0xFB, 0xFF, 0xF8, 0xFE, 0x0F, 0xC1,
0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF0,
0x30, 0x07, 0xC0, 0x7F, 0xC3, 0xFF, 0x9E, 0x3E, 0x70, 0x3F, 0x80, 0xFE,
0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, 0x7F, 0x03, 0x9F, 0x1E, 0x7F, 0xF0,
0xFF, 0x80, 0xF8, 0x00, 0x7F, 0x8F, 0xFC, 0xFF, 0xEE, 0x1F, 0xE0, 0xFE,
0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x6F, 0x0E, 0xFF, 0xCF,
0xF8, 0xFE, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0C, 0x00, 0x07, 0xF1,
0xFF, 0x3F, 0xF7, 0xFF, 0x70, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7F,
0x07, 0xF8, 0x77, 0xFF, 0x7F, 0xF3, 0xFF, 0x0F, 0xF0, 0x07, 0x00, 0x70,
0x07, 0x00, 0x70, 0x06, 0x07, 0x8F, 0xFB, 0xFF, 0x78, 0xCE, 0x01, 0xC0,
0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x30,
0x00, 0x0F, 0x81, 0xFE, 0x3F, 0xE7, 0x1C, 0x78, 0x07, 0xF8, 0x7F, 0xE3,
0xFF, 0x1F, 0xF0, 0x3F, 0x00, 0x77, 0x07, 0x7F, 0xE7, 0xFC, 0x1F, 0x00,
0x30, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1F, 0xE7, 0xFC, 0xFF,
0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1E, 0x03, 0xC6, 0x3F, 0xC7,
0xF8, 0x3C, 0x00, 0x60, 0x7C, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8,
0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF8, 0xFF, 0xFE, 0xFF, 0xCF, 0xB0,
0x60, 0x6E, 0x07, 0xF0, 0xEF, 0x0E, 0x71, 0xC7, 0x9C, 0x79, 0xC3, 0xF8,
0x3F, 0x83, 0xF8, 0x1F, 0x01, 0xF0, 0x0F, 0x00, 0xE0, 0x0C, 0x00, 0x60,
0x03, 0xE0, 0x87, 0xF1, 0xC7, 0xF3, 0xC7, 0x73, 0xCE, 0x73, 0xEE, 0x7B,
0xEE, 0x7F, 0xFC, 0x3F, 0xFC, 0x3E, 0xFC, 0x3E, 0x7C, 0x1E, 0x78, 0x1E,
0x78, 0x1C, 0x38, 0x18, 0x30, 0x60, 0x3F, 0x07, 0xF8, 0xE7, 0x9E, 0x7D,
0xC3, 0xF8, 0x1F, 0x00, 0xF0, 0x0F, 0x81, 0xFC, 0x3B, 0xE7, 0x9F, 0xF1,
0xFE, 0x0F, 0xC0, 0x60, 0x70, 0x37, 0x07, 0x70, 0x77, 0x8E, 0x78, 0xE3,
0x8C, 0x3D, 0xC3, 0xDC, 0x1F, 0x81, 0xF8, 0x1F, 0x80, 0xF0, 0x0F, 0x00,
0x60, 0x0E, 0x00, 0xE0, 0x7C, 0x0F, 0xC0, 0xF8, 0x07, 0x00, 0x7F, 0xFF,
0xFF, 0xFF, 0xE0, 0x1E, 0x03, 0xC0, 0x38, 0x07, 0x80, 0xF0, 0x1E, 0x01,
0xC0, 0x3C, 0x07, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x06, 0x1C, 0x71,
0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x71, 0xC3, 0x87, 0x8F, 0x0E, 0x1C, 0x38,
0x70, 0xE1, 0xC3, 0xC3, 0xC7, 0x86, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xF8, 0x61, 0xE3, 0xC3, 0xC7, 0x87, 0x0E, 0x1C, 0x38,
0x70, 0xF1, 0xE1, 0xC3, 0x8E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x8E, 0x3C,
0x70, 0x00, 0x3C, 0x1F, 0xDF, 0xFF, 0xE7, 0xE0, 0x78 };
const GFXglyph aAntiCorona13pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
{ 1, 4, 20, 7, 2, -17 }, // 0x21 '!'
{ 11, 8, 7, 12, 2, -17 }, // 0x22 '"'
{ 18, 15, 18, 17, 1, -15 }, // 0x23 '#'
{ 52, 13, 19, 16, 2, -16 }, // 0x24 '$'
{ 83, 23, 19, 24, 1, -16 }, // 0x25 '%'
{ 138, 14, 19, 16, 1, -16 }, // 0x26 '&'
{ 172, 3, 7, 7, 2, -17 }, // 0x27 '''
{ 175, 8, 24, 9, 1, -17 }, // 0x28 '('
{ 199, 8, 24, 9, 0, -17 }, // 0x29 ')'
{ 223, 12, 11, 14, 1, -18 }, // 0x2A '*'
{ 240, 11, 11, 13, 1, -12 }, // 0x2B '+'
{ 256, 4, 6, 6, 1, -1 }, // 0x2C ','
{ 259, 11, 3, 13, 1, -5 }, // 0x2D '-'
{ 264, 4, 4, 8, 2, -1 }, // 0x2E '.'
{ 266, 9, 19, 11, 1, -16 }, // 0x2F '/'
{ 288, 15, 19, 17, 1, -16 }, // 0x30 '0'
{ 324, 5, 19, 8, 1, -16 }, // 0x31 '1'
{ 336, 13, 19, 14, 0, -16 }, // 0x32 '2'
{ 367, 11, 19, 13, 1, -16 }, // 0x33 '3'
{ 394, 12, 19, 13, 0, -16 }, // 0x34 '4'
{ 423, 12, 19, 14, 1, -16 }, // 0x35 '5'
{ 452, 13, 19, 15, 1, -16 }, // 0x36 '6'
{ 483, 12, 19, 12, 0, -16 }, // 0x37 '7'
{ 512, 12, 19, 14, 1, -16 }, // 0x38 '8'
{ 541, 14, 19, 15, 1, -16 }, // 0x39 '9'
{ 575, 4, 13, 8, 2, -10 }, // 0x3A ':'
{ 582, 4, 15, 7, 2, -10 }, // 0x3B ';'
{ 590, 14, 12, 16, 1, -12 }, // 0x3C '<'
{ 611, 11, 9, 14, 1, -11 }, // 0x3D '='
{ 624, 14, 12, 16, 1, -12 }, // 0x3E '>'
{ 645, 12, 19, 14, 1, -16 }, // 0x3F '?'
{ 674, 18, 19, 21, 1, -16 }, // 0x40 '@'
{ 717, 15, 19, 15, -1, -16 }, // 0x41 'A'
{ 753, 13, 19, 15, 1, -16 }, // 0x42 'B'
{ 784, 15, 19, 17, 1, -16 }, // 0x43 'C'
{ 820, 15, 19, 17, 1, -16 }, // 0x44 'D'
{ 856, 13, 19, 15, 1, -16 }, // 0x45 'E'
{ 887, 10, 19, 11, 1, -16 }, // 0x46 'F'
{ 911, 15, 19, 17, 1, -16 }, // 0x47 'G'
{ 947, 14, 19, 17, 1, -16 }, // 0x48 'H'
{ 981, 3, 19, 6, 1, -16 }, // 0x49 'I'
{ 989, 11, 19, 11, -1, -16 }, // 0x4A 'J'
{ 1016, 14, 19, 15, 1, -16 }, // 0x4B 'K'
{ 1050, 10, 19, 11, 1, -16 }, // 0x4C 'L'
{ 1074, 15, 19, 18, 1, -16 }, // 0x4D 'M'
{ 1110, 14, 19, 17, 1, -16 }, // 0x4E 'N'
{ 1144, 18, 19, 20, 1, -16 }, // 0x4F 'O'
{ 1187, 13, 19, 15, 1, -16 }, // 0x50 'P'
{ 1218, 18, 19, 20, 1, -16 }, // 0x51 'Q'
{ 1261, 14, 19, 16, 1, -16 }, // 0x52 'R'
{ 1295, 14, 19, 15, 0, -16 }, // 0x53 'S'
{ 1329, 13, 19, 15, 1, -16 }, // 0x54 'T'
{ 1360, 13, 19, 15, 1, -16 }, // 0x55 'U'
{ 1391, 15, 19, 15, 0, -16 }, // 0x56 'V'
{ 1427, 21, 19, 22, 1, -16 }, // 0x57 'W'
{ 1477, 15, 19, 17, 1, -16 }, // 0x58 'X'
{ 1513, 15, 19, 17, 1, -16 }, // 0x59 'Y'
{ 1549, 15, 19, 17, 1, -16 }, // 0x5A 'Z'
{ 1585, 7, 24, 8, 1, -17 }, // 0x5B '['
{ 1606, 9, 19, 11, 1, -16 }, // 0x5C '\'
{ 1628, 7, 24, 9, 0, -17 }, // 0x5D ']'
{ 1649, 12, 11, 13, 0, -17 }, // 0x5E '^'
{ 1666, 11, 3, 13, 1, 2 }, // 0x5F '_'
{ 1671, 7, 7, 8, 1, -16 }, // 0x60 '`'
{ 1678, 11, 15, 13, 1, -12 }, // 0x61 'a'
{ 1699, 12, 20, 14, 1, -17 }, // 0x62 'b'
{ 1729, 12, 15, 13, 1, -12 }, // 0x63 'c'
{ 1752, 12, 20, 14, 1, -17 }, // 0x64 'd'
{ 1782, 12, 15, 14, 1, -12 }, // 0x65 'e'
{ 1805, 10, 20, 10, 1, -17 }, // 0x66 'f'
{ 1830, 12, 20, 14, 1, -12 }, // 0x67 'g'
{ 1860, 12, 20, 14, 1, -17 }, // 0x68 'h'
{ 1890, 4, 20, 6, 1, -17 }, // 0x69 'i'
{ 1900, 12, 25, 6, -7, -17 }, // 0x6A 'j'
{ 1938, 12, 20, 14, 1, -17 }, // 0x6B 'k'
{ 1968, 3, 20, 5, 1, -17 }, // 0x6C 'l'
{ 1976, 17, 15, 19, 1, -12 }, // 0x6D 'm'
{ 2008, 11, 15, 13, 1, -12 }, // 0x6E 'n'
{ 2029, 14, 15, 16, 1, -12 }, // 0x6F 'o'
{ 2056, 12, 20, 14, 1, -12 }, // 0x70 'p'
{ 2086, 12, 20, 15, 1, -12 }, // 0x71 'q'
{ 2116, 11, 15, 12, 1, -12 }, // 0x72 'r'
{ 2137, 12, 15, 13, 0, -12 }, // 0x73 's'
{ 2160, 11, 19, 12, 1, -16 }, // 0x74 't'
{ 2187, 11, 15, 13, 1, -12 }, // 0x75 'u'
{ 2208, 12, 15, 13, 1, -12 }, // 0x76 'v'
{ 2231, 16, 15, 18, 1, -12 }, // 0x77 'w'
{ 2261, 12, 15, 14, 1, -12 }, // 0x78 'x'
{ 2284, 12, 20, 14, 1, -12 }, // 0x79 'y'
{ 2314, 12, 15, 14, 1, -12 }, // 0x7A 'z'
{ 2337, 7, 24, 8, 0, -17 }, // 0x7B '{'
{ 2358, 3, 26, 7, 2, -17 }, // 0x7C '|'
{ 2368, 7, 25, 8, 1, -17 }, // 0x7D '}'
{ 2390, 11, 5, 14, 2, -8 } }; // 0x7E '~'
const GFXfont aAntiCorona13pt7b PROGMEM = {
(uint8_t *)aAntiCorona13pt7bBitmaps,
(GFXglyph *)aAntiCorona13pt7bGlyphs,
0x20, 0x7E, 28 };
// Approx. 3069 bytes

337
src/aAntiCorona14pt7b.h Normal file
View File

@ -0,0 +1,337 @@
const uint8_t aAntiCorona14pt7bBitmaps[] PROGMEM = {
0x00, 0x6E, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEC, 0x00, 0x0F, 0xFF,
0x63, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x42, 0x00, 0x00, 0x00, 0xE7, 0x00,
0x73, 0x80, 0x71, 0xC0, 0x39, 0xC0, 0x1C, 0xE0, 0x7F, 0xFE, 0x7F, 0xFF,
0x3F, 0xFF, 0x07, 0x18, 0x03, 0x9C, 0x01, 0xCE, 0x07, 0xFF, 0xE7, 0xFF,
0xF3, 0xFF, 0xF0, 0x71, 0x80, 0x39, 0xC0, 0x38, 0xE0, 0x1C, 0x60, 0x0C,
0x30, 0x00, 0x01, 0x80, 0x1F, 0x01, 0xFF, 0x0F, 0xFE, 0x3F, 0xF9, 0xCF,
0xC7, 0xB8, 0x1F, 0xE0, 0x7F, 0xC0, 0xFF, 0xC1, 0xFF, 0x81, 0xFF, 0x03,
0xFC, 0x0E, 0xF0, 0x39, 0xDE, 0xE7, 0x7F, 0xF9, 0xFF, 0xE7, 0xFF, 0x03,
0xF0, 0x03, 0x00, 0x0F, 0x01, 0x80, 0x3F, 0x83, 0x80, 0x7F, 0xC3, 0x80,
0x71, 0xE7, 0x80, 0xE1, 0xE7, 0x00, 0xE0, 0xE7, 0x00, 0xE0, 0xEE, 0x00,
0xE0, 0xEE, 0x00, 0xF0, 0xFC, 0x78, 0xF9, 0xDD, 0xFC, 0x7F, 0xFB, 0xFE,
0x3F, 0xBB, 0x8F, 0x1E, 0x77, 0x0F, 0x00, 0x77, 0x07, 0x00, 0xE7, 0x07,
0x00, 0xE7, 0x07, 0x01, 0xC7, 0x87, 0x01, 0xC7, 0xCE, 0x03, 0x83, 0xFE,
0x03, 0x81, 0xFC, 0x03, 0x00, 0xF0, 0x07, 0x80, 0x1F, 0x80, 0x7F, 0x80,
0xCF, 0x03, 0x8E, 0x07, 0x1C, 0x0F, 0x38, 0x1F, 0xE0, 0x3F, 0xC0, 0x7F,
0x00, 0xFC, 0x03, 0xFC, 0xC7, 0xFF, 0x9E, 0xFF, 0x38, 0xFE, 0x70, 0xFC,
0xF0, 0xFF, 0xF0, 0xFD, 0xFF, 0xF3, 0xFE, 0x01, 0xF0, 0x00, 0x7F, 0xFF,
0xD0, 0x07, 0x07, 0x87, 0xC7, 0x03, 0x03, 0x81, 0xC0, 0xC0, 0xE0, 0x70,
0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xF0, 0x78, 0x1C, 0x0F, 0x07,
0x81, 0xE0, 0xFC, 0x3E, 0x0F, 0x00, 0x70, 0xF8, 0xFC, 0x3C, 0x1E, 0x1E,
0x0E, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06,
0x0E, 0x0E, 0x0C, 0x1C, 0x78, 0xF0, 0xE0, 0x03, 0x00, 0x70, 0x07, 0x07,
0x70, 0xFF, 0xFF, 0xFF, 0x7F, 0xE1, 0xFC, 0x1F, 0xC3, 0xFC, 0x79, 0xC7,
0x18, 0x06, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0,
0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x77, 0xBC, 0xE7, 0x31, 0x00,
0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xF0, 0x01, 0x80, 0x70, 0x38, 0x0E,
0x07, 0x81, 0xC0, 0x70, 0x38, 0x0E, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x0E,
0x03, 0x81, 0xE0, 0x70, 0x1C, 0x0F, 0x03, 0x80, 0xC0, 0x00, 0x03, 0xE0,
0x0F, 0xF8, 0x1F, 0xFC, 0x3C, 0x7C, 0x30, 0x1E, 0x70, 0x1E, 0x60, 0x0F,
0xE0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07,
0xF0, 0x07, 0xF0, 0x06, 0x78, 0x0E, 0x78, 0x0C, 0x3E, 0x3C, 0x3F, 0xF8,
0x1F, 0xF0, 0x07, 0xC0, 0x0C, 0x73, 0xDF, 0x7D, 0xF1, 0xC7, 0x1C, 0x71,
0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x18, 0x3F, 0x07, 0xFE, 0x3F,
0xF9, 0x83, 0xC0, 0x0F, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0xF0, 0x0F,
0x00, 0xF8, 0x0F, 0x80, 0xF8, 0x0F, 0x80, 0x78, 0x07, 0x80, 0x78, 0x03,
0xC0, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0x03, 0xFC, 0x1F, 0xF0,
0xC7, 0xC0, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xE0, 0xFE, 0x0F,
0xF8, 0x7F, 0xE0, 0x1F, 0x80, 0x3C, 0x00, 0xE0, 0x07, 0x00, 0x3B, 0x83,
0xBF, 0xF9, 0xFF, 0x87, 0xF0, 0x00, 0x00, 0x60, 0x07, 0x00, 0x38, 0x03,
0x80, 0x3C, 0x01, 0xC0, 0x1E, 0x60, 0xE7, 0x0E, 0x38, 0xF1, 0xC7, 0x0E,
0x78, 0x77, 0x83, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x38, 0x01, 0xC0,
0x0E, 0x00, 0x70, 0x03, 0x00, 0x3F, 0xE7, 0xFE, 0x7F, 0xE7, 0x00, 0x70,
0x07, 0x00, 0x70, 0x07, 0x00, 0x7F, 0x07, 0xFC, 0x7F, 0xE0, 0x1F, 0x00,
0xF0, 0x07, 0x00, 0x70, 0x07, 0x00, 0x66, 0x0E, 0xFF, 0xCF, 0xF8, 0x7E,
0x00, 0x03, 0xC0, 0x3F, 0xC1, 0xFF, 0x8E, 0x3E, 0x38, 0x71, 0xC0, 0x07,
0x00, 0x3D, 0xF8, 0xEF, 0xF3, 0xFF, 0xEF, 0x87, 0xBC, 0x0F, 0xF0, 0x1F,
0xC0, 0x7F, 0x81, 0xDE, 0x07, 0x7C, 0x39, 0xFF, 0xE3, 0xFF, 0x07, 0xF8,
0x0F, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xE0, 0x0F, 0x00, 0x70,
0x03, 0x80, 0x3C, 0x01, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03,
0x80, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x38, 0x01, 0x80,
0x00, 0x0F, 0x80, 0xFE, 0x0F, 0xF8, 0x63, 0xC7, 0x0E, 0x38, 0x71, 0xE3,
0x8F, 0x9C, 0x7F, 0xE1, 0xFF, 0x0F, 0xFC, 0xFF, 0xF7, 0x1F, 0xF0, 0x3F,
0x80, 0xFC, 0x07, 0xF0, 0x3F, 0xC1, 0x9F, 0xF8, 0x7F, 0x81, 0xF8, 0x00,
0x07, 0xC0, 0x3F, 0xC0, 0xFF, 0xC3, 0xFF, 0xC7, 0x0F, 0x9C, 0x0F, 0xB8,
0x0F, 0x70, 0x1E, 0xE0, 0x3D, 0xE0, 0x7B, 0xE1, 0xF3, 0xFF, 0xE3, 0xFF,
0xC1, 0xF3, 0x80, 0x0F, 0x00, 0x1C, 0x38, 0x38, 0xF8, 0xE1, 0xFF, 0x81,
0xFE, 0x00, 0xF8, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0xFF,
0xF0, 0x00, 0x00, 0x06, 0xFF, 0x76, 0x6C, 0x00, 0x06, 0x00, 0x3E, 0x00,
0xFE, 0x07, 0xFC, 0x3F, 0xE0, 0x7F, 0x80, 0xFE, 0x00, 0xFF, 0xC0, 0x7F,
0xF8, 0x0F, 0xFE, 0x03, 0xFF, 0x00, 0x7E, 0x00, 0x1C, 0x7F, 0xFF, 0xFF,
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0, 0x70,
0x00, 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0xF0, 0x1F, 0xFC, 0x03, 0xFE, 0x00,
0xFE, 0x01, 0xFE, 0x0F, 0xF8, 0x3F, 0xC0, 0xFF, 0x00, 0xF8, 0x00, 0xE0,
0x00, 0x3F, 0x0F, 0xFC, 0xFF, 0xEC, 0x1E, 0x00, 0xF0, 0x07, 0x00, 0x70,
0x07, 0x00, 0xF0, 0x0E, 0x01, 0xC0, 0x3C, 0x07, 0x80, 0xF0, 0x0E, 0x00,
0xE0, 0x0C, 0x00, 0x00, 0x1C, 0x01, 0xE0, 0x0E, 0x00, 0x00, 0xFC, 0x00,
0x7F, 0xF0, 0x0F, 0xFF, 0x81, 0xE0, 0xFC, 0x38, 0x03, 0xE3, 0x00, 0x1E,
0x70, 0x79, 0xF6, 0x0F, 0xCF, 0xE1, 0xFC, 0xFE, 0x3B, 0xC7, 0xE3, 0xBC,
0x7E, 0x3F, 0xC7, 0xE3, 0xFC, 0x7F, 0x3F, 0xC6, 0xF1, 0xFC, 0xE7, 0x9F,
0xFC, 0x7C, 0x1F, 0x83, 0xF0, 0xF0, 0x1F, 0xF0, 0x00, 0xFF, 0x00, 0x01,
0xE0, 0x00, 0x00, 0xC0, 0x01, 0xC0, 0x03, 0xC0, 0x03, 0xE0, 0x03, 0xE0,
0x07, 0xE0, 0x07, 0xF0, 0x07, 0xF0, 0x0F, 0xF8, 0x0E, 0x78, 0x1E, 0x78,
0x1E, 0x7C, 0x1C, 0x3C, 0x3F, 0xFC, 0x3F, 0xFE, 0x3F, 0xFE, 0x70, 0x1E,
0x70, 0x0F, 0x70, 0x0F, 0xE0, 0x0F, 0xE0, 0x06, 0x7F, 0x83, 0xFF, 0x8F,
0xFF, 0x38, 0x7C, 0xE0, 0xFB, 0x81, 0xEE, 0x07, 0xB8, 0x1E, 0xE0, 0xF3,
0xFF, 0xCF, 0xFF, 0x3F, 0xFE, 0xE0, 0xFF, 0x80, 0xFE, 0x01, 0xF8, 0x07,
0xE0, 0x1B, 0xC0, 0xEF, 0xFF, 0x3F, 0xF8, 0xFF, 0x80, 0x01, 0xFC, 0x07,
0xFF, 0x0F, 0xFF, 0x1E, 0x1F, 0x38, 0x00, 0x30, 0x00, 0x70, 0x00, 0x60,
0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xF0,
0x00, 0xF0, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x3F, 0x07, 0x1F, 0xFF, 0x0F,
0xFE, 0x03, 0xF0, 0x7F, 0xC0, 0xFF, 0xF0, 0xFF, 0xF8, 0xE0, 0xFC, 0xE0,
0x3E, 0xE0, 0x1E, 0xE0, 0x1F, 0xE0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xE0,
0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x06, 0xE0, 0x0E, 0xE0, 0x0C, 0xE0,
0x1C, 0xF0, 0x78, 0xFF, 0xF0, 0xFF, 0xE0, 0xFF, 0x00, 0x7F, 0xF3, 0xFF,
0xCF, 0xFF, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0,
0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38,
0x00, 0xE0, 0x03, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7F, 0xFF,
0xFF, 0xFF, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1F, 0xC3,
0xF8, 0x7E, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80,
0x70, 0x0C, 0x00, 0x00, 0xFC, 0x07, 0xFF, 0x0F, 0xFF, 0x1E, 0x0F, 0x38,
0x02, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0,
0x00, 0xE0, 0x3F, 0xE0, 0x7F, 0xF0, 0x7F, 0xF0, 0x07, 0x78, 0x07, 0x7C,
0x07, 0x3F, 0x07, 0x1F, 0xFF, 0x0F, 0xFF, 0x03, 0xF6, 0x60, 0x0F, 0x80,
0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0,
0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8,
0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xC0, 0x18, 0x7F, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x30, 0x07, 0x00, 0x70, 0x07,
0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
0x00, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, 0xE7, 0x0C, 0x7F, 0xC7, 0xF8,
0x3E, 0x00, 0x60, 0x19, 0xC0, 0x73, 0x81, 0xE7, 0x07, 0x8E, 0x3E, 0x1C,
0xF8, 0x3B, 0xE0, 0x7F, 0x00, 0xFC, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xF0,
0x0F, 0xF0, 0x1F, 0xF0, 0x3B, 0xF0, 0x73, 0xF8, 0xE3, 0xF9, 0xC3, 0xFB,
0x81, 0xFF, 0x01, 0xEC, 0x01, 0x80, 0x60, 0x1C, 0x03, 0x80, 0x70, 0x0E,
0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01,
0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0xFF, 0xFF, 0xFF, 0xFC, 0x60,
0x03, 0xF0, 0x07, 0xF0, 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xF8, 0x1F, 0xFC,
0x1F, 0xFC, 0x3F, 0xFE, 0x3F, 0xFE, 0x3F, 0xFE, 0x7F, 0xFF, 0x77, 0xEF,
0xF7, 0xEF, 0xE7, 0xE7, 0xE7, 0xE7, 0xC7, 0xE7, 0xC7, 0xE3, 0xC7, 0xE3,
0x87, 0xE0, 0x07, 0xC0, 0x06, 0x60, 0x0F, 0xC0, 0x7F, 0x81, 0xFE, 0x07,
0xFC, 0x1F, 0xF8, 0x7F, 0xE1, 0xFF, 0xC7, 0xEF, 0x9F, 0xBF, 0x7E, 0x7D,
0xF8, 0xFF, 0xE1, 0xFF, 0x87, 0xFE, 0x0F, 0xF8, 0x1F, 0xE0, 0x3F, 0x80,
0xFE, 0x01, 0xF8, 0x07, 0xC0, 0x18, 0x00, 0xFC, 0x00, 0x7F, 0xF0, 0x0F,
0xFF, 0x81, 0xE0, 0xFC, 0x38, 0x03, 0xE3, 0x00, 0x1E, 0x70, 0x01, 0xF6,
0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07,
0xE0, 0x00, 0x7F, 0x00, 0x06, 0xF0, 0x00, 0xE7, 0x80, 0x0C, 0x7C, 0x01,
0xC3, 0xF0, 0x78, 0x1F, 0xFF, 0x00, 0xFF, 0xE0, 0x03, 0xF0, 0x00, 0x7F,
0xC3, 0xFF, 0xCF, 0xFF, 0xB8, 0x3E, 0xE0, 0x3F, 0x80, 0xFE, 0x01, 0xF8,
0x07, 0xE0, 0x1B, 0x81, 0xEF, 0xFF, 0x3F, 0xF8, 0xFF, 0x83, 0x80, 0x0E,
0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xC0, 0x00,
0x00, 0xFC, 0x00, 0x7F, 0xF0, 0x0F, 0xFF, 0x81, 0xE0, 0xFC, 0x38, 0x03,
0xE3, 0x00, 0x1E, 0x70, 0x01, 0xF6, 0x00, 0x0F, 0xE0, 0x00, 0x7E, 0x00,
0x07, 0xE0, 0x00, 0x7E, 0x00, 0x07, 0xE0, 0x00, 0x7F, 0x00, 0x06, 0xF0,
0x00, 0xE7, 0x80, 0x0C, 0x7C, 0x01, 0xC3, 0xF0, 0x78, 0x1F, 0xFF, 0x00,
0xFF, 0xE0, 0x03, 0xF0, 0x00, 0x7F, 0xC1, 0xFF, 0xE3, 0xFF, 0xE7, 0x07,
0xEE, 0x03, 0xDC, 0x03, 0xB8, 0x07, 0x70, 0x1E, 0xFF, 0xF9, 0xFF, 0xE3,
0xFF, 0x87, 0xFE, 0x0F, 0xF0, 0x1F, 0xF8, 0x3B, 0xF8, 0x73, 0xF8, 0xE3,
0xF9, 0xC3, 0xFB, 0x81, 0xF7, 0x01, 0xEC, 0x01, 0x80, 0x07, 0xE0, 0x3F,
0xF0, 0xFF, 0xF1, 0x83, 0xE7, 0x01, 0x8E, 0x00, 0x1E, 0x00, 0x3F, 0x80,
0x7F, 0xF0, 0x7F, 0xF0, 0xFF, 0xF0, 0x7F, 0xF0, 0x1F, 0xE0, 0x07, 0xC0,
0x07, 0x80, 0x07, 0x30, 0x0C, 0xF8, 0x39, 0xFF, 0xE3, 0xFF, 0x81, 0xFC,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xC0, 0x07, 0x00, 0x1C, 0x00,
0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00,
0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0,
0x06, 0x00, 0x60, 0x1F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F,
0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0,
0x1F, 0x80, 0xFE, 0x06, 0xF0, 0x73, 0xC3, 0x1F, 0xF8, 0x7F, 0x80, 0xF0,
0x00, 0x60, 0x07, 0xF0, 0x07, 0xF0, 0x0E, 0xF0, 0x0E, 0x78, 0x0E, 0x78,
0x1C, 0x78, 0x1C, 0x3C, 0x3C, 0x3C, 0x38, 0x3C, 0x38, 0x1E, 0x78, 0x1E,
0x70, 0x1F, 0x70, 0x0F, 0xE0, 0x0F, 0xE0, 0x07, 0xE0, 0x07, 0xC0, 0x07,
0xC0, 0x03, 0xC0, 0x03, 0x80, 0x03, 0x00, 0x60, 0x00, 0x0D, 0xC0, 0x00,
0x3F, 0xC0, 0x60, 0x77, 0x81, 0xC0, 0xEF, 0x03, 0x81, 0xCF, 0x0F, 0x87,
0x1E, 0x1F, 0x0E, 0x3C, 0x3E, 0x1C, 0x38, 0xFE, 0x78, 0x79, 0xFC, 0xE0,
0xF3, 0xF9, 0xC1, 0xEE, 0x7B, 0x81, 0xFC, 0xFE, 0x03, 0xF9, 0xFC, 0x07,
0xF1, 0xF8, 0x07, 0xC3, 0xF0, 0x0F, 0x87, 0xC0, 0x1F, 0x07, 0x80, 0x3C,
0x0F, 0x00, 0x38, 0x1C, 0x00, 0x60, 0x18, 0x00, 0x60, 0x03, 0xF0, 0x07,
0xF8, 0x0F, 0xFC, 0x1E, 0x7C, 0x1C, 0x3E, 0x38, 0x1F, 0x78, 0x1F, 0xF0,
0x0F, 0xE0, 0x07, 0xC0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xF0, 0x0E, 0xF8,
0x1E, 0xFC, 0x1C, 0x7C, 0x38, 0x3E, 0x78, 0x1F, 0xF0, 0x1F, 0xE0, 0x0F,
0xC0, 0x06, 0x60, 0x03, 0xF0, 0x07, 0xF0, 0x0F, 0xF8, 0x1E, 0x7C, 0x3C,
0x3E, 0x78, 0x3E, 0x70, 0x1F, 0xE0, 0x0F, 0xE0, 0x0F, 0xC0, 0x07, 0x80,
0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80,
0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x7F, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF0,
0x01, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x07, 0x80, 0x0F, 0x00,
0x1E, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFE, 0x7F, 0xFF, 0xF7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87,
0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x3F, 0xFF, 0xFC,
0x60, 0x3C, 0x0F, 0x03, 0xC0, 0x78, 0x1E, 0x07, 0x80, 0xF0, 0x3C, 0x0F,
0x01, 0xE0, 0x78, 0x1F, 0x03, 0xC0, 0xF0, 0x1E, 0x07, 0x81, 0xE0, 0x3C,
0x0E, 0x03, 0x00, 0x7F, 0xFF, 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xDF, 0xFF,
0xFC, 0x02, 0x00, 0x70, 0x0F, 0x00, 0xF8, 0x1F, 0x83, 0xFC, 0x3B, 0xE7,
0x3E, 0x71, 0xFE, 0x0F, 0xE0, 0xFC, 0x06, 0x7F, 0xFF, 0xFF, 0xFF, 0xE0,
0x00, 0xE3, 0xC7, 0xC7, 0xC7, 0xC7, 0x82, 0x0F, 0x83, 0xFE, 0x7F, 0xE7,
0x0F, 0x00, 0xF0, 0x3F, 0x1F, 0xF3, 0xFF, 0x7F, 0xFF, 0xE7, 0xE0, 0x7E,
0x07, 0xF0, 0x7F, 0xFF, 0x7F, 0xF1, 0xF6, 0x60, 0x07, 0x00, 0x38, 0x01,
0xC0, 0x0E, 0x00, 0x70, 0x03, 0xFE, 0x1F, 0xF8, 0xFF, 0xE7, 0x0F, 0xB8,
0x3F, 0xC0, 0xFE, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x37, 0x03,
0xBC, 0x39, 0xFF, 0x8F, 0xF8, 0x7F, 0x80, 0x03, 0xE0, 0x7F, 0x87, 0xFC,
0x70, 0xC7, 0x00, 0x30, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x3C,
0x01, 0xF0, 0x07, 0xC3, 0x1F, 0xF8, 0x7F, 0xC1, 0xF8, 0x00, 0x30, 0x07,
0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x07, 0xF1, 0xFF, 0x3F, 0xF3, 0x0F,
0x70, 0x76, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x7F, 0x07,
0x7C, 0x77, 0xFF, 0x3F, 0xF0, 0xFE, 0x03, 0xE0, 0x7F, 0x87, 0xFE, 0x70,
0xF7, 0x03, 0xB0, 0x1F, 0x87, 0xDF, 0xFE, 0xFF, 0xE7, 0xFE, 0x3F, 0x81,
0xF0, 0x07, 0xC3, 0x9F, 0xFC, 0x7F, 0xC1, 0xF8, 0x07, 0x83, 0xFC, 0x7F,
0x9C, 0xE3, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x7F, 0x1F, 0xE3, 0xF8, 0x38,
0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07,
0x00, 0xC0, 0x00, 0x07, 0xF1, 0xFF, 0x3F, 0xF3, 0x0F, 0x70, 0x76, 0x07,
0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x7F, 0x07, 0x7C, 0x77, 0xFF,
0x3F, 0xF0, 0xFF, 0x00, 0x60, 0x0E, 0x30, 0xC7, 0xFC, 0x7F, 0x83, 0xE0,
0x60, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE7, 0x8F, 0xFE,
0xFF, 0xEF, 0x8F, 0xF0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07,
0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7C, 0x06, 0xEF, 0xF0, 0x00,
0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0x00, 0xE0, 0x0F, 0x00,
0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x70, 0x07, 0x00,
0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00,
0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x70, 0xCF, 0xFC, 0xFF,
0x87, 0xE0, 0x60, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03,
0x83, 0x1C, 0x78, 0xEF, 0xC7, 0xFC, 0x3F, 0x81, 0xF0, 0x0F, 0x80, 0x7E,
0x03, 0xF8, 0x1F, 0xF0, 0xFF, 0xC7, 0x3F, 0x38, 0xFD, 0xC3, 0xFE, 0x0F,
0x60, 0x30, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x6F,
0x8F, 0x9F, 0xFF, 0xFB, 0xFF, 0xFF, 0x78, 0xF8, 0xFF, 0x0F, 0x0F, 0xC1,
0xC1, 0xF8, 0x38, 0x3F, 0x07, 0x07, 0xE0, 0xE0, 0xFC, 0x1C, 0x1F, 0x83,
0x83, 0xF0, 0x70, 0x7E, 0x0E, 0x0F, 0xC1, 0xC1, 0xF8, 0x38, 0x3E, 0x06,
0x06, 0x67, 0x8F, 0xFE, 0xFF, 0xEF, 0x0F, 0xF0, 0x7E, 0x07, 0xE0, 0x7E,
0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7C,
0x06, 0x07, 0xE0, 0x1F, 0xE0, 0x7F, 0xE1, 0xC3, 0xE7, 0x03, 0xEC, 0x03,
0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0xC0, 0x37, 0xC0, 0xE7,
0xC3, 0x87, 0xFE, 0x07, 0xF8, 0x07, 0xC0, 0x7F, 0x0F, 0xFC, 0xFF, 0xEE,
0x3E, 0xE0, 0xFE, 0x0F, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x6E,
0x0E, 0xF0, 0xCF, 0xFC, 0xFF, 0x8F, 0xE0, 0xE0, 0x0E, 0x00, 0xE0, 0x0E,
0x00, 0xE0, 0x0C, 0x00, 0x03, 0xF8, 0x7F, 0xCF, 0xFE, 0x7F, 0xF7, 0x07,
0xB0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x81, 0xFC, 0x0F, 0xF8, 0x77,
0xFF, 0x9F, 0xFC, 0xFF, 0xE1, 0xFF, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00,
0x70, 0x03, 0x80, 0x18, 0x07, 0xC7, 0xFE, 0xFF, 0xEF, 0x0C, 0xF0, 0x0E,
0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E,
0x00, 0xE0, 0x0C, 0x00, 0x0F, 0xC1, 0xFF, 0x3F, 0xF7, 0x1E, 0x78, 0x07,
0xF0, 0x7F, 0xC7, 0xFE, 0x3F, 0xF0, 0xFF, 0x01, 0xF0, 0x07, 0x78, 0x67,
0xFE, 0x7F, 0xC3, 0xF0, 0x30, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
0x00, 0x70, 0x07, 0xFC, 0xFF, 0xCF, 0xF8, 0x70, 0x07, 0x00, 0x70, 0x07,
0x00, 0x70, 0x07, 0x00, 0x78, 0x03, 0xC6, 0x3F, 0xE1, 0xFE, 0x0F, 0x80,
0x60, 0x3E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07,
0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x0F, 0xF0, 0xF7, 0xFF, 0x7F, 0xF1, 0xF6,
0x60, 0x3F, 0x07, 0xF0, 0x7F, 0x07, 0x78, 0xE7, 0x8E, 0x79, 0xE3, 0xDC,
0x3D, 0xC3, 0xF8, 0x1F, 0x81, 0xF8, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x60,
0x60, 0x01, 0xF8, 0x21, 0xFC, 0x30, 0xFE, 0x3C, 0x77, 0x1E, 0x7B, 0xDF,
0x39, 0xEF, 0xDC, 0xF7, 0xEE, 0x3F, 0xFE, 0x1F, 0xBF, 0x0F, 0xDF, 0x87,
0xEF, 0xC1, 0xE3, 0xC0, 0xF1, 0xE0, 0x78, 0xF0, 0x18, 0x30, 0x60, 0x3F,
0x07, 0xF8, 0xFF, 0x8E, 0x7D, 0xC3, 0xF8, 0x3F, 0x81, 0xF0, 0x0F, 0x81,
0xFC, 0x1F, 0xC3, 0xBE, 0x71, 0xFF, 0x1F, 0xE0, 0xFC, 0x06, 0x30, 0x1B,
0x81, 0xFC, 0x1E, 0xF0, 0xE7, 0x87, 0x3E, 0x70, 0xF3, 0x87, 0x9C, 0x1F,
0xC0, 0xFE, 0x07, 0xF0, 0x1F, 0x00, 0xF8, 0x07, 0x80, 0x1C, 0x00, 0xE0,
0x0E, 0x00, 0x70, 0x1F, 0x81, 0xF8, 0x0F, 0xC0, 0x3C, 0x00, 0x7F, 0xFF,
0xFF, 0xFF, 0xF0, 0x1E, 0x03, 0xC0, 0x3C, 0x07, 0x80, 0xF0, 0x0F, 0x01,
0xE0, 0x3C, 0x03, 0xC0, 0x78, 0x0F, 0xFF, 0xFF, 0xFF, 0xFE, 0x06, 0x0E,
0x1E, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x70, 0x70, 0x78,
0x78, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3C, 0x3E, 0x1F, 0x1E, 0x0E,
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x61,
0xE3, 0xC7, 0xC7, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xE3, 0xE3, 0xC7,
0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x38, 0xF1, 0xC0, 0x00, 0x3E,
0x37, 0xF7, 0xFF, 0xFE, 0xFE, 0xC7, 0xC0, 0x10 };
const GFXglyph aAntiCorona14pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 7, 0, 0 }, // 0x20 ' '
{ 1, 4, 22, 7, 2, -19 }, // 0x21 '!'
{ 12, 8, 7, 13, 2, -19 }, // 0x22 '"'
{ 19, 17, 20, 19, 1, -17 }, // 0x23 '#'
{ 62, 14, 21, 17, 2, -18 }, // 0x24 '$'
{ 99, 24, 21, 25, 1, -18 }, // 0x25 '%'
{ 162, 15, 21, 17, 1, -18 }, // 0x26 '&'
{ 202, 3, 7, 7, 2, -19 }, // 0x27 '''
{ 205, 9, 25, 10, 1, -19 }, // 0x28 '('
{ 234, 8, 25, 10, 1, -19 }, // 0x29 ')'
{ 259, 12, 12, 14, 1, -19 }, // 0x2A '*'
{ 277, 12, 12, 14, 1, -13 }, // 0x2B '+'
{ 295, 5, 7, 8, 2, -2 }, // 0x2C ','
{ 300, 12, 3, 14, 1, -5 }, // 0x2D '-'
{ 305, 4, 3, 8, 2, 0 }, // 0x2E '.'
{ 307, 10, 21, 12, 1, -18 }, // 0x2F '/'
{ 334, 16, 21, 18, 1, -18 }, // 0x30 '0'
{ 376, 6, 21, 8, 0, -18 }, // 0x31 '1'
{ 392, 13, 21, 15, 1, -18 }, // 0x32 '2'
{ 427, 13, 21, 15, 1, -18 }, // 0x33 '3'
{ 462, 13, 21, 14, 0, -18 }, // 0x34 '4'
{ 497, 12, 21, 14, 1, -18 }, // 0x35 '5'
{ 529, 14, 21, 16, 1, -18 }, // 0x36 '6'
{ 566, 13, 21, 13, 0, -18 }, // 0x37 '7'
{ 601, 13, 21, 15, 1, -18 }, // 0x38 '8'
{ 636, 15, 21, 16, 1, -18 }, // 0x39 '9'
{ 676, 4, 13, 8, 2, -10 }, // 0x3A ':'
{ 683, 4, 16, 8, 2, -11 }, // 0x3B ';'
{ 691, 16, 13, 17, 1, -13 }, // 0x3C '<'
{ 717, 12, 9, 15, 1, -11 }, // 0x3D '='
{ 731, 16, 13, 17, 1, -13 }, // 0x3E '>'
{ 757, 12, 21, 14, 1, -18 }, // 0x3F '?'
{ 789, 20, 21, 23, 1, -18 }, // 0x40 '@'
{ 842, 16, 21, 16, -1, -18 }, // 0x41 'A'
{ 884, 14, 21, 17, 2, -18 }, // 0x42 'B'
{ 921, 16, 21, 18, 1, -18 }, // 0x43 'C'
{ 963, 16, 21, 19, 2, -18 }, // 0x44 'D'
{ 1005, 14, 21, 16, 2, -18 }, // 0x45 'E'
{ 1042, 11, 21, 13, 2, -18 }, // 0x46 'F'
{ 1071, 16, 21, 19, 1, -18 }, // 0x47 'G'
{ 1113, 14, 21, 18, 2, -18 }, // 0x48 'H'
{ 1150, 3, 21, 7, 2, -18 }, // 0x49 'I'
{ 1158, 12, 21, 12, -1, -18 }, // 0x4A 'J'
{ 1190, 15, 21, 17, 2, -18 }, // 0x4B 'K'
{ 1230, 11, 21, 13, 2, -18 }, // 0x4C 'L'
{ 1259, 16, 21, 20, 2, -18 }, // 0x4D 'M'
{ 1301, 14, 21, 18, 2, -18 }, // 0x4E 'N'
{ 1338, 20, 21, 22, 1, -18 }, // 0x4F 'O'
{ 1391, 14, 21, 17, 2, -18 }, // 0x50 'P'
{ 1428, 20, 21, 22, 1, -18 }, // 0x51 'Q'
{ 1481, 15, 21, 18, 2, -18 }, // 0x52 'R'
{ 1521, 15, 21, 16, 0, -18 }, // 0x53 'S'
{ 1561, 14, 21, 16, 1, -18 }, // 0x54 'T'
{ 1598, 13, 21, 15, 1, -18 }, // 0x55 'U'
{ 1633, 16, 21, 17, 0, -18 }, // 0x56 'V'
{ 1675, 23, 21, 24, 1, -18 }, // 0x57 'W'
{ 1736, 16, 21, 18, 1, -18 }, // 0x58 'X'
{ 1778, 16, 21, 18, 1, -18 }, // 0x59 'Y'
{ 1820, 16, 21, 18, 1, -18 }, // 0x5A 'Z'
{ 1862, 7, 25, 10, 2, -19 }, // 0x5B '['
{ 1884, 10, 21, 12, 1, -18 }, // 0x5C '\'
{ 1911, 7, 25, 9, 0, -19 }, // 0x5D ']'
{ 1933, 12, 12, 13, 1, -19 }, // 0x5E '^'
{ 1951, 12, 3, 15, 2, 2 }, // 0x5F '_'
{ 1956, 7, 8, 9, 1, -17 }, // 0x60 '`'
{ 1963, 12, 16, 14, 1, -13 }, // 0x61 'a'
{ 1987, 13, 22, 16, 2, -19 }, // 0x62 'b'
{ 2023, 13, 16, 14, 1, -13 }, // 0x63 'c'
{ 2049, 12, 22, 14, 1, -19 }, // 0x64 'd'
{ 2082, 13, 16, 15, 1, -13 }, // 0x65 'e'
{ 2108, 11, 22, 11, 1, -19 }, // 0x66 'f'
{ 2139, 12, 22, 15, 1, -13 }, // 0x67 'g'
{ 2172, 12, 22, 15, 2, -19 }, // 0x68 'h'
{ 2205, 4, 22, 6, 1, -19 }, // 0x69 'i'
{ 2216, 12, 28, 6, -7, -19 }, // 0x6A 'j'
{ 2258, 13, 22, 15, 2, -19 }, // 0x6B 'k'
{ 2294, 3, 22, 6, 2, -19 }, // 0x6C 'l'
{ 2303, 19, 16, 21, 1, -13 }, // 0x6D 'm'
{ 2341, 12, 16, 14, 1, -13 }, // 0x6E 'n'
{ 2365, 15, 16, 17, 1, -13 }, // 0x6F 'o'
{ 2395, 12, 22, 14, 1, -13 }, // 0x70 'p'
{ 2428, 13, 22, 16, 1, -13 }, // 0x71 'q'
{ 2464, 12, 16, 13, 1, -13 }, // 0x72 'r'
{ 2488, 12, 16, 13, 0, -13 }, // 0x73 's'
{ 2512, 12, 21, 13, 1, -18 }, // 0x74 't'
{ 2544, 12, 16, 14, 1, -13 }, // 0x75 'u'
{ 2568, 12, 16, 14, 1, -13 }, // 0x76 'v'
{ 2592, 17, 16, 19, 1, -13 }, // 0x77 'w'
{ 2626, 12, 16, 14, 1, -13 }, // 0x78 'x'
{ 2650, 13, 22, 14, 1, -13 }, // 0x79 'y'
{ 2686, 12, 16, 14, 1, -13 }, // 0x7A 'z'
{ 2710, 8, 26, 8, 0, -19 }, // 0x7B '{'
{ 2736, 3, 28, 7, 2, -19 }, // 0x7C '|'
{ 2747, 7, 27, 9, 1, -19 }, // 0x7D '}'
{ 2771, 12, 6, 15, 2, -8 } }; // 0x7E '~'
const GFXfont aAntiCorona14pt7b PROGMEM = {
(uint8_t *)aAntiCorona14pt7bBitmaps,
(GFXglyph *)aAntiCorona14pt7bGlyphs,
0x20, 0x7E, 30 };
// Approx. 3452 bytes