Skip to content

fix ADSB cardinal for broken mag direction#11076

Merged
sensei-hacker merged 1 commit into
iNavFlight:masterfrom
error414:ADSB-fix-cardinal-for-broken-mag
Nov 9, 2025
Merged

fix ADSB cardinal for broken mag direction#11076
sensei-hacker merged 1 commit into
iNavFlight:masterfrom
error414:ADSB-fix-cardinal-for-broken-mag

Conversation

@error414

@error414 error414 commented Oct 16, 2025

Copy link
Copy Markdown
Contributor

User description

Use same calculation for fixed wings as "direction to home". For fixed wing is used posControl.actualState.cog instead of osdGetHeading(), I have no idea why.

But some people reported that direction to ADSB aircraft is wrong, I have no able to reproduce the issue.


PR Type

Bug fix, Enhancement


Description

  • Fix ADSB cardinal direction calculation for broken magnetic heading

    • Refactored flight direction calculation into reusable osdGetFlightDirection() function
    • Applied consistent direction calculation across home arrow and ADSB features
  • Improved GPS environment validation for ADSB distance/bearing calculations

    • Enhanced isEnvironmentOkForCalculatingADSBDistanceBearing() to support GPS fix estimation
    • Added IMU heading validity checks before drawing direction indicators
  • Enhanced ADSB info element to display status indicators

    • Shows 'G' for GPS issues, 'H' for IMU heading problems, '-' for no device
  • Code quality improvements and formatting consistency


Diagram Walkthrough

flowchart LR
  A["ADSB Direction Calculation"] --> B["osdGetFlightDirection()"]
  B --> C["Fixed Wing: COG"]
  B --> D["Multirotor: Heading"]
  E["GPS Environment Check"] --> F["isEnvironmentOkForCalculatingADSBDistanceBearing()"]
  F --> G["GPS Fix or Estimation"]
  F --> H["Satellite Count > 4"]
  I["ADSB Info Display"] --> J["Status Indicators"]
  J --> K["G: GPS Issue"]
  J --> L["H: IMU Invalid"]
  J --> M["Number: Aircraft Count"]
Loading

File Walkthrough

Relevant files
Bug fix
adsb.c
Enhance GPS validation and rename environment check function

src/main/io/adsb.c

  • Renamed enviromentOkForCalculatingDistaceBearing() to
    isEnvironmentOkForCalculatingADSBDistanceBearing() with improved logic
  • Enhanced GPS validation to support GPS fix estimation mode via
    USE_GPS_FIX_ESTIMATION ifdef
  • Added debug vehicle code block (commented out) for testing purposes
  • Improved code formatting and consistency in function implementation
+31/-3   
adsb.h
Update function declaration for GPS validation                     

src/main/io/adsb.h

  • Updated function declaration to match renamed
    isEnvironmentOkForCalculatingADSBDistanceBearing()
  • Maintains API consistency across header and implementation files
+1/-1     
osd.c
Refactor direction calculation and add validation checks 

src/main/io/osd.c

  • Created new osdGetFlightDirection() helper function for consistent
    direction calculation
  • Refactored home arrow direction calculation to use new helper function
  • Added IMU heading validity checks before drawing ADSB direction
    indicators
  • Enhanced ADSB info element to display status codes: 'G' for GPS
    issues, 'H' for IMU heading problems
  • Added environment validation check in ADSB warning display logic
  • Improved code formatting and conditional statement consistency
    throughout ADSB sections
  • Applied same direction calculation pattern to geozone fence direction
    feature
+35/-27 
Documentation
ADSB.md
Document ADSB info element status indicators                         

docs/ADSB.md

  • Added documentation for OSD ADSB Info element status indicators
  • Documented meaning of display characters: '-' for no device, 'H' for
    IMU issues, 'G' for GPS issues, number for aircraft count
  • Separated documentation into distinct sections for Info and Warning
    elements
+7/-1     

@error414
error414 marked this pull request as ready for review October 19, 2025 12:56
@qodo-code-review

qodo-code-review Bot commented Oct 19, 2025

Copy link
Copy Markdown
Contributor

PR Compliance Guide 🔍

(Compliance updated until commit 91144d6)

Below is a summary of compliance checks for this PR:

Security Compliance
🟢
No security concerns identified No security vulnerabilities detected by AI analysis. Human verification advised for critical code.
Ticket Compliance
🎫 No ticket provided
  • Create ticket/issue
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
🟢
Generic: Meaningful Naming and Self-Documenting Code

