Skip to content

Commit cc39f67

Browse files
committed
Introduced the following callbacks:
- on connection down - on connection up - raw data received Signed-off-by: Dmytro <[email protected]>
1 parent aa2be50 commit cc39f67

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

src/CRSFforArduino.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,21 @@ namespace sketchLayer
176176
#endif
177177
}
178178

179+
void CRSFforArduino::setRawDataCallback(void (*callback)(int8_t byteReceived))
180+
{
181+
this->SerialReceiver::setRawDataCallback(callback);
182+
}
183+
184+
void CRSFforArduino::setLinkUpCallback(void (*callback)())
185+
{
186+
this->SerialReceiver::setLinkUpCallback(callback);
187+
}
188+
189+
void CRSFforArduino::setLinkDownCallback(void (*callback)())
190+
{
191+
this->SerialReceiver::setLinkDownCallback(callback);
192+
}
193+
179194
void CRSFforArduino::setLinkStatisticsCallback(void (*callback)(serialReceiverLayer::link_statistics_t linkStatistics))
180195
{
181196
#if CRSF_LINK_STATISTICS_ENABLED > 0

src/CRSFforArduino.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ namespace sketchLayer
5656
bool setFlightMode(serialReceiverLayer::flightModeId_t flightModeId, const char *flightModeName, uint8_t channel, uint16_t min, uint16_t max);
5757
bool setFlightMode(serialReceiverLayer::flightModeId_t flightMode, uint8_t channel, uint16_t min, uint16_t max);
5858
void setFlightModeCallback(void (*callback)(serialReceiverLayer::flightModeId_t flightMode));
59+
void setRawDataCallback(void (*callback)(int8_t byteReceived));
60+
61+
void setLinkUpCallback(void (*callback)());
62+
void setLinkDownCallback(void (*callback)());
5963

6064
// Telemetry functions.
6165
void telemetryWriteAttitude(int16_t roll, int16_t pitch, int16_t yaw);

src/SerialReceiver/SerialReceiver.cpp

+43-4
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ using namespace hal;
3333

3434
namespace serialReceiverLayer
3535
{
36-
SerialReceiver::SerialReceiver()
36+
SerialReceiver::SerialReceiver(): _linkIsUp(false), _lastChannelsPacket(0)
3737
{
3838
#if defined(ARDUINO_ARCH_STM32)
3939
#if defined(HAVE_HWSERIAL1)
@@ -72,7 +72,7 @@ namespace serialReceiverLayer
7272
#endif
7373
}
7474

75-
SerialReceiver::SerialReceiver(HardwareSerial *hwUartPort)
75+
SerialReceiver::SerialReceiver(HardwareSerial *hwUartPort) : _linkIsUp(false), _lastChannelsPacket(0)
7676
{
7777
_uart = hwUartPort;
7878

@@ -101,7 +101,7 @@ namespace serialReceiverLayer
101101
#endif
102102
}
103103

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)
105105
{
106106
_uart = hwUartPort;
107107

@@ -130,6 +130,8 @@ namespace serialReceiverLayer
130130

131131
_rxPin = serialReceiver._rxPin;
132132
_txPin = serialReceiver._txPin;
133+
_linkIsUp = serialReceiver._linkIsUp;
134+
_lastChannelsPacket= serialReceiver._lastChannelsPacket;
133135

134136
#if CRSF_RC_ENABLED > 0
135137
_rcChannels = new rcChannels_t;
@@ -159,6 +161,8 @@ namespace serialReceiverLayer
159161
_txPin = serialReceiver._txPin;
160162

161163
crsf = serialReceiver.crsf;
164+
_linkIsUp = serialReceiver._linkIsUp;
165+
_lastChannelsPacket = serialReceiver._lastChannelsPacket;
162166

163167
#if CRSF_TELEMETRY_ENABLED > 0
164168
telemetry = serialReceiver.telemetry;
@@ -341,7 +345,8 @@ namespace serialReceiverLayer
341345
{
342346
while (_uart->available() > 0)
343347
{
344-
if (crsf->receiveFrames((uint8_t)_uart->read()))
348+
uint8_t byteReceived = (uint8_t)_uart->read();
349+
if (crsf->receiveFrames(byteReceived))
345350
{
346351
flushRemainingFrames();
347352

@@ -368,11 +373,40 @@ namespace serialReceiverLayer
368373
_rcChannelsCallback(_rcChannels);
369374
}
370375
#endif
376+
setLinkUp();
371377
}
378+
379+
if (_rawDataCallback != nullptr)
380+
{
381+
_rawDataCallback(byteReceived);
382+
}
383+
372384
}
385+
checkLinkDown();
373386
}
374387
#endif
375388

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+
376410
#if CRSF_LINK_STATISTICS_ENABLED > 0
377411
void SerialReceiver::setLinkStatisticsCallback(linkStatisticsCallback_t callback)
378412
{
@@ -391,6 +425,11 @@ namespace serialReceiverLayer
391425
}
392426
#endif
393427

428+
void SerialReceiver::setRawDataCallback(rawDataCallback_t callback)
429+
{
430+
_rawDataCallback = callback;
431+
}
432+
394433
#if CRSF_RC_ENABLED > 0
395434
void SerialReceiver::setRcChannelsCallback(rcChannelsCallback_t callback)
396435
{

src/SerialReceiver/SerialReceiver.hpp

+21
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,16 @@ namespace serialReceiverLayer
7171
typedef void (*rcChannelsCallback_t)(rcChannels_t *);
7272
typedef void (*flightModeCallback_t)(flightModeId_t);
7373
typedef void (*linkStatisticsCallback_t)(link_statistics_t);
74+
typedef void (*rawDataCallback_t)(int8_t);
75+
76+
typedef void (*linkUpCallback_t)();
77+
typedef void (*linkDownCallback_t)();
7478

7579
class SerialReceiver
7680
{
7781
public:
82+
static const unsigned int CRSF_FAILSAFE_STAGE1_MS = 300;
83+
7884
SerialReceiver();
7985
explicit SerialReceiver(HardwareSerial *hwUartPort);
8086
SerialReceiver(HardwareSerial *hwUartPort, int8_t rxPin, int8_t txPin);
@@ -89,6 +95,8 @@ namespace serialReceiverLayer
8995
void processFrames();
9096
#endif
9197

98+
99+
92100
#if CRSF_LINK_STATISTICS_ENABLED > 0
93101
void setLinkStatisticsCallback(linkStatisticsCallback_t callback);
94102
#endif
@@ -108,6 +116,13 @@ namespace serialReceiverLayer
108116
#endif
109117
#endif
110118

119+
void setRawDataCallback(rawDataCallback_t callback);
120+
void setLinkDownCallback(linkDownCallback_t callback);
121+
void setLinkUpCallback(linkUpCallback_t callback);
122+
bool isLinkUp() const;
123+
void checkLinkDown();
124+
void setLinkUp();
125+
111126
#if CRSF_TELEMETRY_ENABLED > 0
112127
void telemetryWriteAttitude(int16_t roll, int16_t pitch, int16_t yaw);
113128
void telemetryWriteBaroAltitude(uint16_t altitude, int16_t vario);
@@ -123,6 +138,8 @@ namespace serialReceiverLayer
123138

124139
int8_t _rxPin = -1;
125140
int8_t _txPin = -1;
141+
bool _linkIsUp;
142+
uint32_t _lastChannelsPacket;
126143

127144
#if CRSF_TELEMETRY_ENABLED > 0
128145
Telemetry *telemetry = nullptr;
@@ -158,5 +175,9 @@ namespace serialReceiverLayer
158175
#if CRSF_RC_ENABLED > 0 || CRSF_TELEMETRY_ENABLED > 0
159176
void flushRemainingFrames();
160177
#endif
178+
179+
rawDataCallback_t _rawDataCallback = nullptr;
180+
linkUpCallback_t _linkUpCallback = nullptr;
181+
linkDownCallback_t _linkDownCallback = nullptr;
161182
};
162183
} // namespace serialReceiverLayer

0 commit comments

Comments
 (0)