@@ -33,7 +33,7 @@ using namespace hal;
33
33
34
34
namespace serialReceiverLayer
35
35
{
36
- SerialReceiver::SerialReceiver ()
36
+ SerialReceiver::SerialReceiver (): _linkIsUp( false ), _lastChannelsPacket( 0 )
37
37
{
38
38
#if defined(ARDUINO_ARCH_STM32)
39
39
#if defined(HAVE_HWSERIAL1)
@@ -72,7 +72,7 @@ namespace serialReceiverLayer
72
72
#endif
73
73
}
74
74
75
- SerialReceiver::SerialReceiver (HardwareSerial *hwUartPort)
75
+ SerialReceiver::SerialReceiver (HardwareSerial *hwUartPort) : _linkIsUp( false ), _lastChannelsPacket( 0 )
76
76
{
77
77
_uart = hwUartPort;
78
78
@@ -101,7 +101,7 @@ namespace serialReceiverLayer
101
101
#endif
102
102
}
103
103
104
- SerialReceiver::SerialReceiver (HardwareSerial *hwUartPort, int8_t rxPin, int8_t txPin)
104
+ SerialReceiver::SerialReceiver (HardwareSerial *hwUartPort, int8_t rxPin, int8_t txPin) : _linkIsUp( false ), _lastChannelsPacket( 0 )
105
105
{
106
106
_uart = hwUartPort;
107
107
@@ -130,6 +130,8 @@ namespace serialReceiverLayer
130
130
131
131
_rxPin = serialReceiver._rxPin ;
132
132
_txPin = serialReceiver._txPin ;
133
+ _linkIsUp = serialReceiver._linkIsUp ;
134
+ _lastChannelsPacket= serialReceiver._lastChannelsPacket ;
133
135
134
136
#if CRSF_RC_ENABLED > 0
135
137
_rcChannels = new rcChannels_t;
@@ -159,6 +161,8 @@ namespace serialReceiverLayer
159
161
_txPin = serialReceiver._txPin ;
160
162
161
163
crsf = serialReceiver.crsf ;
164
+ _linkIsUp = serialReceiver._linkIsUp ;
165
+ _lastChannelsPacket = serialReceiver._lastChannelsPacket ;
162
166
163
167
#if CRSF_TELEMETRY_ENABLED > 0
164
168
telemetry = serialReceiver.telemetry ;
@@ -341,7 +345,8 @@ namespace serialReceiverLayer
341
345
{
342
346
while (_uart->available () > 0 )
343
347
{
344
- if (crsf->receiveFrames ((uint8_t )_uart->read ()))
348
+ uint8_t byteReceived = (uint8_t )_uart->read ();
349
+ if (crsf->receiveFrames (byteReceived))
345
350
{
346
351
flushRemainingFrames ();
347
352
@@ -368,11 +373,40 @@ namespace serialReceiverLayer
368
373
_rcChannelsCallback (_rcChannels);
369
374
}
370
375
#endif
376
+ setLinkUp ();
371
377
}
378
+
379
+ if (_rawDataCallback != nullptr )
380
+ {
381
+ _rawDataCallback (byteReceived);
382
+ }
383
+
372
384
}
385
+ checkLinkDown ();
373
386
}
374
387
#endif
375
388
389
+ void SerialReceiver::setLinkDownCallback (linkDownCallback_t callback) { _linkDownCallback = callback; }
390
+ void SerialReceiver::setLinkUpCallback (linkUpCallback_t callback) { _linkUpCallback = callback; }
391
+
392
+ bool SerialReceiver::isLinkUp () const { return _linkIsUp; }
393
+
394
+ void SerialReceiver::setLinkUp ()
395
+ {
396
+ if (!_linkIsUp && _linkUpCallback) _linkUpCallback ();
397
+ _linkIsUp = true ;
398
+ _lastChannelsPacket = millis ();
399
+ }
400
+
401
+ void SerialReceiver::checkLinkDown ()
402
+ {
403
+ if (_linkIsUp && millis () - _lastChannelsPacket > CRSF_FAILSAFE_STAGE1_MS) {
404
+ if (_linkDownCallback) _linkDownCallback ();
405
+ _linkIsUp = false ;
406
+ }
407
+ }
408
+
409
+
376
410
#if CRSF_LINK_STATISTICS_ENABLED > 0
377
411
void SerialReceiver::setLinkStatisticsCallback (linkStatisticsCallback_t callback)
378
412
{
@@ -391,6 +425,11 @@ namespace serialReceiverLayer
391
425
}
392
426
#endif
393
427
428
+ void SerialReceiver::setRawDataCallback (rawDataCallback_t callback)
429
+ {
430
+ _rawDataCallback = callback;
431
+ }
432
+
394
433
#if CRSF_RC_ENABLED > 0
395
434
void SerialReceiver::setRcChannelsCallback (rcChannelsCallback_t callback)
396
435
{
0 commit comments