Objective: Ensure all identifiers clearly express their purpose and intent, making code
self-documenting

Status: Passed

Generic: Secure Error Handling

Objective: To prevent the leakage of sensitive system information through error messages while
providing sufficient detail for internal debugging.

Status: Passed

Generic: Secure Logging Practices

Objective: To ensure logs are useful for debugging and auditing without exposing sensitive
information like PII, PHI, or cardholder data.

Status: Passed

Generic: Comprehensive Audit Trails

Objective: To create a detailed and reliable record of critical system actions for security analysis
and compliance.

Status:
No auditing: The new logic for ADSB display, environment checks, and flight direction introduces
critical decision paths but adds no auditing/logging of these actions, and it is unclear
whether auditing is handled elsewhere.

Referred Code
case OSD_ADSB_WARNING:
{
    static uint8_t adsbLengthForClearFirstLine = 0;
    static uint8_t adsbLengthForClearSecondLine = 0;

    uint8_t buffIndexFirstLine = 0;
    uint8_t arrowIndexIndex = 0;
    adsbVehicle_t *vehicle = findVehicleClosestLimit(METERS_TO_CENTIMETERS(osdConfig()->adsb_ignore_plane_above_me_limit));
    if (vehicle != NULL) {
        recalculateVehicle(vehicle);
    }

    if (
            vehicle != NULL
            && (vehicle->calculatedVehicleValues.dist > 0
            && vehicle->calculatedVehicleValues.dist < METERS_TO_CENTIMETERS(osdConfig()->adsb_distance_warning))
            && isEnvironmentOkForCalculatingADSBDistanceBearing()

    ) {
        adsbLengthForClearFirstLine = 11;



 ... (clipped 97 lines)
Generic: Robust Error Handling and Edge Case Management

Objective: Ensure comprehensive error handling that provides meaningful context and graceful
degradation

Status:
Edge cases unhandled: New branches depend on GPS/IMU validity and vehicle presence but perform no explicit error
handling or fallback logging when data is borderline (e.g., heading invalid during
extended ADSB info rendering), leaving ambiguity about behavior under edge conditions.

Referred Code
case OSD_ADSB_WARNING:
{
    static uint8_t adsbLengthForClearFirstLine = 0;
    static uint8_t adsbLengthForClearSecondLine = 0;

    uint8_t buffIndexFirstLine = 0;
    uint8_t arrowIndexIndex = 0;
    adsbVehicle_t *vehicle = findVehicleClosestLimit(METERS_TO_CENTIMETERS(osdConfig()->adsb_ignore_plane_above_me_limit));
    if (vehicle != NULL) {
        recalculateVehicle(vehicle);
    }

    if (
            vehicle != NULL
            && (vehicle->calculatedVehicleValues.dist > 0
            && vehicle->calculatedVehicleValues.dist < METERS_TO_CENTIMETERS(osdConfig()->adsb_distance_warning))
            && isEnvironmentOkForCalculatingADSBDistanceBearing()

    ) {
        adsbLengthForClearFirstLine = 11;



 ... (clipped 65 lines)
Generic: Security-First Input Validation and Data Handling

Objective: Ensure all data inputs are validated, sanitized, and handled securely to prevent
vulnerabilities

Status:
Input validation scope: The new isEnvironmentOkForCalculatingADSBDistanceBearing() relaxes conditions with
estimated GPS fix but adds no additional validation or safeguards around using estimated
data, which may impact downstream calculations.

Referred Code
bool isEnvironmentOkForCalculatingADSBDistanceBearing(void){
    return
    (gpsSol.numSat > 4 &&
    (
        STATE(GPS_FIX)
        #ifdef USE_GPS_FIX_ESTIMATION
            || STATE(GPS_ESTIMATED_FIX)
        #endif
        )
    );
Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

Previous compliance checks

Compliance check up to commit af27616
Security Compliance
🟢
No security concerns identified No security vulnerabilities detected by AI analysis. Human verification advised for critical code.
Ticket Compliance
🎫 No ticket provided
- [ ] Create ticket/issue <!-- /create_ticket --create_ticket=true -->

</details></td></tr>
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
No custom compliance provided

Follow the guide to enable custom compliance check.

@error414

Copy link
Copy Markdown
Contributor Author

Tested in Air
image

image

So it didn't break ccurrent implementation.

@qodo-code-review

Copy link
Copy Markdown
Contributor

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
High-level
ADSB direction logic needs GPS validity check

The code uses GPS-based Course Over Ground (COG) for fixed-wing aircraft without
verifying GPS signal validity. It should fall back to magnetic heading if the
GPS fix is lost to prevent displaying incorrect ADSB directional data.

Examples:

src/main/io/osd.c [2227-2228]
                    int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
                    int directionToPeerError = osdGetHeadingAngle(CENTIDEGREES_TO_DEGREES(vehicle->calculatedVehicleValues.dir)) + panServoDirOffset - (int)flightDirection;
src/main/io/osd.c [2247-2248]
                    int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
                    osdDrawDirArrow(osdDisplayPort, osdGetDisplayPortCanvas(), OSD_DRAW_POINT_GRID(elemPosX + 6, elemPosY + 1), (float)(CENTIDEGREES_TO_DEGREES(vehicle->vehicleValues.heading) - flightDirection + panServoDirOffset));

Solution Walkthrough:

Before:

// In osdDrawSingleElement for OSD_ADSB_WARNING
if (arrowIndexIndex > 0) {
    // Direction is based on aircraft type, without checking GPS status
    int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
    int directionToPeerError = osdGetHeadingAngle(...) - (int)flightDirection;
    osdDrawDirCardinal(..., directionToPeerError, ...);
}
...
if (osdConfig()->adsb_warning_style == OSD_ADSB_WARNING_STYLE_EXTENDED) {
    ...
    int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
    osdDrawDirArrow(..., (float)(... - flightDirection + ...));
}

After:

// In osdDrawSingleElement for OSD_ADSB_WARNING
if (arrowIndexIndex > 0) {
    // Check for valid GPS fix before using COG
    bool useCog = STATE(AIRPLANE) && STATE(GPS_FIX);
    int16_t flightDirection = useCog ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
    int directionToPeerError = osdGetHeadingAngle(...) - (int)flightDirection;
    osdDrawDirCardinal(..., directionToPeerError, ...);
}
...
if (osdConfig()->adsb_warning_style == OSD_ADSB_WARNING_STYLE_EXTENDED) {
    ...
    bool useCog = STATE(AIRPLANE) && STATE(GPS_FIX);
    int16_t flightDirection = useCog ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
    osdDrawDirArrow(..., (float)(... - flightDirection + ...));
}
Suggestion importance[1-10]: 9

__

Why: The suggestion correctly identifies a critical flaw where the code unconditionally uses GPS-derived posControl.actualState.cog for fixed-wing aircraft without checking for a valid GPS fix, which could lead to incorrect or misleading ADSB data upon GPS signal loss.

High
General
Avoid redundant variable calculation

Calculate the flightDirection variable once before the two if blocks that use it
to avoid redundant computation.

src/main/io/osd.c [2225-2251]

+int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
 if (arrowIndexIndex > 0) {
     //[direction to vehicle]
-    int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
     int directionToPeerError = osdGetHeadingAngle(CENTIDEGREES_TO_DEGREES(vehicle->calculatedVehicleValues.dir)) + panServoDirOffset - (int)flightDirection;
     osdDrawDirCardinal(osdDisplayPort, elemPosX + arrowIndexIndex, elemPosY, directionToPeerError, elemAttr);
 }
 //////////////////////////////////////////////////////
 
 //////////////////////////////////////////////////////
 // Second line, extra info
 if (osdConfig()->adsb_warning_style == OSD_ADSB_WARNING_STYLE_EXTENDED) {
     // Vehicle type
     tfp_sprintf(buff, "%s", getAdsbEmitterTypeString(vehicle->vehicleValues.emitterType));
 
     // Vehicle speed
     adsbLengthForClearSecondLine = osdFormatVelocityStr(buff + 7, vehicle->vehicleValues.horVelocity, false, false);
 
     // draw values
     buff[6] = SYM_BLANK; // space for direction arrow
     displayWriteWithAttr(osdDisplayPort, elemPosX, elemPosY + 1, buff, elemAttr);
 
     // Vehicle direction
-    int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());
     osdDrawDirArrow(osdDisplayPort, osdGetDisplayPortCanvas(), OSD_DRAW_POINT_GRID(elemPosX + 6, elemPosY + 1), (float)(CENTIDEGREES_TO_DEGREES(vehicle->vehicleValues.heading) - flightDirection + panServoDirOffset));
 
     adsbLengthForClearSecondLine += 7;
 }
  • Apply / Chat
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies that the flightDirection variable is calculated twice with identical logic, a redundancy introduced in this PR, and proposes a valid refactoring to improve code quality.

Low
  • More

@error414
error414 marked this pull request as draft October 19, 2025 13:29
@error414
error414 marked this pull request as ready for review October 19, 2025 14:25
@qodo-code-review

Copy link
Copy Markdown
Contributor

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
🟢
No security concerns identified No security vulnerabilities detected by AI analysis. Human verification advised for critical code.
Ticket Compliance
🎫 No ticket provided
- [ ] Create ticket/issue <!-- /create_ticket --create_ticket=true -->

</details></td></tr>
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
No custom compliance provided

Follow the guide to enable custom compliance check.

Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

@qodo-code-review

Copy link
Copy Markdown
Contributor

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
High-level
Use magnetic heading at low speeds

For fixed-wing aircraft, use magnetic heading when ground speed is low because
Course Over Ground (COG) is unreliable in those conditions. This will prevent
the ADSB direction indicator from behaving erratically on the ground.

Examples:

src/main/io/osd.c [2229-2234]
                int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());

                if (arrowIndexIndex > 0) {
                    //[direction to vehicle]
                    int directionToPeerError = osdGetHeadingAngle(CENTIDEGREES_TO_DEGREES(vehicle->calculatedVehicleValues.dir)) + panServoDirOffset - (int)flightDirection;
                    osdDrawDirCardinal(osdDisplayPort, elemPosX + arrowIndexIndex, elemPosY, directionToPeerError, elemAttr);

Solution Walkthrough:

Before:

// src/main/io/osd.c

// ... inside OSD_ADSB_WARNING case
int16_t flightDirection = STATE(AIRPLANE) ? CENTIDEGREES_TO_DEGREES(posControl.actualState.cog) : DECIDEGREES_TO_DEGREES(osdGetHeading());

if (arrowIndexIndex > 0) {
    int directionToPeerError = osdGetHeadingAngle(CENTIDEGREES_TO_DEGREES(vehicle->calculatedVehicleValues.dir)) + panServoDirOffset - (int)flightDirection;
    osdDrawDirCardinal(osdDisplayPort, elemPosX + arrowIndexIndex, elemPosY, directionToPeerError, elemAttr);
}
// ...

After:

// src/main/io/osd.c

// ... inside OSD_ADSB_WARNING case
#define MIN_GROUND_SPEED_FOR_COG_CM_S 100 // 1m/s

int16_t flightDirection;
if (STATE(AIRPLANE) && gpsSol.groundSpeed > MIN_GROUND_SPEED_FOR_COG_CM_S) {
    flightDirection = CENTIDEGREES_TO_DEGREES(posControl.actualState.cog);
} else {
    flightDirection = DECIDEGREES_TO_DEGREES(osdGetHeading());
}

if (arrowIndexIndex > 0) {
    int directionToPeerError = osdGetHeadingAngle(CENTIDEGREES_TO_DEGREES(vehicle->calculatedVehicleValues.dir)) + panServoDirOffset - (int)flightDirection;
    osdDrawDirCardinal(osdDisplayPort, elemPosX + arrowIndexIndex, elemPosY, directionToPeerError, elemAttr);
}
// ...
Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies that COG is unreliable at low ground speeds, and the proposed fallback to magnetic heading would prevent erratic ADSB direction indications for fixed-wing aircraft on the ground, significantly improving usability.

Medium
Possible issue
Refine ADSB warning condition for airplanes

Modify the OSD_ADSB_WARNING check to only validate IMU heading for non-airplane
vehicle types, as airplanes use GPS COG for direction.

src/main/io/osd.c [2171-2177]

 case OSD_ADSB_WARNING:
 {
-    if (!isEnvironmentOkForCalculatingADSBDistanceBearing() || !isImuHeadingValid()) {
+    if (!isEnvironmentOkForCalculatingADSBDistanceBearing() || (!STATE(AIRPLANE) && !isImuHeadingValid())) {
        break;
     }
 
     static uint8_t adsbLengthForClearFirstLine = 0;
  • Apply / Chat
Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies a logic flaw in the PR where an airplane without a valid compass heading would be incorrectly prevented from displaying ADSB warnings, even though it uses GPS COG for direction. This is a valid bug fix for the new functionality.

Medium
General
Improve ADSB info status display logic

Reorder the OSD_ADSB_INFO status checks to first verify if an ADSB device is
detected before checking for GPS or IMU status. This ensures the '-' indicator
for 'no device' is prioritized correctly.

src/main/io/osd.c [2274-2288]

 case OSD_ADSB_INFO:
 {
     buff[0] = SYM_ADSB;
-    if (!isEnvironmentOkForCalculatingADSBDistanceBearing()) {
+    if (getAdsbStatus()->vehiclesMessagesTotal == 0 && getAdsbStatus()->heartbeatMessagesTotal == 0) {
+        buff[1] = '-';
+    } else if (!isEnvironmentOkForCalculatingADSBDistanceBearing()) {
         buff[1] = 'G';
     } else if (!isImuHeadingValid()) {
         buff[1] = 'H';
-    } else if (getAdsbStatus()->vehiclesMessagesTotal > 0 || getAdsbStatus()->heartbeatMessagesTotal > 0) {
+    } else {
         tfp_sprintf(buff + 1, "%1d", getActiveVehiclesCount());
-    } else {
-        buff[1] = '-';
     }
 
     break;
 }
  • Apply / Chat
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly proposes reordering the checks to align with the documented logic, ensuring that the 'no device' status (-) has the highest priority. This improves the clarity and correctness of the status indicator.

Medium
  • More

@error414
error414 marked this pull request as draft October 19, 2025 15:27
@error414
error414 force-pushed the ADSB-fix-cardinal-for-broken-mag branch 4 times, most recently from 97c8c7f to 9d5eb63 Compare October 19, 2025 19:43
@trailx

trailx commented Oct 20, 2025

Copy link
Copy Markdown
Contributor

I requested the change to use COG on airplanes. This change to COG aligns with what is currently used for the home arrow on airplanes. It bypasses any potential compass issues which don't matter on airplanes. I had been originally testing ADSB with a GPS unit that was spitting out bad GPS headings, it was throwing off the FC compass - and therefore also throwing off ADSB.

I have tested this, and this PR fixes the ADSB direction issues I was originally having with a fixed wing.

Works great. Thanks @error414 !

@error414
error414 force-pushed the ADSB-fix-cardinal-for-broken-mag branch from 9d5eb63 to fba6de1 Compare October 24, 2025 16:26
* apply good suggestion from qodo-merge-pro
@error414
error414 force-pushed the ADSB-fix-cardinal-for-broken-mag branch from fba6de1 to 91144d6 Compare October 24, 2025 17:06
@error414
error414 marked this pull request as ready for review November 1, 2025 12:06
@error414

error414 commented Nov 1, 2025

Copy link
Copy Markdown
Contributor Author

Today tested and it works like a charm

QODO:

  1. Improve ADSB info status display logic - I added error handling for ADSB info element,
    H = heading error, if you don't use mag, then H is displayed until take of, similar functionality as "return to home" OSD element
    G = GPS error, not enought sats, or GPS fix failure

  2. Use magnetic heading at low speeds - I did not eimplemented because none OSD element use it.

  3. Refine ADSB warning condition for airplanes whole condition has been completely rewritten

@qodo-code-review

Copy link
Copy Markdown
Contributor

PR Compliance Guide 🔍

All compliance sections have been disabled in the configurations.

@qodo-code-review

Copy link
Copy Markdown
Contributor

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
Fix incorrect ADSB direction condition

Modify the if condition to include STATE(AIRPLANE) to ensure the ADSB direction
indicator is drawn for airplanes using GPS COG, even without a valid IMU
heading.

src/main/io/osd.c [2234-2238]

-if (arrowIndexIndex > 0 && isImuHeadingValid()) {
+if (arrowIndexIndex > 0 && (STATE(AIRPLANE) || isImuHeadingValid())) {
     //[direction to vehicle]
     int directionToPeerError = osdGetHeadingAngle(CENTIDEGREES_TO_DEGREES(vehicle->calculatedVehicleValues.dir)) + panServoDirOffset - osdGetFlightDirection();
     osdDrawDirCardinal(osdDisplayPort, elemPosX + arrowIndexIndex, elemPosY, directionToPeerError, elemAttr);
 }
  • Apply / Chat
Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies a bug where the ADSB direction indicator would not be displayed for airplanes without a compass, despite the necessary COG data being available. This is a valid functional fix.

Medium
  • More

@error414

error414 commented Nov 1, 2025

Copy link
Copy Markdown
Contributor Author

QODO

  1. Fix incorrect ADSB direction condition have no idea what is wrong with my code, function isImuHeadingValid contains checking for GPS health and compass, so it should cover both ways how to calculate heading. For example OSD_HOME_DIR uses similar aproach like ADSB src/main/io/osd.c:1976

@sensei-hacker
sensei-hacker merged commit 0121d2c into iNavFlight:master Nov 9, 2025
22 checks passed
@sensei-hacker sensei-hacker added this to the 9.0 milestone Nov 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants