Added some FreeRTOS tasks to avoid blocking issues - still very unreliable

This commit is contained in:
Ray Jones 2020-04-22 16:21:24 +10:00
parent b58ed90432
commit baf8678e99
19 changed files with 943 additions and 167 deletions

View File

@ -381,6 +381,10 @@ void setup() {
DebugPort.setBufferSize(8192);
DebugPort.begin(115200);
DebugPort.println("_______________________________________________________________");
DebugPort.printf("Arduino task priority was %d\r\n", uxTaskPriorityGet(NULL));
vTaskPrioritySet(NULL, TASKPRIORITY_ARDUINO);
DebugPort.printf("Arduino task priority now %d\r\n", uxTaskPriorityGet(NULL));
DebugPort.printf("Getting NVS stats\r\n");
@ -554,6 +558,8 @@ void setup() {
TempSensor.getDS18B20().mapSensor(2, NVstore.getHeaterTuning().DS18B20probe[2].romCode);
delay(1000); // just to hold the splash screeen for while
ScreenManager.clearDisplay();
}
@ -628,7 +634,7 @@ void loop()
if(bReportRecyleEvents)
DebugPort.println("Recycling blue wire serial interface");
initBlueWireSerial();
// initBlueWireSerial();
CommState.set(CommStates::TemperatureRead); // revert to idle mode, after passing thru temperature mode
}
}
@ -1051,7 +1057,7 @@ bool validateFrame(const CProtocol& frame, const char* name)
// Bad CRC - restart blue wire Serial port
DebugPort.printf("\007Bad CRC detected for %s frame - restarting blue wire's serial port\r\n", name);
DebugReportFrame("BAD CRC:", frame, "\r\n");
initBlueWireSerial();
// initBlueWireSerial();
CommState.set(CommStates::TemperatureRead);
return false;
}
@ -1623,7 +1629,7 @@ void feedWatchdog()
#if USE_SW_WATCHDOG == 1 && USE_JTAG == 0
// BEST NOT USE WATCHDOG WITH JTAG DEBUG :-)
// DebugPort.printf("\r %ld Watchdog fed", millis());
DebugPort.print("~");
// DebugPort.print("~");
WatchdogTick = 1500;
#else
WatchdogTick = -1;
@ -1648,7 +1654,7 @@ void doStreaming()
if(NVstore.getUserSettings().wifiMode) {
doWiFiManager();
#if USE_OTA == 1
doOTA();
// doOTA();
#endif // USE_OTA
#if USE_WEBSERVER == 1
bHaveWebClient = doWebServer();

View File

@ -33,7 +33,7 @@ protected:
virtual void foldbackDesiredTemp() {};
public:
virtual void begin() {};
virtual void send(const char* Str) {};
virtual bool send(const char* Str) { return false; };
virtual void check() {};
virtual void collectRxData(char rxVal) {
// provide common behviour for bytes received from a bluetooth client

View File

@ -85,7 +85,7 @@ CBluetoothESP32Classic::check()
}
}
void
bool
CBluetoothESP32Classic::send(const char* Str)
{
if(isConnected()) {
@ -95,12 +95,14 @@ CBluetoothESP32Classic::send(const char* Str)
#endif
SerialBT.write((uint8_t*)Str, strlen(Str));
delay(10);
return true;
}
else {
DebugPort.println("No Bluetooth client");
#if BT_LED == 1
digitalWrite(LED_Pin, 0);
#endif
return false;
}
}
@ -261,7 +263,7 @@ CBluetoothESP32BLE::sendFrame(const char* pHdr, const CProtocol& Frame, bool lin
}
}
*/
void
bool
CBluetoothESP32BLE::send(const char* Str)
{
char fullMsg[32];
@ -275,12 +277,14 @@ CBluetoothESP32BLE::send(const char* Str)
BLE_Send(txData);
delay(10);
return true;
}
else {
DebugPort.println("No Bluetooth client");
#if BT_LED == 1
digitalWrite(LED_Pin, 0);
#endif
return false;
}
}

View File

