Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
7096 commits
Select commit Hold shift + click to select a range
7c49b74
fix: correct PLL1 VCIRANGE from VCIRANGE_2 to VCIRANGE_1
May 30, 2026
7d24bc2
cleanup: trim PLL2 comment block and shorten STATIC_ASSERT slug
May 30, 2026
5ea9664
Refactor airspeed selection logic in imuCalculateTurnRateacceleration…
Feb 5, 2026
cf5c677
Rename pitotValidForAirspeed to pitotGetValidForAirspeed and update r…
Feb 6, 2026
b7b4641
Update comments for airspeed selection logic in imuCalculateTurnRatea…
Feb 6, 2026
de00540
fix: correct ICM42688 bus device hardware type on GEPRC targets
Mar 1, 2026
73df795
implement minimal need for softrf
Mar 3, 2026
abfa703
feat:
May 3, 2026
4331685
improve softRF documentation
May 8, 2026
ec4efa6
change softrf as tested in doc
May 8, 2026
89410f4
fix qodo suggestions
May 18, 2026
9efcbe3
fix qodo suggestions
May 18, 2026
7c2090a
rename servo mixer MAX to Fixed Value
May 24, 2026
b905af0
Add new target: AEDROXH7 (Airbot Systems AEDROX H7)
May 30, 2026
033388d
drivers: fix DMA request disable ordering in timer IRQ handlers and s…
May 26, 2026
633b471
Add support for XTX XT25F128F nor flash chip
May 27, 2026
f650829
JHEMCUF435: enable UART2
May 28, 2026
7bc73ad
feat(target): rename FlyingRC F4Wing Mini target and add BMI270 support
Apr 10, 2026
ad703a6
fix(target): correct default gyro orientations
Apr 10, 2026
1b142d9
Polish FlyingRC F4Wing Mini documentation
May 26, 2026
8fc0c73
Add FlyingRC F4Wing Mini current sensor ADC
May 26, 2026
b59974f
Fix FlyingRC F4Wing Mini PR cleanup
May 26, 2026
d2ff05b
Polish FlyingRC F4Wing Mini review notes
May 26, 2026
2ace7f3
Refine description and manufacturer details for F4Wing Mini
May 31, 2026
b3109d1
dshot ignore fix
May 30, 2026
06fb807
Merge upstream/release/9.1 to resolve conflicts with PR #11365
May 31, 2026
18af8b3
Merge pull request #11365 from sensei-hacker/fix/pr10048-add-msg
May 31, 2026
1702746
feat(msp): add MSP2_INAV_WIND (0x2231) to expose wind estimator
May 26, 2026
58dc107
FW autotrim: replace servo_autotrim_iterm_rate_limit setting with har…
Jun 4, 2026
1b167ee
docs: regenerate Settings.md (remove servo_autotrim_iterm_rate_limit)
Jun 4, 2026
45e14a9
Merge pull request #11617 from sensei-hacker/fix/remove-autotrim-iter…
Jun 4, 2026
f960698
Bump firmware version to 9.1.0
Jun 4, 2026
cf19273
Merge pull request #11618 from sensei-hacker/release/bump-version-9.1.0
Jun 4, 2026
4e68184
Add pinioBoxConfig_t to PG struct sizes reference database
Jun 4, 2026
b26d647
Merge pull request #11619 from sensei-hacker/release/fix-pg-db-add-pi…
Jun 4, 2026
5451de6
Update release guide with lessons from 9.1.0-RC1
Jun 5, 2026
989da80
fix: remove duplicate autotrim macro definitions from servos.c
Jun 6, 2026
3a06d15
FW autotrim: replace servo_autotrim_iterm_rate_limit setting with har…
Jun 4, 2026
48829a5
Merge pull request #11625 from sensei-hacker/9.1_catch_up
Jun 6, 2026
e7d5cce
Merge pull request #11622 from iNavFlight/release/9.1
Jun 6, 2026
511a3cf
AEDROXH7: fix LED strip DMA conflict with motor outputs
Jun 7, 2026
5fa50d4
Merge pull request #11629 from sensei-hacker/add-target-aedroxh7-v2
Jun 7, 2026
d6db20e
fix(gps): guard against NULL serial port when GPS provider changed wi…
Jun 8, 2026
68f2797
Add BMI270 support to COREWINGF405WINGV2
Jun 9, 2026
9c40920
Fixed wing nav: reset WP cross-track tracking state on re-engagement
Jun 9, 2026
c0ba786
target/JHEMCUF435: fix UART7 ESC telemetry defaults
Jun 9, 2026
6c6df28
fix(gps): clamp negative uBlox nano field before millis conversion
Jun 10, 2026
fa91f98
FW nav: fix WP JUMP target skipped by stale turn-smoothing flag
Jun 11, 2026
613d680
Merge pull request #11640 from b14ckyy/fix/fw-wp-tracking-state-reset
Jun 11, 2026
7514548
Merge pull request #11648 from b14ckyy/wp-jump-fix
Jun 11, 2026
12fba34
fix warning / errors from GCC 16 (#11652)
Jun 15, 2026
c7083a6
add TBS_LUCID_H7_V3 target
May 29, 2026
3ff2012
add TBS_LUCID_H7_OEM
May 4, 2026
3a001d0
add ICM45686 to lucid targets
Jun 8, 2026
6799f4f
Remove outdated OLED display link from Display.md
Jun 18, 2026
2ca81dd
Merge pull request #11661 from iNavFlight/update-oled-purchase-link
Jun 18, 2026
4939a7f
Merge pull request #11662 from iNavFlight/release/9.1
Jun 18, 2026
ea888d4
Add ICM42686P IMU support
Jun 9, 2026
c499f5f
fix(sdcard): remove blocking delay from SDIO retry path
Jun 23, 2026
2fda3e4
fix(sdcard): fix write-path state management in SDIO driver
Jun 23, 2026
e172f87
docs(autotune): fix fixed-wing autotune docs to match actual behavior
Jul 1, 2026
87ed42b
Fix build-SITL-Mac VLA-folding-constant error in log.c
Jul 2, 2026
b757e48
Fix build-SITL-Mac VLA-folding-constant error in osd.c STATIC_ASSERT
Jul 2, 2026
9426576
Merge pull request #11680 from sensei-hacker/fix-sitl-mac-vla-error-9.1
Jul 2, 2026
f3527fe
docs(autotune): fix LIMIT mode wording per Qodo review
Jul 2, 2026
ecef12e
Merge pull request #11677 from sensei-hacker/fix-autotune-docs
Jul 2, 2026
1ffa80b
Fix int8_t overflow in AAF frequency selection for ICM-42688P/42686P
Jul 2, 2026
449a645
Merge pull request #11682 from sensei-hacker/fix/icm42688-aaf-freq-ov…
Jul 2, 2026
a68bb04
Merge pull request #11641 from dtrbinh/fix/jhemcuf435-uart7-missing-swap
Jul 3, 2026
a75cf92
Merge pull request #11634 from daijoubu/fix/gps-provider-null-guard
Jul 3, 2026
aa87bb2
Merge pull request #11674 from sensei-hacker/fix/sdio-retry-blocking-…
Jul 3, 2026
015eeab
Merge pull request #11642 from daijoubu/fix/ublox-nano-rtc-offset
Jul 3, 2026
cf48e6e
allow USE_UARTx_PIN_SWAP on H7
Jul 6, 2026
028986c
DAKEFPVH743_SLIM: Fix DMA conflicts
Jul 6, 2026
e6f3353
DAKEFPV H743 SLIM: Fix beeper and UART7
Jul 6, 2026
63113da
Merge pull request #11177 from engineer-dakefpv/DAKEFPVH743_SLIM
Jul 6, 2026
03e8de2
Merge pull request #11687 from sensei-hacker/USE_UARTx_PIN_SWAP-on-H7
Jul 6, 2026
08cde84
Puya PY25Q128 - updated descriptions.
Mar 5, 2026
42f7e52
SOLOGOODF722 - target
Mar 2, 2026
2197875
SOLOGOODF722: add config.c for PINIO user boxes
Jul 6, 2026
90c117d
Merge pull request #11196 from sensei-hacker/refactor/split-omnibusf4…
Jul 6, 2026
7441bec
AETH743Basic Update BMI270 slow tag in target.c
Jul 6, 2026
e5a84ed
Merge pull request #11689 from sensei-hacker/sologoodf722-target-91
Jul 6, 2026
4263507
Merge pull request #11403 from do1234521/master
Jul 6, 2026
db7e465
Update DAKEFPVF405 target to match current Betaflight config
Jul 6, 2026
37dc6fe
Note CAMERA_CONTROL_PIN as a future PWM-PINIO migration candidate
Jul 6, 2026
0631b6e
Clarify CAMERA_CONTROL_PIN comment: functional from 10.0, not permane…
Jul 6, 2026
a7aff3b
Remove dead USE_IMU_ICM42688P block, document actual detection path
Jul 6, 2026
4832784
Fix bf2inav.py gaps found while updating DAKEFPVF405
Jul 6, 2026
6c942bf
Merge pull request #11690 from sensei-hacker/update-dakefpvf405-target
Jul 6, 2026
b6fbebc
Add AXISFLYINGH743PRO target
Jul 7, 2026
aff7794
Add LSM6DSV16X/LSM6DSK320X support to LSM6DXX accgyro driver
Jul 7, 2026
0014dbc
bf2inav.py: update LSM6DSK320X support
Jul 7, 2026
9f57c17
Merge pull request #11691 from sensei-hacker/fix-bf2inav-gaps
Jul 7, 2026
a731ebb
Merge pull request #11694 from sensei-hacker/lsm6dsv16x-lsm6dsk320x-d…
Jul 7, 2026
54b7177
Merge pull request #11638 from sensei-hacker/add/bmi270-corewingf405w…
Jul 7, 2026
82090e4
Fix LED strip / ADC1 DMA conflict on DAKEFPVH743PRO
Jul 7, 2026
3110497
Merge pull request #11696 from sensei-hacker/fix-dakefpvh743pro-led-a…
Jul 7, 2026
cb36ba5
AXISFLYINGH743PRO: remove bogus timers, PINIO_FLAGS_INVERTED
Jul 7, 2026
baabf43
AXISFLYINGH743PRO: set default features
Jul 7, 2026
ec55b09
Converting Betaflight Targets.md: default_features
Jul 7, 2026
27a7bb7
Merge branch 'release/9.1' into feature-axisflyingh743pro-target
Jul 7, 2026
e519b69
Merge pull request #11693 from sensei-hacker/feature-axisflyingh743pr…
Jul 7, 2026
1531750
Merge pull request #11697 from iNavFlight/release/9.1
Jul 8, 2026
31466b8
Update flash_w25n.c
Jul 8, 2026
1dcdfd9
Added target ORBITH743v2
Jul 8, 2026
a725524
Enabled dual gyro (ICM42688P + ICM40609D) on the ORBITH743v2 target
Jul 9, 2026
823ba47
Add DEFAULT_FEATURES to 8 targets with no default feature set
Jul 10, 2026
5e47ffd
Fix SITL system load accounting
Jul 9, 2026
ca26d31
Clarify SITL load-accounting rationale and fix misleading UNUSED macro
Jul 13, 2026
d017c42
Merge pull request #11720 from sensei-hacker/fix-sitl-scheduler-load-…
Jul 13, 2026
f532e42
Merge pull request #11705 from sensei-hacker/fix/default-features-mis…
Jul 19, 2026
2d3d69e
Merge pull request #11700 from somethingjustlike/add-flash-id
Jul 19, 2026
c5c593d
Merge pull request #11728 from iNavFlight/release/9.1
Jul 19, 2026
b8de3f7
Merge pull request #10785 from kijan007/kijan007-ATOMRC405MINI
Aug 2, 2026
b72e657
Merge pull request #11611 from sensei-hacker/replace/11508-msp-wind
Aug 2, 2026
e27a084
Fix settings.rb check_conditions()/resolve_types() header-order disag…
Aug 3, 2026
5037d6a
Track condition truth per group/member occurrence, not by condition s…
Aug 3, 2026
30091d4
Merge pull request #11760 from sensei-hacker/fix-settings-rb-ordering…
Aug 3, 2026
c29dc54
Fix MSP2_INAV_WIND returning stale non-zero values when invalid
Aug 3, 2026
49082e8
Merge pull request #11762 from sensei-hacker/fix-msp2-inav-wind-zero-…
Aug 3, 2026
f248233
Restore explicit resolutionType_e wire values for DJI WTFOS OSD
Aug 17, 2026
48f7fe6
Update MSP enum reference docs for resolutionType_e
Aug 17, 2026
5c5a81a
Regenerate MSP enum reference docs from current source
Aug 17, 2026
27e6322
docs: seed RAM/flash optimization guide with PR #11718 technique
Aug 16, 2026
75aec88
Add CI PR comment for RAM/flash usage delta vs. base branch
Aug 17, 2026
dc1dcb8
Fix GitHub Actions script-injection risk in size-report workflows
Aug 17, 2026
bb4fa3f
Address code review: target-coverage wording, JSON escaping, test hyg…
Aug 17, 2026
b09680f
Fix baseline-publish race flagged by Qodo review on PR #11790
Aug 17, 2026
1a953f6
Merge pull request #11791 from sensei-hacker/feature-ci-ram-flash-dif…
Aug 17, 2026
c1ce8e1
Merge pull request #11792 from iNavFlight/release/9.1
Aug 17, 2026
4029d98
Fix arm-none-eabi-size not found on real CI runners
Aug 17, 2026
7470885
Merge pull request #11794 from sensei-hacker/feature-ci-ram-flash-dif…
Aug 17, 2026
d69afcd
Merge pull request #11795 from sensei-hacker/feature-ci-ram-flash-dif…
Aug 17, 2026
af9a4b5
Point baseline publishing at Build pre-release, not the dead ci.yml p…
Aug 18, 2026
33954ac
Merge pull request #11796 from sensei-hacker/feature-ci-ram-flash-dif…
Aug 18, 2026
e24bbc7
Merge pull request #11797 from sensei-hacker/feature-ci-ram-flash-dif…
Aug 18, 2026
61e93d2
Register MPU6000 and ICM42605 gyro/acc on AOCODARCF722AIO
Aug 20, 2026
a05032d
Merge pull request #11799 from sensei-hacker/fix-aocodarcf722aio-gyro…
Aug 20, 2026
6bfcc9b
Remove orphaned servo_autotrim_iterm_threshold field
Aug 20, 2026
fa7a86f
Don't gate baseline publish on Build pre-release's overall conclusion
Aug 20, 2026
5314baf
Merge pull request #11801 from sensei-hacker/feature-ci-ram-flash-dif…
Aug 20, 2026
47f6afd
Merge pull request #11802 from iNavFlight/release/9.1
Aug 20, 2026
33b6259
Merge pull request #11788 from sensei-hacker/fix-djiwtf-osd-shift-91
Aug 21, 2026
89f935b
ORBITH743v2: add CAN pins
Aug 22, 2026
38c6cf4
Update CAN1 pin definitions in target.h
Aug 23, 2026
c4ba4ad
Added configurations for support LSM6DS320x
Aug 23, 2026
b6c5f2d
Merge pull request #11701 from orbittechnologyx/ORBITH743v2
Aug 23, 2026
64c6a3a
size-diff-comment.js Update noise threshold for delta calculations
Aug 24, 2026
848e35c
Merge pull request #11817 from iNavFlight/size-diff-comment-noise
Aug 24, 2026
e330d4a
Fix off-by-one in ICM42605 WHO_AM_I retry loop
Aug 26, 2026
6348352
docs: expand RAM/flash optimization guide, rewrite as rule-first refe…
Aug 26, 2026
b797504
Merge pull request #11828 from sensei-hacker/docs-ram-flash-optimizat…
Aug 26, 2026
447e1cb
Merge pull request #11829 from iNavFlight/release/9.1
Aug 26, 2026
19fe1bf
Merge pull request #11826 from sensei-hacker/fix-icm42605-retry-loop-…
Aug 26, 2026
1033b5a
Fix Betaflight Passthrough broken by line-coding mirror
Aug 28, 2026
3803359
Capture VCP mirror baseline before passthrough drain waits
Aug 28, 2026
463e224
Merge pull request #11800 from sensei-hacker/fix-autotrim-iterm-thres…
Aug 28, 2026
b73a02b
Compare PR size deltas against the merge-base commit, not the branch tip
Aug 29, 2026
dd3c3d0
Make per-commit baseline pruning failures non-fatal
Aug 29, 2026
6a0fb56
Fix review findings: branch grouping in pruning, exact-baseline retry…
Aug 29, 2026
14e7ae9
Merge pull request #11835 from sensei-hacker/fix-size-baseline-commit…
Aug 29, 2026
6866382
Merge pull request #11836 from iNavFlight/release/9.1
Aug 29, 2026
2475014
Fix ADS-B stale calculated values when a slot is recycled
Aug 29, 2026
87bc1d0
Fix size-baseline publishing: check out repo before calling scripts
Aug 29, 2026
37bf13a
Add contents: read to publish-baseline permissions
Aug 29, 2026
934dcc9
Merge pull request #11840 from sensei-hacker/fix-size-baseline-publis…
Aug 29, 2026
7ab25a4
docs: add terrain-AGL RAM techniques and correct WS2812 buffer figures
Aug 30, 2026
2294bf5
Update RAM and Flash Optimization documentation
Aug 30, 2026
3c2df55
Merge pull request #11827 from sensei-hacker/docs/ram-flash-optimizat…
Aug 30, 2026
07c1574
Merge pull request #11842 from iNavFlight/release/9.1
Aug 30, 2026
f44e250
ci: publish .uf2 test builds (RP2350) alongside .hex in PR releases
Sep 3, 2026
c26316e
Merge pull request #11860 from sensei-hacker/ci/uf2-pr-test-build-ass…
Sep 3, 2026
35b7d86
Merge pull request #11861 from iNavFlight/release/9.1
Sep 3, 2026
b5ff1a4
Fix size-diff PR comment crashing when the non-code-change build stub…
Sep 8, 2026
8e524e6
Merge pull request #11878 from sensei-hacker/fix-pr-comment-build-gating
Sep 8, 2026
bbc0553
Merge pull request #11879 from iNavFlight/release/9.1
Sep 8, 2026
c5b4446
Report CI size-diff RAM delta per linker region instead of combined
Sep 9, 2026
dbce11e
Document rangefinder requirement for FW autoland flare phase
Sep 10, 2026
2bad6be
Port Betaflight ESC passthrough fixes for Bluejay/AM32 compatibility
Jan 10, 2026
aad80f2
Add DEBUG_ESC mode to expose raw ESC bootloader signature
Sep 10, 2026
be6fe1d
ci: only consume artifacts from the real firmware workflow
Sep 11, 2026
de22804
Address code review feedback on ESC passthrough fix
Sep 13, 2026
c07bf73
Fix redefinition of loop variable in esc4wayProcess
Sep 13, 2026
d5ae5a1
Merge pull request #11936 from sensei-hacker/fix-esc-passthrough-blue…
Sep 13, 2026
999ae03
Merge pull request #11891 from sensei-hacker/fix-autoland-final-glide…
Sep 13, 2026
5645e1f
Fix compute-region-sizes.py dropping FAST_CODE from region reports
Sep 14, 2026
d5c29d6
Merge pull request #11886 from sensei-hacker/fix-ci-ram-delta-per-reg…
Sep 14, 2026
e4278ef
Merge pull request #11945 from iNavFlight/release/9.1
Sep 14, 2026
259fb55
Fix spurious per-region size deltas when a target's regions are renamed
Sep 14, 2026
20a6283
Fix publish-size-baseline.sh dropping malformed baselines' branch column
Sep 14, 2026
13485eb
Merge pull request #11950 from sensei-hacker/fix-publish-size-baselin…
Sep 14, 2026
895d0ed
Fix the Parameter Group Version Check so it can run on pull requests
Sep 9, 2026
cef5f36
Fix portable PG version validation
Sep 9, 2026
6f0895e
Fix PG checker scope, conditional versions and workflow output handling
Sep 10, 2026
d42addb
Ignore PG macro definitions and fail on incomplete checker runs
Sep 10, 2026
5efd794
Check PG layouts across files and conditional build variants
Sep 11, 2026
6603b63
docs: describe the Python parameter-group checker
Sep 13, 2026
e2762ab
Fix PG checker output-format mismatch and non-UTF-8 file handling
Sep 14, 2026
1721741
Run the PG version check on release/9.1 PRs too
Sep 14, 2026
7fa8d74
Fix mistyped target macros that silently disable features
Sep 15, 2026
aa7fdea
Stop bf2inav converter from emitting dead W25M flash macros
Sep 15, 2026
261f9b4
Fix inverted tpa_pitch_compensation documentation and comment
Sep 16, 2026
60f5a53
Merge pull request #11839 from sensei-hacker/fix-adsb-stale-slot-values
Sep 17, 2026
49d9f29
Merge pull request #11948 from sensei-hacker/fix-region-rename-false-…
Sep 17, 2026
894ae19
Merge pull request #11955 from sensei-hacker/fix-macro-typos-target-s…
Sep 17, 2026
975df02
docs: document configurator macOS signing and WASM SITL/PWA release flow
Sep 17, 2026
f874de6
Fix PG checker missing renamed+layout-changed structs
Sep 17, 2026
e47bf80
Post PG version warnings from a workflow_run job for fork PRs
Sep 17, 2026
a93a41d
Merge pull request #11956 from sensei-hacker/fix-tpa-pitch-compensati…
Sep 18, 2026
d0c7b2a
Merge pull request #11834 from sensei-hacker/fix-betaflight-passthrou…
Sep 18, 2026
7038d7e
Auto-clean stale pr-test-builds releases
Jul 2, 2026
b169452
Sweep pr-test-builds oldest-first so stale releases aren't skipped
Sep 19, 2026
e7fbdfd
Grant contents: read to the scheduled sweep's checkout
Sep 19, 2026
57ccecd
Re-check release before deleting to avoid the publisher race
Sep 19, 2026
3abaacd
Merge pull request #11972 from sensei-hacker/fix-release-cleanup-pagi…
Sep 19, 2026
c8b196f
Fix IST8310 compass reading torn data by checking DRDY before read
Sep 19, 2026
4184090
Fix IST8308 compass reading torn data by checking DRDY before read
Sep 19, 2026
a318b1e
Merge pull request #11974 from sensei-hacker/fix-ist8310-mag-calibrat…
Sep 19, 2026
8dc4646
Merge pull request #11975 from sensei-hacker/fix-ist8308-mag-calibrat…
Sep 19, 2026
a021773
Merge pull request #11951 from sensei-hacker/pg-version-check-release91
Sep 19, 2026
4adb1f9
Bump version to 9.1.1
Sep 20, 2026
967ca95
Merge pull request #11981 from iNavFlight/bump-version-9.1.1
Sep 20, 2026
4526102
Merge pull request #11985 from iNavFlight/release/9.1
Sep 20, 2026
a246461
Update PR branch-suggestion workflow for the 10.x/11.x cycle
Sep 20, 2026
f043c0b
Clarify the master-target note in the branch-suggestion comment
Sep 20, 2026
df1a24b
Merge pull request #11989 from sensei-hacker/update-pr-branch-suggest…
Sep 20, 2026
863c2fa
docs: update pr-branch-suggestion README entry for 10.x/11.x cycle
Sep 20, 2026
b41db7f
Merge pull request #11990 from sensei-hacker/update-pr-branch-suggest…
Sep 20, 2026
f3c75c6
add link to https://inavflight.github.io
Sep 21, 2026
7cb12ea
Merge pull request #11991 from sensei-hacker/readme-update.md
Sep 21, 2026
4305a1a
Document exercised firmware workflow path filter
Sep 22, 2026
4e713ca
Identify artifact producer through workflow event metadata
Sep 22, 2026
5a9e797
Keep artifact filter comments, docs and test in line with the path guard
Sep 24, 2026
50b1637
Disable LSM6DSL/DSO/DS3 on-chip gyro high-pass filter
Sep 24, 2026
3e689b5
Shorten CTRL7_G comment
Sep 24, 2026
e08ddd6
Reword CTRL7_G comment
Sep 24, 2026
0251bb9
Merge pull request #12026 from sensei-hacker/lsm6dxx-gyro-hpf-settling
Sep 26, 2026
99e3918
GPS: keep the heartbeat across the driver solution copy
Sep 26, 2026
1bf1f57
IMU: filter the TURNRATE GPS speed every loop again
Sep 26, 2026
a26e276
Merge pull request #12045 from sensei-hacker/fix-gps-heartbeat-9.1
Sep 27, 2026
375a4ad
Merge pull request #11963 from sensei-hacker/docs-release-create-sign…
Sep 27, 2026
16f3d94
Duplicate Rx stats fix with HD
Sep 28, 2026
6944bd5
Merge pull request #12070 from breadoven/abo_hd_rxstats_fix
Sep 29, 2026
62b111a
Merge pull request #11930 from Raffi1202/fix/artifact-consumer-workfl…
Oct 2, 2026
a7ae280
Compare PG sizes against the last release tag and handle version wrap…
Oct 2, 2026
be27ddf
Run PG version check and nightly build for maintenance-11.x
Oct 2, 2026
c67fe96
Require the PG reference database to be committed before tagging
Oct 2, 2026
f9e1db8
Merge pull request #12093 from sensei-hacker/fix-pg-validation-wrapar…
Oct 3, 2026
940b928
Merge pull request #12074 from iNavFlight/release/9.1
Oct 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
5 changes: 5 additions & 0 deletions .dir-locals.el
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
;;; Directory Local Variables -*- no-byte-compile: t -*-
;;; For more information see (info "(emacs) Directory Variables")

((nil . ((c-basic-offset . 4)
(c-default-style . "k&r"))))
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
Makefile text
*.bat eol=crlf
*.txt text
*.sh text
*.sh text eol=lf
9 changes: 5 additions & 4 deletions .github/ISSUE_TEMPLATE/Bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,12 @@ assignees: ''

**PLEASE MAKE SURE YOU READ AND UNDERSTAND THE SOCIAL MEDIA SUPPORT CHANNELS. QUESTIONS ABOUT FLASHING, CONFIGURING, PILOTING MAY BE CLOSED WITHOUT FURTHER INTERACTION.**

* [Telegram channel](https://t.me/INAVFlight)
* [Facebook group](https://www.facebook.com/groups/INAVOfficial)
* [RC Groups thread](https://www.rcgroups.com/forums/showthread.php?2495732-Cleanflight-iNav-%28navigation-rewrite%29-project)
* [INAV Discord Server](https://discord.gg/peg2hhbYwN)
* [INAV Official on Facebook](https://www.facebook.com/groups/INAVOfficial)
* [INAV Official on Telegram](https://t.me/INAVFlight)

**Please double-check that nobody reported the issue before by using search in this bug tracker.**
**For Bug-Reports, please use the following template and provide as much information as possible. Bug-Reports that don't follow the template, might be closed unanswered. If you are not sure if you found a bug, ask for further input in the community channels or open a Github discussion.**

**PLEASE DELETE THE TEXT ABOVE AFTER READING AND UNDERSTANDING IT**

Expand All @@ -38,7 +39,7 @@ assignees: ''

## Additional context
<!-- Add any other context about the problem here. -->
<!-- Go to CLI, execute `dump` command copy its output to [PasteBin](https://pastebin.com) and provide a link to a paste here -->
<!-- Go to CLI, execute `diff` command copy its output to [PasteBin](https://pastebin.com) and provide a link to a paste here -->

---
<!-- PLEASE FILL THIS OUT -->
Expand Down
38 changes: 38 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/new_target_pull_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
This pull requests adds support for ``$TARGET_NAME``

* [ ] Target complies with ``docs/policies/NEW_HARDWARE_POLICY.md``

The following items have been checked and confirmed working by an INAV developer on actual hardware: (feel free to remove non-relevant items)

* [ ] Samples received
* [ ] Flash firmware
* [ ] Calibrate
* [ ] Orientation matches
* [ ] Gyro working
* [ ] Accel working
* [ ] Voltage correct
* [ ] Current correct
* [ ] Baro working
* [ ] Mag I2C Bus
* [ ] Additional I2C2 Buses (Airspeed/other accessories)
* [ ] UART1
* [ ] UART2
* [ ] UART3
* [ ] UART4
* [ ] UART5
* [ ] UART6
* [ ] UART7
* [ ] UART8
* [ ] Analog Camera working
* [ ] Video Out working
* [ ] OSD working
* [ ] LEDs working
* [ ] Buzzer working
* [ ] Motor outputs
* [ ] DShot support on m1-4
* [ ] Servo outputs
* [ ] Blackbox
* [ ] PINIO1
* [ ] PINIO2
* [ ] PINIO3
* [ ] PINIO4
58 changes: 58 additions & 0 deletions .github/scripts/artifact-workflow-filter.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
'use strict';

const fs = require('node:fs');
const path = require('node:path');
const assert = require('node:assert/strict');
const { test } = require('node:test');

function conditionFor(file, job) {
const source = fs.readFileSync(path.join(__dirname, '../workflows', file), 'utf8').replace(/\r\n/g, '\n');
const jobBody = source.split(`\n ${job}:\n`)[1]?.split(/\n [\w-]+:\n/)[0];
const expression = jobBody?.match(/\n if: >\n((?: .*\n)+)/)?.[1].trim();
assert.ok(expression, `Missing condition for ${file}:${job}`);
// The conditions use only member access, == and &&, so they run as JavaScript.
// GitHub's == ignores case and a missing object yields null; JS models neither.
return new Function('github', `return Boolean(${expression});`);
}

function event(overrides = {}) {
return {
workflow: { path: '.github/workflows/ci.yml' },
workflow_run: { name: 'Build firmware', event: 'pull_request', conclusion: 'success' },
...overrides,
};
}

for (const [file, job] of [['pr-test-builds.yml', 'publish'], ['ci-size-report.yml', 'pr-comment']]) {
const accepts = conditionFor(file, job);
test(`${file}: accepts firmware without workflow_run.path`, () => {
assert.equal(accepts({ event: event() }), true);
});
test(`${file}: rejects same-name non-code workflow`, () => {
assert.equal(accepts({ event: event({ workflow: { path: '.github/workflows/non-code-change.yaml' } }) }), false);
});
test(`${file}: ignores a misleading run path`, () => {
const payload = event({ workflow: { path: '.github/workflows/non-code-change.yaml' } });
payload.workflow_run.path = '.github/workflows/ci.yml';
assert.equal(accepts({ event: payload }), false);
});
test(`${file}: rejects unsuccessful and non-PR runs`, () => {
for (const conclusion of ['failure', 'cancelled', 'skipped', 'action_required', null]) {
const payload = event();
payload.workflow_run.conclusion = conclusion;
assert.equal(accepts({ event: payload }), false);
}
const payload = event();
payload.workflow_run.event = 'push';
assert.equal(accepts({ event: payload }), false);
});
test(`${file}: rejects missing or unknown workflow paths`, () => {
for (const workflow of [{}, { path: '.github/workflows/other.yml' }]) {
assert.equal(accepts({ event: event({ workflow }) }), false);
}
});
}

test('firmware workflow path exists', () => {
assert.ok(fs.existsSync(path.join(__dirname, '../..', event().workflow.path)));
});
199 changes: 199 additions & 0 deletions .github/scripts/check-pg-versions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
#!/usr/bin/env python3
"""Compare changed PG structs against registrations across the repository.

Preprocessor branches are compared symbolically. Complex #if expressions are
conservative independent conditions; this is not a C ABI or macro-expansion check.
"""
import ast
import functools
import itertools
import os
import re
import subprocess
import sys


def git(*args, allow_missing=False):
result = subprocess.run(['git', *args], capture_output=True, text=True, encoding='utf-8', errors='replace')
if result.returncode and not (allow_missing and result.returncode == 1):
raise RuntimeError(result.stderr.strip() or 'git command failed')
return result.stdout


def clean(source):
return re.sub(r'/\*.*?\*/|//[^\n]*', lambda m: '\n' * m[0].count('\n'), source, flags=re.S)


def condition(text):
text = re.sub(r'\s+', '', text)
match = re.fullmatch(r'(!?)defined\(?([A-Za-z_]\w*)\)?', text)
return (('defined:' + match[2], not bool(match[1])) if match else (text, True))


def annotated(source):
"""Attach surrounding #if/#elif/#else predicates to each non-directive line."""
stack = []
result = []
for line in source.splitlines(keepends=True):
match = re.match(r'\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b(.*)', line)
if match:
directive, value = match.groups()
if directive in ('if', 'ifdef', 'ifndef'):
atom = condition(value) if directive == 'if' else ('defined:' + value.strip(), directive == 'ifdef')
stack.append(([atom], [atom]))
elif directive == 'elif':
previous, _ = stack[-1]
atom = condition(value)
stack[-1] = (previous + [atom], [(a, not b) for a, b in previous] + [atom])
elif directive == 'else':
previous, _ = stack[-1]
stack[-1] = (previous, [(a, not b) for a, b in previous])
else:
stack.pop()
result.append(('', ()))
elif re.match(r'\s*#', line):
result.append(('', ()))
else:
result.append((line, tuple(item for _, active in stack for item in active)))
return result


def structures(source):
source = clean(source)
lines = annotated(source)
result = {}
for match in re.finditer(r'\btypedef\s+struct(?:\s+[A-Za-z_]\w*)?\s*\{', source):
depth, end = 1, match.end()
while end < len(source) and depth:
depth += (source[end] == '{') - (source[end] == '}')
end += 1
alias = re.match(r'\s*([A-Za-z_]\w*)\s*;', source[end:])
if not alias:
continue
first = source.count('\n', 0, match.start())
last = source.count('\n', 0, end) + 1
result[alias[1]] = lines[first:last]
return result


def registrations(ref):
paths = git('grep', '-l', '-E', 'PG_REGISTER', ref, '--', '*.c', '*.h', allow_missing=True).splitlines()
result = {}
for entry in paths:
path = entry[len(ref) + 1:]
lines = annotated(clean(git('show', ref + ':' + path)))
text = ''.join(line if line.endswith('\n') else line + '\n' for line, _ in lines)
for match in re.finditer(r'\bPG_REGISTER\w*\s*\(([^;]+?)\)\s*;', text):
args = [arg.strip() for arg in match[1].split(',')]
if len(args) < 4 or not re.fullmatch(r'[A-Za-z_]\w*', args[0]) or not args[-1].isdigit():
continue
line = text.count('\n', 0, match.start())
result.setdefault(args[0], []).append((args[-2], int(args[-1]), lines[line][1], path))
return result


@functools.lru_cache(maxsize=None)
def boolean_expression(expression):
names = []
def replace_defined(match):
names.append('defined:' + (match[1] or match[2]))
return 'v' + str(len(names) - 1)
translated = re.sub(r'defined(?:\(([A-Za-z_]\w*)\)|([A-Za-z_]\w*))', replace_defined, expression)
if not names:
return None
translated = translated.replace('&&', ' and ').replace('||', ' or ').replace('!', ' not ').strip()
try:
tree = ast.parse(translated, mode='eval')
except SyntaxError:
return None
allowed = (ast.Expression, ast.BoolOp, ast.And, ast.Or, ast.UnaryOp, ast.Not, ast.Name, ast.Load)
if any(not isinstance(node, allowed) for node in ast.walk(tree)):
return None
if any(isinstance(node, ast.Name) and node.id not in {'v' + str(i) for i in range(len(names))} for node in ast.walk(tree)):
return None
return tree.body, names


def variables(expression):
parsed = boolean_expression(expression)
return parsed[1] if parsed else [expression]


def evaluate(expression, values):
if expression in ('0', '1'):
return bool(int(expression))
parsed = boolean_expression(expression)
if not parsed:
return values[expression]
tree, names = parsed
def visit(node):
if isinstance(node, ast.Name):
return values[names[int(node.id[1:])]]
if isinstance(node, ast.UnaryOp):
return not visit(node.operand)
operands = [visit(value) for value in node.values]
return all(operands) if isinstance(node.op, ast.And) else any(operands)
return visit(tree)


def active(predicates, values):
return all(evaluate(atom, values) == expected for atom, expected in predicates)


def layout(lines, values):
return ''.join(re.sub(r'\s+', '', line) for line, predicates in lines if active(predicates, values))


def check(base, head):
base = git('merge-base', base, head).strip()
changed = [path for path in git('diff', '--no-renames', '--name-only', base + '..' + head).splitlines() if path.endswith(('.c', '.h'))]
if not changed:
print('No C/H files changed')
return 0
old_paths = set(git('ls-tree', '-r', '--name-only', base).splitlines())
new_paths = set(git('ls-tree', '-r', '--name-only', head).splitlines())
old_structs, new_structs = {}, {}
for path in changed:
if path in old_paths:
old_structs.update(structures(git('show', base + ':' + path)))
if path in new_paths:
new_structs.update(structures(git('show', head + ':' + path)))
old_regs, new_regs = registrations(base), registrations(head)
issues = []
for name in old_structs.keys() & new_structs.keys() & new_regs.keys():
before, after = old_structs[name], new_structs[name]
if before == after:
continue
previous = old_regs.get(name, [])
current = new_regs[name]
if not previous:
continue # No persisted instance existed before this change.
predicates = [p for _, p in before + after] + [r[2] for r in previous + current]
atoms = sorted({variable for predicate in predicates for atom, _ in predicate for variable in variables(atom)} - {'0', '1'})
if len(atoms) > 10:
issues.append(f'{name}: more than 10 conditional expressions; manually verify the PG versions')
continue
for flags in itertools.product((False, True), repeat=len(atoms)):
values = dict(zip(atoms, flags))
old_layout, new_layout = layout(before, values), layout(after, values)
if old_layout == new_layout or not old_layout:
continue
old_versions = {r[0]: r[1] for r in previous if active(r[2], values)}
new_versions = {r[0]: r[1] for r in current if active(r[2], values)}
if any(pg not in new_versions or new_versions[pg] <= version for pg, version in old_versions.items()):
issues.append(f'{name}: changed layout without a version increase in {", ".join(sorted({r[3] for r in current}))}; conditions {values}')
break
for issue in issues:
print('PG version issue: ' + issue)
if not issues:
print('No PG version issues detected')
return int(bool(issues))


if __name__ == '__main__':
try:
base = 'origin/' + os.environ['GITHUB_BASE_REF'] if os.environ.get('GITHUB_BASE_REF') and os.environ.get('GITHUB_HEAD_REF') else 'HEAD~1'
sys.exit(check(base, 'HEAD'))
except (RuntimeError, ValueError, IndexError, OSError) as error:
print('PG checker error: ' + str(error), file=sys.stderr)
sys.exit(2)
4 changes: 4 additions & 0 deletions .github/scripts/check-pg-versions.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/bash
# Exit 0: checked, 1: potential PG version issue, 2: checker error.
set -euo pipefail
exec python3 "$(dirname "$0")/check-pg-versions.py"
Loading