From 05cbc03f12902f0cd0599b19f7f53c5e6df63fe3 Mon Sep 17 00:00:00 2001 From: Gregg Date: Sat, 29 Oct 2022 18:36:30 -0500 Subject: [PATCH] Added homeSpan.statusString(HS_STATUS statusMessage) Can be used in statusCallback to convert HS_STATUS to char string --- src/HAP.cpp | 13 ++--- src/HomeSpan.cpp | 130 ++++++++++++++++++++++++----------------------- src/HomeSpan.h | 13 +++-- src/Network.cpp | 37 +++++--------- src/src.ino | 2 +- 5 files changed, 94 insertions(+), 101 deletions(-) diff --git a/src/HAP.cpp b/src/HAP.cpp index b747ac5..f4c92e7 100644 --- a/src/HAP.cpp +++ b/src/HAP.cpp @@ -637,11 +637,8 @@ int HAPClient::postPairSetupURL(){ mdns_service_txt_item_set("_hap","_tcp","sf","0"); // broadcast new status LOG1("\n*** ACCESSORY PAIRED! ***\n"); - - homeSpan.statusLED->on(); - - if(homeSpan.statusCallback) - homeSpan.statusCallback(HS_PAIRED); + + STATUS_UPDATE(on(),HS_PAIRED) if(homeSpan.pairCallback) // if set, invoke user-defined Pairing Callback to indicate device has been paired homeSpan.pairCallback(true); @@ -1640,9 +1637,9 @@ void HAPClient::removeController(uint8_t *id){ removeControllers(); LOG1("That was last Admin Controller! Removing any remaining Regular Controllers and unpairing Accessory\n"); mdns_service_txt_item_set("_hap","_tcp","sf","1"); // set Status Flag = 1 (Table 6-8) - homeSpan.statusLED->start(LED_PAIRING_NEEDED); - if(homeSpan.statusCallback) - homeSpan.statusCallback(HS_PAIRING_NEEDED); + + STATUS_UPDATE(start(LED_PAIRING_NEEDED),HS_PAIRING_NEEDED) + if(homeSpan.pairCallback) // if set, invoke user-defined Pairing Callback to indicate device has been paired homeSpan.pairCallback(false); } diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 626ae8a..6dc7039 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -194,10 +194,10 @@ void Span::pollTask() { processSerialCommand("A"); } else { Serial.print("YOU MAY CONFIGURE BY TYPING 'W '.\n\n"); - STATUS_UPDATE(start(LED_WIFI_NEEDED),HS_WIFI_NEEDED); + STATUS_UPDATE(start(LED_WIFI_NEEDED),HS_WIFI_NEEDED) } } else { - STATUS_UPDATE(start(LED_WIFI_CONNECTING),HS_WIFI_CONNECTING); + STATUS_UPDATE(start(LED_WIFI_CONNECTING),HS_WIFI_CONNECTING) } if(controlButton) @@ -296,11 +296,11 @@ void Span::pollTask() { ArduinoOTA.handle(); if(controlButton && controlButton->primed()) - STATUS_UPDATE(start(LED_ALERT),HS_ENTERING_CONFIG_MODE); + STATUS_UPDATE(start(LED_ALERT),HS_ENTERING_CONFIG_MODE) if(controlButton && controlButton->triggered(3000,10000)){ if(controlButton->type()==PushButton::LONG){ - STATUS_UPDATE(off(),HS_FACTORY_RESET); + STATUS_UPDATE(off(),HS_FACTORY_RESET) controlButton->wait(); processSerialCommand("F"); // FACTORY RESET } else { @@ -336,7 +336,7 @@ void Span::commandMode(){ Serial.print("*** COMMAND MODE ***\n\n"); int mode=1; boolean done=false; - STATUS_UPDATE(start(500,0.3,mode,1000),static_cast(HS_ENTERING_CONFIG_MODE+mode)); + STATUS_UPDATE(start(500,0.3,mode,1000),static_cast(HS_ENTERING_CONFIG_MODE+mode)) unsigned long alarmTime=millis()+comModeLife; while(!done){ @@ -352,20 +352,19 @@ void Span::commandMode(){ mode++; if(mode==6) mode=1; - STATUS_UPDATE(start(500,0.3,mode,1000),static_cast(HS_ENTERING_CONFIG_MODE+mode)); + STATUS_UPDATE(start(500,0.3,mode,1000),static_cast(HS_ENTERING_CONFIG_MODE+mode)) } else { done=true; } } // button press } // while - statusLED->start(LED_ALERT); + STATUS_UPDATE(start(LED_ALERT),static_cast(HS_ENTERING_CONFIG_MODE+mode+5)) controlButton->wait(); switch(mode){ case 1: - Serial.print("*** NO ACTION\n\n"); resetStatus(); break; @@ -402,7 +401,7 @@ void Span::checkConnect(){ connected++; waitTime=60000; alarmConnect=0; - STATUS_UPDATE(start(LED_WIFI_CONNECTING),HS_WIFI_CONNECTING); + STATUS_UPDATE(start(LED_WIFI_CONNECTING),HS_WIFI_CONNECTING) } if(WiFi.status()!=WL_CONNECTED){ @@ -753,6 +752,9 @@ void Span::processSerialCommand(const char *c){ Serial.print("\nDEVICE NOT YET PAIRED -- PLEASE PAIR WITH HOMEKIT APP\n\n"); mdns_service_txt_item_set("_hap","_tcp","sf","1"); // set Status Flag = 1 (Table 6-8) + if(homeSpan.pairCallback) + homeSpan.pairCallback(false); + resetStatus(); } break; @@ -770,9 +772,7 @@ void Span::processSerialCommand(const char *c){ nvs_set_blob(wifiNVS,"WIFIDATA",&network.wifiData,sizeof(network.wifiData)); // update data nvs_commit(wifiNVS); // commit to NVS Serial.print("\n*** WiFi Credentials SAVED! Re-starting ***\n\n"); - statusLED->off(); - delay(1000); - ESP.restart(); + reboot(); } break; @@ -802,26 +802,18 @@ void Span::processSerialCommand(const char *c){ Serial.print("*** Setup Code Unchanged\n"); } - statusLED->off(); - if(statusCallback) - statusCallback(HS_REBOOTING); Serial.print("\n*** Re-starting ***\n\n"); - delay(1000); - ESP.restart(); // re-start device + reboot(); } break; case 'X': { - - statusLED->off(); - if(statusCallback) - statusCallback(HS_WIFI_ERASED); + nvs_erase_all(wifiNVS); nvs_commit(wifiNVS); WiFi.begin("none"); Serial.print("\n*** WiFi Credentials ERASED! Re-starting...\n\n"); - delay(1000); - ESP.restart(); // re-start device + reboot(); } break; @@ -835,23 +827,16 @@ void Span::processSerialCommand(const char *c){ case 'H': { - statusLED->off(); nvs_erase_all(HAPClient::hapNVS); nvs_commit(HAPClient::hapNVS); Serial.print("\n*** HomeSpan Device ID and Pairing Data DELETED! Restarting...\n\n"); - delay(1000); - ESP.restart(); + reboot(); } break; case 'R': { - - statusLED->off(); - if(statusCallback) - statusCallback(HS_REBOOTING); - Serial.print("\n*** Restarting...\n\n"); - delay(1000); - ESP.restart(); + + reboot(); } break; @@ -867,18 +852,15 @@ void Span::processSerialCommand(const char *c){ nvs_commit(otaNVS); WiFi.begin("none"); Serial.print("\n*** FACTORY RESET! Restarting...\n\n"); - delay(1000); - ESP.restart(); + reboot(); } break; case 'E': { - statusLED->off(); nvs_flash_erase(); Serial.print("\n*** ALL DATA ERASED! Restarting...\n\n"); - delay(1000); - ESP.restart(); + reboot(); } break; @@ -1110,28 +1092,51 @@ void Span::processSerialCommand(const char *c){ /////////////////////////////// void Span::resetStatus(){ - if(strlen(network.wifiData.ssid)==0){ - statusLED->start(LED_WIFI_NEEDED); - if(statusCallback) - statusCallback(HS_WIFI_NEEDED); - } + if(strlen(network.wifiData.ssid)==0) + STATUS_UPDATE(start(LED_WIFI_NEEDED),HS_WIFI_NEEDED) + else if(WiFi.status()!=WL_CONNECTED) + STATUS_UPDATE(start(LED_WIFI_CONNECTING),HS_WIFI_CONNECTING) + else if(!HAPClient::nAdminControllers()) + STATUS_UPDATE(start(LED_PAIRING_NEEDED),HS_PAIRING_NEEDED) else - if(WiFi.status()!=WL_CONNECTED){ - statusLED->start(LED_WIFI_CONNECTING); - if(statusCallback) - statusCallback(HS_WIFI_CONNECTING); + STATUS_UPDATE(on(),HS_PAIRED) +} + +/////////////////////////////// + +void Span::reboot(){ + STATUS_UPDATE(off(),HS_REBOOTING) + delay(1000); + ESP.restart(); +} + +/////////////////////////////// + +const char* Span::statusString(HS_STATUS s){ + switch(s){ + case HS_WIFI_NEEDED: return("WiFi Credentials Needed"); + case HS_WIFI_CONNECTING: return("WiFi Connecting"); + case HS_PAIRING_NEEDED: return("Device not yet Paired"); + case HS_PAIRED: return("Device Paired"); + case HS_ENTERING_CONFIG_MODE: return("Entering Command Mode"); + case HS_CONFIG_MODE_EXIT: return("1. Exit Command Mode"); + case HS_CONFIG_MODE_REBOOT: return("2. Reboot Device"); + case HS_CONFIG_MODE_LAUNCH_AP: return("3. Launch Access Point"); + case HS_CONFIG_MODE_UNPAIR: return("4. Unpair Device"); + case HS_CONFIG_MODE_ERASE_WIFI: return("5. Erase WiFi Credentials"); + case HS_CONFIG_MODE_EXIT_SELECTED: return("Exiting Command Mode..."); + case HS_CONFIG_MODE_REBOOT_SELECTED: return("Rebooting Device..."); + case HS_CONFIG_MODE_LAUNCH_AP_SELECTED: return("Launching Access Point..."); + case HS_CONFIG_MODE_UNPAIR_SELECTED: return("Unpairing Device..."); + case HS_CONFIG_MODE_ERASE_WIFI_SELECTED: return("Erasing WiFi Credentials..."); + case HS_REBOOTING: return("REBOOTING!"); + case HS_FACTORY_RESET: return("Performing Factory Reset..."); + case HS_AP_STARTED: return("Access Point Started"); + case HS_AP_CONNECTED: return("Access Point Connected"); + case HS_AP_TERMINATED: return("Access Point Terminated"); + case HS_OTA_STARTED: return("OTA Update Started"); + default: return("Unknown"); } - else - if(!HAPClient::nAdminControllers()){ - statusLED->start(LED_PAIRING_NEEDED); - if(statusCallback) - statusCallback(HS_PAIRING_NEEDED); - } - else{ - statusLED->on(); - if(statusCallback) - statusCallback(HS_PAIRED); - } } /////////////////////////////// @@ -2123,11 +2128,9 @@ void SpanOTA::init(boolean _auth, boolean _safeLoad){ void SpanOTA::start(){ Serial.printf("\n*** Current Partition: %s\n*** New Partition: %s\n*** OTA Starting..", - esp_ota_get_running_partition()->label,esp_ota_get_next_update_partition(NULL)->label); + esp_ota_get_running_partition()->label,esp_ota_get_next_update_partition(NULL)->label); otaPercent=0; - homeSpan.statusLED->start(LED_OTA_STARTED); - if(homeSpan.statusCallback) - homeSpan.statusCallback(HS_OTA_STARTED); + STATUS_UPDATE(start(LED_OTA_STARTED),HS_OTA_STARTED) } /////////////////////////////// @@ -2136,8 +2139,7 @@ void SpanOTA::end(){ nvs_set_u8(homeSpan.otaNVS,"OTA_REQUIRED",safeLoad); nvs_commit(homeSpan.otaNVS); Serial.printf(" DONE! Rebooting...\n"); - homeSpan.statusLED->off(); - delay(100); // make sure commit is finished before reboot + homeSpan.reboot(); } /////////////////////////////// diff --git a/src/HomeSpan.h b/src/HomeSpan.h index 02641e3..1d6a6c1 100644 --- a/src/HomeSpan.h +++ b/src/HomeSpan.h @@ -67,7 +67,7 @@ enum { /////////////////////////////// -#define STATUS_UPDATE(LED_UPDATE,MESSAGE_UPDATE) {statusLED->LED_UPDATE;if(statusCallback)statusCallback(MESSAGE_UPDATE);} +#define STATUS_UPDATE(LED_UPDATE,MESSAGE_UPDATE) {homeSpan.statusLED->LED_UPDATE;if(homeSpan.statusCallback)homeSpan.statusCallback(MESSAGE_UPDATE);} enum HS_STATUS { HS_WIFI_NEEDED, @@ -80,11 +80,16 @@ enum HS_STATUS { HS_CONFIG_MODE_LAUNCH_AP, HS_CONFIG_MODE_UNPAIR, HS_CONFIG_MODE_ERASE_WIFI, + HS_CONFIG_MODE_EXIT_SELECTED, + HS_CONFIG_MODE_REBOOT_SELECTED, + HS_CONFIG_MODE_LAUNCH_AP_SELECTED, + HS_CONFIG_MODE_UNPAIR_SELECTED, + HS_CONFIG_MODE_ERASE_WIFI_SELECTED, HS_REBOOTING, HS_FACTORY_RESET, - HS_WIFI_ERASED, HS_AP_STARTED, HS_AP_CONNECTED, + HS_AP_TERMINATED, HS_OTA_STARTED }; @@ -226,7 +231,8 @@ class Span{ void (*pairCallback)(boolean isPaired)=NULL; // optional callback function to invoke when pairing is established (true) or lost (false) boolean autoStartAPEnabled=false; // enables auto start-up of Access Point when WiFi Credentials not found void (*apFunction)()=NULL; // optional function to invoke when starting Access Point - void (*statusCallback)(HS_STATUS status)=NULL; // optional callback when HomeSpan status changes + void (*statusCallback)(HS_STATUS status)=NULL; // optional callback when HomeSpan status changes + const char* statusString(HS_STATUS s); // returns char string for HomeSpan status change messages WiFiServer *hapServer; // pointer to the HAP Server connection Blinker *statusLED; // indicates HomeSpan status @@ -251,6 +257,7 @@ class Span{ void checkConnect(); // check WiFi connection; connect if needed void commandMode(); // allows user to control and reset HomeSpan settings with the control button void resetStatus(); // resets statusLED and calls statusCallback based on current HomeSpan status + void reboot(); // reboots device int sprintfAttributes(char *cBuf, int flags=GET_VALUE|GET_META|GET_PERMS|GET_TYPE|GET_DESC); // prints Attributes JSON database into buf, unless buf=NULL; return number of characters printed, excluding null terminator diff --git a/src/Network.cpp b/src/Network.cpp index 24f2843..9805bed 100644 --- a/src/Network.cpp +++ b/src/Network.cpp @@ -116,9 +116,7 @@ void Network::apConfigure(){ Serial.print(apPassword); Serial.print("\n"); - homeSpan.statusLED->start(LED_AP_STARTED); - if(homeSpan.statusCallback) - homeSpan.statusCallback(HS_AP_STARTED); + STATUS_UPDATE(start(LED_AP_STARTED),HS_AP_STARTED) Serial.print("\nScanning for Networks...\n\n"); @@ -156,11 +154,9 @@ void Network::apConfigure(){ if(homeSpan.controlButton && homeSpan.controlButton->triggered(9999,3000)){ Serial.print("\n*** Access Point Terminated."); - homeSpan.statusLED->start(LED_ALERT); + STATUS_UPDATE(start(LED_ALERT),HS_AP_TERMINATED) homeSpan.controlButton->wait(); - Serial.print(" Restarting... \n\n"); - homeSpan.statusLED->off(); - ESP.restart(); + homeSpan.reboot(); } if(millis()>alarmTimeOut){ @@ -175,13 +171,11 @@ void Network::apConfigure(){ Serial.print(lifetime/1000); Serial.print(" seconds)."); } else { - Serial.print("\n*** Access Point: Configuration Canceled."); + Serial.print("\n*** Access Point: Configuration Cancelled."); } Serial.print(" Restarting...\n\n"); - homeSpan.statusLED->start(LED_ALERT); - delay(1000); - homeSpan.statusLED->off(); - ESP.restart(); + STATUS_UPDATE(start(LED_ALERT),HS_AP_TERMINATED) + homeSpan.reboot(); } } @@ -274,11 +268,9 @@ void Network::processRequest(char *body, char *formData){ getFormValue(formData,"network",wifiData.ssid,MAX_SSID); getFormValue(formData,"pwd",wifiData.pwd,MAX_PWD); - - homeSpan.statusLED->start(LED_WIFI_CONNECTING); - if(homeSpan.statusCallback) - homeSpan.statusCallback(HS_WIFI_CONNECTING); - + + STATUS_UPDATE(start(LED_WIFI_CONNECTING),HS_WIFI_CONNECTING) + responseBody+="" "

Initiating WiFi connection to:

" + String(wifiData.ssid) + "

"; @@ -323,10 +315,8 @@ void Network::processRequest(char *body, char *formData){ WiFi.begin(wifiData.ssid,wifiData.pwd); } else { - - homeSpan.statusLED->start(LED_AP_CONNECTED); // slow double-blink - if(homeSpan.statusCallback) - homeSpan.statusCallback(HS_AP_CONNECTED); + + STATUS_UPDATE(start(LED_AP_CONNECTED),HS_AP_CONNECTED) responseBody+="

SUCCESS! Connected to:

" + String(wifiData.ssid) + "

"; responseBody+="

You may enter new 8-digit Setup Code below, or leave blank to retain existing code.

"; @@ -346,10 +336,7 @@ void Network::processRequest(char *body, char *formData){ LOG1("In Landing Page...\n"); - homeSpan.statusLED->start(LED_AP_CONNECTED); - if(homeSpan.statusCallback) - homeSpan.statusCallback(HS_AP_CONNECTED); - + STATUS_UPDATE(start(LED_AP_CONNECTED),HS_AP_CONNECTED) waitTime=2; responseBody+="

Welcome to HomeSpan! This page allows you to configure the above HomeSpan device to connect to your WiFi network.

" diff --git a/src/src.ino b/src/src.ino index 5a00e4a..abf2d6b 100644 --- a/src/src.ino +++ b/src/src.ino @@ -168,5 +168,5 @@ void userCom2(const char *v){ ////////////////////////////////////// void statusUpdate(HS_STATUS status){ - Serial.printf("\n*** HOMESPAN STATUS CHANGE: %d\n",status); + Serial.printf("\n*** HOMESPAN STATUS CHANGE: %s\n",homeSpan.statusString(status)); }