From d87bef16a268bb6e0241a2e0b9ca42982d1b0862 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 3 Nov 2018 09:49:17 +1100 Subject: [PATCH] AP_RCProtocol: require 3 good frames for weak CRC protocols --- libraries/AP_RCProtocol/AP_RCProtocol.cpp | 8 ++++++++ libraries/AP_RCProtocol/AP_RCProtocol.h | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/libraries/AP_RCProtocol/AP_RCProtocol.cpp b/libraries/AP_RCProtocol/AP_RCProtocol.cpp index 65a63cfb0f..76d67acb51 100644 --- a/libraries/AP_RCProtocol/AP_RCProtocol.cpp +++ b/libraries/AP_RCProtocol/AP_RCProtocol.cpp @@ -64,6 +64,10 @@ void AP_RCProtocol::process_pulse(uint32_t width_s0, uint32_t width_s1) if (backend[i] != nullptr) { backend[i]->process_pulse(width_s0, width_s1); if (backend[i]->new_input()) { + _good_frames[i]++; + if (requires_3_frames((rcprotocol_t)i) && _good_frames[i] < 3) { + continue; + } _new_input = true; _detected_protocol = (enum AP_RCProtocol::rcprotocol_t)i; _last_input_ms = now; @@ -95,6 +99,10 @@ void AP_RCProtocol::process_byte(uint8_t byte, uint32_t baudrate) if (backend[i] != nullptr) { backend[i]->process_byte(byte, baudrate); if (backend[i]->new_input()) { + _good_frames[i]++; + if (requires_3_frames((rcprotocol_t)i) && _good_frames[i] < 3) { + continue; + } _new_input = true; _detected_protocol = (enum AP_RCProtocol::rcprotocol_t)i; _last_input_ms = now; diff --git a/libraries/AP_RCProtocol/AP_RCProtocol.h b/libraries/AP_RCProtocol/AP_RCProtocol.h index 7ab0282039..30ad53424e 100644 --- a/libraries/AP_RCProtocol/AP_RCProtocol.h +++ b/libraries/AP_RCProtocol/AP_RCProtocol.h @@ -50,6 +50,11 @@ public: _disabled_for_pulses |= (1U<<(uint8_t)protocol); } + // for protocols without strong CRCs we require 3 good frames to lock on + bool requires_3_frames(enum rcprotocol_t p) { + return (p == DSM || p == SBUS || p == SBUS_NI || p == PPM); + } + enum rcprotocol_t protocol_detected() { return _detected_protocol; @@ -72,6 +77,7 @@ private: bool _new_input = false; uint32_t _last_input_ms; bool _valid_serial_prot = false; + uint8_t _good_frames[NONE]; static AP_RCProtocol *instance; };