From af0980a72b0c376fc84c1af4a4ad06a93ae6d035 Mon Sep 17 00:00:00 2001 From: rljonesau Date: Tue, 15 Jan 2019 08:41:54 +1100 Subject: [PATCH] Can now set/clear CFG mode with OLED. Can also clear credentials. --- Arduino/BTCDieselHeater/src/OLED/Screen4.cpp | 66 +++++++++++++++---- Arduino/BTCDieselHeater/src/OLED/Screen4.h | 3 + .../BTCDieselHeater/src/OLED/ScreenHeader.cpp | 2 +- Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp | 36 ++++++---- Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h | 3 +- Arduino/BTCDieselHeater/src/cfg/pins.h | 2 +- 6 files changed, 83 insertions(+), 29 deletions(-) diff --git a/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp b/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp index 57163b3..2b61943 100644 --- a/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/Screen4.cpp @@ -37,9 +37,11 @@ // /////////////////////////////////////////////////////////////////////////// +#define STA_HOLD_TIME 10 CScreen4::CScreen4(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) { + _rowSel = 0; } @@ -50,22 +52,29 @@ CScreen4::show() int yPos = 16; if(isWifiConnected() || isWifiAP()) { - if(isWifiAP()) { - _printInverted(0, yPos, " WiFi: AP only ", true); - } - else { - _printInverted(0, yPos, " WiFi: STA+AP ", true); - } - // only show STA IP address if available! - if(isWifiSTA()) { - yPos += _display.textHeight() + 2; - _printMenuText(0, yPos, "STA:"); - _printMenuText(25, yPos, getWifiSTAAddrStr()); - } + + const char* pTitle = NULL; + if(isWifiAP()) + pTitle = isWifiConfigPortal() ? " WiFi: CFG AP only " : " WiFi: AP only "; + else + pTitle = isWifiConfigPortal() ? " WiFi: CFG STA+AP " : " WiFi: STA+AP "; + + if(_rowSel == 1) + _printMenuText(3, yPos, pTitle, true); // selection box + else + _printInverted(3, yPos, pTitle, true); // inverted title bar + yPos += 3; + // show AP IP address yPos += _display.textHeight() + 2; _printMenuText(0, yPos, " AP:"); _printMenuText(25, yPos, getWifiAPAddrStr()); + // only show STA IP address if available! + if(isWifiSTA() && _repeatCount <= STA_HOLD_TIME) { + yPos += _display.textHeight() + 2; + _printMenuText(0, yPos, "STA:"); + _printMenuText(25, yPos, getWifiSTAAddrStr()); + } } else { _printInverted(0, yPos, " WiFi Inactive ", true); @@ -82,6 +91,7 @@ void CScreen4::keyHandler(uint8_t event) { if(event & keyPressed) { + _repeatCount = 0; // press CENTRE if(event & key_Centre) { return; @@ -94,6 +104,38 @@ CScreen4::keyHandler(uint8_t event) if(event & key_Right) { _ScreenManager.nextScreen(); } + // press UP + if(event & key_Up) { + _rowSel = 1; + // _rowSel++; + // UPPERLIMIT(_rowSel, (isWifiConfigPortal() ? 2 : 1)); + } + // press DOWN + if(event & key_Down) { + _rowSel = 0; + // _rowSel--; + // UPPERLIMIT(_rowSel, 0); + } + } + + if(event & keyRepeat) { // track key hold time + _repeatCount++; + } + + if(event & keyReleased) { + if(event & key_Centre) { + if(_rowSel) { + if(isWifiConfigPortal()) + wifiEnterConfigPortal(false); // stop config portal, reboot + 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 + } + } + } + _repeatCount = 0; } } diff --git a/Arduino/BTCDieselHeater/src/OLED/Screen4.h b/Arduino/BTCDieselHeater/src/OLED/Screen4.h index 8577bd7..5380356 100644 --- a/Arduino/BTCDieselHeater/src/OLED/Screen4.h +++ b/Arduino/BTCDieselHeater/src/OLED/Screen4.h @@ -30,4 +30,7 @@ public: CScreen4(C128x64_OLED& display, CScreenManager& mgr); void show(); void keyHandler(uint8_t event); +private: + int _rowSel; + int _repeatCount; }; diff --git a/Arduino/BTCDieselHeater/src/OLED/ScreenHeader.cpp b/Arduino/BTCDieselHeater/src/OLED/ScreenHeader.cpp index 44673e2..e600851 100644 --- a/Arduino/BTCDieselHeater/src/OLED/ScreenHeader.cpp +++ b/Arduino/BTCDieselHeater/src/OLED/ScreenHeader.cpp @@ -128,7 +128,7 @@ CScreenHeader::showWifiIcon() { if(isWifiConnected() || isWifiAP()) { _display.drawBitmap(X_WIFI_ICON, Y_WIFI_ICON, wifiIcon, W_WIFI_ICON, H_WIFI_ICON, WHITE); - if(isConfigPortal()) { + if(isWifiConfigPortal()) { _display.fillRect(X_WIFI_ICON + 8, Y_WIFI_ICON + 5, 15, 7, BLACK); CTransientFont AF(_display, &MINIFONT); // temporarily use a mini font _display.setCursor(X_WIFI_ICON+9, Y_WIFI_ICON+6); diff --git a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp index 3c58027..406b340 100644 --- a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp +++ b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.cpp @@ -166,31 +166,39 @@ void doWiFiManager() DebugPort.print("Wifi config button tDelta = "); DebugPort.println(tDelta); // > 5 second press? if(tDelta > 5000) { - prepBootIntoConfigPortal(true); // very long press - clear credentials, boot into portal - wm.resetSettings(); - DebugPort.println("*** Clearing credentials and rebooting into portal ***"); - delay(1000); - ESP.restart(); + wifiEnterConfigPortal(true, true); // very long press - clear credentials, reboot into portal } // > 1 second press? else if(tDelta > 1000) { - prepBootIntoConfigPortal(false); // long press - boot into SoftAP - DebugPort.println("*** Rebooting into web server ***"); - delay(1000); - ESP.restart(); + wifiEnterConfigPortal(false); // long press - reboot into web server } // > 50ms press? else if(tDelta > 50) { - prepBootIntoConfigPortal(true); // short press - boot into Portal - DebugPort.println("*** Rebooting into config portal ***"); - delay(1000); - ESP.restart(); + wifiEnterConfigPortal(true); // quick press - reboot into portal } // consider as contact bounce if < 50ms! } } } +void wifiEnterConfigPortal(bool state, bool erase) +{ + prepBootIntoConfigPortal(state); + + if(erase) { + wm.resetSettings(); + DebugPort.println("*** Erased wifi credentials ***"); + } + + if(state) + DebugPort.println("*** Rebooting into config portal ***"); + else + DebugPort.println("*** Rebooting into web server ***"); + + delay(1000); + ESP.restart(); +} + // callback is invoked by WiFiManager after new credentials are saved and verified void saveParamsCallback() { @@ -238,7 +246,7 @@ bool isWifiSTA() return isSTA; // true: STAtion mode link is active } -bool isConfigPortal() +bool isWifiConfigPortal() { return isPortalAP; // true: config portal is running } diff --git a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h index 2014ff2..7bc0697 100644 --- a/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h +++ b/Arduino/BTCDieselHeater/src/WiFi/BTCWifi.h @@ -33,9 +33,10 @@ bool isWifiConnected(); bool isWifiAP(); bool isWifiSTA(); - bool isConfigPortal(); + bool isWifiConfigPortal(); bool isWebClientConnected(); bool hasWebClientSpoken(bool reset = false); bool hasWebServerSpoken(bool reset = false); + void wifiEnterConfigPortal(bool state, bool erase = false); #endif __BTCWIFI_H__ diff --git a/Arduino/BTCDieselHeater/src/cfg/pins.h b/Arduino/BTCDieselHeater/src/cfg/pins.h index 1b9e249..49a3baa 100644 --- a/Arduino/BTCDieselHeater/src/cfg/pins.h +++ b/Arduino/BTCDieselHeater/src/cfg/pins.h @@ -46,5 +46,5 @@ const uint8_t keyLeft_pin = 39; // input only, no chip pullup const uint8_t ListenOnlyPin = 33; //const uint8_t WiFi_TriggerPin = 25; -const uint8_t WiFi_TriggerPin = 0; +const uint8_t WiFi_TriggerPin = 0; // BOOT switch!