You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PR #2917 (merged 2026-05-23) added within-session cache + re-push of `speex_nr_level` (NRS) so a profile-global recall doesn't snap the user's choice back to the firmware default of 50. That fixes the reported behavior in #2849.
It does NOT survive an app restart: `m_nrsLevelUser` and `m_nrsLevelUserOverride` are in-memory only. After AetherSDR is restarted:
User reconnects to the radio
Radio sends `speex_nr_level=50` (firmware default, since `profile global` doesn't persist it)
`m_nrsLevelUserOverride == false` (initial state) → no re-push → NRS sits at 50
User has to manually reset NRS to their preferred value each session
Proposal
Persist the user's NRS level (and the override flag) per-radio in AppSettings so the in-session cache also survives across restarts.
Suggested storage shape
Per the AppSettings refactor memo, prefer one nested-JSON value under one key rather than flat per-slice keys:
Keyed by radio serial so two different physical radios on the same operator workstation don't share overrides.
Loading flow
On `SliceModel` construction or first `applyStatus` with serial available:
Look up the radio+slice tuple in `SliceUserOverrides`
If a cached value exists, set `m_nrsLevelUser` and `m_nrsLevelUserOverride = true`
The existing applyStatus re-push logic handles the rest — radio echoes 50 on first status, we re-push the cached value
Saving flow
In `setNrsLevel`, write the new value to the JSON map and `AppSettings::save()`.
Why this is worth doing
NRS isn't the only setting Flex firmware fails to persist across `profile global` recall. The same pattern (in-memory override + applyStatus re-push) is already used for `rtty_mark`. If we keep adding these per-setting workarounds, building one shared persistence layer for them all is cleaner than N copies of the cache-and-re-push code.
The current PR #2917 fix is good for one-shot bug closure (#2849), but the next user report along the lines of "X also resets on profile recall" would benefit from infrastructure already being in place.
No multi-setting demand yet — adding the persistence layer for one knob alone is overengineering
The AppSettings refactor is on the roadmap independently; this work would benefit from landing on top of the nested-JSON-under-one-key infrastructure rather than ahead of it
Effort
If the AppSettings nested-JSON infrastructure is already done: ~2 hours (storage + load + save + manual test of restart-survival).
If not: ~half day, including the small per-setting persistence layer that can be reused for `rtty_mark` and future similar workarounds.
Context
PR #2917 (merged 2026-05-23) added within-session cache + re-push of `speex_nr_level` (NRS) so a profile-global recall doesn't snap the user's choice back to the firmware default of 50. That fixes the reported behavior in #2849.
It does NOT survive an app restart: `m_nrsLevelUser` and `m_nrsLevelUserOverride` are in-memory only. After AetherSDR is restarted:
Proposal
Persist the user's NRS level (and the override flag) per-radio in AppSettings so the in-session cache also survives across restarts.
Suggested storage shape
Per the AppSettings refactor memo, prefer one nested-JSON value under one key rather than flat per-slice keys:
```
SliceUserOverrides = {
"": {
"slice-0": { "nrsLevel": 30 },
"slice-1": { "nrsLevel": 22 }
}
}
```
Keyed by radio serial so two different physical radios on the same operator workstation don't share overrides.
Loading flow
On `SliceModel` construction or first `applyStatus` with serial available:
Saving flow
In `setNrsLevel`, write the new value to the JSON map and `AppSettings::save()`.
Why this is worth doing
NRS isn't the only setting Flex firmware fails to persist across `profile global` recall. The same pattern (in-memory override + applyStatus re-push) is already used for `rtty_mark`. If we keep adding these per-setting workarounds, building one shared persistence layer for them all is cleaner than N copies of the cache-and-re-push code.
The current PR #2917 fix is good for one-shot bug closure (#2849), but the next user report along the lines of "X also resets on profile recall" would benefit from infrastructure already being in place.
Why this can wait
Effort
If the AppSettings nested-JSON infrastructure is already done: ~2 hours (storage + load + save + manual test of restart-survival).
If not: ~half day, including the small per-setting persistence layer that can be reused for `rtty_mark` and future similar workarounds.
References