#include "Arduino.h" #include "ArduinoOTA.h" #include "WiFi.h" #include "wifi.h" #include "storage.h" #include "httpd.h" String ssid = ""; String password = ""; String otaPassword = ""; String hostname = "max80"; bool inOTA = false; static void start_services(void) { my_httpd_start(); } static String wifi_local_ip(void) { return WiFi.localIP().toString(); } static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { bool retry = false; bool connected = false; switch (event) { case ARDUINO_EVENT_WIFI_READY: printf("[WIFI] Interface ready\n"); break; case ARDUINO_EVENT_WIFI_SCAN_DONE: printf("[WIFI] Completed scan for access points\n"); break; case ARDUINO_EVENT_WIFI_STA_START: printf("[WIFI] Client started\n"); break; case ARDUINO_EVENT_WIFI_STA_STOP: printf("[WIFI] Clients stopped\n"); break; case ARDUINO_EVENT_WIFI_STA_CONNECTED: printf("[WIFI] Connected to access point\n"); break; case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: printf("[WIFI] Disconnected from WiFi access point\n"); retry = true; break; case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE: printf("[WIFI] Authentication mode of access point has changed\n"); break; case ARDUINO_EVENT_WIFI_STA_GOT_IP: printf("[WIFI] Obtained IP address: %s\n", wifi_local_ip().c_str()); connected = true; break; case ARDUINO_EVENT_WIFI_STA_LOST_IP: printf("[WIFI] Lost IP address and IP address is reset to 0\n"); retry = true; break; case ARDUINO_EVENT_WPS_ER_SUCCESS: printf("[WIFI] WiFi Protected Setup (WPS): succeeded in enrollee mode\n"); break; case ARDUINO_EVENT_WPS_ER_FAILED: printf("[WIFI] WiFi Protected Setup (WPS): failed in enrollee mode\n"); break; case ARDUINO_EVENT_WPS_ER_TIMEOUT: printf("[WIFI] WiFi Protected Setup (WPS): timeout in enrollee mode\n"); break; case ARDUINO_EVENT_WPS_ER_PIN: printf("[WIFI] WiFi Protected Setup (WPS): pin code in enrollee mode\n"); break; case ARDUINO_EVENT_WIFI_AP_START: printf("[WIFI] Access point started\n"); break; case ARDUINO_EVENT_WIFI_AP_STOP: printf("[WIFI] Access point stopped\n"); break; case ARDUINO_EVENT_WIFI_AP_STACONNECTED: printf("[WIFI] Client connected\n"); break; case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: printf("[WIFI] Client disconnected\n"); break; case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: printf("[WIFI] Assigned IP address to client\n"); break; case ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED: printf("[WIFI] Received probe request\n"); break; case ARDUINO_EVENT_WIFI_AP_GOT_IP6: printf("[WIFI] AP IPv6 is preferred\n"); break; case ARDUINO_EVENT_WIFI_STA_GOT_IP6: printf("[WIFI] STA IPv6 is preferred\n"); connected = true; break; case ARDUINO_EVENT_ETH_GOT_IP6: printf("[ETH] Ethernet IPv6 is preferred\n"); connected = true; break; case ARDUINO_EVENT_ETH_START: printf("[ETH] Ethernet started\n"); break; case ARDUINO_EVENT_ETH_STOP: printf("[ETH] Ethernet stopped\n"); break; case ARDUINO_EVENT_ETH_CONNECTED: printf("[ETH] Ethernet connected\n"); break; case ARDUINO_EVENT_ETH_DISCONNECTED: printf("[ETH] Ethernet disconnected\n"); retry = true; break; case ARDUINO_EVENT_ETH_GOT_IP: printf("[ETH] Obtained IP address: %s\n", wifi_local_ip().c_str()); connected = true; break; default: break; } /* Maybe need to do these in a different thread? */ if (connected) { start_services(); } if (retry) { WiFi.disconnect(); WiFi.begin(); } } void SetupWiFi() { ssid = GetWifiSSID(); password = GetWifiPassword(); hostname = GetHostname(); inOTA = false; printf("[INFO] Setting up WiFi\n"); printf("[INFO] SSID: %s\n", ssid.c_str()); WiFi.onEvent(WiFiEvent); if (WiFi.getMode() != WIFI_STA) { WiFi.mode(WIFI_STA); delay(10); } if (WiFi.SSID() != ssid || WiFi.psk() != password) { printf("[INFO] WiFi config changed.\n"); // ... Try to connect to WiFi station. WiFi.begin(ssid.c_str(), password.c_str()); } else { WiFi.begin(); } WiFi.setAutoReconnect(true); WiFi.setHostname(hostname.c_str()); } void SetupOTA() { // Start OTA server. ArduinoOTA.setHostname((const char *)hostname.c_str()); ArduinoOTA.onStart([]() { inOTA = true; printf("[INFO] OTA Update Start\n"); }); ArduinoOTA.onEnd([]() { printf("[INFO] OTA Update End\n"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { printf("[INFO] Progress: %u%%\n", (unsigned int)((progress*100ULL)/total)); }); ArduinoOTA.onError([](ota_error_t error) { printf("[ERROR] %u: ", error); if (error == OTA_AUTH_ERROR) printf("Auth failed\n"); else if (error == OTA_BEGIN_ERROR) printf("Start Failed\n"); else if (error == OTA_CONNECT_ERROR) printf("Connection failed\n"); else if (error == OTA_RECEIVE_ERROR) printf("Receive Error\n"); else if (error == OTA_END_ERROR) printf("End Fail\n"); }); ArduinoOTA.begin(); }