Skip to content

Commit 4c4afe9

Browse files
committed
add serial config
1 parent 2085b6b commit 4c4afe9

File tree

5 files changed

+174
-39
lines changed

5 files changed

+174
-39
lines changed

include/config.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,32 @@
1111
Preferences *_prefs;
1212
int16_t _tcpPort;
1313
unsigned long _modbusBaudRate;
14-
uint32_t _modbusSerialConfig;
14+
uint32_t _modbusConfig;
15+
unsigned long _serialBaudRate;
16+
uint32_t _serialConfig;
1517
public:
1618
Config();
1719
void begin(Preferences *prefs);
1820
uint16_t getTcpPort();
1921
void setTcpPort(uint16_t value);
22+
uint32_t getModbusConfig();
2023
unsigned long getModbusBaudRate();
21-
uint32_t getModbusSerialConfig();
2224
void setModbusBaudRate(unsigned long value);
2325
uint8_t getModbusDataBits();
2426
void setModbusDataBits(uint8_t value);
2527
uint8_t getModbusParity();
2628
void setModbusParity(uint8_t value);
2729
uint8_t getModbusStopBits();
2830
void setModbusStopBits(uint8_t value);
31+
uint32_t getSerialConfig();
32+
unsigned long getSerialBaudRate();
33+
void setSerialBaudRate(unsigned long value);
34+
uint8_t getSerialDataBits();
35+
void setSerialDataBits(uint8_t value);
36+
uint8_t getSerialParity();
37+
void setSerialParity(uint8_t value);
38+
uint8_t getSerialStopBits();
39+
void setSerialStopBits(uint8_t value);
2940
};
3041
#ifdef DEBUG
3142
#define dbg(x...) debugSerial.print(x);

platformio.ini

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ lib_deps =
1616
https://github.com/tzapu/WiFiManager.git
1717
https://github.com/me-no-dev/ESPAsyncWebServer.git
1818
eModbus
19-
;build_flags = -DLOG_LEVEL=LOG_LEVEL_DEBUG
19+
;build_flags = -DLOG_LEVEL=LOG_LEVEL_DEBUG
20+
monitor_speed = 115200

src/config.cpp

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@ Config::Config()
44
:_prefs(NULL)
55
,_tcpPort(502)
66
,_modbusBaudRate(9600)
7-
,_modbusSerialConfig(SERIAL_8N1)
7+
,_modbusConfig(SERIAL_8N1)
8+
,_serialBaudRate(115200)
9+
,_serialConfig(SERIAL_8N1)
810
{}
911

1012
void Config::begin(Preferences *prefs)
1113
{
1214
_prefs = prefs;
1315
_tcpPort = _prefs->getUShort("tcpPort", _tcpPort);
1416
_modbusBaudRate = _prefs->getULong("modbusBaudRate", _modbusBaudRate);
15-
_modbusSerialConfig = _prefs->getULong("modbusSerialConfig", _modbusSerialConfig);
17+
_modbusConfig = _prefs->getULong("modbusConfig", _modbusConfig);
18+
_serialBaudRate = _prefs->getULong("serialBaudRate", _serialBaudRate);
19+
_serialConfig = _prefs->getULong("serialConfig", _serialConfig);
1620
}
1721

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

28-
uint32_t Config::getModbusSerialConfig(){
29-
return _modbusSerialConfig;
32+
uint32_t Config::getModbusConfig(){
33+
return _modbusConfig;
3034
}
3135

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

4246
uint8_t Config::getModbusDataBits(){
43-
return ((_modbusSerialConfig & 0xc) >> 2) + 5;
47+
return ((_modbusConfig & 0xc) >> 2) + 5;
4448
}
4549

4650
void Config::setModbusDataBits(uint8_t value){
4751
auto dataBits = getModbusDataBits();
4852
value -= 5;
4953
value = (value << 2) & 0xc;
5054
if (value == dataBits) return;
51-
_modbusSerialConfig = (_modbusSerialConfig & 0xfffffff3) | value;
52-
_prefs->putULong("modbusSerialConfig", _modbusSerialConfig);
55+
_modbusConfig = (_modbusConfig & 0xfffffff3) | value;
56+
_prefs->putULong("modbusConfig", _modbusConfig);
5357
}
5458

5559
uint8_t Config::getModbusParity(){
56-
return _modbusSerialConfig & 0x3;
60+
return _modbusConfig & 0x3;
5761
}
5862

5963
void Config::setModbusParity(uint8_t value){
6064
auto parity = getModbusParity();
6165
value = value & 0x3;
6266
if (parity == value) return;
63-
_modbusSerialConfig = (_modbusSerialConfig & 0xfffffffc) | value;
64-
_prefs->putULong("modbusSerialConfig", _modbusSerialConfig);
67+
_modbusConfig = (_modbusConfig & 0xfffffffc) | value;
68+
_prefs->putULong("modbusConfig", _modbusConfig);
6569
}
6670

6771
uint8_t Config::getModbusStopBits(){
68-
return (_modbusSerialConfig & 0x30) >> 4;
72+
return (_modbusConfig & 0x30) >> 4;
6973
}
7074

7175
void Config::setModbusStopBits(uint8_t value){
7276
auto stopbits = getModbusStopBits();
7377
value = (value << 4) & 0x30;
7478
if (stopbits == value) return;
75-
_modbusSerialConfig = (_modbusSerialConfig & 0xffffffcf) | value;
76-
_prefs->putULong("modbusSerialConfig", _modbusSerialConfig);
79+
_modbusConfig = (_modbusConfig & 0xffffffcf) | value;
80+
_prefs->putULong("modbusConfig", _modbusConfig);
81+
}
82+
83+
uint32_t Config::getSerialConfig(){
84+
return _serialConfig;
85+
}
86+
87+
unsigned long Config::getSerialBaudRate(){
88+
return _serialBaudRate;
89+
}
90+
91+
void Config::setSerialBaudRate(unsigned long value){
92+
if (_serialBaudRate == value) return;
93+
_serialBaudRate = value;
94+
_prefs->putULong("serialBaudRate", _serialBaudRate);
95+
}
96+
97+
uint8_t Config::getSerialDataBits(){
98+
return ((_serialConfig & 0xc) >> 2) + 5;
99+
}
100+
101+
void Config::setSerialDataBits(uint8_t value){
102+
auto dataBits = getSerialDataBits();
103+
value -= 5;
104+
value = (value << 2) & 0xc;
105+
if (value == dataBits) return;
106+
_serialConfig = (_serialConfig & 0xfffffff3) | value;
107+
_prefs->putULong("serialConfig", _serialConfig);
108+
}
109+
110+
uint8_t Config::getSerialParity(){
111+
return _serialConfig & 0x3;
112+
}
113+
114+
void Config::setSerialParity(uint8_t value){
115+
auto parity = getSerialParity();
116+
value = value & 0x3;
117+
if (parity == value) return;
118+
_serialConfig = (_serialConfig & 0xfffffffc) | value;
119+
_prefs->putULong("serialConfig", _serialConfig);
120+
}
121+
122+
uint8_t Config::getSerialStopBits(){
123+
return (_serialConfig & 0x30) >> 4;
124+
}
125+
126+
void Config::setSerialStopBits(uint8_t value){
127+
auto stopbits = getSerialStopBits();
128+
value = (value << 4) & 0x30;
129+
if (stopbits == value) return;
130+
_serialConfig = (_serialConfig & 0xffffffcf) | value;
131+
_prefs->putULong("serialConfig", _serialConfig);
77132
}

src/main.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,19 @@ ModbusBridgeWiFi MBbridge;
1717
WiFiManager wm;
1818

1919
void setup() {
20-
debugSerial.begin(9600);
20+
debugSerial.begin(115200);
2121
dbgln();
2222
dbgln("[config] load")
2323
prefs.begin("modbusRtuGw");
2424
config.begin(&prefs);
25+
debugSerial.end();
26+
debugSerial.begin(config.getSerialBaudRate(), config.getSerialConfig());
2527
dbgln("[wifi] start");
2628
WiFi.mode(WIFI_STA);
2729
wm.autoConnect();
2830
dbgln("[wifi] finished");
2931
dbgln("[modbus] start");
30-
modbusSerial.begin(config.getModbusBaudRate(), config.getModbusSerialConfig());
32+
modbusSerial.begin(config.getModbusBaudRate(), config.getModbusConfig());
3133
MBclient.setTimeout(1000);
3234
MBclient.begin();
3335
for (uint8_t i = 1; i < 248; i++)

src/pages.cpp

Lines changed: 87 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
4848
server->on("/config", HTTP_GET, [config](AsyncWebServerRequest *request){
4949
dbgln("[webserver] GET /config");
5050
auto *response = request->beginResponseStream("text/html");
51-
sendResponseHeader(response, "Config");
51+
sendResponseHeader(response, "Modbus TCP");
5252
response->print("<form method=\"post\">");
5353
response->print("<table>"
5454
"<tr>"
@@ -59,28 +59,31 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
5959
response->printf("<input type=\"number\" min=\"1\" max=\"65535\" id=\"port\" name=\"port\" value=\"%d\">", config->getTcpPort());
6060
response->print("</td>"
6161
"</tr>"
62+
"</table>"
63+
"<h3>Modbus RTU</h3>"
64+
"<table>"
6265
"<tr>"
6366
"<td>"
64-
"<label for=\"baud\">Modbus baud rate</label>"
67+
"<label for=\"mb\">Baud rate</label>"
6568
"</td>"
6669
"<td>");
67-
response->printf("<input type=\"number\" min=\"0\" id=\"baud\" name=\"baud\" value=\"%d\">", config->getModbusBaudRate());
70+
response->printf("<input type=\"number\" min=\"0\" id=\"mb\" name=\"mb\" value=\"%d\">", config->getModbusBaudRate());
6871
response->print("</td>"
6972
"</tr>"
7073
"<tr>"
7174
"<td>"
72-
"<label for=\"data\">Modbus data bits</label>"
75+
"<label for=\"md\">Data bits</label>"
7376
"</td>"
7477
"<td>");
75-
response->printf("<input type=\"number\" min=\"5\" max=\"8\" id=\"data\" name=\"data\" value=\"%d\">", config->getModbusDataBits());
78+
response->printf("<input type=\"number\" min=\"5\" max=\"8\" id=\"md\" name=\"md\" value=\"%d\">", config->getModbusDataBits());
7679
response->print("</td>"
7780
"</tr>"
7881
"<tr>"
7982
"<td>"
80-
"<label for=\"parity\">Modbus parity</label>"
83+
"<label for=\"mp\">Parity</label>"
8184
"</td>"
8285
"<td>");
83-
response->printf("<select id=\"parity\" name=\"parity\" data-value=\"%d\">", config->getModbusParity());
86+
response->printf("<select id=\"mp\" name=\"mp\" data-value=\"%d\">", config->getModbusParity());
8487
response->print("<option value=\"0\">None</option>"
8588
"<option value=\"2\">Even</option>"
8689
"<option value=\"3\">Odd</option>"
@@ -89,10 +92,53 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
8992
"</tr>"
9093
"<tr>"
9194
"<td>"
92-
"<label for=\"stop\">Modbus stop bits</label>"
95+
"<label for=\"ms\">Stop bits</label>"
9396
"</td>"
9497
"<td>");
95-
response->printf("<select id=\"stop\" name=\"stop\" data-value=\"%d\">", config->getModbusStopBits());
98+
response->printf("<select id=\"ms\" name=\"ms\" data-value=\"%d\">", config->getModbusStopBits());
99+
response->print("<option value=\"1\">1 bit</option>"
100+
"<option value=\"2\">1.5 bits</option>"
101+
"<option value=\"3\">2 bits</option>"
102+
"</select>"
103+
"</td>"
104+
"</tr>"
105+
"</table>"
106+
"<h3>Serial (Debug)</h3>"
107+
"<table>"
108+
"<tr>"
109+
"<td>"
110+
"<label for=\"sb\">Baud rate</label>"
111+
"</td>"
112+
"<td>");
113+
response->printf("<input type=\"number\" min=\"0\" id=\"sb\" name=\"sb\" value=\"%d\">", config->getSerialBaudRate());
114+
response->print("</td>"
115+
"</tr>"
116+
"<tr>"
117+
"<td>"
118+
"<label for=\"sd\">Data bits</label>"
119+
"</td>"
120+
"<td>");
121+
response->printf("<input type=\"number\" min=\"5\" max=\"8\" id=\"sd\" name=\"sd\" value=\"%d\">", config->getSerialDataBits());
122+
response->print("</td>"
123+
"</tr>"
124+
"<tr>"
125+
"<td>"
126+
"<label for=\"sp\">Parity</label>"
127+
"</td>"
128+
"<td>");
129+
response->printf("<select id=\"sp\" name=\"sp\" data-value=\"%d\">", config->getSerialParity());
130+
response->print("<option value=\"0\">None</option>"
131+
"<option value=\"2\">Even</option>"
132+
"<option value=\"3\">Odd</option>"
133+
"</select>"
134+
"</td>"
135+
"</tr>"
136+
"<tr>"
137+
"<td>"
138+
"<label for=\"ss\">Stop bits</label>"
139+
"</td>"
140+
"<td>");
141+
response->printf("<select id=\"ss\" name=\"ss\" data-value=\"%d\">", config->getSerialStopBits());
96142
response->print("<option value=\"1\">1 bit</option>"
97143
"<option value=\"2\">1.5 bits</option>"
98144
"<option value=\"3\">2 bits</option>"
@@ -121,25 +167,45 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi *
121167
config->setTcpPort(port);
122168
dbgln("[webserver] saved port");
123169
}
124-
if (request->hasParam("baud", true)){
125-
auto baud = request->getParam("baud", true)->value().toInt();
170+
if (request->hasParam("mb", true)){
171+
auto baud = request->getParam("mb", true)->value().toInt();
126172
config->setModbusBaudRate(baud);
127-
dbgln("[webserver] saved baud");
173+
dbgln("[webserver] saved modbus baud rate");
128174
}
129-
if (request->hasParam("data", true)){
130-
auto data = request->getParam("data", true)->value().toInt();
175+
if (request->hasParam("md", true)){
176+
auto data = request->getParam("md", true)->value().toInt();
131177
config->setModbusDataBits(data);
132-
dbgln("[webserver] saved data");
178+
dbgln("[webserver] saved modbus data bits");
133179
}
134-
if (request->hasParam("parity", true)){
135-
auto parity = request->getParam("parity", true)->value().toInt();
180+
if (request->hasParam("mp", true)){
181+
auto parity = request->getParam("mp", true)->value().toInt();
136182
config->setModbusParity(parity);
137-
dbgln("[webserver] saved parity");
183+
dbgln("[webserver] saved modbus parity");
138184
}
139-
if (request->hasParam("stop", true)){
140-
auto stop = request->getParam("stop", true)->value().toInt();
185+
if (request->hasParam("ms", true)){
186+
auto stop = request->getParam("ms", true)->value().toInt();
141187
config->setModbusStopBits(stop);
142-
dbgln("[webserver] saved stop");
188+
dbgln("[webserver] saved modbus stop bits");
189+
}
190+
if (request->hasParam("sb", true)){
191+
auto baud = request->getParam("sb", true)->value().toInt();
192+
config->setSerialBaudRate(baud);
193+
dbgln("[webserver] saved serial baud rate");
194+
}
195+
if (request->hasParam("sd", true)){
196+
auto data = request->getParam("sd", true)->value().toInt();
197+
config->setSerialDataBits(data);
198+
dbgln("[webserver] saved serial data bits");
199+
}
200+
if (request->hasParam("sp", true)){
201+
auto parity = request->getParam("sp", true)->value().toInt();
202+
config->setSerialParity(parity);
203+
dbgln("[webserver] saved serial parity");
204+
}
205+
if (request->hasParam("ss", true)){
206+
auto stop = request->getParam("ss", true)->value().toInt();
207+
config->setSerialStopBits(stop);
208+
dbgln("[webserver] saved serial stop bits");
143209
}
144210
request->redirect("/");
145211
});

0 commit comments

Comments
 (0)