fix(nv14): About page button overlap, AFHDS2A bind prompt, AFHDS2A on external bay - #7836
Merged
Merged
Conversation
…page The "Modules / RX version" button was placed at a fixed position at the bottom of the info box, regardless of how tall the version text was. On NV14 (portrait LCD, PL18 family) the extra LCD/Touch lines, together with a wrapping OPTS line, push the text under the button on real hardware. The simulator hides this because those lines are not shown there. Lay the info box out as a flex column instead: the button follows the text, a spacer keeps it at the bottom when the text is short (same position as before), and the box scrolls when the text is too tall. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
IS_D16_MULTI() and IS_R9_MULTI() only compared multi.rfProtocol, without checking that the module is a Multi module. That byte shares storage with other module types' data; for AFHDS2A it is flysky.rx_id[0], the low byte of the bound receiver ID. When a bound receiver's ID ends in 0x0E, 0x3F or 0x40 (Multi FrSky X, X2 or R9), isModuleD16() / IS_R9_MULTI() returned true for the NV14 internal AFHDS2A module. Pressing Bind then opened the FrSky "Ch1-8 telem ON/OFF" menu, which wrote the PXX receiver bits into rx_id[0] and set bind mode without restarting the AFHDS2A state machine. The module dropped straight back to normal mode, so no bind started and no bind beeps sounded. Check the module type in both macros. This also covers the B&W model setup screens, which use isModuleD16() for the same bind menu. Add a regression test for the helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AFHDS2A is the NV14 internal RF chip protocol. No external module speaks it, and its driver only supports the internal module. 4a79480 ("Prevent AFHDS2A from being used as an external module") restricted it to the internal bay. When EdgeTX#3783 split FLYSKY into separate AFHDS2A and AFHDS3 types, that restriction became "not available unless built with AFHDS2", so NV14 builds offered AFHDS2A for the external bay again. Always reject AFHDS2A in isExternalModuleAvailable(). getModuleType() uses the same check, so existing models with the external bay set to AFHDS2A no longer start the driver there either. Also drop the duplicated AFHDS3 check introduced by the same split. Remove AFHDS2A from Companion's external module/protocol lists too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On PL18 family radios the About page adds "LCD:" and "Touch:" lines, but they were left out in the simulator. That made the simulator's About page shorter than the radio's and hid the overlap fixed in the previous commit. Show them in the simulator too, with "Simulator" as a placeholder value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… text With the button after the text in one scrolling box, it is the only focusable control, so it takes focus as soon as it is created and LVGL scrolls it into view. When the version text doesn't fit, the About page opened scrolled to the bottom with the FW/VERS lines hidden, and the button scrolled together with the text. Put the version text in its own scrolling area that takes the spare height, with the button fixed below it in a non-scrolling info box. The button stays where it was and is always visible, the text can never be covered, and focusing the button doesn't scroll the text. When the text fits, the page looks the same as before. The spacer is no longer needed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pfeerick
marked this pull request as ready for review
September 28, 2026 23:36
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.
Three NV14 fixes (but first will effect EL18 / all portrait layouts).
1. About page: "Modules / RX version" button overlaps the version text
The button sat at a fixed position at the bottom of the info box. On NV14 (portrait, PL18 family), hardware shows extra
LCD:/Touch:lines, which the simulator doesn't. On 2.12 that is enough to push the last line of text under the button. Main has a slightly taller page, so it currently fits there, but any extra line would cause the same overlap.The version text now has its own scrolling area above the button:
When the text fits, the page looks the same as before.
Another commit makes the simulator show the
LCD:/Touch:lines too, with "Simulator" as a placeholder value. Leaving those lines out is why the overlap never showed up in the simulator; now its About page matches the radio's. Verified on GX15 that this doesn't negatively impact horizontal screen radios.2. AFHDS2A: Bind opens the FrSky "telemetry ON/OFF" menu and then doesn't bind
IS_D16_MULTI()/IS_R9_MULTI()only comparedmulti.rfProtocoland never checked the module type. For AFHDS2A that byte isflysky.rx_id[0], the low byte of the bound receiver ID.If a receiver's ID ends in
0x0E,0x3For0x40(Multi FrSky X / X2 / R9), every later Bind press on the internal AFHDS2A module opensBindChoiceMenu. That menu then:rx_id[0];This matches the report "altering channel range seems to prevent binding ... brings up telemetry on/off prompt then no bind beeps". The channel range change is most likely just when the rebind happened: the first bind stored an unlucky ID.
Both macros now check
isModuleMultimodule(). That also covers the B&W model setup screens, which useisModuleD16()for the same menu. Affected users just need to bind once more after updating.3. AFHDS2A offered as an external module type (regression from #3783)
AFHDS2A is the NV14 internal RF chip protocol. No external module speaks it, and the driver only handles the internal module. 4a79480 restricted it to the internal bay. When #3783 split FLYSKY into separate AFHDS2A and AFHDS3 types, the check became
#if !defined(AFHDS2), so NV14 builds offered it for the external bay again.Changes:
isExternalModuleAvailable()now always rejects AFHDS2A.getModuleType()uses the same check, so existing models with the external bay set to AFHDS2A no longer start the driver there either.Testing
tests/modules_helpers.cppwith regression tests for 2 and 3. They fail without the fixes and pass with them onnv14andtx16s. Fulltests-radiopasses on both.gtests-companionbuilds and passes.Backport
Labelled
backport/2.12. When backporting, the Companion hunk in commit 3 will probably need applying by hand, becausemoduledata.cpphas diverged between main and 2.12.🤖 Generated with Claude Code