diff --git a/EthernetInterface.cpp b/EthernetInterface.cpp index 5cf531c..993d5d0 100644 --- a/EthernetInterface.cpp +++ b/EthernetInterface.cpp @@ -41,8 +41,11 @@ void EthernetInterface::setup() DIAG(F("Prog Error!")); return; } - if ((singleton=new EthernetInterface())) + DIAG(F("Ethernet Class setup, attempting to instantiate")); + if ((singleton=new EthernetInterface())) { + DIAG(F("Ethernet Class initialized")); return; + } DIAG(F("Ethernet not initialized")); }; @@ -55,24 +58,48 @@ void EthernetInterface::setup() */ EthernetInterface::EthernetInterface() { - byte mac[6]; - DCCTimer::getSimulatedMacAddress(mac); connected=false; - - #ifdef IP_ADDRESS - Ethernet.begin(mac, IP_ADDRESS); - #else - if (Ethernet.begin(mac) == 0) +#if defined(STM32_ETHERNET) + // Set a HOSTNAME for the DHCP request - a nice to have, but hard it seems on LWIP for STM32 + // The default is "lwip", which is **always** set in STM32Ethernet/src/utility/ethernetif.cpp + // for some reason. One can edit it to instead read: + // #if LWIP_NETIF_HOSTNAME + // /* Initialize interface hostname */ + // if (netif->hostname == NULL) + // netif->hostname = "lwip"; + // #endif /* LWIP_NETIF_HOSTNAME */ + // Which seems more useful! We should propose the patch... so the following line actually works! + netif_set_hostname(&gnetif, WIFI_HOSTNAME); // Should probably be passed in the contructor... + #ifdef IP_ADDRESS + if (Ethernet.begin(IP_ADDRESS) == 0) + #else + if (Ethernet.begin() == 0) + #endif // IP_ADDRESS { DIAG(F("Ethernet.begin FAILED")); return; } - #endif +#else // All other architectures + byte mac[6]= { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + DIAG(F("Ethernet attempting to get MAC address")); + DCCTimer::getSimulatedMacAddress(mac); + DIAG(F("Ethernet got MAC address")); + #ifdef IP_ADDRESS + if (Ethernet.begin(IP_ADDRESS) == 0) + #else + if (Ethernet.begin(mac, IP_ADDRESS) == 0) + #endif + { + DIAG(F("Ethernet.begin FAILED")); + return; + } + if (Ethernet.hardwareStatus() == EthernetNoHardware) { DIAG(F("Ethernet shield not found or W5100")); } - - unsigned long startmilli = millis(); +#endif + + uint32_t startmilli = millis(); while ((millis() - startmilli) < 5500) { // Loop to give time to check for cable connection if (Ethernet.linkStatus() == LinkON) break; @@ -171,17 +198,25 @@ void EthernetInterface::loop2() { return; } // get client from the server + #if defined (STM32_ETHERNET) + // STM32Ethernet doesn't use accept(), just available() + EthernetClient client = server->available(); + #else EthernetClient client = server->accept(); - + #endif // check for new client if (client) { - if (Diag::ETHERNET) DIAG(F("Ethernet: New client ")); byte socket; for (socket = 0; socket < MAX_SOCK_NUM; socket++) { - if (!clients[socket]) + if (clients[socket]) { + if (clients[socket] == client) + break; + } + else //if (!clients[socket]) { + if (Diag::ETHERNET) DIAG(F("Ethernet: New client ")); // On accept() the EthernetServer doesn't track the client anymore // so we store it in our client array if (Diag::ETHERNET) DIAG(F("Socket %d"),socket); diff --git a/EthernetInterface.h b/EthernetInterface.h index 8078c3f..f4f18dd 100644 --- a/EthernetInterface.h +++ b/EthernetInterface.h @@ -35,8 +35,18 @@ #if defined (ARDUINO_TEENSY41) #include //TEENSY Ethernet Treiber #include + #define MAX_SOCK_NUM 4 +#elif defined (ARDUINO_NUCLEO_F429ZI) || defined (ARDUINO_NUCLEO_F439ZI) + #include +// #include "STM32lwipopts.h" + #include + #include + extern "C" struct netif gnetif; + #define STM32_ETHERNET + #define MAX_SOCK_NUM 10 #else #include "Ethernet.h" + #define MAX_SOCK_NUM 4 #endif #include "RingStream.h" diff --git a/I2CManager_STM32.h b/I2CManager_STM32.h index 7e0f547..f386959 100644 --- a/I2CManager_STM32.h +++ b/I2CManager_STM32.h @@ -39,7 +39,8 @@ #if defined(I2C_USE_INTERRUPTS) && defined(ARDUINO_ARCH_STM32) #if defined(ARDUINO_NUCLEO_F401RE) || defined(ARDUINO_NUCLEO_F411RE) || defined(ARDUINO_NUCLEO_F446RE) \ || defined(ARDUINO_NUCLEO_F412ZG) || defined(ARDUINO_NUCLEO_F413ZH) \ - || defined(ARDUINO_NUCLEO_F429ZI) || defined(ARDUINO_NUCLEO_F446ZE) + || defined(ARDUINO_NUCLEO_F429ZI) || defined(ARDUINO_NUCLEO_F439ZI) \ + || defined(ARDUINO_NUCLEO_F446ZE) // Assume I2C1 for now - default I2C bus on Nucleo-F411RE and likely all Nucleo-64 // and Nucleo-144 variants I2C_TypeDef *s = I2C1; diff --git a/platformio.ini b/platformio.ini index 8767ef1..93804de 100644 --- a/platformio.ini +++ b/platformio.ini @@ -30,7 +30,6 @@ include_dir = . [env] build_flags = -Wall -Wextra -; monitor_filters = time [env:samd21-dev-usb] platform = atmelsam @@ -245,18 +244,32 @@ monitor_echo = yes ; Experimental - Ethernet work still in progress ; -; [env:Nucleo-F429ZI] -; platform = ststm32 -; board = nucleo_f429zi -; framework = arduino -; lib_deps = ${env.lib_deps} -; arduino-libraries/Ethernet @ ^2.0.1 -; stm32duino/STM32Ethernet @ ^1.3.0 -; stm32duino/STM32duino LwIP @ ^2.1.2 -; build_flags = -std=c++17 -Os -g2 -Wunused-variable -; monitor_speed = 115200 -; monitor_echo = yes -; upload_protocol = stlink +[env:Nucleo-F429ZI] +platform = ststm32 +board = nucleo_f429zi +framework = arduino +lib_deps = ${env.lib_deps} + stm32duino/STM32Ethernet @ ^1.3.0 + stm32duino/STM32duino LwIP @ ^2.1.2 +build_flags = -std=c++17 -Os -g2 -Wunused-variable +monitor_speed = 115200 +monitor_echo = yes +upload_protocol = stlink + +; Experimental - Ethernet work still in progress +; Commented out as the F439ZI also needs variant files +; +[env:Nucleo-F439ZI] +platform = ststm32 +board = nucleo_f439zi +framework = arduino +lib_deps = ${env.lib_deps} + stm32duino/STM32Ethernet @ ^1.3.0 + stm32duino/STM32duino LwIP @ ^2.1.2 +build_flags = -std=c++17 -Os -g2 -Wunused-variable +monitor_speed = 115200 +monitor_echo = yes +upload_protocol = stlink [env:Teensy3_2] platform = teensy diff --git a/version.h b/version.h index a6265d8..2e12d24 100644 --- a/version.h +++ b/version.h @@ -3,7 +3,9 @@ #include "StringFormatter.h" -#define VERSION "5.2.14" +#define VERSION "5.2.14eth" +// 5.2.14eth - Initial ethernet code for STM32F429ZI and F439ZI boards +// - CMRI RS485 connection // 5.2.14 - Reminder window DCC packet optimization // - Optional #define DISABLE_FUNCTION_REMINDERS // 5.2.13 - EXRAIL STEALTH