Skip to content

Commit

Permalink
Update wifi handler
Browse files Browse the repository at this point in the history
  • Loading branch information
lbussy committed Nov 28, 2020
1 parent b4e6d0f commit f197b6d
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 54 deletions.
2 changes: 1 addition & 1 deletion src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
20 changes: 13 additions & 7 deletions src/ntp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
5 changes: 5 additions & 0 deletions src/ntp.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ SOFTWARE. */

#include "config.h"
#include "tools.h"
#include "serial_setup.h"
// TODO:
// #include "serialhandler.h"
#include <Ticker.h>
#include <ArduinoLog.h>

Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/webserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ SOFTWARE. */
#define USE_LITTLEFS
#endif

#include "wifi.h"
#include "wifihandler.h"
#include "execota.h"
#include "bubbles.h"
#include "jsonconfig.h"
Expand Down
127 changes: 87 additions & 40 deletions src/wifi.cpp → src/wifihandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand All @@ -55,33 +66,45 @@ 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("<style>html{filter: invert(100%); -webkit-filter: invert(100%);}</style>");
// 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?
}
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);
Expand All @@ -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()
Expand All @@ -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(),
Expand All @@ -174,7 +213,7 @@ void preSaveConfigCallback()
void saveConfigCallback()
{
Log.verbose(F("[CALLBACK]: setSaveConfigCallback fired." CR));
shouldSaveConfig = true;
// shouldSaveConfig = true;
}

void saveParamsCallback()
Expand All @@ -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);
}
24 changes: 19 additions & 5 deletions src/wifi.h → src/wifihandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <ESP8266WiFi.h>
#endif
#ifdef ESP32
#include <WiFi.h>
#endif
#include <AsyncWiFiManager.h>

#include <Ticker.h>
#include <ArduinoLog.h>
#include <AsyncWiFiManager.h>

void wifiBlinker();
void doWiFi();
Expand All @@ -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

0 comments on commit f197b6d

Please sign in to comment.