From 7a5a135739fad18bd2b96f48e1c521368705722a Mon Sep 17 00:00:00 2001 From: Kurt Kiefer Date: Sun, 22 Jul 2018 14:23:17 -0700 Subject: [PATCH] PX4IO Firmware: promote rssi to static storage The controls_tick() rate exceeds the rate at which RC receivers provide digital rssi. As such, most ticks set PX4IO_P_RAW_RC_NRSSI to 0. This change promotes the controls_tick() local variable 'rssi' to static storage so that it doesn't have to be updated every tick to keep the correct value in PX4IO_P_RAW_RC_NRSSI. --- src/modules/px4iofirmware/controls.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/modules/px4iofirmware/controls.c b/src/modules/px4iofirmware/controls.c index 7dd5cdd82a..650a84db03 100644 --- a/src/modules/px4iofirmware/controls.c +++ b/src/modules/px4iofirmware/controls.c @@ -72,6 +72,10 @@ static uint16_t rc_value_override = 0; static unsigned _rssi_adc_counts = 0; #endif +/* receive signal strenght indicator (RSSI). 0 = no connection, 100 (RC_INPUT_RSSI_MAX): perfect connection */ +/* Note: this is static because RC-provided telemetry does not occur every tick */ +static uint16_t _rssi = 0; + bool dsm_port_input(uint16_t *rssi, bool *dsm_updated, bool *st24_updated, bool *sumd_updated) { perf_begin(c_gather_dsm); @@ -209,9 +213,6 @@ controls_tick() * other. Don't do that. */ - /* receive signal strenght indicator (RSSI). 0 = no connection, 255: perfect connection */ - uint16_t rssi = 0; - #ifdef ADC_RSSI if (r_setup_features & PX4IO_P_SETUP_FEATURES_ADC_RSSI) { @@ -223,10 +224,10 @@ controls_tick() /* use 1:1 scaling on 3.3V, 12-Bit ADC input */ unsigned mV = _rssi_adc_counts * 3300 / 4095; /* scale to 0..100 (RC_INPUT_RSSI_MAX == 100) */ - rssi = (mV * RC_INPUT_RSSI_MAX / 3300); + _rssi = (mV * RC_INPUT_RSSI_MAX / 3300); - if (rssi > RC_INPUT_RSSI_MAX) { - rssi = RC_INPUT_RSSI_MAX; + if (_rssi > RC_INPUT_RSSI_MAX) { + _rssi = RC_INPUT_RSSI_MAX; } } } @@ -235,7 +236,7 @@ controls_tick() /* zero RSSI if signal is lost */ if (!(r_raw_rc_flags & (PX4IO_P_RAW_RC_FLAGS_RC_OK))) { - rssi = 0; + _rssi = 0; } perf_begin(c_gather_sbus); @@ -266,7 +267,7 @@ controls_tick() /* set RSSI to an emulated value if ADC RSSI is off */ if (!(r_setup_features & PX4IO_P_SETUP_FEATURES_ADC_RSSI)) { - rssi = sbus_rssi; + _rssi = sbus_rssi; } } @@ -295,7 +296,7 @@ controls_tick() if (!((r_status_flags & PX4IO_P_STATUS_FLAGS_RC_SBUS) || (r_status_flags & PX4IO_P_STATUS_FLAGS_RC_PPM))) { perf_begin(c_gather_dsm); - (void)dsm_port_input(&rssi, &dsm_updated, &st24_updated, &sumd_updated); + (void)dsm_port_input(&_rssi, &dsm_updated, &st24_updated, &sumd_updated); if (dsm_updated) { PX4_ATOMIC_MODIFY_OR(r_status_flags, PX4IO_P_STATUS_FLAGS_RC_DSM); @@ -318,7 +319,7 @@ controls_tick() } /* store RSSI */ - r_page_raw_rc_input[PX4IO_P_RAW_RC_NRSSI] = rssi; + r_page_raw_rc_input[PX4IO_P_RAW_RC_NRSSI] = _rssi; /* * In some cases we may have received a frame, but input has still