Skip to content

Commit

Permalink
Reboot task added
Browse files Browse the repository at this point in the history
  • Loading branch information
soylentOrange committed Oct 10, 2024
1 parent 551f167 commit 399567f
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 32 deletions.
27 changes: 19 additions & 8 deletions src/localmodbus.cpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
#include "localmodbus.h"
#include <esp_task_wdt.h>
#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) {
uint16_t address; // requested register address
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);
Expand All @@ -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);
Expand All @@ -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();
}
Expand All @@ -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;
Expand All @@ -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);
Expand Down
33 changes: 23 additions & 10 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -47,23 +60,23 @@ 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;
}
};

// 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
Expand Down Expand Up @@ -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");
}

Expand Down
30 changes: 16 additions & 14 deletions src/pages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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){
Expand Down Expand Up @@ -796,6 +796,7 @@ void sendDebugForm_diagnosticSerial(AsyncResponseStream *response, String slaveI
response->printf("<input type=\"text\" minlength=\"0\" maxlength=\"4\" id=\"dt\" name=\"dt\" value=\"%s\">", data.c_str());
response->print("</td>"
"</tr>"
"<tr><td>&nbsp;</td><td></td></tr>"
"</table>");
response->print("<button class=\"r\">Make it so</button>"
"</form>"
Expand Down Expand Up @@ -849,8 +850,9 @@ void sendDebugForm_read(AsyncResponseStream *response, String slaveId, String re
response->printf("<input type=\"number\" min=\"0\" max=\"65535\" id=\"count\" name=\"count\" value=\"%s\">", count.c_str());
response->print("</td>"
"</tr>"
"<tr><td>&nbsp;</td><td></td></tr>"
"</table>");
response->print("<button class=\"r\">Send</button>"
response->print("<button class=\"r\">Make it so</button>"
"</form>"
"<p></p>");
response->print("<script>"
Expand Down

0 comments on commit 399567f

Please sign in to comment.