mirror of https://github.com/ArduPilot/ardupilot
AP_RCProtocol: process CRSF crc per-byte
This commit is contained in:
parent
f9bb9b4fc0
commit
5224468ec6
|
@ -135,7 +135,8 @@ static const char* get_frame_type(uint8_t byte)
|
||||||
#define CRSF_INTER_FRAME_TIME_US_250HZ 4000U // At fastest, frames are sent by the transmitter every 4 ms, 250 Hz
|
#define CRSF_INTER_FRAME_TIME_US_250HZ 4000U // At fastest, frames are sent by the transmitter every 4 ms, 250 Hz
|
||||||
#define CRSF_INTER_FRAME_TIME_US_150HZ 6667U // At medium, frames are sent by the transmitter every 6.667 ms, 150 Hz
|
#define CRSF_INTER_FRAME_TIME_US_150HZ 6667U // At medium, frames are sent by the transmitter every 6.667 ms, 150 Hz
|
||||||
#define CRSF_INTER_FRAME_TIME_US_50HZ 20000U // At slowest, frames are sent by the transmitter every 20ms, 50 Hz
|
#define CRSF_INTER_FRAME_TIME_US_50HZ 20000U // At slowest, frames are sent by the transmitter every 20ms, 50 Hz
|
||||||
#define CSRF_HEADER_LEN 2
|
#define CSRF_HEADER_LEN 2 // header length
|
||||||
|
#define CSRF_HEADER_TYPE_LEN (CSRF_HEADER_LEN + 1) // header length including type
|
||||||
|
|
||||||
#define CRSF_DIGITAL_CHANNEL_MIN 172
|
#define CRSF_DIGITAL_CHANNEL_MIN 172
|
||||||
#define CRSF_DIGITAL_CHANNEL_MAX 1811
|
#define CRSF_DIGITAL_CHANNEL_MAX 1811
|
||||||
|
@ -200,12 +201,13 @@ void AP_RCProtocol_CRSF::_process_byte(uint32_t timestamp_us, uint8_t byte)
|
||||||
add_to_buffer(_frame_ofs++, byte);
|
add_to_buffer(_frame_ofs++, byte);
|
||||||
|
|
||||||
// need a header to get the length
|
// need a header to get the length
|
||||||
if (_frame_ofs < CSRF_HEADER_LEN) {
|
if (_frame_ofs < CSRF_HEADER_TYPE_LEN) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse the length
|
// parse the length
|
||||||
if (_frame_ofs == CSRF_HEADER_LEN) {
|
if (_frame_ofs == CSRF_HEADER_TYPE_LEN) {
|
||||||
|
_frame_crc = crc8_dvb_s2(0, _frame.type);
|
||||||
// check for garbage frame
|
// check for garbage frame
|
||||||
if (_frame.length > CRSF_FRAMELEN_MAX) {
|
if (_frame.length > CRSF_FRAMELEN_MAX) {
|
||||||
_frame_ofs = 0;
|
_frame_ofs = 0;
|
||||||
|
@ -213,6 +215,11 @@ void AP_RCProtocol_CRSF::_process_byte(uint32_t timestamp_us, uint8_t byte)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update crc
|
||||||
|
if (_frame_ofs < _frame.length + CSRF_HEADER_LEN) {
|
||||||
|
_frame_crc = crc8_dvb_s2(_frame_crc, byte);
|
||||||
|
}
|
||||||
|
|
||||||
// overflow check
|
// overflow check
|
||||||
if (_frame_ofs > _frame.length + CSRF_HEADER_LEN) {
|
if (_frame_ofs > _frame.length + CSRF_HEADER_LEN) {
|
||||||
_frame_ofs = 0;
|
_frame_ofs = 0;
|
||||||
|
@ -226,13 +233,8 @@ void AP_RCProtocol_CRSF::_process_byte(uint32_t timestamp_us, uint8_t byte)
|
||||||
// we consumed the partial frame, reset
|
// we consumed the partial frame, reset
|
||||||
_frame_ofs = 0;
|
_frame_ofs = 0;
|
||||||
|
|
||||||
uint8_t crc = crc8_dvb_s2(0, _frame.type);
|
|
||||||
for (uint8_t i = 0; i < _frame.length - 2; i++) {
|
|
||||||
crc = crc8_dvb_s2(crc, _frame.payload[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// bad CRC
|
// bad CRC
|
||||||
if (crc != _frame.payload[_frame.length - CSRF_HEADER_LEN]) {
|
if (_frame_crc != _frame.payload[_frame.length - CSRF_HEADER_LEN]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -239,6 +239,7 @@ private:
|
||||||
struct Frame _frame;
|
struct Frame _frame;
|
||||||
struct Frame _telemetry_frame;
|
struct Frame _telemetry_frame;
|
||||||
uint8_t _frame_ofs;
|
uint8_t _frame_ofs;
|
||||||
|
uint8_t _frame_crc;
|
||||||
|
|
||||||
const uint8_t MAX_CHANNELS = MIN((uint8_t)CRSF_MAX_CHANNELS, (uint8_t)MAX_RCIN_CHANNELS);
|
const uint8_t MAX_CHANNELS = MIN((uint8_t)CRSF_MAX_CHANNELS, (uint8_t)MAX_RCIN_CHANNELS);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue