Skip to content

Commit

Permalink
add serial config
Browse files Browse the repository at this point in the history
  • Loading branch information
zivillian committed Jun 17, 2022
1 parent 2085b6b commit 4c4afe9
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 39 deletions.
15 changes: 13 additions & 2 deletions include/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,32 @@
Preferences *_prefs;
int16_t _tcpPort;
unsigned long _modbusBaudRate;
uint32_t _modbusSerialConfig;
uint32_t _modbusConfig;
unsigned long _serialBaudRate;
uint32_t _serialConfig;
public:
Config();
void begin(Preferences *prefs);
uint16_t getTcpPort();
void setTcpPort(uint16_t value);
uint32_t getModbusConfig();
unsigned long getModbusBaudRate();
uint32_t getModbusSerialConfig();
void setModbusBaudRate(unsigned long value);
uint8_t getModbusDataBits();
void setModbusDataBits(uint8_t value);
uint8_t getModbusParity();
void setModbusParity(uint8_t value);
uint8_t getModbusStopBits();
void setModbusStopBits(uint8_t value);
uint32_t getSerialConfig();
unsigned long getSerialBaudRate();
void setSerialBaudRate(unsigned long value);
uint8_t getSerialDataBits();
void setSerialDataBits(uint8_t value);
uint8_t getSerialParity();
void setSerialParity(uint8_t value);
uint8_t getSerialStopBits();
void setSerialStopBits(uint8_t value);
};
#ifdef DEBUG
#define dbg(x...) debugSerial.print(x);
Expand Down
3 changes: 2 additions & 1 deletion platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ lib_deps =
https://github.com/tzapu/WiFiManager.git
https://github.com/me-no-dev/ESPAsyncWebServer.git
eModbus
;build_flags = -DLOG_LEVEL=LOG_LEVEL_DEBUG
;build_flags = -DLOG_LEVEL=LOG_LEVEL_DEBUG
monitor_speed = 115200
81 changes: 68 additions & 13 deletions src/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,19 @@ Config::Config()
:_prefs(NULL)
,_tcpPort(502)
,_modbusBaudRate(9600)
,_modbusSerialConfig(SERIAL_8N1)
,_modbusConfig(SERIAL_8N1)
,_serialBaudRate(115200)
,_serialConfig(SERIAL_8N1)
{}

void Config::begin(Preferences *prefs)
{
_prefs = prefs;
_tcpPort = _prefs->getUShort("tcpPort", _tcpPort);
_modbusBaudRate = _prefs->getULong("modbusBaudRate", _modbusBaudRate);
_modbusSerialConfig = _prefs->getULong("modbusSerialConfig", _modbusSerialConfig);
_modbusConfig = _prefs->getULong("modbusConfig", _modbusConfig);
_serialBaudRate = _prefs->getULong("serialBaudRate", _serialBaudRate);
_serialConfig = _prefs->getULong("serialConfig", _serialConfig);
}

uint16_t Config::getTcpPort(){
Expand All @@ -25,8 +29,8 @@ void Config::setTcpPort(uint16_t value){
_prefs->putUShort("tcpPort", _tcpPort);
}

uint32_t Config::getModbusSerialConfig(){
return _modbusSerialConfig;
uint32_t Config::getModbusConfig(){
return _modbusConfig;
}

unsigned long Config::getModbusBaudRate(){
Expand All @@ -40,38 +44,89 @@ void Config::setModbusBaudRate(unsigned long value){
}

uint8_t Config::getModbusDataBits(){
return ((_modbusSerialConfig & 0xc) >> 2) + 5;
return ((_modbusConfig & 0xc) >> 2) + 5;
}

void Config::setModbusDataBits(uint8_t value){
auto dataBits = getModbusDataBits();
value -= 5;
value = (value << 2) & 0xc;
if (value == dataBits) return;
_modbusSerialConfig = (_modbusSerialConfig & 0xfffffff3) | value;
_prefs->putULong("modbusSerialConfig", _modbusSerialConfig);
_modbusConfig = (_modbusConfig & 0xfffffff3) | value;
_prefs->putULong("modbusConfig", _modbusConfig);
}

uint8_t Config::getModbusParity(){
return _modbusSerialConfig & 0x3;
return _modbusConfig & 0x3;
}

void Config::setModbusParity(uint8_t value){
auto parity = getModbusParity();
value = value & 0x3;
if (parity == value) return;
_modbusSerialConfig = (_modbusSerialConfig & 0xfffffffc) | value;
_prefs->putULong("modbusSerialConfig", _modbusSerialConfig);
_modbusConfig = (_modbusConfig & 0xfffffffc) | value;
_prefs->putULong("modbusConfig", _modbusConfig);
}

uint8_t Config::getModbusStopBits(){
return (_modbusSerialConfig & 0x30) >> 4;
return (_modbusConfig & 0x30) >> 4;
}

void Config::setModbusStopBits(uint8_t value){
auto stopbits = getModbusStopBits();
value = (value << 4) & 0x30;
if (stopbits == value) return;
_modbusSerialConfig = (_modbusSerialConfig & 0xffffffcf) | value;
_prefs->putULong("modbusSerialConfig", _modbusSerialConfig);
_modbusConfig = (_modbusConfig & 0xffffffcf) | value;
_prefs->putULong("modbusConfig", _modbusConfig);
}

uint32_t Config::getSerialConfig(){
return _serialConfig;
}

unsigned long Config::getSerialBaudRate(){
return _serialBaudRate;
}

void Config::setSerialBaudRate(unsigned long value){
if (_serialBaudRate == value) return;
_serialBaudRate = value;
_prefs->putULong("serialBaudRate", _serialBaudRate);
}

uint8_t Config::getSerialDataBits(){
return ((_serialConfig & 0xc) >> 2) + 5;
}

void Config::setSerialDataBits(uint8_t value){
auto dataBits = getSerialDataBits();
value -= 5;
value = (value << 2) & 0xc;
if (value == dataBits) return;
_serialConfig = (_serialConfig & 0xfffffff3) | value;
_prefs->putULong("serialConfig", _serialConfig);
}

uint8_t Config::getSerialParity(){
return _serialConfig & 0x3;
}

void Config::setSerialParity(uint8_t value){
auto parity = getSerialParity();
value = value & 0x3;
if (parity == value) return;
_serialConfig = (_serialConfig & 0xfffffffc) | value;
_prefs->putULong("serialConfig", _serialConfig);
}

uint8_t Config::getSerialStopBits(){
return (_serialConfig & 0x30) >> 4;
}

void Config::setSerialStopBits(uint8_t value){
auto stopbits = getSerialStopBits();
value = (value << 4) & 0x30;
if (stopbits == value) return;
_serialConfig = (_serialConfig & 0xffffffcf) | value;
_prefs->putULong("serialConfig", _serialConfig);
}
6 changes: 4 additions & 2 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,19 @@ ModbusBridgeWiFi MBbridge;
WiFiManager wm;

void setup() {
debugSerial.begin(9600);
debugSerial.begin(115200);
dbgln();
dbgln("[config] load")
prefs.begin("modbusRtuGw");
config.begin(&prefs);
debugSerial.end();
debugSerial.begin(config.getSerialBaudRate(), config.getSerialConfig());
dbgln("[wifi] start");
WiFi.mode(WIFI_STA);
wm.autoConnect();
dbgln("[wifi] finished");
dbgln("[modbus] start");
modbusSerial.begin(config.getModbusBaudRate(), config.getModbusSerialConfig());
modbusSerial.begin(config.getModbusBaudRate(), config.getModbusConfig());
MBclient.setTimeout(1000);
MBclient.begin();
for (uint8_t i = 1; i < 248; i++)
Expand Down
108 changes: 87 additions & 21 deletions src/pages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
server->on("/config", HTTP_GET, [config](AsyncWebServerRequest *request){
dbgln("[webserver] GET /config");
auto *response = request->beginResponseStream("text/html");
sendResponseHeader(response, "Config");
sendResponseHeader(response, "Modbus TCP");
response->print("<form method=\"post\">");
response->print("<table>"
"<tr>"
Expand All @@ -59,28 +59,31 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
response->printf("<input type=\"number\" min=\"1\" max=\"65535\" id=\"port\" name=\"port\" value=\"%d\">", config->getTcpPort());
response->print("</td>"
"</tr>"
"</table>"
"<h3>Modbus RTU</h3>"
"<table>"
"<tr>"
"<td>"
"<label for=\"baud\">Modbus baud rate</label>"
"<label for=\"mb\">Baud rate</label>"
"</td>"
"<td>");
response->printf("<input type=\"number\" min=\"0\" id=\"baud\" name=\"baud\" value=\"%d\">", config->getModbusBaudRate());
response->printf("<input type=\"number\" min=\"0\" id=\"mb\" name=\"mb\" value=\"%d\">", config->getModbusBaudRate());
response->print("</td>"
"</tr>"
"<tr>"
"<td>"
"<label for=\"data\">Modbus data bits</label>"
"<label for=\"md\">Data bits</label>"
"</td>"
"<td>");
response->printf("<input type=\"number\" min=\"5\" max=\"8\" id=\"data\" name=\"data\" value=\"%d\">", config->getModbusDataBits());
response->printf("<input type=\"number\" min=\"5\" max=\"8\" id=\"md\" name=\"md\" value=\"%d\">", config->getModbusDataBits());
response->print("</td>"
"</tr>"
"<tr>"
"<td>"
"<label for=\"parity\">Modbus parity</label>"
"<label for=\"mp\">Parity</label>"
"</td>"
"<td>");
response->printf("<select id=\"parity\" name=\"parity\" data-value=\"%d\">", config->getModbusParity());
response->printf("<select id=\"mp\" name=\"mp\" data-value=\"%d\">", config->getModbusParity());
response->print("<option value=\"0\">None</option>"
"<option value=\"2\">Even</option>"
"<option value=\"3\">Odd</option>"
Expand All @@ -89,10 +92,53 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
"</tr>"
"<tr>"
"<td>"
"<label for=\"stop\">Modbus stop bits</label>"
"<label for=\"ms\">Stop bits</label>"
"</td>"
"<td>");
response->printf("<select id=\"stop\" name=\"stop\" data-value=\"%d\">", config->getModbusStopBits());
response->printf("<select id=\"ms\" name=\"ms\" data-value=\"%d\">", config->getModbusStopBits());
response->print("<option value=\"1\">1 bit</option>"
"<option value=\"2\">1.5 bits</option>"
"<option value=\"3\">2 bits</option>"
"</select>"
"</td>"
"</tr>"
"</table>"
"<h3>Serial (Debug)</h3>"
"<table>"
"<tr>"
"<td>"
"<label for=\"sb\">Baud rate</label>"
"</td>"
"<td>");
response->printf("<input type=\"number\" min=\"0\" id=\"sb\" name=\"sb\" value=\"%d\">", config->getSerialBaudRate());
response->print("</td>"
"</tr>"
"<tr>"
"<td>"
"<label for=\"sd\">Data bits</label>"
"</td>"
"<td>");
response->printf("<input type=\"number\" min=\"5\" max=\"8\" id=\"sd\" name=\"sd\" value=\"%d\">", config->getSerialDataBits());
response->print("</td>"
"</tr>"
"<tr>"
"<td>"
"<label for=\"sp\">Parity</label>"
"</td>"
"<td>");
response->printf("<select id=\"sp\" name=\"sp\" data-value=\"%d\">", config->getSerialParity());
response->print("<option value=\"0\">None</option>"
"<option value=\"2\">Even</option>"
"<option value=\"3\">Odd</option>"
"</select>"
"</td>"
"</tr>"
"<tr>"
"<td>"
"<label for=\"ss\">Stop bits</label>"
"</td>"
"<td>");
response->printf("<select id=\"ss\" name=\"ss\" data-value=\"%d\">", config->getSerialStopBits());
response->print("<option value=\"1\">1 bit</option>"
"<option value=\"2\">1.5 bits</option>"
"<option value=\"3\">2 bits</option>"
Expand Down Expand Up @@ -121,25 +167,45 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
config->setTcpPort(port);
dbgln("[webserver] saved port");
}
if (request->hasParam("baud", true)){
auto baud = request->getParam("baud", true)->value().toInt();
if (request->hasParam("mb", true)){
auto baud = request->getParam("mb", true)->value().toInt();
config->setModbusBaudRate(baud);
dbgln("[webserver] saved baud");
dbgln("[webserver] saved modbus baud rate");
}
if (request->hasParam("data", true)){
auto data = request->getParam("data", true)->value().toInt();
if (request->hasParam("md", true)){
auto data = request->getParam("md", true)->value().toInt();
config->setModbusDataBits(data);
dbgln("[webserver] saved data");
dbgln("[webserver] saved modbus data bits");
}
if (request->hasParam("parity", true)){
auto parity = request->getParam("parity", true)->value().toInt();
if (request->hasParam("mp", true)){
auto parity = request->getParam("mp", true)->value().toInt();
config->setModbusParity(parity);
dbgln("[webserver] saved parity");
dbgln("[webserver] saved modbus parity");
}
if (request->hasParam("stop", true)){
auto stop = request->getParam("stop", true)->value().toInt();
if (request->hasParam("ms", true)){
auto stop = request->getParam("ms", true)->value().toInt();
config->setModbusStopBits(stop);
dbgln("[webserver] saved stop");
dbgln("[webserver] saved modbus stop bits");
}
if (request->hasParam("sb", true)){
auto baud = request->getParam("sb", true)->value().toInt();
config->setSerialBaudRate(baud);
dbgln("[webserver] saved serial baud rate");
}
if (request->hasParam("sd", true)){
auto data = request->getParam("sd", true)->value().toInt();
config->setSerialDataBits(data);
dbgln("[webserver] saved serial data bits");
}
if (request->hasParam("sp", true)){
auto parity = request->getParam("sp", true)->value().toInt();
config->setSerialParity(parity);
dbgln("[webserver] saved serial parity");
}
if (request->hasParam("ss", true)){
auto stop = request->getParam("ss", true)->value().toInt();
config->setSerialStopBits(stop);
dbgln("[webserver] saved serial stop bits");
}
request->redirect("/");
});
Expand Down

0 comments on commit 4c4afe9

Please sign in to comment.