From cd44927da8543dff49d9ebb7d40b614fb6fe99a5 Mon Sep 17 00:00:00 2001 From: Raphael Hunziker Date: Thu, 10 Sep 2026 20:43:45 +0200 Subject: [PATCH 1/2] Hide RX downlink power OSD element when the link does not report it The receiver transmit power is only written by the MSP and MAVLink RC paths. The CRSF link statistics frame 0x14 has no such field and no other CRSF frame is parsed for it, so with an ExpressLRS receiver the element showed a permanent 0 mW. ExpressLRS never sends the optional link statistics RX frame 0x1C that would carry a power value, so parsing it would not populate the element either. A power of 0 already means "not reported" on the other paths, so skip drawing the element in that case. Fixes #11136 --- docs/OSD.md | 2 +- src/main/io/osd.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/OSD.md b/docs/OSD.md index 44084266f8f..7a976a2b0fc 100644 --- a/docs/OSD.md +++ b/docs/OSD.md @@ -192,7 +192,7 @@ Here are the OSD Elements provided by INAV. | 157 | OSD_CUSTOM_ELEMENT_7 | 8.0.0 | | | 158 | OSD_CUSTOM_ELEMENT_8 | 8.0.0 | | | 159 | OSD_LQ_DOWNLINK | 8.0.0 | | -| 160 | OSD_RX_POWER_DOWNLINK | 8.0.0 | | +| 160 | OSD_RX_POWER_DOWNLINK | 8.0.0 | The element will be hidden unless the RC link reports the transmit power of the receiver. CRSF does not send this value, it is available on MSP and MAVLink RC links. | | 161 | OSD_RX_BAND | 8.0.0 | | | 162 | OSD_RX_MODE | 8.0.0 | | | 163 | OSD_COURSE_TO_FENCE | 8.0.0 | | diff --git a/src/main/io/osd.c b/src/main/io/osd.c index e5bbcf49037..38e395498c3 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -2845,6 +2845,11 @@ static bool osdDrawSingleElement(uint8_t item) case OSD_RX_POWER_DOWNLINK: { + // Only the MSP and MAVLink RC links report the transmit power of the receiver, the CRSF + // link statistics frame has no such field. Hide the element instead of showing a permanent 0. + if (rxLinkStatistics.downlinkTXPower == 0) + return false; + if (!failsafeIsReceivingRxData()) tfp_sprintf(buff, "%s%c%c", " ", SYM_MW, SYM_AH_DECORATION_DOWN); else From fe5ea8145af6e703d9f1c38db61689a54a291c55 Mon Sep 17 00:00:00 2001 From: Raffi1202 Date: Fri, 11 Sep 2026 18:02:07 +0200 Subject: [PATCH 2/2] Clear stale receiver power when telemetry becomes unavailable --- src/main/io/osd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 38e395498c3..235a43a60c9 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -2847,8 +2847,10 @@ static bool osdDrawSingleElement(uint8_t item) { // Only the MSP and MAVLink RC links report the transmit power of the receiver, the CRSF // link statistics frame has no such field. Hide the element instead of showing a permanent 0. - if (rxLinkStatistics.downlinkTXPower == 0) + if (rxLinkStatistics.downlinkTXPower == 0) { + displayWrite(osdDisplayPort, elemPosX, elemPosY, " "); return false; + } if (!failsafeIsReceivingRxData()) tfp_sprintf(buff, "%s%c%c", " ", SYM_MW, SYM_AH_DECORATION_DOWN);