Version 1.4.3.

This commit is contained in:
GuruSR 2022-02-17 19:42:30 -05:00 committed by GitHub
parent 94b6d5222f
commit 045b4098ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 26 deletions

View File

@ -1,9 +1,6 @@
#ifndef DEFINES_GSR_H #ifndef DEFINES_GSR_H
#define DEFINES_GSR_H #define DEFINES_GSR_H
// Time Sync Server
#define ntpServer "pool.ntp.org"
//debug //debug
#define USEDEBUG 0 // !0 is on, will not setup Serial OR print output if zero. #define USEDEBUG 0 // !0 is on, will not setup Serial OR print output if zero.
@ -20,8 +17,6 @@
// Battery // Battery
#define MaxBattery 4.37 #define MaxBattery 4.37
#define MinBattery 3.58
#define LowBattery 3.45
// functions // functions
#define roller(v,lo,hi) (((v)<(lo))?(hi):((v)>(hi))?(lo):(v)) #define roller(v,lo,hi) (((v)<(lo))?(hi):((v)>(hi))?(lo):(v))

View File

@ -301,6 +301,14 @@ const unsigned char PMIndicator [] PROGMEM = {
0x78, 0xfc, 0xfc, 0xfc, 0xfc, 0x78 0x78, 0xfc, 0xfc, 0xfc, 0xfc, 0x78
}; };
// 'NoClock', 19x19px
const unsigned char iNoClock [] PROGMEM = {
0x87, 0xfc, 0x20, 0xdf, 0xff, 0x60, 0x7c, 0x07, 0xc0, 0x70, 0x41, 0xc0, 0x78, 0xe3, 0xc0, 0xec,
0xe6, 0xe0, 0xc6, 0xec, 0x60, 0xc3, 0xf8, 0x60, 0xc1, 0xf0, 0x60, 0xc0, 0xe0, 0x60, 0xc0, 0xf0,
0x60, 0xc1, 0xb8, 0x60, 0xc3, 0x1c, 0x60, 0xe6, 0x0e, 0xe0, 0x6c, 0x06, 0xc0, 0x78, 0x03, 0xc0,
0x3c, 0x07, 0x80, 0x7f, 0xff, 0xc0, 0xc7, 0xfc, 0x60
};
// 'Sync', 19x19px // 'Sync', 19x19px
const unsigned char iSync [] PROGMEM = { const unsigned char iSync [] PROGMEM = {
0x07, 0xfc, 0x00, 0x1f, 0xff, 0x00, 0x3c, 0x07, 0x80, 0x70, 0x41, 0xc0, 0x60, 0xe0, 0xc0, 0xe0, 0x07, 0xfc, 0x00, 0x1f, 0xff, 0x00, 0x3c, 0x07, 0x80, 0x70, 0x41, 0xc0, 0x60, 0xe0, 0xc0, 0xe0,

View File

@ -156,6 +156,8 @@ RTC_DATA_ATTR struct BatteryUse final {
int8_t UpCount; // Counts how many times the battery is in a direction to determine true charging. int8_t UpCount; // Counts how many times the battery is in a direction to determine true charging.
int8_t DownCount; int8_t DownCount;
int8_t LastState; // 0=not visible, 1= showing chargeme, 2=showing charging. int8_t LastState; // 0=not visible, 1= showing chargeme, 2=showing charging.
float MinLevel; // Lowest level before the indicator comes on.
float LowLevel; // The battery is about to get too low for the RTC to function.
} Battery; } Battery;
RTC_DATA_ATTR struct MenuUse final { RTC_DATA_ATTR struct MenuUse final {
@ -181,6 +183,7 @@ RTC_DATA_ATTR struct GoneDark final {
bool Went; bool Went;
unsigned long Last; unsigned long Last;
bool Woke; bool Woke;
unsigned long Tilt; // Used to track Tilt, if upright count for 1 second.
} Darkness; // Whether or not the screen is darkened. } Darkness; // Whether or not the screen is darkened.
RTC_DATA_ATTR struct dispUpdate final { RTC_DATA_ATTR struct dispUpdate final {
@ -277,6 +280,7 @@ void WatchyGSR::init(String datetime){
Updates.Tapped = false; Updates.Tapped = false;
LastButton = 0; LastButton = 0;
Darkness.Last = 0; Darkness.Last = 0;
Darkness.Tilt = 0;
Darkness.Woke = false; Darkness.Woke = false;
TurboTime = 0; TurboTime = 0;
CPUSet.Freq=getCpuFrequencyMhz(); CPUSet.Freq=getCpuFrequencyMhz();
@ -306,10 +310,10 @@ void WatchyGSR::init(String datetime){
if (Button == 5 && Options.SleepStyle > 1){ // Accelerometer caused this. if (Button == 5 && Options.SleepStyle > 1){ // Accelerometer caused this.
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(); Darkness.Tilt = Darkness.Last; UpdateDisp = true; // Update Screen to new state.
}else if (Button == 6 && !WatchTime.BedTime){ // 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(); Darkness.Tilt = Darkness.Last; UpdateDisp = true; // Do this anyways, always.
} }
} }
SRTC.resetWake(); SRTC.resetWake();
@ -318,6 +322,8 @@ void WatchyGSR::init(String datetime){
WatchStyles.Count = 0; WatchStyles.Count = 0;
BasicWatchStyles = -1; BasicWatchStyles = -1;
SRTC.init(); SRTC.init();
Battery.MinLevel = SRTC.getRTCBattery();
Battery.LowLevel = SRTC.getRTCBattery(true);
initZeros(); initZeros();
setupDefaults(); setupDefaults();
Rebooted=true; Rebooted=true;
@ -355,7 +361,7 @@ void WatchyGSR::init(String datetime){
} }
if ((Battery.Last > LowBattery || Button != 0 || Updates.Tapped || Darkness.Woke) && !(Options.SleepStyle == 4 && Darkness.Went && !Updates.Tapped)){ if ((Battery.Last > Battery.LowLevel || 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);
@ -391,9 +397,13 @@ void WatchyGSR::init(String datetime){
ManageTime(); // Handle Time method. ManageTime(); // Handle Time method.
Up=SBMA.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 (Options.SleepStyle == 1 || Options.SleepStyle > 2){ if ((Options.SleepStyle == 1 || Options.SleepStyle > 2 || WatchTime.DeadRTC) && !WatchTime.BedTime){
if (Darkness.Woke && Up) Darkness.Last = millis(); if (Darkness.Went && Up && !Darkness.Woke){ // Do this when the wrist is UP.
if (Darkness.Went && Up && !WatchTime.BedTime) { Darkness.Last = millis(); Darkness.Woke = true; UpdateDisp=Showing(); } if (Darkness.Tilt == 0) Darkness.Tilt = millis();
else if (millis() - Darkness.Tilt > 999) { Darkness.Last = millis(); Darkness.Woke = true; UpdateDisp=Showing(); }
}
if (!Up) Darkness.Tilt = 0;
else if (Darkness.Tilt != 0 && millis() - Darkness.Tilt > 999 && Darkness.Woke) { Darkness.Last = millis(); }
} }
processWiFiRequest(); // Process any WiFi requests. processWiFiRequest(); // Process any WiFi requests.
if (!Sensitive){ if (!Sensitive){
@ -680,12 +690,12 @@ void WatchyGSR::init(String datetime){
} }
void WatchyGSR::showWatchFace(){ void WatchyGSR::showWatchFace(){
if (Options.Performance > 0 && Battery.Last > MinBattery ) RefreshCPU((Options.Performance == 1 ? CPUMID : CPUMAX)); if (Options.Performance > 0 && Battery.Last > Battery.MinLevel ) RefreshCPU((Options.Performance == 1 ? CPUMID : CPUMAX));
DisplayInit(); DisplayInit();
display.setFullWindow(); display.setFullWindow();
drawWatchFace(); drawWatchFace();
if (Options.Feedback && DoHaptic && Battery.Last > MinBattery){ if (Options.Feedback && DoHaptic && Battery.Last > Battery.MinLevel){
VibeTo(true); VibeTo(true);
delay(40); delay(40);
VibeTo(false); VibeTo(false);
@ -1223,7 +1233,7 @@ void WatchyGSR::deepSleep(){
uint8_t I, N, D; uint8_t I, N, D;
bool BatOk, BT,B, DM; bool BatOk, BT,B, DM;
UpdateUTC(); UpdateClock(); UpdateUTC(); UpdateClock();
BatOk = (Battery.Last == 0 || Battery.Last > LowBattery); BatOk = (Battery.Last == 0 || Battery.Last > Battery.LowLevel);
BT = (Options.SleepStyle == 2 && WatchTime.BedTime); BT = (Options.SleepStyle == 2 && WatchTime.BedTime);
B = (((Options.SleepStyle == 1 || Options.SleepStyle > 2) || BT) && BatOk); B = (((Options.SleepStyle == 1 || Options.SleepStyle > 2) || BT) && BatOk);
@ -1250,14 +1260,16 @@ void WatchyGSR::deepSleep(){
} }
void WatchyGSR::GoDark(){ void WatchyGSR::GoDark(){
if ((Updates.Drawn || Battery.Direction != Battery.DarkDirection || !Darkness.Went || Battery.Last < LowBattery) && !Showing()) if ((Updates.Drawn || Battery.Direction != Battery.DarkDirection || !Darkness.Went || Battery.Last < Battery.LowLevel) && !Showing())
{ {
Darkness.Went=true; Darkness.Went=true;
Darkness.Woke=false;
Darkness.Tilt=0;
Updates.Init=Updates.Drawn; Updates.Init=Updates.Drawn;
display.setFullWindow(); display.setFullWindow();
DisplayInit(true); // Force it here so it fixes the border. DisplayInit(true); // Force it here so it fixes the border.
display.fillScreen(GxEPD_BLACK); display.fillScreen(GxEPD_BLACK);
if (Battery.Last < MinBattery) display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, (Battery.Last < LowBattery ? ChargeMeBad : ChargeMe), 40, 17, GxEPD_WHITE); else if (Battery.Direction == 1) display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, Charging, 40, 17, GxEPD_WHITE); if (Battery.Last < Battery.MinLevel) display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, (Battery.Last < Battery.LowLevel ? ChargeMeBad : ChargeMe), 40, 17, GxEPD_WHITE); else if (Battery.Direction == 1) display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, Charging, 40, 17, GxEPD_WHITE);
Battery.DarkDirection = Battery.Direction; Battery.DarkDirection = Battery.Direction;
display.display(true); display.display(true);
Updates.Drawn=false; Updates.Drawn=false;
@ -1392,7 +1404,7 @@ void WatchyGSR::ProcessNTP(){
} }
NTPData.NTPDone = false; NTPData.NTPDone = false;
setStatus("NTP"); setStatus("NTP");
SNTP.Begin(ntpServer); //"132.246.11.237","132.246.11.227"); SNTP.Begin(InsertNTPServer()); //"132.246.11.237","132.246.11.227");
NTPData.Wait = 0; NTPData.Wait = 0;
NTPData.Pause = 20; NTPData.Pause = 20;
NTPData.State++; NTPData.State++;
@ -1443,9 +1455,9 @@ void WatchyGSR::drawChargeMe(){
// Show Battery charging bitmap. // Show Battery charging bitmap.
display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, Charging, 40, 17, ForeColor()); display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, Charging, 40, 17, ForeColor());
D = 2; D = 2;
}else if (Battery.Last < MinBattery){ }else if (Battery.Last < Battery.MinLevel){
// Show Battery needs charging bitmap. // Show Battery needs charging bitmap.
display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, (Battery.Last < LowBattery ? ChargeMeBad : ChargeMe), 40, 17, ForeColor()); display.drawBitmap(Design.Status.BATTx, Design.Status.BATTy, (Battery.Last < Battery.LowLevel ? ChargeMeBad : ChargeMe), 40, 17, ForeColor());
D = 1; D = 1;
} }
} }
@ -1465,6 +1477,7 @@ void WatchyGSR::drawStatus(){
else if (WatchyStatus == "TZ") display.drawBitmap(Design.Status.WIFIx, Design.Status.WIFIy - 18, iTZ, 19, 19, ForeColor()); else if (WatchyStatus == "TZ") display.drawBitmap(Design.Status.WIFIx, Design.Status.WIFIy - 18, iTZ, 19, 19, ForeColor());
else if (WatchyStatus == "NTP") display.drawBitmap(Design.Status.WIFIx, Design.Status.WIFIy - 18, iSync, 19, 19, ForeColor()); else if (WatchyStatus == "NTP") display.drawBitmap(Design.Status.WIFIx, Design.Status.WIFIy - 18, iSync, 19, 19, ForeColor());
else if (WatchyStatus == "ESP") display.drawBitmap(Design.Status.WIFIx, Design.Status.WIFIy - 18, iSync, 19, 19, ForeColor()); else if (WatchyStatus == "ESP") display.drawBitmap(Design.Status.WIFIx, Design.Status.WIFIy - 18, iSync, 19, 19, ForeColor());
else if (WatchyStatus == "NC") display.drawBitmap(Design.Status.WIFIx, Design.Status.WIFIy - 18, iNoClock, 19, 19, ForeColor());
else{ else{
display.setTextColor(ForeColor()); display.setTextColor(ForeColor());
display.setCursor(Design.Status.WIFIx, Design.Status.WIFIy); display.setCursor(Design.Status.WIFIx, Design.Status.WIFIy);
@ -1474,6 +1487,7 @@ void WatchyGSR::drawStatus(){
} }
void WatchyGSR::setStatus(String Status){ void WatchyGSR::setStatus(String Status){
if (Status == "" && !SRTC.isOperating()) Status = "NC";
if (WatchyStatus != Status){ if (WatchyStatus != Status){
WatchyStatus = Status; WatchyStatus = Status;
UpdateDisp=Showing(); UpdateDisp=Showing();
@ -1501,7 +1515,7 @@ 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 (Pressed < 5 && LastButton > 0 && (millis() - LastButton) < KEYPAUSE) return; if (Pressed < 5 && LastButton > 0 && (millis() - LastButton) < KEYPAUSE) return;
if (Darkness.Went) { Darkness.Woke=true; Darkness.Last=millis(); UpdateUTC(); UpdateClock(); UpdateDisp=true; return; } // Don't do the button, just exit. if (Darkness.Went) { Darkness.Woke=true; Darkness.Last=millis(); Darkness.Tilt = Darkness.Last; 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){
@ -2052,7 +2066,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_STYL, (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 < Battery.MinLevel) ? 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){
@ -2230,7 +2244,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_STYL, (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 < Battery.MinLevel) ? 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){
@ -2296,6 +2310,7 @@ void WatchyGSR::ManageTime(){
else if (WatchTime.UTC_RAW == WatchTime.TravelTest) Options.Drift = 0; else if (WatchTime.UTC_RAW == WatchTime.TravelTest) Options.Drift = 0;
if (Options.Drift < -29 || Options.Drift > 29){ if (Options.Drift < -29 || Options.Drift > 29){
WatchTime.DeadRTC = true; Options.NeedsSaving = true; Options.UsingDrift = false; Options.Feedback = false; Options.MasterRepeats = 4; Alarms_Repeats[0] = 4; Alarms_Repeats[1] = 4; Alarms_Repeats[2] = 4; Alarms_Repeats[3] = 4; TimerDown.MaxTones = 4; WatchTime.DeadRTC = true; Options.NeedsSaving = true; Options.UsingDrift = false; Options.Feedback = false; Options.MasterRepeats = 4; Alarms_Repeats[0] = 4; Alarms_Repeats[1] = 4; Alarms_Repeats[2] = 4; Alarms_Repeats[3] = 4; TimerDown.MaxTones = 4;
NTPData.State = 1; NTPData.UpdateUTC = true; AskForWiFi();
if (Options.SleepStyle == 0) Options.SleepStyle = 1; if (Options.SleepStyle == 0) Options.SleepStyle = 1;
}else Options.UsingDrift = (Options.Drift != 0); }else Options.UsingDrift = (Options.Drift != 0);
if (Menu.Item == MENU_TOFF) Menu.SubItem = 3; if (Menu.Item == MENU_TOFF) Menu.SubItem = 3;
@ -2416,6 +2431,7 @@ uint8_t WatchyGSR::AddWatchStyle(String StyleName){
WatchStyles.Count++; WatchStyles.Count++;
return WatchStyles.Count; return WatchStyles.Count;
} }
String WatchyGSR::InsertNTPServer() { return "pool.ntp.org"; }
void WatchyGSR::AllowDefaultWatchStyles(bool Allow) { DefaultWatchStyles = Allow; } void WatchyGSR::AllowDefaultWatchStyles(bool Allow) { DefaultWatchStyles = Allow; }
bool WatchyGSR::IsDark(){ return Darkness.Went; } bool WatchyGSR::IsDark(){ return Darkness.Went; }
@ -3162,7 +3178,7 @@ void WatchyGSR::NVSEmpty(){
// Turbo Mode! // Turbo Mode!
void WatchyGSR::SetTurbo(){ void WatchyGSR::SetTurbo(){
if (Battery.Last > MinBattery){ if (Battery.Last > Battery.MinLevel){
TurboTime=millis(); TurboTime=millis();
LastButton=TurboTime; // Here for speed. LastButton=TurboTime; // Here for speed.
//Darkness.Last=LastButton; // Keeps track of SleepMode. //Darkness.Last=LastButton; // Keeps track of SleepMode.
@ -3205,7 +3221,7 @@ bool WatchyGSR::Showing() {
void WatchyGSR::RefreshCPU(){ RefreshCPU(0); } void WatchyGSR::RefreshCPU(){ RefreshCPU(0); }
void WatchyGSR::RefreshCPU(int Value){ void WatchyGSR::RefreshCPU(int Value){
uint32_t C = 80; uint32_t C = 80;
if (!WatchTime.DeadRTC && Battery.Last > MinBattery) { if (!WatchTime.DeadRTC && Battery.Last > Battery.MinLevel) {
if (Value == CPUMAX) CPUSet.Locked = true; if (Value == CPUMAX) CPUSet.Locked = true;
if (Value == CPUDEF) CPUSet.Locked = false; if (Value == CPUDEF) CPUSet.Locked = false;
if (!CPUSet.Locked && Options.Performance != 2) C = (InTurbo() || Value == CPUMID) ? 160 : 80; if (!CPUSet.Locked && Options.Performance != 2) C = (InTurbo() || Value == CPUMID) ? 160 : 80;

View File

@ -38,7 +38,7 @@ class WatchyGSR{
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.2"; static constexpr const char* Build = "1.4.3";
enum DesOps {dSTATIC, dLEFT, dRIGHT, dCENTER}; enum DesOps {dSTATIC, dLEFT, dRIGHT, dCENTER};
public: public:
WatchyGSR(); WatchyGSR();
@ -73,6 +73,7 @@ class WatchyGSR{
void InsertDrawWatchStyle(uint8_t StyleID); void InsertDrawWatchStyle(uint8_t StyleID);
void InsertInitWatchStyle(uint8_t StyleID); void InsertInitWatchStyle(uint8_t StyleID);
virtual uint8_t AddWatchStyle(String StyleName) final; virtual uint8_t AddWatchStyle(String StyleName) final;
String InsertNTPServer();
virtual void AllowDefaultWatchStyles(bool Allow = true) final; virtual void AllowDefaultWatchStyles(bool Allow = true) final;
virtual void AskForWiFi() final; virtual void AskForWiFi() final;
virtual wl_status_t currentWiFi() final; virtual wl_status_t currentWiFi() final;