Merge branch 'WifiOLED'

This commit is contained in:
rljonesau 2019-01-16 20:24:11 +11:00
commit 26d001657c
9 changed files with 156 additions and 66 deletions

View file

@ -37,9 +37,11 @@
// //
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#define STA_HOLD_TIME 10
CScreen4::CScreen4(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr) CScreen4::CScreen4(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr)
{ {
_rowSel = 0;
} }
@ -50,31 +52,39 @@ CScreen4::show()
int yPos = 16; int yPos = 16;
if(isWifiConnected() || isWifiAP()) { if(isWifiConnected() || isWifiAP()) {
if(isWifiAP()) {
_printInverted(0, yPos, " WiFi: AP only ", true); const char* pTitle = NULL;
} if(isWifiAP())
else { pTitle = isWifiConfigPortal() ? " WiFi: CFG AP only " : " WiFi: AP only ";
_printInverted(0, yPos, " WiFi: STA+AP ", true); else
} pTitle = isWifiConfigPortal() ? " WiFi: CFG STA+AP " : " WiFi: STA+AP ";
// only show STA IP address if available!
if(isWifiSTA()) { if(_rowSel == 1)
yPos += _display.textHeight() + 2; _printMenuText(3, yPos, pTitle, true); // selection box
_printMenuText(0, yPos, "STA:"); else
_printMenuText(25, yPos, getWifiSTAAddrStr()); _printInverted(3, yPos, pTitle, true); // inverted title bar
} yPos += 3;
// show AP IP address // show AP IP address
yPos += _display.textHeight() + 2; yPos += _display.textHeight() + 2;
_printMenuText(0, yPos, " AP:"); _printMenuText(0, yPos, " AP:");
_printMenuText(25, yPos, getWifiAPAddrStr()); _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 { else {
_printInverted(0, yPos, " WiFi Inactive ", true); _printInverted(0, yPos, " WiFi Inactive ", true);
} }
yPos += _display.textHeight() + 2;
/* yPos += _display.textHeight() + 2;
char msg[32]; char msg[32];
int mins = NVstore.getDimTime() / 60000; int mins = NVstore.getDimTime() / 60000;
sprintf(msg, "Display Dim: %d min%c", mins, (mins > 1) ? 's' : ' '); sprintf(msg, "Display Dim: %d min%c", mins, (mins > 1) ? 's' : ' ');
_printMenuText(0, yPos, msg); _printMenuText(0, yPos, msg);*/
} }
@ -82,18 +92,57 @@ void
CScreen4::keyHandler(uint8_t event) CScreen4::keyHandler(uint8_t event)
{ {
if(event & keyPressed) { if(event & keyPressed) {
_repeatCount = 0;
// press CENTRE // press CENTRE
if(event & key_Centre) { if(event & key_Centre) {
return;
} }
// press LEFT // press LEFT
if(event & key_Left) { if(event & key_Left) {
_ScreenManager.prevScreen(); _ScreenManager.prevScreen();
_rowSel = 0;
} }
// press RIGHT // press RIGHT
if(event & key_Right) { if(event & key_Right) {
_ScreenManager.nextScreen(); _ScreenManager.nextScreen();
_rowSel = 0;
} }
// 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);
}
_ScreenManager.reqUpdate();
}
if(event & keyRepeat) { // track key hold time
_repeatCount++;
}
if(event & keyReleased) {
if(event & key_Centre) {
if(_rowSel) {
if(_repeatCount > STA_HOLD_TIME) {
wifiEnterConfigPortal(true, _repeatCount > STA_HOLD_TIME, 5000); // press - reboot into portal, long press - erase credentials
}
else {
if(isWifiConfigPortal()) {
wifiEnterConfigPortal(false, false, 5000); // stop config portal, reboot
}
else {
wifiEnterConfigPortal(true, false, 5000); // stop config portal, reboot
}
}
}
}
_repeatCount = 0;
} }
} }

View file

@ -30,4 +30,7 @@ public:
CScreen4(C128x64_OLED& display, CScreenManager& mgr); CScreen4(C128x64_OLED& display, CScreenManager& mgr);
void show(); void show();
void keyHandler(uint8_t event); void keyHandler(uint8_t event);
private:
int _rowSel;
int _repeatCount;
}; };

View file

