Skip to content

fix(nv14): About page button overlap, AFHDS2A bind prompt, AFHDS2A on external bay - #7836

Merged
pfeerick merged 5 commits into
EdgeTX:mainfrom
pfeerick:pfeerick/nv14-fixes
Sep 28, 2026
Merged

pfeerick merged 5 commits into
EdgeTX:mainfrom
pfeerick:pfeerick/nv14-fixes

Conversation

@pfeerick

@pfeerick pfeerick commented Sep 27, 2026 •

Copy link
Copy Markdown
Member

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:

  • the button stays fixed at the bottom, in the same position as before;
  • only the text scrolls, and only when it doesn't fit;
  • the page opens showing the start of the text, and focusing the button doesn't scroll it.

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 compared multi.rfProtocol and never checked the module type. For AFHDS2A that byte is flysky.rx_id[0], the low byte of the bound receiver ID.

If a receiver's ID ends in 0x0E, 0x3F or 0x40 (Multi FrSky X / X2 / R9), every later Bind press on the internal AFHDS2A module opens BindChoiceMenu. That menu then:

  • writes the PXX receiver bits into rx_id[0];
  • sets bind mode without restarting the AFHDS2A state machine, which drops straight back to normal mode. So there's no bind and no bind beeps.

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 use isModuleD16() 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.
  • Removed the duplicated AFHDS3 check that came from the same split.
  • Companion's external module/protocol lists no longer offer AFHDS2A.

Testing

  • New tests/modules_helpers.cpp with regression tests for 2 and 3. They fail without the fixes and pass with them on nv14 and tx16s. Full tests-radio passes on both.
  • NV14 firmware and simulator build.
  • gtests-companion builds and passes.
  • Tested on NV14 hardware: all three issues are resolved.
  • Simulator: About page layout with normal and overflowing text.

Backport

Labelled backport/2.12. When backporting, the Companion hunk in commit 3 will probably need applying by hand, because moduledata.cpp has diverged between main and 2.12.

🤖 Generated with Claude Code

pfeerick and others added 3 commits September 27, 2026 23:06
…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>
@pfeerick pfeerick added this to the 2.12.5 milestone Sep 27, 2026
@pfeerick pfeerick added color Related generally to color LCD radios bug/regression ↩️ A new version of EdgeTX broke something backport/2.12 To be backported to a 2.12 release also. labels Sep 27, 2026
pfeerick and others added 2 commits September 27, 2026 23:26
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
pfeerick marked this pull request as ready for review September 28, 2026 23:36
@pfeerick
pfeerick merged commit 75e15a0 into EdgeTX:main Sep 28, 2026
60 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport/2.12 To be backported to a 2.12 release also. bug/regression ↩️ A new version of EdgeTX broke something color Related generally to color LCD radios

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant