From 4a6c737c7202bf3f00d9ad4ee03336c9cc5630f5 Mon Sep 17 00:00:00 2001 From: Gregg Date: Mon, 7 Sep 2020 11:02:44 -0500 Subject: [PATCH] Moving serial wifi update into Network.cpp --- src/HomeSpan.cpp | 57 +++++++++++++++++-------- src/Network.cpp | 105 +++++++++++++++++++++++++++++++---------------- src/Network.h | 24 +++++------ 3 files changed, 121 insertions(+), 65 deletions(-) diff --git a/src/HomeSpan.cpp b/src/HomeSpan.cpp index 55ee342..3de1e1c 100644 --- a/src/HomeSpan.cpp +++ b/src/HomeSpan.cpp @@ -212,6 +212,8 @@ void Span::initWifi(){ char pwd[MAX_PWD+1]; } wifiData; + char setupCode[9]; + char id[18]; // create string version of Accessory ID for MDNS broadcast memcpy(id,HAPClient::accessory.ID,17); // copy ID bytes id[17]='\0'; // add terminating null @@ -230,26 +232,45 @@ void Span::initWifi(){ if(!nvs_get_blob(wifiHandle,"WIFIDATA",NULL,&len)){ // if found WiFi data in NVS nvs_get_blob(wifiHandle,"WIFIDATA",&wifiData,&len); // retrieve data } else { - statusLED.start(500,0.3,2,1000); - network.configure(hostName); + statusLED.start(250); + Serial.print("Network configuration required!\nPress control button for 3 seconds to start AccessPoint or enter network data here.\n\n"); + Serial.print(">>> WiFi SSID: "); + + resetPressed=0; + int status=0; + + while(status==0){ // loop until a configuration method is chosen and completed + + if(!resetPressed){ + if(!digitalRead(resetPin)){ + resetPressed=1; + resetTime=millis()+3000; + } + } else if(digitalRead(resetPin)){ + resetPressed=0; + } else if(millis()>resetTime){ + statusLED.start(100,0.3,3,500); +// statusLED.start(2000,0.75); + Serial.print("(skipping)\n\n"); + status=network.apConfigure(hostName); + } + + if(Serial.available()) + status=network.serialConfigure(); + + } // while loop + + Serial.println(status); + Serial.print("'"); Serial.print(network.ssid); Serial.println("'"); + Serial.print("'"); Serial.print(network.pwd); Serial.println("'"); + Serial.print("'"); Serial.print(network.setupCode); Serial.println("'"); + while(1); + +// delay(2000); // pause while prior page is displayed +// WiFi.softAPdisconnect(true); // terminate connections and shut down captive access point +// ESP.restart(); // re-start device - Serial.print("Please configure network...\n"); - sprintf(wifiData.ssid,"MyNetwork"); - sprintf(wifiData.pwd,"MyPassword"); - - Serial.print(">>> WiFi SSID ("); - Serial.print(wifiData.ssid); - Serial.print("): "); - readSerial(wifiData.ssid,MAX_SSID); - Serial.print(wifiData.ssid); - - Serial.print("\n>>> WiFi Password ("); - Serial.print(wifiData.pwd); - Serial.print("): "); - readSerial(wifiData.pwd,MAX_PWD); - Serial.print(mask(wifiData.pwd,2)); - Serial.print("\n\n"); nvs_set_blob(wifiHandle,"WIFIDATA",&wifiData,sizeof(wifiData)); // update data nvs_commit(wifiHandle); // commit to NVS diff --git a/src/Network.cpp b/src/Network.cpp index 9e566f7..94a3b37 100644 --- a/src/Network.cpp +++ b/src/Network.cpp @@ -3,13 +3,48 @@ #include "Network.h" #include "Utils.h" +#include "HAP.h" + +using namespace Utils; /////////////////////////////// -void Network::configure(char *apName){ +int Network::serialConfigure(){ - Serial.print("WiFi Configuration required. Please enter details here, or connect to Access Point: "); + sprintf(ssid,""); + sprintf(pwd,""); + + readSerial(ssid,MAX_SSID); + Serial.print(ssid); + Serial.print("\n"); + + while(!strlen(ssid)){ + Serial.print(">>> WiFi SSID: "); + readSerial(ssid,MAX_SSID); + Serial.print(ssid); + Serial.print("\n"); + } + + while(!strlen(pwd)){ + Serial.print(">>> WiFi PASS: "); + readSerial(pwd,MAX_PWD); + Serial.print(mask(pwd,2)); + Serial.print("\n"); + } + + Serial.print("Done"); + while(1); + +} + +/////////////////////////////// + +int Network::apConfigure(char *apName){ + + Serial.print("Starting Access Point: "); Serial.print(apName); + Serial.print(" / "); + Serial.print(apPassword); Serial.print("\n"); WiFiServer apServer(80); @@ -22,13 +57,21 @@ void Network::configure(char *apName){ IPAddress apIP(192, 168, 4, 1); WiFi.mode(WIFI_AP); - WiFi.softAP(apName,"homespan"); // start access point + WiFi.softAP(apName,apPassword); // start access point dnsServer.start(DNS_PORT, "*", apIP); // start DNS server that resolves every request to the address of this device apServer.begin(); - boolean needsConfiguration=true; + int status=0; // initialize status + alarmTimeOut=millis()+lifetime; // Access Point will stay alive until alarmTimeOut is reached - while(needsConfiguration){ + while(status==0){ + + if(millis()>alarmTimeOut){ + Serial.print("\n*** ERROR: Access Point timed Out ("); + Serial.print(lifetime/1000); + Serial.print(" seconds)\n\n"); + return(-1); + } dnsServer.processNextRequest(); @@ -82,35 +125,25 @@ void Network::configure(char *apName){ LOG2("\n------------ END BODY! ------------\n"); content[cLen]='\0'; // add a trailing null on end of any contents, which should always be text-based - processRequest(body, (char *)content); // process request - delay(1); - client.stop(); - - /* - if(!client){ // client disconnected by server - LOG1("** Disconnecting AP Client ("); - LOG1(millis()/1000); - LOG1(" sec)\n"); - } - */ + status=processRequest(body, (char *)content); // process request; returns 0=continue, 1=exit and save settings, 2=exit and cancel changes LOG2("\n"); } // process HAP Client - } + } // while status==0 - while(1); + return(status); } /////////////////////////////// -void Network::processRequest(char *body, char *formData){ - - boolean restart=false; +int Network::processRequest(char *body, char *formData){ + int returnCode=0; + String responseHead="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n"; String responseBody="