5656#include < termios.h>
5757#include < string.h>
5858#include < unistd.h>
59+ #include < math.h>
5960
6061// TODO: include RSSI dBm to percentage conversion for ghost receiver
6162#include " spektrum_rssi.h"
@@ -77,8 +78,8 @@ enum class ghst_parser_state_t : uint8_t {
7778 synced
7879};
7980
80- // only RSSI frame contains value of RSSI, if it is not received, send last received RSSI
81- static int8_t ghst_rssi = - 1 ;
81+ // only RSSI frame contains value of RSSI, if it is not received, send last received RSSI/LQ
82+ static ghstLinkStatistics_t last_link_stats = { . rssi_pct = - 1 , . rssi_dbm = NAN, . link_quality = 0 } ;
8283
8384static ghst_frame_t &ghst_frame = rc_decode_buf.ghst_frame;
8485static uint32_t current_frame_position = 0U ;
@@ -89,7 +90,8 @@ static uint16_t prev_rc_vals[GHST_MAX_NUM_CHANNELS];
8990/* *
9091 * parse the current ghst_frame buffer
9192 */
92- static bool ghst_parse_buffer (uint16_t *values, int8_t *rssi, uint16_t *num_values, uint16_t max_channels);
93+ static bool ghst_parse_buffer (uint16_t *values, ghstLinkStatistics_t *link_stats, uint16_t *num_values,
94+ uint16_t max_channels);
9395
9496int ghst_config (int uart_fd)
9597{
@@ -114,7 +116,7 @@ static uint16_t convert_channel_value(unsigned chan_value);
114116
115117
116118bool ghst_parse (const uint64_t now, const uint8_t *frame, unsigned len, uint16_t *values,
117- int8_t *rssi , uint16_t *num_values, uint16_t max_channels)
119+ ghstLinkStatistics_t *link_stats , uint16_t *num_values, uint16_t max_channels)
118120{
119121 bool success = false ;
120122 uint8_t *ghst_frame_ptr = (uint8_t *)&ghst_frame;
@@ -145,7 +147,7 @@ bool ghst_parse(const uint64_t now, const uint8_t *frame, unsigned len, uint16_t
145147 len -= current_len;
146148 frame += current_len;
147149
148- if (ghst_parse_buffer (values, rssi , num_values, max_channels)) {
150+ if (ghst_parse_buffer (values, link_stats , num_values, max_channels)) {
149151 success = true ;
150152 }
151153 }
@@ -182,7 +184,8 @@ static uint16_t convert_channel_value(unsigned int chan_value)
182184 return converted_chan_value;
183185}
184186
185- static bool ghst_parse_buffer (uint16_t *values, int8_t *rssi, uint16_t *num_values, uint16_t max_channels)
187+ static bool ghst_parse_buffer (uint16_t *values, ghstLinkStatistics_t *link_stats, uint16_t *num_values,
188+ uint16_t max_channels)
186189{
187190 uint8_t *ghst_frame_ptr = (uint8_t *)&ghst_frame;
188191
@@ -299,13 +302,16 @@ static bool ghst_parse_buffer(uint16_t *values, int8_t *rssi, uint16_t *num_valu
299302 } else if (ghst_frame.type == static_cast <uint8_t >(ghstFrameType::frameTypeRssi)) {
300303 const ghstPayloadRssi_t *const rssiValues = (ghstPayloadRssi_t *)&ghst_frame.payload ;
301304 // TODO: call function for RSSI dBm to percentage conversion for ghost receiver
302- ghst_rssi = spek_dbm_to_percent (static_cast <int8_t >(rssiValues->rssidBm ));
305+ last_link_stats.rssi_pct = spek_dbm_to_percent (static_cast <int8_t >
306+ (rssiValues->rssidBm )); // rssidBm sign inverted (90 = -90dBm)
307+ last_link_stats.rssi_dbm = -rssiValues->rssidBm ;
308+ last_link_stats.link_quality = rssiValues->lq ; // 0 - 100
303309
304310 } else {
305311 GHST_DEBUG (" Frame type: %u" , ghst_frame.type );
306312 }
307313
308- *rssi = ghst_rssi ;
314+ *link_stats = last_link_stats ;
309315
310316 memcpy (prev_rc_vals, values, sizeof (uint16_t ) * GHST_MAX_NUM_CHANNELS);
311317
0 commit comments