Merge ethernet_esp32 and esthernet_spi.cpp

This commit is contained in:
fvanroie 2022-06-11 19:16:21 +02:00
parent 2af1f4800e
commit 0f95052dc3
12 changed files with 112 additions and 220 deletions

View File

@ -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 <ETHSPI.h>
#include "sys/net/hasp_ethernet_spi.h"
#warning Using ESP32 Ethernet SPI W5500
#define HASP_ETHERNET ETHSPI
#else
#include <ETH.h>
#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 <ETH.h>
#warning Using ESP32 Ethernet LAN8720
#define HASP_ETHERNET ETH
#endif // HASP_USE_SPI_ETHERNET
#else
#if USE_BUILTIN_ETHERNET > 0
#include <LwIP.h>

View File

@ -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);

View File

@ -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));

View File

@ -192,6 +192,7 @@ enum {
TAG_MQTT_RCV = 67,
TAG_FTP = 68,
TAG_TIME = 69,
TAG_NETW = 70,
TAG_LVGL = 90,
TAG_LVFS = 91,

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -6,8 +6,6 @@
#include "ArduinoJson.h"
static bool eth_connected = false;
void ethernetSetup();
void ethernetLoop(void);

View File

@ -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

View File

@ -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);

View File

@ -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);