Suite of minor bug fixes and annoyances - now Afterburner for AP and BT server names :-)

OTA was not rebooting after AP only update
This commit is contained in:
Ray Jones 2019-05-11 12:18:06 +10:00
parent b47a4606dd
commit 9861297744
10 changed files with 93 additions and 22 deletions

View file

@ -116,8 +116,8 @@
#define RX_DATA_TIMOUT 50 #define RX_DATA_TIMOUT 50
const int FirmwareRevision = 22; const int FirmwareRevision = 22;
const int FirmwareSubRevision = 2; const int FirmwareSubRevision = 3;
const char* FirmwareDate = "9 May 2019"; const char* FirmwareDate = "11 May 2019";
#ifdef ESP32 #ifdef ESP32
@ -560,8 +560,8 @@ void loop()
// Detect the possible start of a new frame sequence from an OEM controller // Detect the possible start of a new frame sequence from an OEM controller
// This will be the first activity for considerable period on the blue wire // This will be the first activity for considerable period on the blue wire
// The heater always responds to a controller frame, but otherwise never by itself // The heater always responds to a controller frame, but otherwise never by itself
// if(RxTimeElapsed >= 970) {
if(RxTimeElapsed >= NVstore.getFrameRate()) { if(RxTimeElapsed >= (NVstore.getFrameRate() - 60)) { // compensate for the time spent just doing things in this state machine
// have not seen any receive data for a second. // have not seen any receive data for a second.
// OEM controller is probably not connected. // OEM controller is probably not connected.
// Skip state machine immediately to BTC_Tx, sending our own settings. // Skip state machine immediately to BTC_Tx, sending our own settings.
@ -1325,3 +1325,7 @@ int getBoardRevision()
return BoardRevision; return BoardRevision;
} }
void ShowOTAScreen(int percent)
{
ScreenManager.showOTAMessage(percent);
}

View file

@ -107,8 +107,8 @@ CBluetoothHC05::begin()
DebugPort.println("HC-05 found"); DebugPort.println("HC-05 found");
DebugPort.print(" Setting Name to \"Diesel Heater\"... "); DebugPort.print(" Setting Name to \"Afterburner\"... ");
if(!ATCommand("AT+NAME=\"Diesel Heater\"\r\n")) { if(!ATCommand("AT+NAME=\"Afterburner\"\r\n")) {
DebugPort.println("FAILED"); DebugPort.println("FAILED");
} }
else { else {
@ -145,6 +145,8 @@ CBluetoothHC05::begin()
else { else {
DebugPort.println("OK"); DebugPort.println("OK");
}*/ }*/
flush();
delay(100);
openSerial(9600); openSerial(9600);
// leave HC-05 command mode, return to data mode // leave HC-05 command mode, return to data mode
@ -231,6 +233,7 @@ CBluetoothHC05::openSerial(int baudrate)
bool bool
CBluetoothHC05::ATCommand(const char* cmd) CBluetoothHC05::ATCommand(const char* cmd)
{ {
flush(); // ensure response is for *this* command!
HC05_SerialPort.print(cmd); HC05_SerialPort.print(cmd);
char RxBuffer[16]; char RxBuffer[16];
memset(RxBuffer, 0, 16); memset(RxBuffer, 0, 16);

View file

@ -490,6 +490,25 @@ CScreenManager::showRebootMsg(const char* content[2], long delayTime)
_dim(false); _dim(false);
} }
void
CScreenManager::showOTAMessage(int percent)
{
static int prevPercent = -1;
if(percent != prevPercent) {
_pDisplay->clearDisplay();
_pDisplay->setCursor(64,22);
_pDisplay->printCentreJustified("OTA update active");
if(percent) {
char msg[16];
sprintf(msg, "%d%%", percent);
_pDisplay->setCursor(64,32);
_pDisplay->printCentreJustified(msg);
}
prevPercent = percent;
_pDisplay->display();
}
}
void void
CScreenManager::_dim(bool state) CScreenManager::_dim(bool state)
{ {

View file

@ -66,6 +66,7 @@ public:
void reqUpdate(); void reqUpdate();
void selectMenu(eUIMenuSets menuset, int specific = -1); // use to select loop menus, including the root or branches void selectMenu(eUIMenuSets menuset, int specific = -1); // use to select loop menus, including the root or branches
void showRebootMsg(const char* content[2], long delayTime); void showRebootMsg(const char* content[2], long delayTime);
void showOTAMessage(int percent);
}; };
#endif // __SCREEN_MANAGER_H__ #endif // __SCREEN_MANAGER_H__

View file

@ -25,6 +25,7 @@
#include "../Protocol/helpers.h" #include "../Protocol/helpers.h"
#include "../Utility/UtilClasses.h" #include "../Utility/UtilClasses.h"
#include "fonts/Icons.h" #include "fonts/Icons.h"
#include "../Utility/NVStorage.h"
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
@ -38,7 +39,7 @@
static const int Line3 = 14; static const int Line3 = 14;
static const int Line2 = 27; static const int Line2 = 27;
static const int Line1 = 40; static const int Line1 = 40;
static const int Column = 50; static const int Column = 40;
CThermostatModeScreen::CThermostatModeScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr) CThermostatModeScreen::CThermostatModeScreen(C128x64_OLED& display, CScreenManager& mgr) : CPasswordScreen(display, mgr)
{ {
@ -81,8 +82,15 @@ CThermostatModeScreen::show()
} }
else { else {
_printInverted(_display.xCentre(), 0, " Thermostat Mode ", true, eCentreJustify); _printInverted(_display.xCentre(), 0, " Thermostat Mode ", true, eCentreJustify);
_display.drawBitmap(10, 14, thermostatIcon, thermostatWidth, thermostatHeight, WHITE); _display.drawBitmap(3, 14, thermostatIcon, thermostatWidth, thermostatHeight, WHITE);
sprintf(msg, "%.1f\367C", _window); // \367 is octal for Adafruit degree symbol float fTemp = _window;
if(NVstore.getDegFMode()) {
fTemp = fTemp * 9 / 5;
sprintf(msg, "%.1f\367F", fTemp);
}
else {
sprintf(msg, "%.1f\367C", fTemp);
}
_printMenuText(Column, Line2, msg, _rowSel == 3); _printMenuText(Column, Line2, msg, _rowSel == 3);
switch(_thermoMode) { switch(_thermoMode) {
case 1: case 1:
@ -96,19 +104,33 @@ CThermostatModeScreen::show()
break; break;
} }
if(_cyclicMode.isEnabled()) { if(_cyclicMode.isEnabled()) {
sprintf(msg, "> %d\367C", _cyclicMode.Stop+1); // \367 is octal for Adafruit degree symbol float fTemp = _cyclicMode.Stop+1;
if(NVstore.getDegFMode()) {
fTemp = fTemp * 9 / 5;
sprintf(msg, "\352>%.0f\367F", fTemp);
}
else {
sprintf(msg, "\352>%.0f\367C", fTemp);
}
} }
else { else {
strcpy(msg, "OFF"); strcpy(msg, "OFF");
} }
_printMenuText(Column, Line1, msg, _rowSel == 1); _printMenuText(Column, Line1, msg, _rowSel == 1);
if(_cyclicMode.isEnabled()) { if(_cyclicMode.isEnabled()) {
sprintf(msg, "< %d\367C", _cyclicMode.Start); // \367 is octal for Adafruit degree symbol float fTemp = _cyclicMode.Start;
if(NVstore.getDegFMode()) {
fTemp = fTemp * 9 / 5;
sprintf(msg, "\352<%.0f\367F", fTemp);
}
else {
sprintf(msg, "\352<%.0f\367C", fTemp);
}
} }
else { else {
strcpy(msg, ""); strcpy(msg, "");
} }
_printMenuText(Column + 37, Line1, msg, _rowSel == 2); _printMenuText(Column + 42, Line1, msg, _rowSel == 2);
} }
} }

View file

@ -55,8 +55,7 @@ CVersionInfoScreen::show()
_printInverted(_display.xCentre(), 0, " Version Information ", true, eCentreJustify); _printInverted(_display.xCentre(), 0, " Version Information ", true, eCentreJustify);
_display.drawBitmap(10, 11, firmwareIcon, firmwareWidth, firmwareHeight, WHITE); _display.drawBitmap(10, 11, firmwareIcon, firmwareWidth, firmwareHeight, WHITE);
sprintf(msg, "V%.3f", getVersion()); _printMenuText(43, 14, getVersionStr());
_printMenuText(43, 14, msg);
_printMenuText(43, 25, getVersionDate()); _printMenuText(43, 25, getVersionDate());
_display.drawBitmap(20, 34, hardwareIcon, hardwareWidth, hardwareHeight, WHITE); _display.drawBitmap(20, 34, hardwareIcon, hardwareWidth, hardwareHeight, WHITE);

View file

@ -378,7 +378,7 @@ CHeaterStorage::setHomeMenu(sHomeMenuActions val)
/////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
// ESP32 // ESP32
// //
#ifdef ESP32 //#ifdef ESP32
CESP32HeaterStorage::CESP32HeaterStorage() CESP32HeaterStorage::CESP32HeaterStorage()
{ {
@ -521,8 +521,8 @@ CESP32HeaterStorage::saveUI()
preferences.putUChar("thermoMethod", _calValues.Options.ThermostatMethod); preferences.putUChar("thermoMethod", _calValues.Options.ThermostatMethod);
preferences.putUChar("enableWifi", _calValues.Options.enableWifi); preferences.putUChar("enableWifi", _calValues.Options.enableWifi);
preferences.putUChar("enableOTA", _calValues.Options.enableOTA); preferences.putUChar("enableOTA", _calValues.Options.enableOTA);
preferences.putUChar("cyclicStop", _calValues.Options.cyclic.Stop); preferences.putChar("cyclicStop", _calValues.Options.cyclic.Stop);
preferences.putUChar("cyclicStart", _calValues.Options.cyclic.Start); preferences.putChar("cyclicStart", _calValues.Options.cyclic.Start);
preferences.putUChar("GPIOinMode", _calValues.Options.GPIOinMode); preferences.putUChar("GPIOinMode", _calValues.Options.GPIOinMode);
preferences.putUChar("GPIOoutMode", _calValues.Options.GPIOoutMode); preferences.putUChar("GPIOoutMode", _calValues.Options.GPIOoutMode);
preferences.putUChar("GPIOalgMode", _calValues.Options.GPIOalgMode); preferences.putUChar("GPIOalgMode", _calValues.Options.GPIOalgMode);
@ -631,4 +631,4 @@ bool s32inBounds(long test, long minLim, long maxLim)
} }
#endif // ESP32 //#endif // ESP32

View file

@ -96,6 +96,11 @@ struct sCyclicThermostat {
bool isEnabled() const { bool isEnabled() const {
return Stop != 0; return Stop != 0;
} }
sCyclicThermostat& operator=(const sCyclicThermostat& rhs) {
Stop = rhs.Stop;
Start = rhs.Start;
return *this;
}
}; };
struct sBTCoptions { struct sBTCoptions {

View file

@ -65,7 +65,7 @@ bool initWifi(int initpin,const char *failedssid, const char *failedpassword)
DebugPort.print(" AP MAC address: "); DebugPort.println(MACstr[1]); DebugPort.print(" AP MAC address: "); DebugPort.println(MACstr[1]);
char APname[32]; char APname[32];
sprintf(APname, "%s-%02X%02X", failedssid, MAC[4], MAC[5]); sprintf(APname, "%s", failedssid);
//reset settings - wipe credentials for testing //reset settings - wipe credentials for testing
// wm.resetSettings(); // wm.resetSettings();
@ -106,6 +106,7 @@ bool initWifi(int initpin,const char *failedssid, const char *failedpassword)
if(!res) { if(!res) {
// failed STA mode // failed STA mode
DebugPort.println("WiFimanager failed STA connection. Setting up AP..."); DebugPort.println("WiFimanager failed STA connection. Setting up AP...");
WiFi.disconnect(); // apparently needed for AP only OTA to reboot properly!!!
} }
else { else {
// runs through here if STA connected OK // runs through here if STA connected OK

View file

@ -24,6 +24,17 @@
#if USE_SPIFFS == 1 #if USE_SPIFFS == 1
#include <SPIFFS.h> #include <SPIFFS.h>
#endif #endif
extern void ShowOTAScreen(int percent=0);
#include <esp_int_wdt.h>
#include <esp_task_wdt.h>
void hard_restart() {
esp_task_wdt_init(1,true);
esp_task_wdt_add(NULL);
while(true);
}
void initOTA(){ void initOTA(){
// ArduinoOTA.setHostname("myesp32"); // ArduinoOTA.setHostname("myesp32");
@ -41,16 +52,21 @@ void initOTA(){
SPIFFS.end(); SPIFFS.end();
DebugPort.println("Start updating " + type); DebugPort.println("Start updating " + type);
DebugPort.handle(); // keep telnet spy alive DebugPort.handle(); // keep telnet spy alive
ShowOTAScreen();
}) })
.onEnd([]() { .onEnd([]() {
DebugPort.println("\nEnd"); DebugPort.println("\nEnd");
DebugPort.handle(); // keep telnet spy alive DebugPort.handle(); // keep telnet spy alive
DebugPort.end(); // force graceful close of telnetspy - ensures a client will reconnect cleanly delay(100);
ESP.restart(); // DebugPort.end(); // force graceful close of telnetspy - ensures a client will reconnect cleanly
}) })
.onProgress([](unsigned int progress, unsigned int total) { .onProgress([](unsigned int progress, unsigned int total) {
DebugPort.printf("Progress: %u%%\r", (progress / (total / 100))); int percent = (progress / (total / 100));
DebugPort.printf("Progress: %u%%\r", percent);
DebugPort.handle(); // keep telnet spy alive DebugPort.handle(); // keep telnet spy alive
ShowOTAScreen(percent);
}) })
.onError([](ota_error_t error) { .onError([](ota_error_t error) {
DebugPort.printf("Error[%u]: ", error); DebugPort.printf("Error[%u]: ", error);
@ -59,6 +75,7 @@ void initOTA(){
else if (error == OTA_CONNECT_ERROR) DebugPort.println("Connect Failed"); else if (error == OTA_CONNECT_ERROR) DebugPort.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) DebugPort.println("Receive Failed"); else if (error == OTA_RECEIVE_ERROR) DebugPort.println("Receive Failed");
else if (error == OTA_END_ERROR) DebugPort.println("End Failed"); else if (error == OTA_END_ERROR) DebugPort.println("End Failed");
DebugPort.handle(); // keep telnet spy alive
}); });
ArduinoOTA.begin(); ArduinoOTA.begin();