AP_RCProtocol: add Link Quality reporting to RC protocols

This commit is contained in:
Hwurzburg 2021-07-13 11:45:08 -05:00 committed by Andrew Tridgell
parent df0c9a42cb
commit c5f53fc0b6
6 changed files with 18 additions and 5 deletions

View File

@ -351,7 +351,13 @@ int16_t AP_RCProtocol::get_RSSI(void) const
}
return -1;
}
int16_t AP_RCProtocol::get_rx_link_quality(void) const
{
if (_detected_protocol != AP_RCProtocol::NONE) {
return backend[_detected_protocol]->get_rx_link_quality();
}
return -1;
}
/*
ask for bind start on supported receivers (eg spektrum satellite)
*/

View File

@ -70,6 +70,7 @@ public:
bool new_input();
void start_bind(void);
int16_t get_RSSI(void) const;
int16_t get_rx_link_quality(void) const;
// return protocol name as a string
static const char *protocol_name_from_protocol(rcprotocol_t protocol);

View File

@ -58,7 +58,7 @@ void AP_RCProtocol_Backend::read(uint16_t *pwm, uint8_t n)
/*
provide input from a backend
*/
void AP_RCProtocol_Backend::add_input(uint8_t num_values, uint16_t *values, bool in_failsafe, int16_t _rssi)
void AP_RCProtocol_Backend::add_input(uint8_t num_values, uint16_t *values, bool in_failsafe, int16_t _rssi, int16_t _rx_link_quality)
{
num_values = MIN(num_values, MAX_RCIN_CHANNELS);
memcpy(_pwm_values, values, num_values*sizeof(uint16_t));
@ -73,6 +73,7 @@ void AP_RCProtocol_Backend::add_input(uint8_t num_values, uint16_t *values, bool
rc_input_count++;
}
rssi = _rssi;
rx_link_quality = _rx_link_quality;
}

View File

@ -67,7 +67,9 @@ public:
int16_t get_RSSI(void) const {
return rssi;
}
int16_t get_rx_link_quality(void) const {
return rx_link_quality;
}
// get UART for RCIN, if available. This will return false if we
// aren't getting the active RC input protocol via the uart
AP_HAL::UARTDriver *get_UART(void) const {
@ -99,7 +101,7 @@ protected:
uint32_t ch7 : 11;
} PACKED;
void add_input(uint8_t num_channels, uint16_t *values, bool in_failsafe, int16_t rssi=-1);
void add_input(uint8_t num_channels, uint16_t *values, bool in_failsafe, int16_t rssi=-1, int16_t rx_link_quality=-1);
AP_RCProtocol &frontend;
void log_data(AP_RCProtocol::rcprotocol_t prot, uint32_t timestamp, const uint8_t *data, uint8_t len) const;
@ -115,4 +117,5 @@ private:
uint16_t _pwm_values[MAX_RCIN_CHANNELS];
uint8_t _num_channels;
int16_t rssi = -1;
int16_t rx_link_quality = -1;
};

View File

@ -204,7 +204,7 @@ void AP_RCProtocol_CRSF::_process_byte(uint32_t timestamp_us, uint8_t byte)
_last_frame_time_us = timestamp_us;
// decode here
if (decode_csrf_packet()) {
add_input(MAX_CHANNELS, _channels, false, _link_status.rssi);
add_input(MAX_CHANNELS, _channels, false, _link_status.rssi, _link_status.link_quality);
}
}
}
@ -341,6 +341,7 @@ void AP_RCProtocol_CRSF::process_link_stats_frame(const void* data)
} else {
rssi_dbm = link->uplink_rssi_ant2;
}
_link_status.link_quality = link->uplink_status;
// AP rssi: -1 for unknown, 0 for no link, 255 for maximum link
if (rssi_dbm < 50) {
_link_status.rssi = 255;

View File

@ -181,6 +181,7 @@ public:
struct LinkStatus {
int16_t rssi = -1;
int16_t link_quality = -1;
RFMode rf_mode;
};