@ -128,7 +128,7 @@ CScreenHeader::showWifiIcon()
{ {
if(isWifiConnected() || isWifiAP()) { if(isWifiConnected() || isWifiAP()) {
_display.drawBitmap(X_WIFI_ICON, Y_WIFI_ICON, wifiIcon, W_WIFI_ICON, H_WIFI_ICON, WHITE); _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); _display.fillRect(X_WIFI_ICON + 8, Y_WIFI_ICON + 5, 15, 7, BLACK);
CTransientFont AF(_display, &MINIFONT); // temporarily use a mini font CTransientFont AF(_display, &MINIFONT); // temporarily use a mini font
_display.setCursor(X_WIFI_ICON+9, Y_WIFI_ICON+6); _display.setCursor(X_WIFI_ICON+9, Y_WIFI_ICON+6);

View file

@ -7,6 +7,7 @@
#include "Screen6.h" #include "Screen6.h"
#include "Screen7.h" #include "Screen7.h"
#include "Screen8.h" #include "Screen8.h"
#include "RebootScreen.h"
#include <Wire.h> #include <Wire.h>
#include "../cfg/pins.h" #include "../cfg/pins.h"
#include "../cfg/BTCConfig.h" #include "../cfg/BTCConfig.h"
@ -96,6 +97,7 @@ CScreenManager::CScreenManager()
_currentScreen = -1; _currentScreen = -1;
_bReqUpdate = false; _bReqUpdate = false;
_DimTime = millis() + 60000; _DimTime = millis() + 60000;
_pRebootScreen = NULL;
} }
CScreenManager::~CScreenManager() CScreenManager::~CScreenManager()
@ -167,10 +169,17 @@ CScreenManager::checkUpdate()
} }
if(_bReqUpdate) { if(_bReqUpdate) {
if(_currentScreen >= 0) { if(_pRebootScreen) {
_Screens[_currentScreen]->show(); _pRebootScreen->show();
_bReqUpdate = false; _bReqUpdate = false;
return true; return true;
}
else {
if(_currentScreen >= 0) {
_Screens[_currentScreen]->show();
_bReqUpdate = false;
return true;
}
} }
} }
return false; return false;
@ -235,11 +244,18 @@ CScreenManager::keyHandler(uint8_t event)
if(_DimTime == 0) if(_DimTime == 0)
_pDisplay->dim(false); _pDisplay->dim(false);
// _DimTime = millis() + NVstore.getDimTime(); _DimTime = (millis() + NVstore.getDimTime()) | 1;
_DimTime = millis() + 60000; // _DimTime = (millis() + 60000) | 1;
if(_DimTime == 0)
_DimTime = 1;
} }
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);
}

View file

@ -28,6 +28,7 @@
class CProtocol; class CProtocol;
class C128x64_OLED; class C128x64_OLED;
class CScreen; class CScreen;
class CRebootScreen;
class CScreenManager { class CScreenManager {
std::vector<CScreen*> _Screens; std::vector<CScreen*> _Screens;
@ -36,6 +37,7 @@ class CScreenManager {
unsigned long _DimTime; unsigned long _DimTime;
bool _bReqUpdate; bool _bReqUpdate;
void _switchScreen(); void _switchScreen();
CRebootScreen* _pRebootScreen;
public: public:
CScreenManager(); CScreenManager();
~CScreenManager(); ~CScreenManager();
@ -47,6 +49,7 @@ public:
void prevScreen(); void prevScreen();
void keyHandler(uint8_t event); void keyHandler(uint8_t event);
void reqUpdate(); void reqUpdate();
void showRebootMsg(const char* content[2], long delayTime);
}; };
#endif // __SCREEN_MANAGER_H__ #endif // __SCREEN_MANAGER_H__

View file

@ -47,24 +47,22 @@ void handleBTCRoot() {
} }
void handleWMConfig() { void handleWMConfig() {
server.send(200, "text/plain", "Start Config Portal - Retaining credential");
DebugPort.println("Starting web portal for wifi config"); DebugPort.println("Starting web portal for wifi config");
wm.startWebPortal(); delay(500);
// wm.startWebPortal();
wifiEnterConfigPortal(true, false, 3000);
} }
void handleReset() { 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"); DebugPort.println("diconnecting client and wifi, then rebooting");
delay(500);
//client.disconnect(); //client.disconnect();
// wifi_station_disconnect(); // wifi_station_disconnect();
wm.disconnect(); // wm.disconnect();
wm.resetSettings(); // wm.resetSettings();
wifiEnterConfigPortal(true, true, 3000);
delay(1000);
ESP.restart();
} }
void handleBTCNotFound() { void handleBTCNotFound() {

View file

@ -24,6 +24,7 @@
#include "BTCWifi.h" #include "BTCWifi.h"
#include "../Utility/DebugPort.h" #include "../Utility/DebugPort.h"
#include <DNSServer.h> #include <DNSServer.h>
#include "../OLED/ScreenManager.h"
#include "esp_system.h" #include "esp_system.h"
#include <Preferences.h> #include <Preferences.h>
@ -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 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 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) bool initWifi(int initpin,const char *failedssid, const char *failedpassword)
{ {
@ -134,17 +136,6 @@ void doWiFiManager()
{ {
wm.process(); 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 // manage handling of pin to enter WiFManager config portal
// we typically use the BOOT pin for this (pins.h) // we typically use the BOOT pin for this (pins.h)
@ -154,49 +145,78 @@ void doWiFiManager()
// > 5 second press - erase credentials, enable config portal // > 5 second press - erase credentials, enable config portal
static bool pinDown = false; static bool pinDown = false;
static long pinTime = 0; static long pinTime = 0;
unsigned long tDelta;
if(digitalRead(TRIG_PIN) == LOW) { if(digitalRead(TRIG_PIN) == LOW) {
if(!pinDown) if(!pinDown)
pinTime = millis(); pinTime = millis();
pinDown = true; 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 { else {
if(pinDown) { if(pinDown) {
pinDown = false; pinDown = false;
unsigned long tDelta = millis() - pinTime; tDelta = millis() - pinTime;
DebugPort.print("Wifi config button tDelta = "); DebugPort.println(tDelta); DebugPort.print("Wifi config button tDelta = "); DebugPort.println(tDelta);
// > 5 second press? // > 5 second press?
if(tDelta > 5000) { if(tDelta > 5000) {
prepBootIntoConfigPortal(true); // very long press - clear credentials, boot into portal wifiEnterConfigPortal(true, true); // very long press - clear credentials, reboot into portal
wm.resetSettings();
DebugPort.println("*** Clearing credentials and rebooting into portal ***");
delay(1000);
ESP.restart();
} }
// > 1 second press? // > 1 second press?
else if(tDelta > 1000) { else if(tDelta > 1000) {
prepBootIntoConfigPortal(false); // long press - boot into SoftAP wifiEnterConfigPortal(false); // long press - reboot into web server
DebugPort.println("*** Rebooting into web server ***");
delay(1000);
ESP.restart();
} }
// > 50ms press? // > 50ms press?
else if(tDelta > 50) { else if(tDelta > 50) {
prepBootIntoConfigPortal(true); // short press - boot into Portal wifiEnterConfigPortal(true); // quick press - reboot into portal
DebugPort.println("*** Rebooting into config portal ***");
delay(1000);
ESP.restart();
} }
// consider as contact bounce if < 50ms! // consider as contact bounce if < 50ms!
} }
} }
} }
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) {
DebugPort.println("*** Rebooting into config portal ***");
content[1] = "Web -> Config Portal";
}
else {
DebugPort.println("*** Rebooting into web server ***");
content[1] = "Web -> Heater control";
}
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 // callback is invoked by WiFiManager after new credentials are saved and verified
void saveParamsCallback() void saveParamsCallback()
{ {
restartServer = millis() | 1; // prepare to reboot in the near future - ensure non zero! wifiEnterConfigPortal(false); // stop config portal, reboot
prepBootIntoConfigPortal(false); // ensure we present our web page after reboot
isPortalAP = false; // clear CFG adornment from OLED WiFi icon
} }
// callback called if the WiFiManager started the config portal // callback called if the WiFiManager started the config portal
@ -238,7 +258,7 @@ bool isWifiSTA()
return isSTA; // true: STAtion mode link is active return isSTA; // true: STAtion mode link is active
} }
bool isConfigPortal() bool isWifiConfigPortal()
{ {
return isPortalAP; // true: config portal is running return isPortalAP; // true: config portal is running
} }

View file

@ -33,9 +33,10 @@
bool isWifiConnected(); bool isWifiConnected();
bool isWifiAP(); bool isWifiAP();
bool isWifiSTA(); bool isWifiSTA();
bool isConfigPortal(); bool isWifiConfigPortal();
bool isWebClientConnected(); bool isWebClientConnected();
bool hasWebClientSpoken(bool reset = false); bool hasWebClientSpoken(bool reset = false);
bool hasWebServerSpoken(bool reset = false); bool hasWebServerSpoken(bool reset = false);
void wifiEnterConfigPortal(bool state, bool erase = false, long timeout = 7000);
#endif __BTCWIFI_H__ #endif __BTCWIFI_H__

View file

@ -46,5 +46,5 @@ const uint8_t keyLeft_pin = 39; // input only, no chip pullup
const uint8_t ListenOnlyPin = 33; const uint8_t ListenOnlyPin = 33;
//const uint8_t WiFi_TriggerPin = 25; //const uint8_t WiFi_TriggerPin = 25;
const uint8_t WiFi_TriggerPin = 0; const uint8_t WiFi_TriggerPin = 0; // BOOT switch!