When a MIDI button is mapped to MOX via the toggle sentinel (scaledValue == -1.0), pressing once turns TX on but a second press does not release it. Only the GUI can release TX.
Root Cause
The toggle sentinel reads the getter, flips it, then calls the setter. The tx.mox getter used isMox() which reads m_mox. The radio never sends mox= in transmit status messages (SmartSDR protocol v1.4.0.0 — documented in CLAUDE.md), so m_mox is always false. The getter always returns 0, the toggle always computes 1, and setTransmit(true) is called on every press — stuck in TX.
The FlexControl path at MainWindow.cpp:3545 already correctly used isTransmitting(). The MIDI path did not.
Fix
Change the tx.mox MIDI getter from isMox() to isTransmitting(). isTransmitting() is set optimistically by setTransmit() the moment the command is sent, so it immediately reflects toggle state.
Affected Platforms
Reproducible on Raspberry Pi / Linux with any MIDI controller mapped to MOX toggle.
When a MIDI button is mapped to MOX via the toggle sentinel (scaledValue == -1.0), pressing once turns TX on but a second press does not release it. Only the GUI can release TX.
Root Cause
The toggle sentinel reads the getter, flips it, then calls the setter. The
tx.moxgetter usedisMox()which readsm_mox. The radio never sendsmox=in transmit status messages (SmartSDR protocol v1.4.0.0 — documented in CLAUDE.md), som_moxis alwaysfalse. The getter always returns 0, the toggle always computes 1, andsetTransmit(true)is called on every press — stuck in TX.The FlexControl path at MainWindow.cpp:3545 already correctly used
isTransmitting(). The MIDI path did not.Fix
Change the
tx.moxMIDI getter fromisMox()toisTransmitting().isTransmitting()is set optimistically bysetTransmit()the moment the command is sent, so it immediately reflects toggle state.Affected Platforms
Reproducible on Raspberry Pi / Linux with any MIDI controller mapped to MOX toggle.