@ -37,7 +37,7 @@ class CBluetoothESP32Classic : public CBluetoothAbstract {
BluetoothSerial SerialBT;
public:
virtual void begin();
virtual void send(const char* Str);
virtual bool send(const char* Str);
virtual void check();
virtual bool isConnected();
};
@ -64,7 +64,7 @@ public:
CBluetoothESP32BLE();
virtual ~CBluetoothESP32BLE();
virtual void begin();
virtual void send(const char* Str);
virtual bool send(const char* Str);
virtual void check();
virtual bool isConnected();

View File

@ -199,14 +199,16 @@ CBluetoothHC05::isConnected()
return digitalRead(_sensePin);
}
void
bool
CBluetoothHC05::send(const char* Str)
{
if(isConnected() && !_bTest) {
HC05_SerialPort.print(Str);
return true;
}
else {
// DebugPort.print("No Bluetooth client");
return false;
}
}

View File

@ -48,7 +48,7 @@ class CBluetoothHC05 : public CBluetoothAbstract {
public:
CBluetoothHC05(int keyPin, int sensePin);
void begin();
void send(const char* Str);
bool send(const char* Str);
void check();
virtual bool isConnected();
const char* getMAC();

View File

@ -468,6 +468,7 @@ CScreenManager::_loadScreens()
_bReload = false;
reqUpdate();
_enterScreen();
showSplash();
}
bool
@ -790,6 +791,34 @@ CScreenManager::showSplash()
_pDisplay->display();
}
void
CScreenManager::showBootMsg(const char* msg)
{
CTransientFont AF(*_pDisplay, &arialItalic_7ptFontInfo);
_pDisplay->fillRect(0, 50, 128, 14, BLACK);
_pDisplay->setCursor(0, 50);
_pDisplay->print(msg);
_pDisplay->display();
}
void
CScreenManager::showBootWait(int show)
{
static int idx = 0;
// idx++;
BITMAP_INFO bitmap = hourGlassIcon0Info;
switch(idx++ & 0x03) {
case 0: bitmap = hourGlassIcon0Info; break;
case 1: bitmap = hourGlassIcon1Info; break;
case 2: bitmap = hourGlassIcon2Info; break;
case 3: bitmap = hourGlassIcon3Info; break;
}
_pDisplay->fillRect(80, 50, bitmap.width, bitmap.height, BLACK);
if(show)
_pDisplay->drawBitmap(80, 50, bitmap.pBitmap, bitmap.width, bitmap.height, WHITE);
_pDisplay->display();
}
void
CScreenManager::selectHomeMenu()
{

View File

@ -73,6 +73,8 @@ public:
void selectMenu(eUIMenuSets menuset, int specific = -1); // use to select loop menus, including the root or branches
void returnMenu(); // use to select loop menus, including the root or branches
void showRebootMsg(const char* content[2], long delayTime);
void showBootMsg(const char* msg);
void showBootWait(int show);
void showOTAMessage(int percent, eOTAmodes updateType);
void clearDisplay();
void bumpTimeout();

View File

@ -2918,11 +2918,11 @@ const uint8_t PROGMEM arialItalic_7ptBitmaps [] =
0x10, 0x00, // #
// @458 'T' (5 pixels wide)
0x40, 0x00, // #
0x47, 0x00, // # ###
0x78, 0x00, // ####
0x40, 0x00, // #
0x40, 0x00, // #
0x20, 0x00, // #
0x23, 0x80, // # ###
0x3c, 0x00, // ####
0x20, 0x00, // #
0x20, 0x00, // #
// @468 'U' (6 pixels wide)
0x07, 0x00, // ###

View File

@ -1360,3 +1360,60 @@ const uint8_t PROGMEM humidityIcon[] =
};
const BITMAP_INFO humidityIconInfo(15, 14, humidityIcon);
const uint8_t PROGMEM HourGlass0_Icon[] =
{
0x01, 0xFF, // #########
0x00, 0xFE, // #######
0x00, 0xFE, // #######
0x00, 0x7C, // #####
0x00, 0x38, // ###
0x00, 0x44, // # #
0x00, 0x82, // # #
0x00, 0x82, // # #
0x00, 0x82, // # #
0x01, 0xFF, // #########
};const uint8_t PROGMEM HourGlass1_Icon[] =
{
0x01, 0xFF, // #########
0x00, 0x82, // # #
0x00, 0xEE, // ### ###
0x00, 0x7C, // #####
0x00, 0x38, // ###
0x00, 0x44, // # #
0x00, 0x82, // # #
0x00, 0x92, // # # #
0x00, 0xBA, // # ### #
0x01, 0xFF, // #########
};const uint8_t PROGMEM HourGlass2_Icon[] =
{
0x01, 0xFF, // #########
0x00, 0x82, // # #
0x00, 0x82, // # #
0x00, 0x7C, // #####
0x00, 0x38, // ###
0x00, 0x44, // # #
0x00, 0x92, // # # #
0x00, 0xBA, // # ### #
0x00, 0xFE, // #######
0x01, 0xFF, // #########
};const uint8_t PROGMEM HourGlass3_Icon[] =
{
0x01, 0xFF, // #########
0x00, 0x82, // # #
0x00, 0x82, // # #
0x00, 0x44, // # #
0x00, 0x28, // # #
0x00, 0x44, // # #
0x00, 0xBA, // # ### #
0x00, 0xFE, // #######
0x00, 0xFE, // #######
0x01, 0xFF, // #########
};
const BITMAP_INFO hourGlassIcon0Info(16, 10, HourGlass0_Icon);
const BITMAP_INFO hourGlassIcon1Info(16, 10, HourGlass1_Icon);
const BITMAP_INFO hourGlassIcon2Info(16, 10, HourGlass2_Icon);
const BITMAP_INFO hourGlassIcon3Info(16, 10, HourGlass3_Icon);

View File

@ -162,3 +162,8 @@ extern const BITMAP_INFO threshIconInfo;
extern const BITMAP_INFO onOffIconInfo;
extern const BITMAP_INFO frostIconInfo;
extern const BITMAP_INFO humidityIconInfo;
extern const BITMAP_INFO hourGlassIcon0Info;
extern const BITMAP_INFO hourGlassIcon1Info;
extern const BITMAP_INFO hourGlassIcon2Info;
extern const BITMAP_INFO hourGlassIcon3Info;

View File

@ -562,14 +562,23 @@ void Expand(std::string& str)
void sendJSONtext(const char* jsonStr)
{
std::string dest;
DebugPort.print("1");
sendWebSocketString( jsonStr );
if(sendWebSocketString( jsonStr ))
dest += "W";
DebugPort.print("2");
mqttPublishJSON(jsonStr);
if(mqttPublishJSON(jsonStr))
dest += "M";
DebugPort.print("3");
std::string expand = jsonStr;
Expand(expand);
getBluetoothClient().send( expand.c_str() );
if(getBluetoothClient().send( expand.c_str() ))
dest += "B";
if(!dest.empty()) {
DebugPort.printf(" to %s", dest.c_str());
}
}
void doJSONreboot(uint16_t PIN)

View File

@ -600,6 +600,8 @@ sCredentials::load()
validatedLoad("APpassword", APpassword, 31, "thereisnospoon");
validatedLoad("webUpdateUser", webUpdateUsername, 31, "Afterburner");
validatedLoad("webUpdatePass", webUpdatePassword, 31, "BurnBabyBurn");
validatedLoad("webUser", webUsername, 31, "Afterburner");
validatedLoad("webPass", webPassword, 31, "WebAccess");
preferences.end();
}
@ -612,6 +614,8 @@ sCredentials::save()
preferences.putString("APpassword", APpassword);
preferences.putString("webUpdateUser", webUpdateUsername);
preferences.putString("webUpdatePass", webUpdatePassword);
preferences.putString("webUser", webUsername);
preferences.putString("webPass", webPassword);
preferences.end();
}

View File

@ -235,11 +235,15 @@ struct sCredentials : public CESP32_NVStorage {
char APpassword[32];
char webUpdateUsername[32];
char webUpdatePassword[32];
char webUsername[32];
char webPassword[32];
void init() {
strcpy(APSSID, "Afterburner");
strcpy(APpassword, "thereisnospoon");
strcpy(webUpdateUsername, "Afterburner");
strcpy(webUpdatePassword, "BurnBabyBurn");
strcpy(webUsername, "Afterburner");
strcpy(webPassword, "WebAccess");
};
void load();
void save();
@ -249,6 +253,8 @@ struct sCredentials : public CESP32_NVStorage {
strcpy(APpassword, rhs.APpassword);
strcpy(webUpdateUsername, rhs.webUpdateUsername);
strcpy(webUpdatePassword, rhs.webUpdatePassword);
strcpy(webUsername, rhs.webUsername);
strcpy(webPassword, rhs.webPassword);
return *this;
}
};

File diff suppressed because it is too large Load Diff

View File

@ -94,7 +94,9 @@ bool initWifi()
wm.setEnableConfigPortal(shouldBootIntoConfigPortal());
//REMOVED - UNSTABLE WHETHER WE GET 192.168.4.1 or 192.168.100.1 ????
// REMOVED wm.setAPStaticIPConfig(IPAddress(192, 168, 100, 1), IPAddress(192, 168, 100, 1), IPAddress(255,255,255,0));
ScreenManager.showBootMsg("Starting WiFi");
bool res = wm.autoConnect(creds.APSSID, creds.APpassword); // User definable AP name & password
DebugPort.printf("WifiMode after autoConnect = "); DebugPort.println(WiFi.getMode());
@ -106,6 +108,7 @@ bool initWifi()
DebugPort.println("WiFimanager failed STA connection. Setting up AP...");
WiFi.disconnect(); // apparently needed for AP only OTA to reboot properly!!!
startAP = true;
ScreenManager.showBootMsg("STA failed");
}
else {
// runs through here if STA connected OK
@ -120,10 +123,12 @@ bool initWifi()
if(isSTA) {
if(NVstore.getUserSettings().wifiMode & 0x02) { // Check for STA only mode
DebugPort.println(" Using STA only mode.");
ScreenManager.showBootMsg("STA only");
}
else {
DebugPort.println("Now promoting to STA+AP mode...");
startAP = true;
ScreenManager.showBootMsg("STA+AP");
}
}
#if USE_AP_ALWAYS == 1
@ -140,6 +145,8 @@ bool initWifi()
// DebugPort.printf(" AP SSID: %s\r\n", WiFi.softAPgetHostname());
// DebugPort.printf(" AP IP address: %s\r\n", getWifiAPAddrStr());
DebugPort.printf("WifiMode after initWifi = %d\r\n", WiFi.getMode());
if(!isSTA)
ScreenManager.showBootMsg("AP only");
}
// even though we may have started in STA mode - start the config portal if demanded via the NV flag

View File

@ -103,7 +103,7 @@ sBrowserUpload::begin(String& filename, int filesize)
}
int
sBrowserUpload::fragment(HTTPUpload& upload)
sBrowserUpload::fragment(HTTPUpload& upload, httpsserver::HTTPResponse * res)
{
if(isSPIFFSupload()) {
// SPIFFS update (may be error state)
@ -118,9 +118,8 @@ sBrowserUpload::fragment(HTTPUpload& upload)
::SPIFFS.remove(SrcFile.name.c_str()); // remove the bad file from SPIFFS
return -2;
}
#ifdef SSL_SERVER
upload.totalSize += upload.currentSize;
#endif
if(res)
upload.totalSize += upload.currentSize;
}
}
else {
@ -130,9 +129,8 @@ sBrowserUpload::fragment(HTTPUpload& upload)
Update.printError(DebugPort);
return -3;
}
#ifdef SSL_SERVER
upload.totalSize += upload.currentSize;
#endif
if(res)
upload.totalSize += upload.currentSize;
}
return upload.totalSize;
}

View File

@ -25,6 +25,7 @@
#include <Arduino.h>
#include <SPIFFS.h>
#include <WebServer.h>
#include <HTTPResponse.hpp>
struct sBrowserUpload{
struct {
@ -49,7 +50,7 @@ struct sBrowserUpload{
}
void init();
int begin(String& filename, int filesize = -1);
int fragment(HTTPUpload& upload);
int fragment(HTTPUpload& upload, httpsserver::HTTPResponse * res = NULL);
int end(HTTPUpload& upload);
bool isSPIFFSupload() const { return DstFile.state != 0; };
bool isOK() const;

View File

@ -117,3 +117,9 @@
//
#define USE_SW_WATCHDOG 1
#define USE_SSL_LOOP_TASK 1
// FreeRTOS task priorities
#define TASKPRIORITY_ARDUINO 3
#define TASKPRIORITY_HEATERCOMMS 4
#define TASKPRIORITY_SSL_CERT 1
#define TASKPRIORITY_SSL_LOOP 1