Added homeSpan.statusString(HS_STATUS statusMessage)

Can be used in statusCallback to convert HS_STATUS to char string
This commit is contained in:
Gregg 2022-10-29 18:36:30 -05:00
parent 645c169a5e
commit 05cbc03f12
5 changed files with 94 additions and 101 deletions

View File

@ -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);
}

View File

@ -194,10 +194,10 @@ void Span::pollTask() {
processSerialCommand("A");
} else {
Serial.print("YOU MAY CONFIGURE BY TYPING 'W <RETURN>'.\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_STATUS>(HS_ENTERING_CONFIG_MODE+mode));
STATUS_UPDATE(start(500,0.3,mode,1000),static_cast<HS_STATUS>(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_STATUS>(HS_ENTERING_CONFIG_MODE+mode));
STATUS_UPDATE(start(500,0.3,mode,1000),static_cast<HS_STATUS>(HS_ENTERING_CONFIG_MODE+mode))
} else {
done=true;
}
} // button press
} // while
statusLED->start(LED_ALERT);
STATUS_UPDATE(start(LED_ALERT),static_cast<HS_STATUS>(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();
}
///////////////////////////////

View File

@ -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

View File

@ -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+="<meta http-equiv = \"refresh\" content = \"" + String(waitTime) + "; url = /wifi-status\" />"
"<p>Initiating WiFi connection to:</p><p><b>" + String(wifiData.ssid) + "</p>";
@ -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+="<p>SUCCESS! Connected to:</p><p><b>" + String(wifiData.ssid) + "</b></p>";
responseBody+="<p>You may enter new 8-digit Setup Code below, or leave blank to retain existing code.</p>";
@ -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+="<p>Welcome to HomeSpan! This page allows you to configure the above HomeSpan device to connect to your WiFi network.</p>"

View File

@ -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));
}