diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index 270254875a..cc81554932 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -1352,6 +1352,9 @@ const clivalue_t valueTable[] = { #ifdef USE_RX_LINK_QUALITY_INFO { "osd_link_quality_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_LINK_QUALITY]) }, #endif +#ifdef USE_RX_LINK_UPLINK_POWER + { "osd_link_tx_power_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_TX_UPLINK_POWER]) }, +#endif #ifdef USE_RX_RSSI_DBM { "osd_rssi_dbm_pos", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, OSD_POSCFG_MAX }, PG_OSD_ELEMENT_CONFIG, offsetof(osdElementConfig_t, item_pos[OSD_RSSI_DBM_VALUE]) }, #endif diff --git a/src/main/osd/osd.h b/src/main/osd/osd.h index 6c8412595a..d6c1b2c944 100644 --- a/src/main/osd/osd.h +++ b/src/main/osd/osd.h @@ -160,6 +160,7 @@ typedef enum { OSD_EFFICIENCY, OSD_TOTAL_FLIGHTS, OSD_UP_DOWN_REFERENCE, + OSD_TX_UPLINK_POWER, OSD_ITEM_COUNT // MUST BE LAST } osd_items_e; diff --git a/src/main/osd/osd_elements.c b/src/main/osd/osd_elements.c index 5030e576a3..d562026b6f 100644 --- a/src/main/osd/osd_elements.c +++ b/src/main/osd/osd_elements.c @@ -1036,6 +1036,18 @@ static void osdElementLinkQuality(osdElementParms_t *element) } #endif // USE_RX_LINK_QUALITY_INFO +#ifdef USE_RX_LINK_UPLINK_POWER +static void osdElementTxUplinkPower(osdElementParms_t *element) +{ + const uint16_t osdUplinkTxPowerMw = rxGetUplinkTxPwrMw(); + if (osdUplinkTxPowerMw < 1000) { + tfp_sprintf(element->buff, "%c%3dMW", SYM_RSSI, osdUplinkTxPowerMw); + } else { + osdPrintFloat(element->buff, SYM_RSSI, osdUplinkTxPowerMw / 1000.0f, "", 1, false, 'W'); + } +} +#endif // USE_RX_LINK_UPLINK_POWER + #ifdef USE_BLACKBOX static void osdElementLogStatus(osdElementParms_t *element) { @@ -1422,6 +1434,9 @@ static const uint8_t osdElementDisplayOrder[] = { #ifdef USE_RX_LINK_QUALITY_INFO OSD_LINK_QUALITY, #endif +#ifdef USE_RX_LINK_UPLINK_POWER + OSD_TX_UPLINK_POWER, +#endif #ifdef USE_RX_RSSI_DBM OSD_RSSI_DBM_VALUE, #endif @@ -1527,6 +1542,9 @@ const osdElementDrawFn osdElementDrawFunction[OSD_ITEM_COUNT] = { #ifdef USE_RX_LINK_QUALITY_INFO [OSD_LINK_QUALITY] = osdElementLinkQuality, #endif +#ifdef USE_RX_LINK_UPLINK_POWER + [OSD_TX_UPLINK_POWER] = osdElementTxUplinkPower, +#endif #ifdef USE_GPS [OSD_FLIGHT_DIST] = osdElementGpsFlightDistance, #endif diff --git a/src/main/rx/crsf.c b/src/main/rx/crsf.c index 33ba6bbdab..d46f737abc 100644 --- a/src/main/rx/crsf.c +++ b/src/main/rx/crsf.c @@ -70,6 +70,12 @@ static uint8_t telemetryBufLen = 0; static timeUs_t lastRcFrameTimeUs = 0; +#ifdef USE_RX_LINK_UPLINK_POWER +#define CRSF_UPLINK_POWER_LEVEL_MW_ITEMS_COUNT 8 +// Uplink power levels by uplinkTXPower expressed in mW (250 mW is from ver >=4.00) +const uint16_t uplinkTXPowerStatesMw[CRSF_UPLINK_POWER_LEVEL_MW_ITEMS_COUNT] = {0, 10, 25, 100, 500, 1000, 2000, 250}; +#endif + /* * CRSF protocol * @@ -130,7 +136,7 @@ typedef struct crsfPayloadRcChannelsPacked_s crsfPayloadRcChannelsPacked_t; * int8_t Uplink SNR ( db ) * uint8_t Diversity active antenna ( enum ant. 1 = 0, ant. 2 ) * uint8_t RF Mode ( enum 4fps = 0 , 50fps, 150hz) - * uint8_t Uplink TX Power ( enum 0mW = 0, 10mW, 25 mW, 100 mW, 500 mW, 1000 mW, 2000mW ) + * uint8_t Uplink TX Power ( enum 0mW = 0, 10mW, 25 mW, 100 mW, 500 mW, 1000 mW, 2000mW, 250mW ) * uint8_t Downlink RSSI ( dBm * -1 ) * uint8_t Downlink package success rate / Link quality ( % ) * int8_t Downlink SNR ( db ) @@ -175,6 +181,11 @@ static void handleCrsfLinkStatisticsFrame(const crsfLinkStatistics_t* statsPtr, } #endif +#ifdef USE_RX_LINK_UPLINK_POWER + const uint8_t crsfUplinkPowerStatesItemIndex = (stats.uplink_TX_Power < CRSF_UPLINK_POWER_LEVEL_MW_ITEMS_COUNT) ? stats.uplink_TX_Power : 0; + rxSetUplinkTxPwrMw(uplinkTXPowerStatesMw[crsfUplinkPowerStatesItemIndex]); +#endif + switch (debugMode) { case DEBUG_CRSF_LINK_STATISTICS_UPLINK: DEBUG_SET(DEBUG_CRSF_LINK_STATISTICS_UPLINK, 0, stats.uplink_RSSI_1); diff --git a/src/main/rx/rx.c b/src/main/rx/rx.c index 380f5e7dc2..345d5ca792 100644 --- a/src/main/rx/rx.c +++ b/src/main/rx/rx.c @@ -85,6 +85,10 @@ static uint16_t linkQuality = 0; static uint8_t rfMode = 0; #endif +#ifdef USE_RX_LINK_UPLINK_POWER +static uint16_t uplinkTxPwrMw = 0; //Uplink Tx power in mW +#endif + #define MSP_RSSI_TIMEOUT_US 1500000 // 1.5 sec #define RSSI_ADC_DIVISOR (4096 / 1024) @@ -455,6 +459,13 @@ void setLinkQualityDirect(uint16_t linkqualityValue) #endif } +#ifdef USE_RX_LINK_UPLINK_POWER +void rxSetUplinkTxPwrMw(uint16_t uplinkTxPwrMwValue) +{ + uplinkTxPwrMw = uplinkTxPwrMwValue; +} +#endif + bool rxUpdateCheck(timeUs_t currentTimeUs, timeDelta_t currentDeltaTimeUs) { bool signalReceived = false; @@ -881,6 +892,13 @@ uint16_t rxGetLinkQualityPercent(void) } #endif +#ifdef USE_RX_LINK_UPLINK_POWER +uint16_t rxGetUplinkTxPwrMw(void) +{ + return uplinkTxPwrMw; +} +#endif + uint16_t rxGetRefreshRate(void) { return rxRuntimeState.rxRefreshRate; diff --git a/src/main/rx/rx.h b/src/main/rx/rx.h index 87731bbf23..796f498142 100644 --- a/src/main/rx/rx.h +++ b/src/main/rx/rx.h @@ -206,6 +206,9 @@ void setRssiDbmDirect(int16_t newRssiDbm, rssiSource_e source); void rxSetRfMode(uint8_t rfModeValue); uint8_t rxGetRfMode(void); +void rxSetUplinkTxPwrMw(uint16_t uplinkTxPwrMwValue); +uint16_t rxGetUplinkTxPwrMw(void); + void resetAllRxChannelRangeConfigurations(rxChannelRangeConfig_t *rxChannelRangeConfig); void suspendRxPwmPpmSignal(void); diff --git a/src/main/target/common_post.h b/src/main/target/common_post.h index 65a4f9074a..da671c4201 100644 --- a/src/main/target/common_post.h +++ b/src/main/target/common_post.h @@ -231,6 +231,7 @@ #undef USE_RX_LINK_QUALITY_INFO #undef USE_OSD_PROFILES #undef USE_OSD_STICK_OVERLAY +#undef USE_RX_LINK_UPLINK_POWER #endif #if defined(USE_GPS_RESCUE) diff --git a/src/main/target/common_pre.h b/src/main/target/common_pre.h index dd7109da5e..ddbf61b13e 100644 --- a/src/main/target/common_pre.h +++ b/src/main/target/common_pre.h @@ -397,4 +397,5 @@ #define USE_BATTERY_VOLTAGE_SAG_COMPENSATION #define USE_RX_MSP_OVERRIDE #define USE_SIMPLIFIED_TUNING +#define USE_RX_LINK_UPLINK_POWER #endif