From 56e2c97d1229c0d74e12ce1bdda5a496d33dcdfa Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Wed, 5 Nov 2025 21:53:36 +0000 Subject: [PATCH 1/2] Update flight modes to reflect the latest changes in INAV Updated to bring the flight modes in line with the latest changes. There were some older modes missing, missing modes from INAV 8.0, plus there have been extra modes added to the telemetry in INAV 9. In INAV 9 the 470 sensor is changed to a uint32_t. That is expected in the telemetry anyway. -Added Course Hold, which has been missing for countless versions - Corrected RTH mode magic number when using CRSF - Added Land, Turtle, Loiter, WRTH, and Angle Hold - Modes are in both SmartPort and CRSF telemetry **Completed so far** Tested using the FrSky system (SmartPort). All modes tested except for `Turtle`. **To do** - [ ] Test using CRSF - [ ] Create sound files for the new modes - [ ] Test sound files --- src/SCRIPTS/TELEMETRY/iNav.lua | 52 ++++++++++++++++++---------- src/SCRIPTS/TELEMETRY/iNav/crsf.lua | 14 +++++++- src/SCRIPTS/TELEMETRY/iNav/modes.lua | 29 ++++++++++------ 3 files changed, 65 insertions(+), 30 deletions(-) diff --git a/src/SCRIPTS/TELEMETRY/iNav.lua b/src/SCRIPTS/TELEMETRY/iNav.lua index 3b6a925e..c05f6813 100644 --- a/src/SCRIPTS/TELEMETRY/iNav.lua +++ b/src/SCRIPTS/TELEMETRY/iNav.lua @@ -210,39 +210,55 @@ function inav.background() data.headFree = false data.headingHold = false data.altHold = false - local modeA = data.mode * 0.0001 - local modeB = data.mode * 0.001 % 10 - local modeC = data.mode * 0.01 % 10 - local modeD = data.mode * 0.1 % 10 - local modeE = data.mode % 10 - if bit32.band(modeD, 2) == 2 then + local modeA = data.mode * 0.000001 + local modeB = data.mode * 0.00001 + local modeC = data.mode * 0.0001 + local modeD = data.mode * 0.001 % 10 + local modeE = data.mode * 0.01 % 10 + local modeF = data.mode * 0.1 % 10 + local modeG = data.mode % 10 + if bit32.band(modeF, 2) == 2 then data.modeId = 2 -- Horizon - elseif bit32.band(modeD, 1) == 1 then + elseif bit32.band(modeF, 1) == 1 then data.modeId = 3 -- Angle else data.modeId = 4 -- Acro end - data.headFree = bit32.band(modeB, 4) == 4 - data.headingHold = bit32.band(modeC, 1) == 1 - if bit32.band(modeE, 4) == 4 then + data.headFree = bit32.band(modeD, 4) == 4 + data.headingHold = bit32.band(modeE, 1) == 1 + if bit32.band(modeG, 4) == 4 then data.armed = true - data.altHold = (bit32.band(modeC, 2) == 2 or bit32.band(modeC, 4) == 4) + data.altHold = (bit32.band(modeE, 2) == 2 or bit32.band(modeE, 4) == 4) homeReset = data.satellites >= 4000 - data.modeId = bit32.band(modeC, 4) == 4 and 7 or data.modeId -- Pos hold + data.modeId = bit32.band(modeE, 4) == 4 and 7 or data.modeId -- Pos hold else preArmMode = data.modeId - data.modeId = (bit32.band(modeE, 2) == 2 or modeE == 0) and (data.throttle > -920 and 12 or 5) or 6 -- Not OK to arm(5) / Throttle warning(12) / Ready to fly(6) + data.modeId = (bit32.band(modeG, 2) == 2 or modeG == 0) and (data.throttle > -920 and 12 or 5) or 6 -- Not OK to arm(5) / Throttle warning(12) / Ready to fly(6) end - if bit32.band(modeA, 4) == 4 then + if bit32.band(modeC, 4) == 4 then data.modeId = 11 -- Failsafe - elseif bit32.band(modeB, 1) == 1 then + elseif bit32.band(modeD, 1) == 1 then data.modeId = 10 -- RTH - elseif bit32.band(modeD, 4) == 4 then + elseif bit32.band(modeF, 4) == 4 then data.modeId = 9 -- Manual - elseif bit32.band(modeB, 2) == 2 then + elseif bit32.band(modeD, 2) == 2 then data.modeId = 8 -- Waypoint - elseif bit32.band(modeB, 8) == 8 then + elseif bit32.band(modeD, 8) == 8 and bit32.band(modeE, 2) == 2 then data.modeId = 13 -- Cruise + elseif bit32.band(modeD, 8) == 8 then + data.modeId = 20 -- Course Hold + elseif bit32.band(modeA, 1) == 1 then + data.modeId = 19 -- WRTH + elseif bit32.band(modeA, 2) == 2 then + data.modeId = 14 -- Angle Hold + elseif bit32.band(modeB, 1) == 1 then + data.modeId = 15 -- Auto land + elseif bit32.band(modeB, 2) == 2 then + data.modeId = 17 -- Turtle mode + elseif bit32.band(modeB, 4) == 4 then + data.modeId = 16 -- Geofence navigation + elseif bit32.band(modeB, 8) == 8 then + data.modeId = 18 -- Loiter end end diff --git a/src/SCRIPTS/TELEMETRY/iNav/crsf.lua b/src/SCRIPTS/TELEMETRY/iNav/crsf.lua index 7243fbca..12874981 100644 --- a/src/SCRIPTS/TELEMETRY/iNav/crsf.lua +++ b/src/SCRIPTS/TELEMETRY/iNav/crsf.lua @@ -113,7 +113,19 @@ local function crsf(data) elseif data.fm == "WP" then data.mode = 2015 elseif data.fm == "RTH" then - data.mode = 1615 + data.mode = 1215 + elseif data.fm == "LAND" then + data.mode = 100015 + elseif data.fm == "GEO" then + data.mode = 400015 + elseif data.fm == "TURT" then + data.mode = 200005 + elseif data.fm == "WRTH" then + data.mode = 10000215 + elseif data.fm == "LOTR" then + data.mode = 800215 + elseif data.fm == "ANGH" then + data.mode = 2000005 elseif data.fm == "!FS!" then data.mode = 40004 end diff --git a/src/SCRIPTS/TELEMETRY/iNav/modes.lua b/src/SCRIPTS/TELEMETRY/iNav/modes.lua index 9a02f1c9..ed9150d5 100644 --- a/src/SCRIPTS/TELEMETRY/iNav/modes.lua +++ b/src/SCRIPTS/TELEMETRY/iNav/modes.lua @@ -3,18 +3,25 @@ local HORUS = ... -- Modes: t=text / f=flags for text / w=wave file local modes = { { t = "! TELEM !", f = 3 }, - { t = "HORIZON", f = 0, w = "hrznmd" }, - { t = " ANGLE", f = 0, w = "anglmd" }, - { t = " ACRO", f = 0, w = "acromd" }, - { t = " NOT OK ", f = 3 }, - { t = " READY", f = 0, w = "ready" }, - { t = "POS HOLD", f = 0, w = "poshld" }, - { t = "WAYPONT", f = 0, w = "waypt" }, - { t = " MANUAL", f = 0, w = "manmd" }, - { t = " RTH ", f = 3, w = "rtl" }, - { t = "! FAIL !", f = 3, w = "fson" }, + { t = " HORIZON ", f = 0, w = "hrznmd" }, + { t = " ANGLE ", f = 0, w = "anglmd" }, + { t = " ACRO ", f = 0, w = "acromd" }, + { t = " NOT OK ", f = 3 }, -- 5 + { t = " READY ", f = 0, w = "ready" }, + { t = "POS HOLD ", f = 0, w = "poshld" }, + { t = " WAYPONT ", f = 0, w = "waypt" }, + { t = " MANUAL ", f = 0, w = "manmd" }, + { t = " RTH ", f = 3, w = "rtl" }, -- 10 + { t = "! FAIL !", f = 3, w = "fson" }, { t = "! THROT !", f = 3 }, - { t = " CRUISE", f = 0, w = "cruzmd" } + { t = " CRUISE ", f = 0, w = "cruzmd" }, + { t = "ANGL HOLD", f = 0, w = "aglhld" }, + { t = " LAND ", f = 0, w = "landin" }, -- 15 + { t = " GEO NAV ", f = 0, w = "geonav" }, + { t = " TURTLE ", f = 0, w = "turtle" }, + { t = " LOITER ", f = 0, w = "loiter" }, + { t = " WP RTH ", f = 0, w = "wrth" }, + { t = "CORSE HLD", f = 0, w = "crsh" } -- 20 } local units = { [0] = "", "V", "A", "mA", "kts", "m/s", "f/s", "kmh", "MPH", "m", HORUS and "ft" or "'" } From f1f264f6a27b5783effa7795a7dbe2d3124caaeb Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Thu, 6 Nov 2025 20:17:11 +0000 Subject: [PATCH 2/2] Updates after testing with CRSF --- src/SCRIPTS/TELEMETRY/iNav.lua | 6 +++--- src/SCRIPTS/TELEMETRY/iNav/crsf.lua | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SCRIPTS/TELEMETRY/iNav.lua b/src/SCRIPTS/TELEMETRY/iNav.lua index c05f6813..b20cc4bb 100644 --- a/src/SCRIPTS/TELEMETRY/iNav.lua +++ b/src/SCRIPTS/TELEMETRY/iNav.lua @@ -210,9 +210,9 @@ function inav.background() data.headFree = false data.headingHold = false data.altHold = false - local modeA = data.mode * 0.000001 - local modeB = data.mode * 0.00001 - local modeC = data.mode * 0.0001 + local modeA = data.mode * 0.000001 % 10 + local modeB = data.mode * 0.00001 % 10 + local modeC = data.mode * 0.0001 % 10 local modeD = data.mode * 0.001 % 10 local modeE = data.mode * 0.01 % 10 local modeF = data.mode * 0.1 % 10 diff --git a/src/SCRIPTS/TELEMETRY/iNav/crsf.lua b/src/SCRIPTS/TELEMETRY/iNav/crsf.lua index 12874981..2e971d6c 100644 --- a/src/SCRIPTS/TELEMETRY/iNav/crsf.lua +++ b/src/SCRIPTS/TELEMETRY/iNav/crsf.lua @@ -121,7 +121,7 @@ local function crsf(data) elseif data.fm == "TURT" then data.mode = 200005 elseif data.fm == "WRTH" then - data.mode = 10000215 + data.mode = 1000215 elseif data.fm == "LOTR" then data.mode = 800215 elseif data.fm == "ANGH" then