Skip to content

Commit f56c307

Browse files
authored
Esp8266/ESP32 handshake for the serial connection (#432)
1 parent 38fd2cd commit f56c307

File tree

4 files changed

+122
-16
lines changed

4 files changed

+122
-16
lines changed

Diff for: assets/webconfig/i18n/en.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1188,5 +1188,6 @@
11881188
"led_editor_context_moving": "Left click the mouse to accept the position",
11891189
"conf_leds_disabled_notification" : "Some LEDs are disabled by the user!",
11901190
"conf_leds_layout_context" : "Right click on the LED to display the context menu. With the CTRL key selects the object below.",
1191-
"conf_leds_layout_btn_zoom" : "Zoom"
1191+
"conf_leds_layout_btn_zoom" : "Zoom",
1192+
"edt_serial_espHandshake" : "Esp8266/ESP32 handshake"
11921193
}

Diff for: sources/leddevice/dev_serial/ProviderRs232.cpp

+94-8
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
// qt includes
77
#include <QSerialPortInfo>
88
#include <QEventLoop>
9+
#include <QThread>
910

1011
#include <chrono>
12+
#include <utils/InternalClock.h>
1113

1214
// Constants
1315
constexpr std::chrono::milliseconds WRITE_TIMEOUT{ 1000 }; // device write timeout in ms
@@ -22,6 +24,7 @@ ProviderRs232::ProviderRs232(const QJsonObject& deviceConfig)
2224
, _isAutoDeviceName(false)
2325
, _delayAfterConnect_ms(0)
2426
, _frameDropCounter(0)
27+
, _espHandshake(true)
2528
{
2629
}
2730

@@ -46,11 +49,13 @@ bool ProviderRs232::init(const QJsonObject& deviceConfig)
4649
_isAutoDeviceName = _deviceName.toLower() == "auto";
4750
_baudRate_Hz = deviceConfig["rate"].toInt();
4851
_delayAfterConnect_ms = deviceConfig["delayAfterConnect"].toInt(0);
52+
_espHandshake = deviceConfig["espHandshake"].toBool(false);
4953

50-
Debug(_log, "deviceName : %s", QSTRING_CSTR(_deviceName));
51-
Debug(_log, "AutoDevice : %d", _isAutoDeviceName);
52-
Debug(_log, "baudRate_Hz : %d", _baudRate_Hz);
53-
Debug(_log, "delayAfCon ms: %d", _delayAfterConnect_ms);
54+
Debug(_log, "Device name : %s", QSTRING_CSTR(_deviceName));
55+
Debug(_log, "Auto selection: %d", _isAutoDeviceName);
56+
Debug(_log, "Baud rate : %d", _baudRate_Hz);
57+
Debug(_log, "ESP handshake : %s", (_espHandshake) ? "ON" : "OFF");
58+
Debug(_log, "Delayed open : %d", _delayAfterConnect_ms);
5459

5560
isInitOK = true;
5661
}
@@ -59,6 +64,8 @@ bool ProviderRs232::init(const QJsonObject& deviceConfig)
5964

6065
ProviderRs232::~ProviderRs232()
6166
{
67+
if (_rs232Port.isOpen())
68+
_rs232Port.close();
6269
}
6370

6471
int ProviderRs232::open()
@@ -76,6 +83,24 @@ int ProviderRs232::open()
7683
return retval;
7784
}
7885

86+
void ProviderRs232::waitForExitStats()
87+
{
88+
if (_rs232Port.isOpen())
89+
{
90+
if (_rs232Port.bytesAvailable() > 16)
91+
{
92+
auto incoming = QString(_rs232Port.readAll());
93+
94+
Info(_log, "Received: %s", QSTRING_CSTR(incoming));
95+
}
96+
if (!_isDeviceReady)
97+
{
98+
Debug(_log, "Close UART: %s", QSTRING_CSTR(_deviceName));
99+
_rs232Port.close();
100+
}
101+
}
102+
}
103+
79104
int ProviderRs232::close()
80105
{
81106
int retval = 0;
@@ -89,9 +114,20 @@ int ProviderRs232::close()
89114
{
90115
Debug(_log, "Flush was successful");
91116
}
92-
Debug(_log, "Close UART: %s", QSTRING_CSTR(_deviceName));
93-
_rs232Port.close();
94-
// Everything is OK -> device is closed
117+
118+
119+
if (_espHandshake)
120+
{
121+
// read the statistics on goodbye
122+
QTimer::singleShot(6000, this, &ProviderRs232::waitForExitStats);
123+
connect(&_rs232Port, &QSerialPort::readyRead, this, &ProviderRs232::waitForExitStats);
124+
}
125+
else
126+
{
127+
Debug(_log, "Close UART: %s", QSTRING_CSTR(_deviceName));
128+
_rs232Port.close();
129+
}
130+
95131
}
96132
return retval;
97133
}
@@ -150,11 +186,61 @@ bool ProviderRs232::tryOpen(int delayAfterConnect_ms)
150186

151187
if (!serialPortInfo.isNull())
152188
{
153-
if (!_rs232Port.open(QIODevice::ReadWrite))
189+
if (!_rs232Port.isOpen() && !_rs232Port.open(QIODevice::ReadWrite))
154190
{
155191
this->setInError(_rs232Port.errorString());
156192
return false;
157193
}
194+
195+
if (_espHandshake)
196+
{
197+
disconnect(&_rs232Port, &QSerialPort::readyRead, nullptr, nullptr);
198+
199+
// reset to defaults
200+
_rs232Port.setDataTerminalReady(true);
201+
_rs232Port.setRequestToSend(false);
202+
QThread::msleep(50);
203+
204+
// reset device
205+
_rs232Port.setDataTerminalReady(false);
206+
_rs232Port.setRequestToSend(true);
207+
QThread::msleep(100);
208+
209+
// resume device
210+
_rs232Port.setRequestToSend(false);
211+
QThread::msleep(100);
212+
213+
// read the reset message, search for AWA tag
214+
auto start = InternalClock::now();
215+
216+
while(InternalClock::now() - start < 1000)
217+
{
218+
_rs232Port.waitForReadyRead(100);
219+
if (_rs232Port.bytesAvailable() > 16)
220+
{
221+
auto incoming = _rs232Port.readAll();
222+
for (int i = 0; i < incoming.length(); i++)
223+
if (!(incoming[i] == '\n' ||
224+
(incoming[i] >= ' ' && incoming[i] <= 'Z') ||
225+
(incoming[i] >= 'a' && incoming[i] <= 'z')))
226+
{
227+
incoming.replace(incoming[i], '*');
228+
}
229+
QString result = QString(incoming).remove('*').replace('\n',' ').trimmed();
230+
if (result.indexOf("Awa driver",Qt::CaseInsensitive) >= 0)
231+
{
232+
Info(_log, "DETECTED DEVICE USING HYPERSERIALESP8266/HYPERSERIALESP32 FIRMWARE (%s) at %i msec", QSTRING_CSTR(result), int(InternalClock::now() - start));
233+
start = 0;
234+
break;
235+
}
236+
}
237+
if (InternalClock::now() <= start)
238+
break;
239+
}
240+
241+
if (start != 0)
242+
Error(_log, "Could not detect HyperSerialEsp8266/HyperSerialESP32 device");
243+
}
158244
}
159245
else
160246
{

Diff for: sources/leddevice/dev_serial/ProviderRs232.h

+5
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ protected slots:
9797
///
9898
void setInError(const QString& errorMsg) override;
9999

100+
public slots:
101+
void waitForExitStats();
102+
100103
private:
101104

102105
///
@@ -114,6 +117,8 @@ protected slots:
114117

115118
/// Frames dropped, as write failed
116119
int _frameDropCounter;
120+
121+
bool _espHandshake;
117122
};
118123

119124
#endif // PROVIDERRS232_H

Diff for: sources/leddevice/schemas/schema-adalight.json

+21-7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@
2121
"default": 2000000,
2222
"propertyOrder" : 3
2323
},
24+
"espHandshake" :
25+
{
26+
"type" : "boolean",
27+
"format": "checkbox",
28+
"title" : "edt_serial_espHandshake",
29+
"default" : true,
30+
"required" : true,
31+
"options": {
32+
"dependencies": {
33+
"awa_mode": true
34+
}
35+
},
36+
"propertyOrder" : 4
37+
},
2438
"white_channel_calibration": {
2539
"type": "boolean",
2640
"format": "checkbox",
@@ -32,7 +46,7 @@
3246
"awa_mode": true
3347
}
3448
},
35-
"propertyOrder" : 4
49+
"propertyOrder" : 5
3650
},
3751
"white_channel_limit": {
3852
"type": "number",
@@ -49,7 +63,7 @@
4963
"white_channel_calibration": true
5064
}
5165
},
52-
"propertyOrder" : 5
66+
"propertyOrder" : 6
5367
},
5468
"white_channel_red": {
5569
"type": "integer",
@@ -65,7 +79,7 @@
6579
"white_channel_calibration": true
6680
}
6781
},
68-
"propertyOrder" : 6
82+
"propertyOrder" : 7
6983
},
7084
"white_channel_green": {
7185
"type": "integer",
@@ -81,7 +95,7 @@
8195
"white_channel_calibration": true
8296
}
8397
},
84-
"propertyOrder" : 7
98+
"propertyOrder" : 8
8599
},
86100
"white_channel_blue": {
87101
"type": "integer",
@@ -97,7 +111,7 @@
97111
"white_channel_calibration": true
98112
}
99113
},
100-
"propertyOrder" : 8
114+
"propertyOrder" : 9
101115
},
102116
"delayAfterConnect": {
103117
"type": "integer",
@@ -110,7 +124,7 @@
110124
"awa_mode": false
111125
}
112126
},
113-
"propertyOrder" : 9
127+
"propertyOrder" : 10
114128
},
115129
"lightberry_apa102_mode": {
116130
"type": "boolean",
@@ -123,7 +137,7 @@
123137
"awa_mode": false
124138
}
125139
},
126-
"propertyOrder" : 10
140+
"propertyOrder" : 11
127141
}
128142
},
129143
"additionalProperties": true

0 commit comments

Comments
 (0)