diff --git a/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp b/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp index 2b61943..f850230 100644 --- a/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp @@ -79,11 +79,12 @@ CScreen4::show() else { _printInverted(0, yPos, " WiFi Inactive ", true); } - yPos += _display.textHeight() + 2; + +/* yPos += _display.textHeight() + 2; char msg[32]; int mins = NVstore.getDimTime() / 60000; sprintf(msg, "Display Dim: %d min%c", mins, (mins > 1) ? 's' : ' '); - _printMenuText(0, yPos, msg); + _printMenuText(0, yPos, msg);*/ } @@ -94,15 +95,16 @@ CScreen4::keyHandler(uint8_t event) _repeatCount = 0; // press CENTRE if(event & key_Centre) { - return; } // press LEFT if(event & key_Left) { _ScreenManager.prevScreen(); + _rowSel = 0; } // press RIGHT if(event & key_Right) { _ScreenManager.nextScreen(); + _rowSel = 0; } // press UP if(event & key_Up) { @@ -116,6 +118,7 @@ CScreen4::keyHandler(uint8_t event) // _rowSel--; // UPPERLIMIT(_rowSel, 0); } + _ScreenManager.reqUpdate(); } if(event & keyRepeat) { // track key hold time @@ -125,13 +128,17 @@ CScreen4::keyHandler(uint8_t event) if(event & keyReleased) { if(event & key_Centre) { if(_rowSel) { - if(isWifiConfigPortal()) - wifiEnterConfigPortal(false); // stop config portal, reboot + + if(_repeatCount > STA_HOLD_TIME) { + wifiEnterConfigPortal(true, _repeatCount > STA_HOLD_TIME, 5000); // press - reboot into portal, long press - erase credentials + } else { - if(_rowSel==1) - wifiEnterConfigPortal(true, _repeatCount > STA_HOLD_TIME); // press - reboot into portal, long press - erase credentials - else - wifiEnterConfigPortal(false); // stop config portal, reboot + if(isWifiConfigPortal()) { + wifiEnterConfigPortal(false, false, 5000); // stop config portal, reboot + } + else { + wifiEnterConfigPortal(true, false, 5000); // stop config portal, reboot + } } } } diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp index b8e77cc..968642c 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.cpp @@ -7,6 +7,7 @@ #include "Screen6.h" #include "Screen7.h" #include "Screen8.h" +#include "RebootScreen.h" #include #include "../cfg/pins.h" #include "../cfg/BTCConfig.h" @@ -96,6 +97,7 @@ CScreenManager::CScreenManager() _currentScreen = -1; _bReqUpdate = false; _DimTime = millis() + 60000; + _pRebootScreen = NULL; } CScreenManager::~CScreenManager() @@ -167,10 +169,17 @@ CScreenManager::checkUpdate() } if(_bReqUpdate) { - if(_currentScreen >= 0) { - _Screens[_currentScreen]->show(); + if(_pRebootScreen) { + _pRebootScreen->show(); _bReqUpdate = false; - return true; + return true; + } + else { + if(_currentScreen >= 0) { + _Screens[_currentScreen]->show(); + _bReqUpdate = false; + return true; + } } } return false; @@ -235,11 +244,18 @@ CScreenManager::keyHandler(uint8_t event) if(_DimTime == 0) _pDisplay->dim(false); -// _DimTime = millis() + NVstore.getDimTime(); - _DimTime = millis() + 60000; - if(_DimTime == 0) - _DimTime = 1; + _DimTime = (millis() + NVstore.getDimTime()) | 1; +// _DimTime = (millis() + 60000) | 1; } - \ No newline at end of file +void +CScreenManager::showRebootMsg(const char* content[2], long delayTime) +{ + if(_pRebootScreen == NULL) + _pRebootScreen = new CRebootScreen(*_pDisplay, *this); + + _pRebootScreen->setMessage(content, delayTime); + _bReqUpdate = true; + _pDisplay->dim(false); +} diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h index c776b82..e200eef 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenManager.h @@ -28,6 +28,7 @@ class CProtocol; class C128x64_OLED; class CScreen; +class CRebootScreen; class CScreenManager { std::vector _Screens; @@ -36,6 +37,7 @@ class CScreenManager { unsigned long _DimTime; bool _bReqUpdate; void _switchScreen(); + CRebootScreen* _pRebootScreen; public: CScreenManager(); ~CScreenManager(); @@ -47,6 +49,7 @@ public: void prevScreen(); void keyHandler(uint8_t event); void reqUpdate(); + void showRebootMsg(const char* content[2], long delayTime); }; #endif // __SCREEN_MANAGER_H__ diff --git a/Arduino/BTCDieselHeater/src/WiFi/BTCWebServer.cpp b/Arduino/BTCDieselHeater/src/WiFi/BTCWebServer.cpp index a5663cd..c3149ec 100644 --- a/Arduino/BTCDieselHeater/src/WiFi/BTCWebServer.cpp +++ b/Arduino/BTCDieselHeater/src/WiFi/BTCWebServer.cpp @@ -47,24 +47,22 @@ void handleBTCRoot() { } void handleWMConfig() { + server.send(200, "text/plain", "Start Config Portal - Retaining credential"); DebugPort.println("Starting web portal for wifi config"); - wm.startWebPortal(); + delay(500); +// wm.startWebPortal(); + wifiEnterConfigPortal(true, false, 3000); } void handleReset() { - server.send(200, "text/plain", "Resetting Wifi Settings!"); + server.send(200, "text/plain", "Start Config Portal - Resetting Wifi credentials!"); DebugPort.println("diconnecting client and wifi, then rebooting"); + delay(500); //client.disconnect(); // wifi_station_disconnect(); - wm.disconnect(); - wm.resetSettings(); - - delay(1000); - - ESP.restart(); - - - +// wm.disconnect(); +// wm.resetSettings(); + wifiEnterConfigPortal(true, true, 3000); } void handleBTCNotFound() { diff --git a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp index 406b340..c44e7b3 100644 --- a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp +++ b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp @@ -24,6 +24,7 @@ #include "BTCWifi.h" #include "../Utility/DebugPort.h" #include +#include "../OLED/ScreenManager.h" #include "esp_system.h" #include @@ -45,6 +46,7 @@ bool isSTA = false; // true if connected to an access point int TRIG_PIN; // pin that triggers the configuration portal when set to LOW unsigned restartServer = 0; // set to time of portal reconfig - will cause reboot a while later +extern CScreenManager ScreenManager; bool initWifi(int initpin,const char *failedssid, const char *failedpassword) { @@ -134,17 +136,6 @@ void doWiFiManager() { wm.process(); - // handle the tail end of new credentials being saved by WiFiManager - // whilst the new connection is established OK, the web server is detached - // Reboot the ESP so the config portal's root link is removed and our's becomes active - // reboot takes palce 7.5 seconds after the config portal params are saved - if(restartServer) { - long tDelta = millis() - restartServer; - if(tDelta > 7500) { - restartServer = 0; - ESP.restart(); - } - } // manage handling of pin to enter WiFManager config portal // we typically use the BOOT pin for this (pins.h) @@ -154,15 +145,25 @@ void doWiFiManager() // > 5 second press - erase credentials, enable config portal static bool pinDown = false; static long pinTime = 0; + unsigned long tDelta; + if(digitalRead(TRIG_PIN) == LOW) { if(!pinDown) pinTime = millis(); pinDown = true; + // track hold duration - change OLED Wifi annotation according to length of press + tDelta = millis() - pinTime; + if(tDelta > 5000) + isPortalAP = true; // we will start portal - show 'CFG' on OLED! + else if(tDelta > 1000) + isPortalAP = false; // we won't start portal - hide 'CFG' on OLED! + else + isPortalAP = true; // we will start portal - show 'CFG' on OLED! } else { if(pinDown) { pinDown = false; - unsigned long tDelta = millis() - pinTime; + tDelta = millis() - pinTime; DebugPort.print("Wifi config button tDelta = "); DebugPort.println(tDelta); // > 5 second press? if(tDelta > 5000) { @@ -181,30 +182,41 @@ void doWiFiManager() } } -void wifiEnterConfigPortal(bool state, bool erase) +void wifiEnterConfigPortal(bool state, bool erase, long rebootDelay) { + wm.disconnect(); prepBootIntoConfigPortal(state); + const char* content[2]; + + if(isWifiSTA() && !erase) + content[0] = "WiFi Mode -> STA+AP"; + else + content[0] = "WiFi Mode -> AP only"; + if(erase) { wm.resetSettings(); DebugPort.println("*** Erased wifi credentials ***"); } - if(state) + if(state) { DebugPort.println("*** Rebooting into config portal ***"); - else + content[1] = "Web -> Config Portal"; + } + else { DebugPort.println("*** Rebooting into web server ***"); + content[1] = "Web -> Heater control"; + } - delay(1000); - ESP.restart(); + restartServer = (millis() + rebootDelay) | 1; // prepare to reboot in the future - ensure non zero! + + ScreenManager.showRebootMsg(content, rebootDelay); } // callback is invoked by WiFiManager after new credentials are saved and verified void saveParamsCallback() { - restartServer = millis() | 1; // prepare to reboot in the near future - ensure non zero! - prepBootIntoConfigPortal(false); // ensure we present our web page after reboot - isPortalAP = false; // clear CFG adornment from OLED WiFi icon + wifiEnterConfigPortal(false); // stop config portal, reboot } // callback called if the WiFiManager started the config portal diff --git a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h index 7bc0697..ce06df5 100644 --- a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h +++ b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h @@ -37,6 +37,6 @@ bool isWebClientConnected(); bool hasWebClientSpoken(bool reset = false); bool hasWebServerSpoken(bool reset = false); - void wifiEnterConfigPortal(bool state, bool erase = false); + void wifiEnterConfigPortal(bool state, bool erase = false, long timeout = 7000); #endif __BTCWIFI_H__