Skip to content

CRSF: downlink LQ is never read, and uplink TX power may show the receiver's power with ELRS 4.x (needs verification) #12030

Description

@Raffi1202

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions