diff --git a/src/main.h b/src/main.h index 3a2565b..0b28164 100644 --- a/src/main.h +++ b/src/main.h @@ -28,7 +28,7 @@ SOFTWARE. */ #include "execota.h" #include "jsonconfig.h" #include "webserver.h" -#include "wifi.h" +#include "wifihandler.h" #include "version.h" #include "pushtarget.h" #include "target.h" diff --git a/src/ntp.cpp b/src/ntp.cpp index 6b64372..968defa 100644 --- a/src/ntp.cpp +++ b/src/ntp.cpp @@ -27,40 +27,46 @@ void setClock() Ticker blinker; Log.notice(F("Entering blocking loop to get NTP time.")); blinker.attach_ms(NTPBLINK, ntpBlinker); - configTime(GMT, 0, "pool.ntp.org", "time.nist.gov"); - time_t nowSecs = time(nullptr); time_t startSecs = time(nullptr); int cycle = 0; - while (nowSecs < EPOCH_1_1_2019) + while (time(nullptr) < EPOCH_1_1_2019) { - if (nowSecs - startSecs > 9) + configTime("GMT", "pool.ntp.org", "time.nist.gov"); + if (time(nullptr) - startSecs > 9) { if (cycle > 9) { - Log.warning(F("Unable to get time hack from %s, rebooting." CR), TIMESERVER); + + Log.warning(F(CR "Unable to get time hack from %s, rebooting." CR), TIMESERVER); ESP.restart(); } #ifdef LOG_LEVEL + // TODO: + //myPrintln(); Serial.println(); #endif Log.verbose(F("Re-requesting time hack.")); - configTime(GMT, 0, "pool.ntp.org", "time.nist.gov"); startSecs = time(nullptr); cycle++; } #ifdef LOG_LEVEL + // TODO: + //myPrint(F(".")); Serial.print(F(".")); #endif delay(1000); yield(); - nowSecs = time(nullptr); } blinker.detach(); #ifdef LOG_LEVEL + // TODO: + //myPrintln(); Serial.println(); #endif + lastNTPUpdate = millis(); Log.notice(F("NTP time set." CR)); struct tm timeinfo; + time_t nowSecs = time(nullptr); gmtime_r(&nowSecs, &timeinfo); } diff --git a/src/ntp.h b/src/ntp.h index 14a03e1..c83003a 100644 --- a/src/ntp.h +++ b/src/ntp.h @@ -31,6 +31,9 @@ SOFTWARE. */ #include "config.h" #include "tools.h" +#include "serial_setup.h" +// TODO: +// #include "serialhandler.h" #include #include @@ -46,6 +49,8 @@ int getSecond(); // tm_sec int getYDay(); // tm_yday void ntpBlinker(); +static uint32_t __attribute__((unused)) lastNTPUpdate = 0; + static const float __attribute__((unused)) GMT = 0; static const float __attribute__((unused)) UTC = 0; static const float __attribute__((unused)) ECT = 1.00; diff --git a/src/webserver.h b/src/webserver.h index d7db626..a95507e 100644 --- a/src/webserver.h +++ b/src/webserver.h @@ -27,7 +27,7 @@ SOFTWARE. */ #define USE_LITTLEFS #endif -#include "wifi.h" +#include "wifihandler.h" #include "execota.h" #include "bubbles.h" #include "jsonconfig.h" diff --git a/src/wifi.cpp b/src/wifihandler.cpp similarity index 61% rename from src/wifi.cpp rename to src/wifihandler.cpp index e63993d..f591ffc 100644 --- a/src/wifi.cpp +++ b/src/wifihandler.cpp @@ -20,8 +20,9 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "wifi.h" +#include "wifihandler.h" +AsyncWiFiManager myAsyncWifiManager; bool shouldSaveConfig = false; Ticker blinker; @@ -30,20 +31,30 @@ void doWiFi() doWiFi(false); } -void doWiFi(bool ignore = false) -{ // Handle WiFi and optionally ignore current config - AsyncWiFiManager myAsyncWifiManager; +void doWiFi(bool dontUseStoredCreds) +{ + // Eliminate 4-way handshake errors + // WiFi.disconnect(); // Don't think I should use this + WiFi.enableSTA(true); +#ifdef ESP8266 + WiFi.setSleepMode(WIFI_NONE_SLEEP); +#elif ESP32 + WiFi.setSleep(false); +#endif // AsyncWiFiManager Callbacks myAsyncWifiManager.setAPCallback(apCallback); // Called after AP has started + myAsyncWifiManager.setWebServerCallback(webServerCallback); // Called after webserver is setup + myAsyncWifiManager.setPreSaveConfigCallback(preSaveConfigCallback); // Called before saving wifi creds or parameters + myAsyncWifiManager.setSaveParamsCallback(saveParamsCallback); // Called after wifi parameters are saved + myAsyncWifiManager.setSaveConfigCallback(saveConfigCallback); // Called only if optional parameters are saved, or setBreakAfterConfig(true) myAsyncWifiManager.setConfigResetCallback(configResetCallback); // Called after settings are reset - myAsyncWifiManager.setPreSaveConfigCallback(preSaveConfigCallback); // Called before saving wifi creds - myAsyncWifiManager.setSaveConfigCallback(saveConfigCallback); - myAsyncWifiManager.setSaveParamsCallback(saveParamsCallback); // Called after parameters are saved via params menu or wifi config - myAsyncWifiManager.setWebServerCallback(webServerCallback); // Called after webserver is setup #ifndef DISABLE_LOGGING - myAsyncWifiManager.setDebugOutput(true); // Verbose debug is enabled by default + if (Log.getLevel()) + myAsyncWifiManager.setDebugOutput(true); // Verbose debug is enabled by default + else + myAsyncWifiManager.setDebugOutput(false); #else myAsyncWifiManager.setDebugOutput(false); #endif @@ -55,24 +66,37 @@ void doWiFi(bool ignore = false) "info", //"param", //"close", - //"sep", "erase", "restart", "exit"}; myAsyncWifiManager.setMenu(_wfmPortalMenu); // Set menu items - myAsyncWifiManager.setClass(F("invert")); // Set dark theme + // myAsyncWifiManager.setCustomHeadElement(""); + // myAsyncWifiManager.setClass(F("invert")); // Set dark theme myAsyncWifiManager.setCountry(WIFI_COUNTRY); // Setting wifi country seems to improve OSX soft ap connectivity myAsyncWifiManager.setWiFiAPChannel(WIFI_CHAN); // Set WiFi channel - myAsyncWifiManager.setShowStaticFields(true); // force show static ip fields - myAsyncWifiManager.setShowDnsFields(true); // force show dns field always + myAsyncWifiManager.setShowStaticFields(true); // Force show static ip fields + myAsyncWifiManager.setShowDnsFields(true); // Force show dns field always + + // Allow non-default host name + AsyncWiFiManagerParameter hostname("hostname", "Custom Hostname", HOSTNAME, 32); + myAsyncWifiManager.addParameter(&hostname); - if (ignore) - { // Voluntary portal + // TODO: + // if (doNonBlock) + // { + // // Enable nonblocking portal (if configured) + // myAsyncWifiManager.setConfigPortalBlocking(false); + // } + + if (dontUseStoredCreds) + { + // Voluntary portal blinker.attach_ms(APBLINK, wifiBlinker); myAsyncWifiManager.setConfigPortalTimeout(120); + if (myAsyncWifiManager.startConfigPortal(config.apconfig.ssid, config.apconfig.passphrase)) { // We finished with portal, do we need this? @@ -80,8 +104,7 @@ void doWiFi(bool ignore = false) else { // Hit timeout on voluntary portal - if (blinker.active()) - blinker.detach(); // Turn off blinker + blinker.detach(); // Turn off blinker digitalWrite(LED, LOW); _delay(3000); digitalWrite(LED, HIGH); @@ -96,51 +119,68 @@ void doWiFi(bool ignore = false) myAsyncWifiManager.setConfigPortalTimeout(120); if (!myAsyncWifiManager.autoConnect(config.apconfig.ssid, config.apconfig.passphrase)) { - Log.warning(F("Failed to connect and hit timeout.")); - if (blinker.active()) - blinker.detach(); // Turn off blinker + Log.warning(F("Failed to connect and/or hit timeout." CR)); + blinker.detach(); // Turn off blinker digitalWrite(LED, LOW); _delay(3000); digitalWrite(LED, HIGH); - Log.warning(F("Hit timeout on connect, restarting." CR)); - ESP.restart(); + Log.warning(F("Restarting." CR)); + resetController(); _delay(1000); // Just a hack to give it time to reset } else { - // We finished with portal (configured) - WiFi.mode(WIFI_STA); // Explicitly set mode, esp defaults to STA+AP + // We finished with portal (We were configured) +#ifdef ESP8266 WiFi.setSleepMode(WIFI_NONE_SLEEP); // Make sure sleep is disabled - if (blinker.active()) - blinker.detach(); // Turn off blinker +#endif + blinker.detach(); // Turn off blinker digitalWrite(LED, HIGH); // Turn off LED +#ifdef ESP8266 + WiFi.hostname(config.hostname); +#elif defined ESP32 + WiFi.setHostname(config.hostname); +#endif + } + } + + if (shouldSaveConfig) + { // Save configuration + if (hostname.getValue() != config.hostname) + { + Log.notice(F("Saving custom hostname configuration: %s." CR), hostname.getValue()); + strlcpy(config.hostname, hostname.getValue(), sizeof(config.hostname)); + saveConfig(); +#ifdef ESP8266 WiFi.hostname(config.hostname); +#elif defined ESP32 + WiFi.setHostname(config.hostname); +#endif } } - // if (shouldSaveConfig) { // Save configuration - // Log.notice(F("Saving configuration." CR)); - // + // TODO: + // if (doNonBlock) + // { + // // Turn off nonblocking portal (if configured) + // Log.notice(F("Returning after non-blocking reconnect." CR)); + // doNonBlock = false; + // mdnsreset(); // } Log.notice(F("Connected. IP address: %s." CR), WiFi.localIP().toString().c_str()); - if (blinker.active()) - blinker.detach(); // Turn off blinker + blinker.detach(); // Turn off blinker digitalWrite(LED, HIGH); // Turn off LED } void resetWifi() { // Wipe wifi settings and reset controller AsyncWiFiManager myAsyncWifiManager; - _delay(3000); // Allow page to load myAsyncWifiManager.resetSettings(); - if (blinker.active()) - blinker.detach(); // Turn off blinker + blinker.detach(); // Turn off blinker digitalWrite(LED, LOW); // Turn on LED - _delay(3000); - Log.warning(F("Restarting after clearing wifi settings." CR)); + Log.notice(F("Restarting after clearing wifi settings." CR)); ESP.restart(); - _delay(1000); } void wifiBlinker() @@ -153,8 +193,7 @@ void wifiBlinker() void apCallback(AsyncWiFiManager *asyncWiFiManager) { // Entered Access Point mode Log.verbose(F("[CALLBACK]: setAPCallback fired." CR)); - if (blinker.active()) - blinker.detach(); // Turn off blinker + blinker.detach(); // Turn off blinker blinker.attach_ms(APBLINK, wifiBlinker); Log.notice(F("Entered portal mode; name: %s, IP: %s." CR), asyncWiFiManager->getConfigPortalSSID().c_str(), @@ -174,7 +213,7 @@ void preSaveConfigCallback() void saveConfigCallback() { Log.verbose(F("[CALLBACK]: setSaveConfigCallback fired." CR)); - shouldSaveConfig = true; + // shouldSaveConfig = true; } void saveParamsCallback() @@ -187,3 +226,11 @@ void webServerCallback() { Log.verbose(F("[CALLBACK]: setWebServerCallback fired." CR)); } + +void tcpCleanup(void) +{ + // Supposedly not needed, but we still get -8 errors on occasion + // https://github.com/esp8266/Arduino/tree/master/doc/faq#how-to-clear-tcp-pcbs-in-time-wait-state- + while (tcp_tw_pcbs) + tcp_abort(tcp_tw_pcbs); +} diff --git a/src/wifi.h b/src/wifihandler.h similarity index 82% rename from src/wifi.h rename to src/wifihandler.h index cb5f19a..81bdfc0 100644 --- a/src/wifi.h +++ b/src/wifihandler.h @@ -20,19 +20,26 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef _WIFI_H -#define _WIFI_H +#ifndef _WIFIHANDLER_H +#define _WIFIHANDLER_H #define WM_ASYNC #include "config.h" #include "jsonconfig.h" #include "tools.h" -#include "pushhelper.h" +#include "mdns.h" + +#ifdef ESP8266 #include +#endif +#ifdef ESP32 +#include +#endif +#include + #include #include -#include void wifiBlinker(); void doWiFi(); @@ -48,5 +55,12 @@ void saveParamsCallback(); void webServerCallback(); extern struct Config config; +extern const size_t capacitySerial; +extern const size_t capacityDeserial; + +struct tcp_pcb; +extern struct tcp_pcb *tcp_tw_pcbs; +extern "C" void tcp_abort(struct tcp_pcb *pcb); +void tcpCleanup(void); -#endif // _WIFI_H +#endif // _WIFIHANDLER_H