Found while working on #11914. Both points are derived from source only and have not been verified on hardware. Opening this so they can be confirmed before anyone attempts a fix.
1. OSD_LQ_DOWNLINK shows 0 and blinks on CRSF
- The CRSF parser handles link statistics frame 0x14 but never copies
downlinkLQ into rxLinkStatistics, although the field is in the payload struct (crsf.c:122, crsf.c:235-251). Only MSP (MSP2_COMMON_SET_MSP_RC_INFO) and mLRS write it.
OSD_LQ_DOWNLINK (osd.c:2801-2816) therefore prints 0 on CRSF and blinks, because 0 is below osd_link_quality_alarm (default 70, settings.yaml:3744-3748).
- The logic condition operand for downlink LQ also returns 0 on CRSF (logic_condition.c:968).
- Copying the field alone would not help ExpressLRS users. An ELRS receiver fills the downlink fields of the 0x14 frame it sends to the FC only in builds with
DEBUG_BF_LINK_STATS (rx_main.cpp 4.1.0:288-293); otherwise they are 0. Whether TBS Crossfire/Tracer receivers fill them is unknown.
To verify: enable OSD_LQ_DOWNLINK with an ELRS receiver (and a TBS one if available) and check what it shows.
A possible fix after verification: read downlinkLQ from 0x14 and hide the element while the value is 0, as #11914 does for OSD_RX_POWER_DOWNLINK.
2. OSD_TX_POWER_UPLINK may show the receiver's own power with ELRS 4.x in Hybrid switch mode
INAV displays the uplink_TX_Power byte of frame 0x14 (crsf.c:250). On an ELRS 4.x receiver that byte has two writers:
- The OTA packets in Wide mode (every 8th packet) and in the full-res modes (OTA.cpp 4.1.0:417, :467). This is the transmitter power, which is correct.
POWERMGNT::setPower() (POWERMGNT.cpp 4.1.0:284), which also runs on receivers and writes the receiver's own telemetry power. It was moved there from TX-only code in ExpressLRS commit bc3e8b7, first released in 4.0.0.
In Hybrid switch mode the transmitter power is not sent over the air, so only the setPower() value reaches the FC. With ELRS 3.5.x the byte stays 0 in Hybrid mode.
To verify: set the ELRS 4.x TX and the RX telemetry power to different levels (e.g. TX 250 mW, RX 25 mW), then compare OSD_TX_POWER_UPLINK in Hybrid and in Wide mode.
If this is confirmed, the cause is in ExpressLRS rather than INAV and should be reported there. INAV only displays what it receives.
Found while working on #11914. Both points are derived from source only and have not been verified on hardware. Opening this so they can be confirmed before anyone attempts a fix.
1.
OSD_LQ_DOWNLINKshows 0 and blinks on CRSFdownlinkLQintorxLinkStatistics, although the field is in the payload struct (crsf.c:122, crsf.c:235-251). Only MSP (MSP2_COMMON_SET_MSP_RC_INFO) and mLRS write it.OSD_LQ_DOWNLINK(osd.c:2801-2816) therefore prints 0 on CRSF and blinks, because 0 is belowosd_link_quality_alarm(default 70, settings.yaml:3744-3748).DEBUG_BF_LINK_STATS(rx_main.cpp 4.1.0:288-293); otherwise they are 0. Whether TBS Crossfire/Tracer receivers fill them is unknown.To verify: enable
OSD_LQ_DOWNLINKwith an ELRS receiver (and a TBS one if available) and check what it shows.A possible fix after verification: read
downlinkLQfrom 0x14 and hide the element while the value is 0, as #11914 does forOSD_RX_POWER_DOWNLINK.2.
OSD_TX_POWER_UPLINKmay show the receiver's own power with ELRS 4.x in Hybrid switch modeINAV displays the
uplink_TX_Powerbyte of frame 0x14 (crsf.c:250). On an ELRS 4.x receiver that byte has two writers:POWERMGNT::setPower()(POWERMGNT.cpp 4.1.0:284), which also runs on receivers and writes the receiver's own telemetry power. It was moved there from TX-only code in ExpressLRS commit bc3e8b7, first released in 4.0.0.In Hybrid switch mode the transmitter power is not sent over the air, so only the
setPower()value reaches the FC. With ELRS 3.5.x the byte stays 0 in Hybrid mode.To verify: set the ELRS 4.x TX and the RX telemetry power to different levels (e.g. TX 250 mW, RX 25 mW), then compare
OSD_TX_POWER_UPLINKin Hybrid and in Wide mode.If this is confirmed, the cause is in ExpressLRS rather than INAV and should be reported there. INAV only displays what it receives.