Repository navigation
chore: 2.12.5 backports - #7817
Merged
Merged
Conversation
pfeerick
force-pushed
the
pfeerick/backport-2.12.5
branch
2 times, most recently
from
October 3, 2026 22:15
f99169e to
a7fcf5f
Compare
pfeerick
force-pushed
the
pfeerick/backport-2.12.5
branch
from
October 4, 2026 10:51
a7fcf5f to
5c3c44c
Compare
pfeerick
marked this pull request as ready for review
October 4, 2026 10:52
(cherry picked from commit 1ca4e58)
Co-authored-by: Kilrah <kilrah@kilrah.xyz> (cherry picked from commit 7f7d57e)
(cherry picked from commit d0d5805) Hand-ported for 2.12: the colorlcd part of upstream changes a DateNumberEdit class in radio_setup.cpp that only exists on main (it was added by the main-only refactor #7032). On 2.12, DateTimeWindow still creates six plain NumberEdit fields and refreshes them from the RTC itself. The port adds an equivalent DateNumberEdit wrapper to 2.12's radio_setup.cpp and uses it for those six fields. The wrapper has upstream's editing logic: while a field is being edited it shows the value being edited instead of the RTC value, and writes to the RTC only when editing finishes. The rest of 2.12's DateTimeWindow is unchanged, including its per-field display handlers. The numberedit.{h,cpp} and 128x64/212x64 hunks applied cleanly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Not an upstream cherry-pick. `tools/update-companion-translations.sh` (lupdate -no-obsolete) run on 2.12. The 2.12 .ts files hadn't been refreshed since strings from features backported to 2.12 were added (e.g. new radios such as GX15 and Commando 14, key lock, charge while radio on), so they had no entries for those strings. That meant translation updates cherry-picked from main (such as #7772, next) had nowhere to land. main's equivalent refresh (ae5ce49) can't be cherry-picked because it also covers main-only strings. This refresh is generated from 2.12's own companion sources, which are the same here as at the tip of this backport branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 65bb97d) Conflicts resolved by hand for 2.12: - radio/src/translations/i18n/se.h: 2.12's English TR_KEYS_LOCKED_FMT is "Keys locked (%s+%s)" (no TR_BW_COL / "to unlock" variant), and TR_TOUCH_ENABLED/TR_TOUCH_DISABLED don't exist on 2.12. Translated the four key-lock strings using the 2.12 format and left out the two touch strings. The rest of the file applied cleanly. - companion/src/translations/companion_sv.ts: main's .ts was refreshed by lupdate (ae5ce49, main-only), so line-based merging failed. Merged by message key (context + source + comment) instead, on top of the previous commit's 2.12 refresh: applied each translation this commit changed to the 2.12 message with the same key. 21 of the 75 changed messages apply. The other 54 are strings that exist only on main (e.g. the LabelsStorageFormat/SdcardFormat storage messages and "Disable Keys"). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit ad8822a) Conflict resolved by hand for 2.12: 2.12's English TR_KEYS_LOCKED_FMT is "Keys locked (%s+%s)" (no TR_BW_COL / "to unlock" variant), and TR_TOUCH_ENABLED/TR_TOUCH_DISABLED don't exist on 2.12. Translated TR_KEYS_LOCKED_FMT using the 2.12 format and left out the two touch strings. The other four strings (TR_ONE_LOG_PER_DAY, TR_KEY_LOCK_FMT, TR_KEYS_LOCKED, TR_KEYS_UNLOCKED) are as upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ated UI (#7762) Co-authored-by: philmoz <philmoz@users.noreply.github.com> (cherry picked from commit e066572) Conflicts resolved by hand for 2.12, which still uses the older bitmap names and layout from before main's #6781 cleanup: - radio_calibration.cpp: 2.12 includes alpha_stick_{pointer,background}.lbm, where main has bmp_radio_stick_*. Removed that include block, as upstream does. - Upstream deletes bitmaps/<res>/bmp_radio_stick_*.png and img-src/bmp_radio_stick_*.svg. On 2.12 the same images are bitmaps/<res>/default_theme/alpha_stick_*.png and img-src/default_theme/alpha_stick_*.svg (picked up by the alpha_*.png glob in the bitmaps CMakeLists), so those are deleted instead. - tools/convert-gfx-list.csv doesn't exist on 2.12 (added by #6781), so upstream's edit to it is dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit ca82bc5)
) (cherry picked from commit 6fe19b2) Trivial conflict in menu.h: upstream removes the redundant `class Menu;` forward declaration next to `class MaskBitmap;`, which 2.12 doesn't have. Removed `class Menu;` as upstream does. menu.cpp and menutoolbar.cpp applied cleanly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 4d2e2a9) Adapted for 2.12: upstream adds a `Messaging refreshMsg;` member to ChannelFSCombo that is never used. Messaging is main's publish/subscribe class (#7032, main-only) and doesn't exist on 2.12, so the member is left out. Everything else applied as upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit be527ef)
Co-authored-by: philmoz <phil.a.mitchell@gmail.com> (cherry picked from commit b0eb233)
(cherry picked from commit 9bab4ec)
Not an upstream cherry-pick. Partial port of 9326a20 (#7438, "refactor(cpn): introduce BoundedString<N> for ModelData string fields", main-only), taking only its "test harness restore" changes. None of the BoundedString refactor is included: - companion/src/tests/conversions.cpp is deleted, as upstream. It tested conversion of old binary EEPROM files, which Companion no longer supports (storage is YAML-only), and it hasn't compiled since #4406 removed GeneralSettings::switchName. That compile error has stopped 2.12's gtests-companion target building at all. - gtests.cpp main() now creates gBoardFactories (identical to upstream's hunk). Without it, registering the firmwares dereferences a null pointer, which has been latent since #4406. - The "Run companion unit tests" step (identical to upstream's) goes in .github/workflows/linux_cpn.yml after "Setup and Build", since on 2.12 the Linux Companion job lives there instead of in companion.yml. The tests need the board JSON files that the Companion build generates, so they run in the same build/native directory. Together with the next commit (#7744), this lets #7810's flex switch test build and pass on 2.12. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…th empty hwdefnId (#7744) Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> (cherry picked from commit aa72609) Brought into 2.12.5 as a prerequisite (milestoned 3.0, not labelled backport/2.12): with it, every firmware registers its board from the hw_defs JSON named after its flavour, which #7810's flex switch test relies on. Clean cherry-pick. Checked locally that each of the 54 firmwares 2.12's Companion registers has a hw_defs JSON from the Companion build, so this doesn't trigger a "Load Board Hardware Definition" error at startup. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> (cherry picked from commit f5c13ab) Conflict resolved by hand for 2.12: 2.12's flex switch count line lacked HelloRadioSky V16 (main added it in #7501). Took upstream's line as-is. On 2.12 FLEXSW is also set for TX16S, TX16S MK3, F16, V16 and MT12, and all five IS_*() helpers exist in 2.12's boards.h, so the list is correct for 2.12 too (and also fixes the missing V16 flex switches). The new flex_switches_test.cpp applied cleanly. It relies on the previous two commits (the companion test harness restore and #7744). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… external bay (#7836) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 75e15a0) Conflicts resolved by hand for 2.12: - companion/src/firmwares/moduledata.cpp: 2.12 has a different surrounding structure and indentation in isAvailable() and isProtocolAvailable(), so the hunks didn't merge. Applied upstream's three one-line removals directly: PULSES_FLYSKY_AFHDS2A from the external-bay protocol list, and MODULE_TYPE_FLYSKY_AFHDS2A from the EXTMODSIZE_BOTH and EXTMODSIZE_STD module lists. - radio/src/gui/gui_common.cpp: 2.12's isExternalModuleAvailable() has the same AFHDS3 check twice. As upstream does, the second copy is removed along with the AFHDS2 guard, so the function ends exactly as on main (one AFHDS3 check, then the unconditional AFHDS2A rejection). - radio/src/gui/colorlcd/radio/radio_version.cpp: applied cleanly but uses Window::setWindowFlag(NO_SCROLL), and NO_SCROLL only exists on main (added by #6989). Replaced it with what that flag does on main: lv_obj_clear_flag(infoBox->getLvObj(), LV_OBJ_FLAG_SCROLLABLE). modules_helpers.h and the new tests/modules_helpers.cpp applied cleanly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Not an upstream cherry-pick. Partial port of ed71a38 (#7562, "feat(firmware): add 'user data' section to model yaml for Lua scripts", milestone 3.0, main-only), taking only its yaml_tree_walker.{h,cpp} and yaml_parser.cpp hunks, unchanged: - yaml_output_string() is no longer static, and is declared in yaml_tree_walker.h with a new 'exact' flag (default false, the old behaviour; true writes max_len bytes even past a NUL, for std::string contents). - '\' is now written as \x5C, like '"' already is as \x22. 2.12's parser already decodes \xNN inside quoted strings, but otherwise drops a lone backslash, so a literal '\' didn't survive a round trip. - The radio parser now accepts lowercase hex in \xNN, and \b \t \n \f \r, inside quoted strings. That's what Companion's yaml-cpp writes. Without it, a lowercase escape stops the parser and the rest of the file isn't loaded. This is a prerequisite for the next commit (#7831), which writes widget names, widget option strings and analog labels with yaml_output_string(). That function escapes bytes >= 0x80 (e.g. UTF-8 text) as \xNN. Companion reads those back as separate characters and may save C1 code points as lowercase escapes. The parser change makes 2.12 read such files completely, as main does. The garbled UTF-8 text in Companion itself also happens on main and isn't addressed here. The rest of #7562 (the Lua user data feature) is not included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…option string, switch name, contains certain characters (#7831) Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 0b2e470) Adapted for 2.12 (depends on the previous commit, which exports yaml_output_string() as on main): - yaml_datastructs_funcs.cpp: the widget name, widget option string and analog label hunks applied as upstream. The w_keyShortcut() / w_qmFavorite() hunks are dropped: on 2.12 key shortcuts and quick menu favourites are a plain QMPage enum with no app/tool name, so there are no user strings to quote and those functions don't exist. - tests/yaml_strings.cpp: removed the KeyShortcutToolName, FavoriteToolName and NonAppShortcutsUnquoted tests, the shortcut part of ReadsLegacyUnquotedValues, and the tool-name resets in resetStorage(), which all need main's key shortcut API. The widget option, screen and topbar widget name, analog label and legacy-model tests are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 7957b93)
#7822) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit ebde54c) Conflict resolved by hand for 2.12: on main, FreeRTOSConfig.h wraps its declarations in an extern "C" block (added with the main-only FreeRTOS V11.3.1 update, #6549), and upstream puts the new timersGetRunTimeCounter() declaration inside it. 2.12's FreeRTOSConfig.h has no such block, so the declaration has its own extern "C" guard here. Without it, C++ files using portGET_RUN_TIME_COUNTER_VALUE() would see a C++-linkage declaration that conflicts with the extern "C" definition in timers_driver.cpp. The rest of the header change and the other eight files applied as upstream. 2.12's FreeRTOS (V11.1.0) provides ulTaskGetIdleRunTimeCounter() under the same configGENERATE_RUN_TIME_STATS / INCLUDE_xTaskGetIdleTaskHandle settings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ieldInfo() switches (#7826) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit c70fb34) Conflicts resolved by hand for 2.12: - lua/api_model.cpp: both hunks change main-only code (luadoc and the return value of model.setSwitchWarning(), and the model user data luadoc from #7562), neither of which exists on 2.12. Dropped. - tests/lua.cpp: on main the new tests sit next to the insertMix() / insertInput() round-trip tests, which aren't on 2.12. Added only the four tests from this commit (getSwitchInfo, getFieldInfoSwitches, getFieldInfoSensorBeforeSwitch, getSwitchInfoOutOfRange), in the same place before testFloatIntegerEquality. - tests/strhelpers.cpp: on main this file was created by #7711 (a main-only refactor) and its existing tests cover strReplaceAll(), which 2.12 doesn't have. Created it here with main's header and only the tests this commit adds. curves.cpp, draw_functions.cpp, model_curves.cpp, api_general.cpp, strhelpers.cpp, switches.cpp and tests/switches.cpp applied cleanly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 3c5c463) Trivial conflict resolved for 2.12: upstream adds setValueText() just before ValueWidget::foreground(). On 2.12 that method is still called checkEvents() (main renamed it), so the new function goes before checkEvents() instead. The +/- lines are otherwise identical to upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: philmoz <phil.a.mitchell@gmail.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com> (cherry picked from commit cc677bd) Conflicts resolved by hand for 2.12: - gui/colorlcd/libui/file_browser.{h,cpp}: 2.12's onSelected() / onPress() / onPressLong() call getCurrentPath() inline instead of through a local 'path' variable, so the hunks didn't merge. The code is otherwise the same, so upstream's versions are taken as-is. On 2.12, getCurrentPath()/getFullPath() are FileBrowser member functions rather than the static helpers upstream deletes; they are removed here too (upstream's reason applies: they rely on f_getcwd(), which is broken on exFAT), along with their declarations. Nothing else used them. - gui/colorlcd/radio/radio_tools.cpp: the surrounding Lua tools code is laid out differently on 2.12. Applied upstream's one-line change (f_chdir(toolPath) -> etxChdir(toolPath) in run_lua_tool()) directly. The other 17 files, including the new tests/fs_path.cpp and the Lua lauxlib.c/liolib.c changes, applied cleanly with the same +/- lines as upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…en setup (#7795) (cherry picked from commit 5da9f92) Conflicts resolved by hand for 2.12: on 2.12, SetupTopBarWidgetsPage and SetupWidgetsPage override deleteLater(bool detach, bool trash) and handle keys in onEvent(); main overrides deleteLater() and uses the onPress*() key methods. Applied upstream's change to 2.12's code: - topbar.{h,cpp}, widgets_setup.{h,cpp}: the deleteLater() overrides are removed. Their clean-up (reopening the quick menu page, restoring the main view) moves into onCancel() without the storageDirty() call, as upstream. 2.12's onEvent() key handling is unchanged. - storageDirty(EE_MODEL) is now called only when a widget is removed (TopBar::removeWidget() and the slot menu's "Remove widget") or added (addNewWidget()), as upstream. screen_setup.cpp (SET_DIRTY() after a layout change) applied cleanly. The added lines are identical to upstream's; the removed lines differ only by 2.12's deleteLater() signature. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit f364c6e)
(cherry picked from commit aa9a0a5)
Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit abc2be6) Conflicts resolved by hand for 2.12: - translations/i18n/he.h: 2.12's he.h differs from main's in many places, so the hunks didn't merge. Merged per #define instead: each string this commit changes was applied where 2.12 still had the old value (422 strings). Nine changed strings don't exist on 2.12 (their English versions aren't in 2.12's en.h either) and are left out: TR_BTAUDIO, TR_CONTROL, TR_LAST_CHANNEL, TR_PAIRING, TR_PWM_OUTPUT, TR_SF_DISABLE_KEYS, TR_SF_OVERRIDDEN, TR_TOUCH_DISABLED, TR_TOUCH_ENABLED. 2.12's English TR_KEYS_LOCKED_FMT is "Keys locked (%s+%s)" (no TR_BW_COL / "to unlock" variant), so it's translated in that form. Every string's printf placeholders match 2.12's en.h, and the set of defines is unchanged. - cfn_sort.cpp: the Hebrew sort table takes upstream's new ordering by the Hebrew names, minus FUNC_DISABLE_KEYS (which doesn't exist on 2.12), and with 2.12's #if defined(OLED_SCREEN) style. It lists the same 29 functions as 2.12's previous table, on 30 lines (FUNC_BACKLIGHT appears under both the OLED and non-OLED guards).
(cherry picked from commit be9f2fd)
(cherry picked from commit 34f99db)
Co-authored-by: 3djc <3djc@gh.com> Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com> (cherry picked from commit 5204f6c) Port notes for 2.12: the simulator stub change is applied to simpgmspace.cpp instead of simulib.cpp (simulib.cpp is main-only, added by #6435). The flashWrite() return type change is also applied to the HelloRadioSky V15 board.h, which was added to 2.12 (#7868) before this backport. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 1fb3184)
pfeerick
force-pushed
the
pfeerick/backport-2.12.5
branch
from
October 13, 2026 02:13
5c3c44c to
cce8db0
Compare
Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit e8ccf64) Port notes for 2.12: 2.12 has no committed hw_defs JSON or web/public/radios.json; switch defaults live in radio/util/hw_defs/switch_config.py. The SF default change is applied to the t15 and t15pro entries there instead, as the PR describes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 9adfd01) Port notes for 2.12: the contrast range calls in the new else branch keep 2.12's firmware->getCapability(MinContrast/MaxContrast) instead of main's Boards::getCapability(board, Board::MinContrast/MaxContrast), which 2.12 does not use here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> (cherry picked from commit d04ba80) Port notes for 2.12: the V12 target lives in radio/src/targets/hrs/v12 on 2.12, so the change is applied there. 2.12's CMakeLists.txt has no forced "AUX_SERIAL OFF" line to replace, so "set(AUX_SERIAL YES)" is added in the same place. 2.12's hal.h resource table differs from main's; only the entries this PR changes are updated. Stream2 listed a stale FLYSKY_HALL_DMA_Stream_RX and the table listed "USART4: BT MODULE", but neither has any define on 2.12, so they are replaced by the AUX_SERIAL entries. UART4, PH13/PH14 and DMA1 streams 2 and 6 are unused by the 2.12 V12 target and its board code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 78007d0) Port notes for 2.12: the conflict was only in a context line (2.12 has "#elif defined(STATUS_LEDS)" where main has "#elif STATUS_LEDS"); the changed lines are identical to upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Peter Feerick <5500713+pfeerick@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit be7192a)
pfeerick
force-pushed
the
pfeerick/backport-2.12.5
branch
from
October 13, 2026 02:46
cce8db0 to
3aa95c9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Tracking PR for commits backported from
mainonto2.12for the 2.12.5 release. Rebase-merge only, please don't squash: the individual cherry-picked commits are the point.Already on
2.12(merged directly, no cherry-pick needed)Backported commits
DateNumberEditclass that only exists onmain(added by chore(color): implement publish/subscribe messaging to simplify code and further code consolidation #7032). The port adds an equivalent wrapper to 2.12'sDateTimeWindow. BW andNumberEdithunks applied cleanly.tools/update-companion-translations.shrun on 2.12, so the translations cherry-picked from main have entries to land in (not an upstream cherry-pick).se.hkey-lock strings use 2.12's English formats, and the touch strings that don't exist on 2.12 are left out.companion_sv.tsmerged by message key on top of the refresh: 21 of the 75 updated messages apply, and the other 54 are strings that exist only onmain.default_theme/alpha_stick_*bitmaps, which are the 2.12 equivalent of main'sbmp_radio_stick_*.Messaging refreshMsg;member:Messagingis main-only (chore(color): implement publish/subscribe messaging to simplify code and further code consolidation #7032).Added in the second round
Milestoned 2.12.5, or labelled
backport/2.12while milestoned 2.11.8:conversions.cpp(binary EEPROM tests, no longer compiled since refactor(cpn): Support JSON radio hardware definitions #4406), adds the missinggBoardFactoriesinit togtests.cpp, and adds the "Run companion unit tests" CI step (inlinux_cpn.ymlon 2.12). None of refactor(cpn): introduce BoundedString<N> for ModelData string fields #7438's BoundedString refactor is included.moduledata.cpp/gui_common.cpphunks applied by hand;NO_SCROLL(main-only, chore(color): cleanup UI code #6989) replaced with the LVGL call it makes.yaml_output_string()(withexactflag), escapes\, and lets the radio parser accept the lowercase hex and\b \t \n \f \rescapes Companion writes. The rest of feat(firmware): add 'user data' section to model yaml for Lua scripts #7562 (Lua user data) is not included.timersGetRunTimeCounter()gets its ownextern "C"guard, since 2.12'sFreeRTOSConfig.hhas no extern "C" block. 2.12's FreeRTOS V11.1.0 provides the API used.api_model.cpphunks dropped; only this PR's tests added.f_getcwd()-based path helpers removed.Added in the third round
deleteLater(bool, bool)/onEvent()page structure. Inherits a small upstream issue:TopBar::removeWidget()also marks the model dirty during the model-switch teardown, so the newly loaded model is rewritten once on every switch (no data change). To be picked up here if fixed onmain.he.hmerged per#define(422 strings;TR_KEYS_LOCKED_FMTadapted to 2.12's format; 9 main-only strings skipped). Hebrew CFN sort table uses upstream's new order minusFUNC_DISABLE_KEYS(not on 2.12).Added in the fourth round
backport/2.12. The simulator stub change goes insimpgmspace.cpp(simulib.cppismain-only, from feat: WASM modules based simulation in Companion #6435), and theflashWrite()return-type change is also applied to the HelloRadioSky V15board.h(V15 landed on 2.12 in feat: add HelloRadioSky V15 - 2.12 #7868, before this backport); everything else applies unchanged. Same code as the release-test build in test: 2.12.5 release candidate (backport-2.12.5 + #7415) pfeerick/edgetx#28, which passed CI.EXFAToption came to 2.12 with fix(radio): exFat directory handling #7485/chore(radio): display exfat compile option on version screen #7857)Added in the fifth round
Rebased onto the current
2.12head first (it now includes the PRs listed above as already on2.12). From here on, new commits are added at the end.web/public/radios.json, so the change goes in thet15andt15proentries ofradio/util/hw_defs/switch_config.py.firmware->getCapability(MinContrast/MaxContrast)calls.targets/hrs/v12. 2.12'shal.hresource table differs from main's, so only the entries this PR changes are updated.Outstanding Items
backport/2.12-labeled PRs milestoned 2.12.5 not yet coveredTopBar::removeWidget()→storageDirty), if/when it lands onmainBuild-verified locally:
gx15,tx15,pa01(SE),tx16s(DE, RU, and HE with exFAT),tx16smk3(Bluetooth),x7(DE),x9d(SE) andnv14firmware build clean, and thetx16ssimulator library builds withEXFAT=ON(#7859).gtests-radiopasses 142/142, andgtests-companionpasses 6/6 (it builds again on 2.12, and CI now runs it). Allcompanion_*.tschecked withlrelease. Each commit reviewed against its source PR; the third, fourth and fifth rounds were also reviewed by a higher-tier model. Fifth round:t15h7,t18h7,v15,v14,tprov2,t15,t15pro,v12andtx16sfirmware build clean,gtests-radiopasses 142/142, and Companion'sgeneraleditlibrary builds. Local builds are compile checks in an arm64 devcontainer; CI on the official images is the authoritative check.🤖 Generated with Claude Code