diff --git a/src/localmodbus.cpp b/src/localmodbus.cpp index d5c6820..d498c54 100644 --- a/src/localmodbus.cpp +++ b/src/localmodbus.cpp @@ -1,9 +1,16 @@ #include "localmodbus.h" +#include #define ETAG "\"" __DATE__ "" __TIME__ "\"" static ModbusClientRTU* _rtu = NULL; static ModbusBridgeWiFi* _bridge = NULL; +// FreeRTOS-task to pause some time and then reboot +void rebootAfterDelay(void * parameter){ + vTaskDelay((uint32_t) parameter / portTICK_PERIOD_MS); + ESP.restart(); + vTaskDelete(NULL); // will probably not be reached... +} // FC03: worker do serve Modbus function code 0x03 (READ_HOLD_REGISTER) ModbusMessage FC03(ModbusMessage request) { @@ -11,7 +18,7 @@ ModbusMessage FC03(ModbusMessage request) { uint16_t words; // requested number of registers ModbusMessage response; // response message to be sent back - LOG_D("WORKER CALLED FC03"); + LOG_D("Worker for FC03\n"); // get request values request.get(2, address); @@ -38,7 +45,7 @@ ModbusMessage FC08(ModbusMessage request) { ModbusMessage response; // response message to be sent back uint16_t resultWord = 0; - LOG_D("WORKER CALLED FC08\n"); + LOG_D("Worker for FC08\n"); // get request values request.get(2, subFunctionCode); @@ -51,9 +58,13 @@ ModbusMessage FC08(ModbusMessage request) { case RESTART_COMMUNICATION_OPTION: LOG_D("Restart Communications Option\n"); response = request; + // create a task to reboot + xTaskCreate(rebootAfterDelay, "rebootAfterDelay", configMINIMAL_STACK_SIZE, + (void*) 1000, // delay for 1000 ms + 1, NULL); break; case CLEAR_COUNTERS_AND_DIAGNOSTIC_REGISTER: - LOG_D("Restart Communications Option\n"); + LOG_D("Clear Counters and Diagnostic Register\n"); if(_rtu != NULL) { _rtu->resetCounts(); } @@ -65,21 +76,21 @@ ModbusMessage FC08(ModbusMessage request) { case RETURN_BUS_MESSAGE_COUNT: LOG_D("Return Bus Message Count\n"); if(_bridge != NULL) { - resultWord = _bridge->getMessageCount(); + resultWord = (uint16_t) _bridge->getMessageCount(); } response = ModbusMessage(request.getServerID(), DIAGNOSTICS_SERIAL, RETURN_BUS_MESSAGE_COUNT, resultWord); break; case RETURN_BUS_COMMUNICATION_ERROR_COUNT: LOG_D("Return Bus Communication Error Count\n"); if(_bridge != NULL) { - resultWord = _bridge->getErrorCount(); + resultWord = (uint16_t) _bridge->getErrorCount(); } response = ModbusMessage(request.getServerID(), DIAGNOSTICS_SERIAL, RETURN_BUS_COMMUNICATION_ERROR_COUNT, resultWord); break; case RETURN_SLAVE_MESSAGE_COUNT: LOG_D("Return Slave Message Count\n"); if(_rtu != NULL) { - resultWord = _rtu->getMessageCount(); + resultWord = (uint16_t) _rtu->getMessageCount(); } response = ModbusMessage(request.getServerID(), DIAGNOSTICS_SERIAL, RETURN_SLAVE_MESSAGE_COUNT, resultWord); break; @@ -92,8 +103,8 @@ ModbusMessage FC08(ModbusMessage request) { } void setupLocalModbus(uint8_t serverID, ModbusClientRTU *rtu, ModbusBridgeWiFi *bridge, Config *config, WiFiManager *wm) { - String EfuseMac = String(ESP.getEfuseMac(), 16); - dbgln(EfuseMac); + // String EfuseMac = String(ESP.getEfuseMac(), 16); + // dbgln(EfuseMac); _rtu = rtu; _bridge = bridge; bridge->registerWorker(serverID, READ_HOLD_REGISTER, &FC03); diff --git a/src/main.cpp b/src/main.cpp index b6b7492..976d8a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,16 +23,29 @@ boolean isConnected(false); // Start mDNS for webserver and modbus void startMDNS(uint16_t webPort = 80, uint16_t modbusPort = 502) { // start mDNS - MDNS.begin(WiFi.getHostname()); - MDNS.addService("http", "tcp", webPort); - MDNS.addService("modbus", "tcp", modbusPort); + if(!MDNS.begin(WiFi.getHostname())) { + dbgln("[WiFi] failed to start mDNS"); + return; + } + if(!MDNS.addService("http", "tcp", webPort)) { + dbgln("[WiFi] failed to add service for http"); + return; + } + if(!MDNS.addService("modbus", "tcp", modbusPort)) { + dbgln("[WiFi] failed to add service for modbus"); + return; + } }; // Connect to Wifi boolean WiFiConnect() { // Set Hostname + dbg("[WiFi] Hostname: ") if(config.getHostname().length() > 2) { WiFi.setHostname(config.getHostname().c_str()); + dbgln(config.getHostname()); + } else { + dbgln(WiFi.getHostname()); } // Set WiFi to station mode WiFi.mode(WIFI_STA); @@ -47,11 +60,11 @@ boolean WiFiConnect() { ESP.restart(); } if(WiFi.getMode() == WIFI_MODE_STA) { - dbgln("[WiFi] connected in WIFI_MODE_STA"); + dbgln("[WiFi] connected to AP"); wm.setWiFiAutoReconnect(false); return true; } else { - dbgln("[WiFi] NOT connected in WIFI_MODE_STA"); + dbgln("[WiFi] NOT connected"); return false; } }; @@ -59,11 +72,11 @@ boolean WiFiConnect() { // Callback for reconnecting void WiFiLostIP(WiFiEvent_t event, WiFiEventInfo_t info) { dbgln("[WiFi] (possibly) disconnected"); - wm.disconnect(); - dbgln("[WiFi] trying to reconnect"); MDNS.end(); + wm.disconnect(); - isConnected = false; + // reconnect to AP + dbgln("[WiFi] trying to reconnect"); isConnected = WiFiConnect(); // Start mDNS @@ -124,8 +137,8 @@ void setup() { // Start mDNS startMDNS(80, config.getTcpPort()); - // Register Callbacks for re-starting mDNs after disconnect - WiFi.onEvent(WiFiLostIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED); + // Register Callback for re-starting mDNs after disconnect + WiFi.onEvent(WiFiLostIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_LOST_IP); dbgln("[setup] finished"); } diff --git a/src/pages.cpp b/src/pages.cpp index 59bdcd9..2494fcf 100644 --- a/src/pages.cpp +++ b/src/pages.cpp @@ -534,19 +534,19 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi * sendResponseTrailer(response); request->send(response); - // reset when requested - if(config->getLocalModbusEnable()) { - if(slaveId.toInt() == config->getLocalModbusAddress()) { - if(answer.getFunctionCode() == DIAGNOSTICS_SERIAL) { - uint16_t subFunctionCode; // Sub-function code - answer.get(2, subFunctionCode); - if(subFunctionCode == RESTART_COMMUNICATION_OPTION) { - dbgln("[webserver] rebooting..."); - ESP.restart(); - } - } - } - } + // // reset when requested + // if(config->getLocalModbusEnable()) { + // if(slaveId.toInt() == config->getLocalModbusAddress()) { + // if(answer.getFunctionCode() == DIAGNOSTICS_SERIAL) { + // uint16_t subFunctionCode; // Sub-function code + // answer.get(2, subFunctionCode); + // if(subFunctionCode == RESTART_COMMUNICATION_OPTION) { + // dbgln("[webserver] rebooting..."); + // ESP.restart(); + // } + // } + // } + // } }); server->on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ @@ -796,6 +796,7 @@ void sendDebugForm_diagnosticSerial(AsyncResponseStream *response, String slaveI response->printf("", data.c_str()); response->print("" "" + " " ""); response->print("" "" @@ -849,8 +850,9 @@ void sendDebugForm_read(AsyncResponseStream *response, String slaveId, String re response->printf("", count.c_str()); response->print("" "" + " " ""); - response->print("" + response->print("" "" "

"); response->print("