AP_RCProtocol: bootstrap Ghost to correct baudrate

This commit is contained in:
Andy Piper 2024-01-02 18:20:46 +00:00 committed by Andrew Tridgell
parent 0da6989c8e
commit 0df36a8d81
3 changed files with 22 additions and 6 deletions

View File

@ -301,16 +301,12 @@ static const AP_RCProtocol::SerialConfig serial_configs[] {
// FastSBUS:
{ 200000, 2, 2, true },
#endif
#if AP_RCPROTOCOL_CRSF_ENABLED
#if AP_RCPROTOCOL_CRSF_ENABLED || AP_RCPROTOCOL_GHST_ENABLED
// CrossFire:
{ 416666, 0, 1, false },
// CRSFv3 can negotiate higher rates which are sticky on soft reboot
{ 2000000, 0, 1, false },
#endif
#if AP_RCPROTOCOL_GHST_ENABLED
// Ghost:
{ 420000, 0, 1, false },
#endif
};
static_assert(ARRAY_SIZE(serial_configs) > 1, "must have at least one serial config");

View File

@ -21,6 +21,8 @@
#if AP_RCPROTOCOL_GHST_ENABLED
#define CRSF_BAUDRATE 416666U
#include "AP_RCProtocol.h"
#include "AP_RCProtocol_GHST.h"
#include <AP_HAL/AP_HAL.h>
@ -413,12 +415,29 @@ bool AP_RCProtocol_GHST::is_telemetry_supported() const
void AP_RCProtocol_GHST::process_byte(uint8_t byte, uint32_t baudrate)
{
// reject RC data if we have been configured for standalone mode
if (baudrate != GHST_BAUDRATE) {
if (baudrate != CRSF_BAUDRATE && baudrate != GHST_BAUDRATE) {
return;
}
_process_byte(AP_HAL::micros(), byte);
}
// change the bootstrap baud rate to ELRS standard if configured
void AP_RCProtocol_GHST::process_handshake(uint32_t baudrate)
{
AP_HAL::UARTDriver *uart = get_current_UART();
// only change the baudrate if we are bootstrapping CRSF
if (uart == nullptr
|| baudrate != CRSF_BAUDRATE
|| baudrate == GHST_BAUDRATE
|| uart->get_baud_rate() == GHST_BAUDRATE
|| (get_rc_protocols_mask() & ((1U<<(uint8_t(AP_RCProtocol::GHST)+1))+1)) == 0) {
return;
}
uart->begin(GHST_BAUDRATE);
}
//returns uplink link quality on 0-255 scale
int16_t AP_RCProtocol_GHST::derive_scaled_lq_value(uint8_t uplink_lq)
{

View File

@ -36,6 +36,7 @@ public:
AP_RCProtocol_GHST(AP_RCProtocol &_frontend);
virtual ~AP_RCProtocol_GHST();
void process_byte(uint8_t byte, uint32_t baudrate) override;
void process_handshake(uint32_t baudrate) override;
void update(void) override;
// is the receiver active, used to detect power loss and baudrate changes