From d0cf12a52b24354a93a977a4a1e9a65379c1a5c6 Mon Sep 17 00:00:00 2001 From: mikeller Date: Sat, 7 Mar 2020 17:29:21 +1300 Subject: [PATCH] Added option to display RX SNR dB for CRSF instead of RSSI dBm. --- src/main/cli/settings.c | 12 ++++++++---- src/main/osd/osd.c | 11 ++++++----- src/main/osd/osd.h | 4 ++-- src/main/osd/osd_elements.c | 4 ++-- src/main/pg/rx.c | 1 + src/main/pg/rx.h | 1 + src/main/rx/a7105_flysky.h | 2 ++ src/main/rx/crsf.c | 15 +++++++++++---- src/main/rx/crsf.h | 5 +++++ src/main/rx/rx.c | 20 ++++++++++---------- src/main/rx/rx.h | 6 +++--- 11 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index 6815c75af..0cbedf590 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -99,12 +99,13 @@ #include "pg/stats.h" #include "pg/board.h" -#include "rx/rx.h" +#include "rx/a7105_flysky.h" #include "rx/cc2500_frsky_common.h" #include "rx/cc2500_sfhss.h" -#include "rx/spektrum.h" +#include "rx/crsf.h" #include "rx/cyrf6936_spektrum.h" -#include "rx/a7105_flysky.h" +#include "rx/rx.h" +#include "rx/spektrum.h" #include "sensors/acceleration.h" #include "sensors/barometer.h" @@ -741,6 +742,9 @@ const clivalue_t valueTable[] = { #if defined(USE_SERIALRX_SBUS) { "sbus_baud_fast", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_RX_CONFIG, offsetof(rxConfig_t, sbus_baud_fast) }, #endif +#if defined(USE_SERIALRX_CRSF) + { "crsf_use_rx_snr", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_RX_CONFIG, offsetof(rxConfig_t, crsf_use_rx_snr) }, +#endif { "airmode_start_throttle_percent", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 100 }, PG_RX_CONFIG, offsetof(rxConfig_t, airModeActivateThreshold) }, { "rx_min_usec", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { PWM_PULSE_MIN, PWM_PULSE_MAX }, PG_RX_CONFIG, offsetof(rxConfig_t, rx_min_usec) }, { "rx_max_usec", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { PWM_PULSE_MIN, PWM_PULSE_MAX }, PG_RX_CONFIG, offsetof(rxConfig_t, rx_max_usec) }, @@ -1236,7 +1240,7 @@ const clivalue_t valueTable[] = { { "osd_link_quality_alarm", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 300 }, PG_OSD_CONFIG, offsetof(osdConfig_t, link_quality_alarm) }, #endif #ifdef USE_RX_RSSI_DBM - { "osd_rssi_dbm_alarm", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 130 }, PG_OSD_CONFIG, offsetof(osdConfig_t, rssi_dbm_alarm) }, + { "osd_rssi_dbm_alarm", VAR_INT16 | MASTER_VALUE, .config.minmaxUnsigned = { CRSF_RSSI_MIN, CRSF_SNR_MAX }, PG_OSD_CONFIG, offsetof(osdConfig_t, rssi_dbm_alarm) }, #endif { "osd_cap_alarm", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 20000 }, PG_OSD_CONFIG, offsetof(osdConfig_t, cap_alarm) }, { "osd_alt_alarm", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 10000 }, PG_OSD_CONFIG, offsetof(osdConfig_t, alt_alarm) }, diff --git a/src/main/osd/osd.c b/src/main/osd/osd.c index bde4802f2..4c5036ef0 100644 --- a/src/main/osd/osd.c +++ b/src/main/osd/osd.c @@ -80,6 +80,7 @@ #include "pg/pg_ids.h" #include "pg/stats.h" +#include "rx/crsf.h" #include "rx/rx.h" #include "sensors/acceleration.h" @@ -140,7 +141,7 @@ escSensorData_t *osdEscDataCombined; STATIC_ASSERT(OSD_POS_MAX == OSD_POS(31,31), OSD_POS_MAX_incorrect); -PG_REGISTER_WITH_RESET_FN(osdConfig_t, osdConfig, PG_OSD_CONFIG, 7); +PG_REGISTER_WITH_RESET_FN(osdConfig_t, osdConfig, PG_OSD_CONFIG, 8); PG_REGISTER_WITH_RESET_FN(osdElementConfig_t, osdElementConfig, PG_OSD_ELEMENT_CONFIG, 0); @@ -319,7 +320,7 @@ void pgResetFn_osdConfig(osdConfig_t *osdConfig) for (int i=0; i < OSD_PROFILE_COUNT; i++) { osdConfig->profile[i][0] = '\0'; } - osdConfig->rssi_dbm_alarm = 60; + osdConfig->rssi_dbm_alarm = -60; osdConfig->gps_sats_show_hdop = false; for (int i = 0; i < OSD_RCCHANNELS_COUNT; i++) { @@ -447,7 +448,7 @@ static void osdResetStats(void) stats.max_esc_temp = 0; stats.max_esc_rpm = 0; stats.min_link_quality = (linkQualitySource == LQ_SOURCE_RX_PROTOCOL_CRSF) ? 300 : 99; // CRSF : percent - stats.min_rssi_dbm = 0; + stats.min_rssi_dbm = CRSF_SNR_MAX; } static void osdUpdateStats(void) @@ -500,7 +501,7 @@ static void osdUpdateStats(void) #ifdef USE_RX_RSSI_DBM value = getRssiDbm(); - if (stats.min_rssi_dbm < value) { + if (stats.min_rssi_dbm > value) { stats.min_rssi_dbm = value; } #endif @@ -760,7 +761,7 @@ static bool osdDisplayStat(int statistic, uint8_t displayRow) #ifdef USE_RX_RSSI_DBM case OSD_STAT_MIN_RSSI_DBM: - tfp_sprintf(buff, "%3d", stats.min_rssi_dbm * -1); + tfp_sprintf(buff, "%3d", stats.min_rssi_dbm); osdDisplayStatisticLabel(displayRow, "MIN RSSI DBM", buff); return true; #endif diff --git a/src/main/osd/osd.h b/src/main/osd/osd.h index f66c99f1f..fd3b197fc 100644 --- a/src/main/osd/osd.h +++ b/src/main/osd/osd.h @@ -278,7 +278,7 @@ typedef struct osdConfig_s { uint8_t overlay_radio_mode; char profile[OSD_PROFILE_COUNT][OSD_PROFILE_NAME_LENGTH + 1]; uint16_t link_quality_alarm; - uint8_t rssi_dbm_alarm; + int16_t rssi_dbm_alarm; uint8_t gps_sats_show_hdop; int8_t rcChannels[OSD_RCCHANNELS_COUNT]; // RC channel values to display, -1 if none uint8_t displayPortDevice; // osdDisplayPortDevice_e @@ -310,7 +310,7 @@ typedef struct statistic_s { int16_t max_esc_temp; int32_t max_esc_rpm; uint16_t min_link_quality; - uint8_t min_rssi_dbm; + int16_t min_rssi_dbm; } statistic_t; extern timeUs_t resumeRefreshAt; diff --git a/src/main/osd/osd_elements.c b/src/main/osd/osd_elements.c index a4363572f..9223fb0bf 100644 --- a/src/main/osd/osd_elements.c +++ b/src/main/osd/osd_elements.c @@ -1142,7 +1142,7 @@ static void osdElementRtcTime(osdElementParms_t *element) #ifdef USE_RX_RSSI_DBM static void osdElementRssiDbm(osdElementParms_t *element) { - tfp_sprintf(element->buff, "%c%3d", SYM_RSSI, getRssiDbm() * -1); + tfp_sprintf(element->buff, "%c%3d", SYM_RSSI, getRssiDbm()); } #endif // USE_RX_RSSI_DBM @@ -1349,7 +1349,7 @@ static void osdElementWarnings(osdElementParms_t *element) } #ifdef USE_RX_RSSI_DBM // rssi dbm - if (osdWarnGetState(OSD_WARNING_RSSI_DBM) && (getRssiDbm() > osdConfig()->rssi_dbm_alarm)) { + if (osdWarnGetState(OSD_WARNING_RSSI_DBM) && (getRssiDbm() < osdConfig()->rssi_dbm_alarm)) { tfp_sprintf(element->buff, "RSSI DBM"); element->attr = DISPLAYPORT_ATTR_WARNING; SET_BLINK(OSD_WARNINGS); diff --git a/src/main/pg/rx.c b/src/main/pg/rx.c index 7bf771427..e075b0b82 100644 --- a/src/main/pg/rx.c +++ b/src/main/pg/rx.c @@ -72,6 +72,7 @@ void pgResetFn_rxConfig(rxConfig_t *rxConfig) .srxl2_unit_id = 1, .srxl2_baud_fast = true, .sbus_baud_fast = false, + .crsf_use_rx_snr = false, ); #ifdef RX_CHANNELS_TAER diff --git a/src/main/pg/rx.h b/src/main/pg/rx.h index 69ecfc9fd..4f46ca952 100644 --- a/src/main/pg/rx.h +++ b/src/main/pg/rx.h @@ -65,6 +65,7 @@ typedef struct rxConfig_s { uint8_t srxl2_unit_id; // Spektrum SRXL2 RX unit id uint8_t srxl2_baud_fast; // Select Spektrum SRXL2 fast baud rate uint8_t sbus_baud_fast; // Select SBus fast baud rate + uint8_t crsf_use_rx_snr; // Use RX SNR (in dB) instead of RSSI dBm for CRSF } rxConfig_t; PG_DECLARE(rxConfig_t, rxConfig); diff --git a/src/main/rx/a7105_flysky.h b/src/main/rx/a7105_flysky.h index 7e154e642..71615fcc8 100644 --- a/src/main/rx/a7105_flysky.h +++ b/src/main/rx/a7105_flysky.h @@ -23,6 +23,8 @@ #include #include +#include "rx/rx_spi.h" + typedef struct flySkyConfig_s { uint32_t txId; uint8_t rfChannelMap[16]; diff --git a/src/main/rx/crsf.c b/src/main/rx/crsf.c index 1e76f4f62..a0de143fd 100644 --- a/src/main/rx/crsf.c +++ b/src/main/rx/crsf.c @@ -157,12 +157,15 @@ static void handleCrsfLinkStatisticsFrame(const crsfLinkStatistics_t* statsPtr, const crsfLinkStatistics_t stats = *statsPtr; lastLinkStatisticsFrameUs = currentTimeUs; if (rssiSource == RSSI_SOURCE_RX_PROTOCOL_CRSF) { - const uint8_t rssiDbm = stats.active_antenna ? stats.uplink_RSSI_2 : stats.uplink_RSSI_1; + int16_t rssiDbm = -1 * (stats.active_antenna ? stats.uplink_RSSI_2 : stats.uplink_RSSI_1); + const uint16_t rssiPercentScaled = scaleRange(rssiDbm, CRSF_RSSI_MIN, 0, 0, RSSI_MAX_VALUE); + setRssi(rssiPercentScaled, RSSI_SOURCE_RX_PROTOCOL_CRSF); #ifdef USE_RX_RSSI_DBM + if (rxConfig()->crsf_use_rx_snr) { + rssiDbm = stats.uplink_SNR; + } setRssiDbm(rssiDbm, RSSI_SOURCE_RX_PROTOCOL_CRSF); #endif - const uint16_t rssiPercentScaled = scaleRange(rssiDbm, 130, 0, 0, RSSI_MAX_VALUE); - setRssi(rssiPercentScaled, RSSI_SOURCE_RX_PROTOCOL_CRSF); } #ifdef USE_RX_LINK_QUALITY_INFO @@ -201,7 +204,11 @@ static void crsfCheckRssi(uint32_t currentTimeUs) { if (rssiSource == RSSI_SOURCE_RX_PROTOCOL_CRSF) { setRssiDirect(0, RSSI_SOURCE_RX_PROTOCOL_CRSF); #ifdef USE_RX_RSSI_DBM - setRssiDbmDirect(130, RSSI_SOURCE_RX_PROTOCOL_CRSF); + if (rxConfig()->crsf_use_rx_snr) { + setRssiDbmDirect(CRSF_SNR_MIN, RSSI_SOURCE_RX_PROTOCOL_CRSF); + } else { + setRssiDbmDirect(CRSF_RSSI_MIN, RSSI_SOURCE_RX_PROTOCOL_CRSF); + } #endif } #ifdef USE_RX_LINK_QUALITY_INFO diff --git a/src/main/rx/crsf.h b/src/main/rx/crsf.h index e77054690..fe8efed07 100644 --- a/src/main/rx/crsf.h +++ b/src/main/rx/crsf.h @@ -28,6 +28,11 @@ #define CRSF_MAX_CHANNEL 16 +#define CRSF_RSSI_MIN (-130) +#define CRSF_RSSI_MAX 0 +#define CRSF_SNR_MIN (-30) +#define CRSF_SNR_MAX 20 + typedef struct crsfFrameDef_s { uint8_t deviceAddress; uint8_t frameLength; diff --git a/src/main/rx/rx.c b/src/main/rx/rx.c index 1c0d577ba..cd52e5210 100644 --- a/src/main/rx/rx.c +++ b/src/main/rx/rx.c @@ -72,7 +72,7 @@ const char rcChannelLetters[] = "AERT12345678abcdefgh"; static uint16_t rssi = 0; // range: [0;1023] -static uint8_t rssi_dbm = 130; // range: [0;130] display 0 to -130 +static int16_t rssiDbm = CRSF_RSSI_MIN; // range: [-130,20] static timeUs_t lastMspRssiUpdateUs = 0; static pt1Filter_t frameErrFilter; @@ -809,18 +809,18 @@ uint8_t getRssiPercent(void) return scaleRange(getRssi(), 0, RSSI_MAX_VALUE, 0, 100); } -uint8_t getRssiDbm(void) +int16_t getRssiDbm(void) { - return rssi_dbm; + return rssiDbm; } #define RSSI_SAMPLE_COUNT_DBM 16 -static uint8_t updateRssiDbmSamples(uint8_t value) +static int16_t updateRssiDbmSamples(int16_t value) { - static uint16_t samplesdbm[RSSI_SAMPLE_COUNT_DBM]; + static int16_t samplesdbm[RSSI_SAMPLE_COUNT_DBM]; static uint8_t sampledbmIndex = 0; - static unsigned sumdbm = 0; + static int sumdbm = 0; sumdbm += value - samplesdbm[sampledbmIndex]; samplesdbm[sampledbmIndex] = value; @@ -828,22 +828,22 @@ static uint8_t updateRssiDbmSamples(uint8_t value) return sumdbm / RSSI_SAMPLE_COUNT_DBM; } -void setRssiDbm(uint8_t rssiDbmValue, rssiSource_e source) +void setRssiDbm(int16_t rssiDbmValue, rssiSource_e source) { if (source != rssiSource) { return; } - rssi_dbm = updateRssiDbmSamples(rssiDbmValue); + rssiDbm = updateRssiDbmSamples(rssiDbmValue); } -void setRssiDbmDirect(uint8_t newRssiDbm, rssiSource_e source) +void setRssiDbmDirect(int16_t newRssiDbm, rssiSource_e source) { if (source != rssiSource) { return; } - rssi_dbm = newRssiDbm; + rssiDbm = newRssiDbm; } #ifdef USE_RX_LINK_QUALITY_INFO diff --git a/src/main/rx/rx.h b/src/main/rx/rx.h index 8e115fefd..2022a6b81 100644 --- a/src/main/rx/rx.h +++ b/src/main/rx/rx.h @@ -196,9 +196,9 @@ uint16_t rxGetLinkQuality(void); void setLinkQualityDirect(uint16_t linkqualityValue); uint16_t rxGetLinkQualityPercent(void); -uint8_t getRssiDbm(void); -void setRssiDbm(uint8_t newRssiDbm, rssiSource_e source); -void setRssiDbmDirect(uint8_t newRssiDbm, rssiSource_e source); +int16_t getRssiDbm(void); +void setRssiDbm(int16_t newRssiDbm, rssiSource_e source); +void setRssiDbmDirect(int16_t newRssiDbm, rssiSource_e source); void rxSetRfMode(uint8_t rfModeValue); uint8_t rxGetRfMode(void); -- 2.11.4.GIT