diff --git a/include/hasp_conf.h b/include/hasp_conf.h index ad1243f8..7aae6b26 100644 --- a/include/hasp_conf.h +++ b/include/hasp_conf.h @@ -234,14 +234,13 @@ static WiFiSpiClass WiFi; #if HASP_USE_ETHERNET > 0 #if defined(ARDUINO_ARCH_ESP32) +#include "sys/net/hasp_ethernet_esp32.h" #if HASP_USE_SPI_ETHERNET > 0 #include -#include "sys/net/hasp_ethernet_spi.h" #warning Using ESP32 Ethernet SPI W5500 +#define HASP_ETHERNET ETHSPI #else -#include - #define ETH_ADDR 0 #define ETH_POWER_PIN -1 #define ETH_MDC_PIN 23 @@ -249,10 +248,11 @@ static WiFiSpiClass WiFi; #define NRST 5 #define ETH_TYPE ETH_PHY_LAN8720 #define ETH_CLKMODE ETH_CLOCK_GPIO17_OUT - -#include "sys/net/hasp_ethernet_esp32.h" +#include #warning Using ESP32 Ethernet LAN8720 +#define HASP_ETHERNET ETH #endif // HASP_USE_SPI_ETHERNET + #else #if USE_BUILTIN_ETHERNET > 0 #include diff --git a/src/hasp/hasp_attribute.cpp b/src/hasp/hasp_attribute.cpp index 8478828e..772a0ba9 100644 --- a/src/hasp/hasp_attribute.cpp +++ b/src/hasp/hasp_attribute.cpp @@ -1320,7 +1320,7 @@ static hasp_attribute_type_t special_attribute_src(lv_obj_t* obj, const char* pa } } else { -#if defined(ARDUINO) && defined(ARDUINO_ARCH_ESP32) +#if defined(ARDUINO) && defined(ARDUINO_ARCH_ESP32) && 1 HTTPClient http; http.begin(payload); diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index ecc189a4..382fe196 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -1040,9 +1040,7 @@ void dispatch_reboot(bool saveConfig) #if HASP_USE_CONFIG > 0 debugStop(); #endif -#if HASP_USE_WIFI > 0 - wifiStop(); -#endif + networkStop(); LOG_VERBOSE(TAG_MSGR, F("-------------------------------------")); LOG_TRACE(TAG_MSGR, F(D_DISPATCH_REBOOT)); diff --git a/src/hasp_debug.h b/src/hasp_debug.h index f4a68901..3ff8d582 100644 --- a/src/hasp_debug.h +++ b/src/hasp_debug.h @@ -192,6 +192,7 @@ enum { TAG_MQTT_RCV = 67, TAG_FTP = 68, TAG_TIME = 69, + TAG_NETW = 70, TAG_LVGL = 90, TAG_LVFS = 91, diff --git a/src/sys/net/hasp_ethernet_esp32.cpp b/src/sys/net/hasp_ethernet_esp32.cpp index f7f14a5f..85e95c9b 100644 --- a/src/sys/net/hasp_ethernet_esp32.cpp +++ b/src/sys/net/hasp_ethernet_esp32.cpp @@ -8,39 +8,46 @@ #include "hal/hasp_hal.h" #include "dev/device.h" -#if HASP_USE_ETHERNET > 0 && defined(ARDUINO_ARCH_ESP32) && HASP_USE_SPI_ETHERNET == 0 +#if HASP_USE_ETHERNET > 0 && defined(ARDUINO_ARCH_ESP32) && defined(HASP_ETHERNET) +bool eth_connected = false; IPAddress ip; +void ethernet_get_ipaddress(char* buffer, size_t len) +{ + IPAddress ip = HASP_ETHERNET.localIP(); + snprintf_P(buffer, len, PSTR("%d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]); +} + void EthernetEvent(WiFiEvent_t event) { switch(event) { - case SYSTEM_EVENT_ETH_START: + case ARDUINO_EVENT_ETH_START: LOG_TRACE(TAG_ETH, F(D_SERVICE_STARTED)); // set eth hostname here - ETH.setHostname(haspDevice.get_hostname()); + HASP_ETHERNET.setHostname(haspDevice.get_hostname()); break; - case SYSTEM_EVENT_ETH_CONNECTED: + case ARDUINO_EVENT_ETH_CONNECTED: LOG_TRACE(TAG_ETH, F(D_SERVICE_CONNECTED)); eth_connected = true; break; - case SYSTEM_EVENT_ETH_GOT_IP: - LOG_TRACE(TAG_ETH, F(D_INFO_MAC_ADDRESS " %s"), ETH.macAddress().c_str()); - ip = ETH.localIP(); + case ARDUINO_EVENT_ETH_GOT_IP: + LOG_TRACE(TAG_ETH, F(D_INFO_MAC_ADDRESS " %s"), HASP_ETHERNET.macAddress().c_str()); + ip = HASP_ETHERNET.localIP(); LOG_TRACE(TAG_ETH, F("IPv4: %d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]); - if(ETH.fullDuplex()) { + if(HASP_ETHERNET.fullDuplex()) { LOG_TRACE(TAG_ETH, F(D_INFO_FULL_DUPLEX)); } - LOG_TRACE(TAG_ETH, F(D_INFO_LINK_SPEED " %d Mbps"), ETH.linkSpeed()); + LOG_TRACE(TAG_ETH, F(D_INFO_LINK_SPEED " %d Mbps"), HASP_ETHERNET.linkSpeed()); eth_connected = true; networkStart(); // Start network services break; - case SYSTEM_EVENT_ETH_DISCONNECTED: + case ARDUINO_EVENT_ETH_DISCONNECTED: LOG_TRACE(TAG_ETH, F(D_SERVICE_DISCONNECTED)); eth_connected = false; networkStop(); // Stop network services break; - case SYSTEM_EVENT_ETH_STOP: + case ARDUINO_EVENT_ETH_STOP: LOG_WARNING(TAG_ETH, F(D_SERVICE_STOPPED)); eth_connected = false; break; @@ -51,8 +58,22 @@ void EthernetEvent(WiFiEvent_t event) void ethernetSetup() { +#if HASP_USE_WIFI == 0 + // Need to make sure we get the Ethernet Events + WiFi.begin(); + WiFi.mode(WIFI_OFF); +#endif + + bool started = false; WiFi.onEvent(EthernetEvent); - ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLKMODE); +#if HASP_USE_SPI_ETHERNET > 0 + started = HASP_ETHERNET.begin(ETHSPI_MOSI_GPIO, ETHSPI_MISO_GPIO, ETHSPI_SCLK_GPIO, ETHSPI_CS_GPIO, ETHSPI_INT_GPIO, + ETHSPI_HOST); +#else + started = HASP_ETHERNET.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLKMODE); +#endif + + if(started) LOG_TRACE(TAG_ETH, F("ETHSPI Started ")); } IRAM_ATTR void ethernetLoop(void) @@ -67,8 +88,8 @@ bool ethernetEvery5Seconds() void ethernet_get_statusupdate(char* buffer, size_t len) { snprintf_P(buffer, len, PSTR("\"eth\":\"%s\",\"link\":\"%d Mbps\",\"ip\":\"%s\",\"mac\":\"%s\","), - eth_connected ? F("on") : F("off"), ETH.linkSpeed(), ETH.localIP().toString().c_str(), - ETH.macAddress().c_str()); + eth_connected ? F("on") : F("off"), HASP_ETHERNET.linkSpeed(), + HASP_ETHERNET.localIP().toString().c_str(), HASP_ETHERNET.macAddress().c_str()); } void ethernet_get_info(JsonDocument& doc) @@ -79,17 +100,17 @@ void ethernet_get_info(JsonDocument& doc) JsonObject info = doc.createNestedObject(F(D_INFO_ETHERNET)); - buffer = ETH.linkSpeed(); + buffer = HASP_ETHERNET.linkSpeed(); buffer += F(" Mbps"); - if(ETH.fullDuplex()) { + if(HASP_ETHERNET.fullDuplex()) { buffer += F(" " D_INFO_FULL_DUPLEX); } info[F(D_INFO_LINK_SPEED)] = buffer; - info[F(D_INFO_IP_ADDRESS)] = ETH.localIP().toString(); - info[F(D_INFO_GATEWAY)] = ETH.gatewayIP().toString(); - info[F(D_INFO_DNS_SERVER)] = ETH.dnsIP().toString(); - info[F(D_INFO_MAC_ADDRESS)] = ETH.macAddress(); + info[F(D_INFO_IP_ADDRESS)] = HASP_ETHERNET.localIP().toString(); + info[F(D_INFO_GATEWAY)] = HASP_ETHERNET.gatewayIP().toString(); + info[F(D_INFO_DNS_SERVER)] = HASP_ETHERNET.dnsIP().toString(); + info[F(D_INFO_MAC_ADDRESS)] = HASP_ETHERNET.macAddress(); } #endif \ No newline at end of file diff --git a/src/sys/net/hasp_ethernet_esp32.h b/src/sys/net/hasp_ethernet_esp32.h index 635cfb37..d3359a2c 100644 --- a/src/sys/net/hasp_ethernet_esp32.h +++ b/src/sys/net/hasp_ethernet_esp32.h @@ -6,14 +6,13 @@ #include "ArduinoJson.h" -static bool eth_connected = false; - void ethernetSetup(); IRAM_ATTR void ethernetLoop(void); bool ethernetEverySecond(); bool ethernetEvery5Seconds(); void ethernet_get_statusupdate(char* buffer, size_t len); +void ethernet_get_ipaddress(char* buffer, size_t len); void ethernet_get_info(JsonDocument& doc); diff --git a/src/sys/net/hasp_ethernet_spi.cpp b/src/sys/net/hasp_ethernet_spi.cpp deleted file mode 100644 index afa6ab27..00000000 --- a/src/sys/net/hasp_ethernet_spi.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* MIT License - Copyright (c) 2022 Ben Suffolk, ben@vanilla.net - For full license information read the LICENSE file in the project folder */ - - -#include "hasp_conf.h" -#include "hasp_debug.h" -#include "hasp_network.h" - -#include "hal/hasp_hal.h" -#include "dev/device.h" - -#if HASP_USE_ETHERNET > 0 && defined(ARDUINO_ARCH_ESP32) && HASP_USE_SPI_ETHERNET > 0 - -static bool eth_connected = false; - -void EthernetEvent(WiFiEvent_t event) -{ - IPAddress ip; - switch(event) { - case ARDUINO_EVENT_ETH_START: - LOG_TRACE(TAG_ETH, F(D_SERVICE_STARTED)); - // set eth hostname here - ETHSPI.setHostname(haspDevice.get_hostname()); - break; - case ARDUINO_EVENT_ETH_CONNECTED: - LOG_TRACE(TAG_ETH, F(D_SERVICE_CONNECTED)); - eth_connected = true; - break; - case ARDUINO_EVENT_ETH_GOT_IP: - LOG_TRACE(TAG_ETH, F(D_INFO_MAC_ADDRESS " %s"), ETHSPI.macAddress().c_str()); - ip = ETHSPI.localIP(); - LOG_TRACE(TAG_ETH, F("IPv4: %d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]); - if(ETHSPI.fullDuplex()) { - LOG_TRACE(TAG_ETH, F(D_INFO_FULL_DUPLEX)); - } - LOG_TRACE(TAG_ETH, F(D_INFO_LINK_SPEED " %d Mbps"), ETHSPI.linkSpeed()); - eth_connected = true; - networkStart(); // Start network services - break; - case ARDUINO_EVENT_ETH_DISCONNECTED: - LOG_TRACE(TAG_ETH, F(D_SERVICE_DISCONNECTED)); - eth_connected = false; - networkStop(); // Stop network services - break; - case ARDUINO_EVENT_ETH_STOP: - LOG_WARNING(TAG_ETH, F(D_SERVICE_STOPPED)); - eth_connected = false; - break; - default: - break; - } -} - -void ethernetSetup() -{ -#if HASP_USE_WIFI == 0 - // Need to make sure we get the Ethernet Events - WiFi.begin(); - WiFi.mode(WIFI_OFF); -#endif - - WiFi.onEvent(EthernetEvent); - ETHSPI.begin(); -} - -IRAM_ATTR void ethernetLoop(void) -{} - -bool ethernetEvery5Seconds() -{ - return eth_connected; -} - -void ethernet_get_statusupdate(char* buffer, size_t len) -{ - snprintf_P(buffer, len, PSTR("\"eth\":\"%s\",\"link\":\"%d Mbps\",\"ip\":\"%s\",\"mac\":\"%s\","), - eth_connected ? F("on") : F("off"), ETHSPI.linkSpeed(), ETHSPI.localIP().toString().c_str(), - ETHSPI.macAddress().c_str()); -} - -void ethernet_get_info(JsonDocument& doc) -{ - char size_buf[32]; - String buffer((char*)0); - buffer.reserve(64); - - JsonObject info = doc.createNestedObject(F(D_INFO_ETHERNET)); - - buffer = ETHSPI.linkSpeed(); - buffer += F(" Mbps"); - if(ETHSPI.fullDuplex()) { - buffer += F(" " D_INFO_FULL_DUPLEX); - } - - info[F(D_INFO_LINK_SPEED)] = buffer; - info[F(D_INFO_IP_ADDRESS)] = ETHSPI.localIP().toString(); - info[F(D_INFO_GATEWAY)] = ETHSPI.gatewayIP().toString(); - info[F(D_INFO_DNS_SERVER)] = ETHSPI.dnsIP().toString(); - info[F(D_INFO_MAC_ADDRESS)] = ETHSPI.macAddress(); -} - -#endif - diff --git a/src/sys/net/hasp_ethernet_spi.h b/src/sys/net/hasp_ethernet_spi.h deleted file mode 100644 index 472def7d..00000000 --- a/src/sys/net/hasp_ethernet_spi.h +++ /dev/null @@ -1,18 +0,0 @@ -/* MIT License - Copyright (c) 2022 Ben Suffolk, ben@vanilla.net - For full license information read the LICENSE file in the project folder */ - -#ifndef HASP_ETHERNET_SPI_H -#define HASP_ETHERNET_SPI_H - -#include "ArduinoJson.h" - -void ethernetSetup(); -IRAM_ATTR void ethernetLoop(void); - -bool ethernetEverySecond(); -bool ethernetEvery5Seconds(); -void ethernet_get_statusupdate(char* buffer, size_t len); - -void ethernet_get_info(JsonDocument& doc); - -#endif diff --git a/src/sys/net/hasp_ethernet_stm32.h b/src/sys/net/hasp_ethernet_stm32.h index f4d77e5c..10064158 100644 --- a/src/sys/net/hasp_ethernet_stm32.h +++ b/src/sys/net/hasp_ethernet_stm32.h @@ -6,8 +6,6 @@ #include "ArduinoJson.h" -static bool eth_connected = false; - void ethernetSetup(); void ethernetLoop(void); diff --git a/src/sys/net/hasp_network.cpp b/src/sys/net/hasp_network.cpp index 4c55ba56..cf2f8c09 100644 --- a/src/sys/net/hasp_network.cpp +++ b/src/sys/net/hasp_network.cpp @@ -8,9 +8,50 @@ #include "hasp_network.h" #include "sys/svc/hasp_mdns.h" -bool haspOnline = false; +bool last_network_state = false; +bool current_network_state = false; +uint16_t network_reconnect_counter = 0; #if HASP_USE_ETHERNET > 0 || HASP_USE_WIFI > 0 + +void network_disconnected() +{ + + // if(wifiReconnectCounter++ % 5 == 0) + // LOG_WARNING(TAG_NETW, F("Disconnected from %s (Reason: %s [%d])"), ssid, buffer, reason); + + // if(!current_network_state) return; // we were not connected + + current_network_state = false; // now we are disconnected + network_reconnect_counter++; + // LOG_VERBOSE(TAG_NETW, F("Connected = %s"), + // WiFi.status() == WL_CONNECTED ? PSTR(D_NETWORK_ONLINE) : PSTR(D_NETWORK_OFFLINE)); +} + +void network_connected() +{ + if(current_network_state) return; // already connected + + current_network_state = true; // now we are connected + network_reconnect_counter = 0; + LOG_VERBOSE(TAG_NETW, F("Connected = %s"), + WiFi.status() == WL_CONNECTED ? PSTR(D_NETWORK_ONLINE) : PSTR(D_NETWORK_OFFLINE)); +} + +void network_run_scripts() +{ + if(last_network_state != current_network_state) { + if(current_network_state) { + dispatch_exec(NULL, "L:/online.cmd", TAG_NETW); + networkStart(); + } else { + dispatch_exec(NULL, "L:/offline.cmd", TAG_NETW); + networkStop(); + } + last_network_state = current_network_state; + } +} + void networkStart(void) { // haspProgressVal(255); // hide @@ -31,6 +72,7 @@ void networkStart(void) void networkStop(void) { haspProgressMsg(F("Network Disconnected")); + network_reconnect_counter = 0; // Prevent endless loop in wifiDisconnected debugStopSyslog(); // mqttStop(); @@ -41,8 +83,15 @@ void networkStop(void) #if HASP_USE_MDNS > 0 mdnsStop(); #endif -} +#if HASP_USE_ETHERNET > 0 + // ethernetStop(); +#endif + +#if HASP_USE_WIFI > 0 + wifiStop(); +#endif +} void networkSetup() { #if HASP_USE_ETHERNET > 0 @@ -54,14 +103,6 @@ void networkSetup() #endif } -void network_run_scripts() -{ - if(haspOnline) - dispatch_exec(NULL, "L:/online.cmd", TAG_WIFI); - else - dispatch_exec(NULL, "L:/offline.cmd", TAG_WIFI); -} - IRAM_ATTR void networkLoop(void) { #if HASP_USE_ETHERNET > 0 @@ -99,41 +140,8 @@ IRAM_ATTR void networkLoop(void) bool networkEvery5Seconds(void) { -#if HASP_USE_ETHERNET > 0 - if(ethernetEvery5Seconds() != haspOnline) { - haspOnline = !haspOnline; - LOG_WARNING(TAG_ETH, haspOnline ? F(D_NETWORK_ONLINE) : F(D_NETWORK_OFFLINE)); - - if(haspOnline) { - networkStart(); - } else { - networkStop(); - } - - network_run_scripts(); - } - - return haspOnline; -#endif - -#if HASP_USE_WIFI > 0 - if(wifiEvery5Seconds() != haspOnline) { - haspOnline = !haspOnline; - LOG_WARNING(TAG_WIFI, haspOnline ? F(D_NETWORK_ONLINE) : F(D_NETWORK_OFFLINE)); - - if(haspOnline) { - networkStart(); - } else { - networkStop(); - } - - network_run_scripts(); - } - - return haspOnline; -#endif - - return false; + if(current_network_state != last_network_state) network_run_scripts(); + return current_network_state; } /* bool networkEverySecond(void) @@ -180,6 +188,7 @@ void network_get_ipaddress(char* buffer, size_t len) #endif snprintf_P(buffer, len, PSTR("%d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]); return; + ethernet_get_ipaddress(buffer, len); #endif #if HASP_USE_WIFI > 0 diff --git a/src/sys/net/hasp_network.h b/src/sys/net/hasp_network.h index 07fe7156..83f9b7b2 100644 --- a/src/sys/net/hasp_network.h +++ b/src/sys/net/hasp_network.h @@ -13,7 +13,9 @@ void networkStart(void); void networkStop(void); /* ===== Special Event Processors ===== */ -void network_run_scripts(); +void network_connected(); +void network_disconnected(); +void network_run_scripts(); /* ===== Getter and Setter Functions ===== */ void network_get_statusupdate(char* buffer, size_t len); diff --git a/src/sys/net/hasp_wifi.cpp b/src/sys/net/hasp_wifi.cpp index 1c5ebacb..a11ebd18 100644 --- a/src/sys/net/hasp_wifi.cpp +++ b/src/sys/net/hasp_wifi.cpp @@ -41,16 +41,14 @@ SPIClass espSPI(ESPSPI_MOSI, ESPSPI_MISO, ESPSPI_SCLK); // SPI port where esp is char wifiSsid[MAX_USERNAME_LENGTH] = WIFI_SSID; char wifiPassword[MAX_PASSWORD_LENGTH] = WIFI_PASSWORD; char wifiIpAddress[16] = ""; -uint16_t wifiReconnectCounter = 0; -bool wifiOnline = false; bool wifiEnabled = true; +extern uint16_t network_reconnect_counter; // const byte DNS_PORT = 53; // DNSServer dnsServer; /* ============ Connection Event Handlers =============================================================== */ - static void wifiConnected(IPAddress ipaddress) { #if defined(STM32F4xx) @@ -63,18 +61,13 @@ static void wifiConnected(IPAddress ipaddress) if((uint32_t)ipaddress == 0) { LOG_ERROR(TAG_WIFI, F(D_NETWORK_IP_ADDRESS_RECEIVED), wifiIpAddress); - wifiOnline = false; + network_disconnected(); return; } else { LOG_TRACE(TAG_WIFI, F(D_NETWORK_IP_ADDRESS_RECEIVED), wifiIpAddress); } - if(wifiOnline) return; // already connected - - wifiOnline = true; // now we are connected - wifiReconnectCounter = 0; - LOG_VERBOSE(TAG_WIFI, F("Connected = %s"), - WiFi.status() == WL_CONNECTED ? PSTR(D_NETWORK_ONLINE) : PSTR(D_NETWORK_OFFLINE)); + network_connected(); } static void wifiDisconnected(const char* ssid, uint8_t reason) @@ -265,14 +258,7 @@ static void wifiDisconnected(const char* ssid, uint8_t reason) snprintf_P(buffer, sizeof(buffer), PSTR(D_ERROR_UNKNOWN)); } - if(wifiReconnectCounter++ % 5 == 0) - LOG_WARNING(TAG_WIFI, F("Disconnected from %s (Reason: %s [%d])"), ssid, buffer, reason); - - if(!wifiOnline) return; // we were not connected - - wifiOnline = false; // now we are disconnected - LOG_VERBOSE(TAG_WIFI, F("Connected = %s"), - WiFi.status() == WL_CONNECTED ? PSTR(D_NETWORK_ONLINE) : PSTR(D_NETWORK_OFFLINE)); + network_disconnected(); } static void wifiSsidConnected(const char* ssid) @@ -519,7 +505,7 @@ bool wifiEvery5Seconds() } if(wifiEnabled) { - LOG_WARNING(TAG_WIFI, F("No Connection... retry %d"), wifiReconnectCounter); + LOG_WARNING(TAG_WIFI, F("No Connection... retry %d"), network_reconnect_counter); wifiReconnect(); } @@ -565,7 +551,6 @@ bool wifiValidateSsid(const char* ssid, const char* pass) void wifiStop() { - wifiReconnectCounter = 0; // Prevent endless loop in wifiDisconnected WiFi.disconnect(true); #if !defined(STM32F4xx) WiFi.mode(WIFI_OFF);