[PR #273] [MERGED] Add Adaptive RF recovery (QoS) #271

Closed
opened 2026-10-22 05:08:33 +00:00 by roman · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/safijari/openpuck/pull/273
Author: @ixelyth
Created: 9/3/2026
Status: ✅ Merged
Merged: 10/14/2026
Merged by: @safijari

Base: main ← Head: rf-recovery


📝 Commits (1)

  • 34f7991 RF recovery: reconcile with current upstream main

📊 Changes

17 files changed (+3974 additions, -127 deletions)

View changed files

📝 ARCHITECTURE.md (+3 -0)
📝 Makefile (+3 -2)
📝 OpenPuck/OpenPuck.ino (+1 -0)
📝 OpenPuck/config.cpp (+30 -3)
📝 OpenPuck/config.h (+4 -0)
📝 OpenPuck/fw_update.cpp (+13 -3)
📝 OpenPuck/haptics.cpp (+39 -0)
📝 OpenPuck/haptics.h (+6 -0)
📝 OpenPuck/puck_hid.cpp (+4 -2)
📝 OpenPuck/radio.cpp (+26 -0)
📝 OpenPuck/radio.h (+3 -0)
➕ OpenPuck/rf_journal_layout.h (+22 -0)
📝 OpenPuck/rf_link.cpp (+3167 -107)
📝 OpenPuck/rf_link.h (+99 -0)
📝 OpenPuck/serial_console.cpp (+2 -3)
📝 OpenPuck/webusb_config.cpp (+136 -5)
📝 docs/index.html (+416 -2)

📄 Description

Adds adaptive RF channel recovery and coordinated channel handoff for degraded controller links, together with startup-channel persistence, persistent channel history, idle RF surveying, and WebUSB diagnostics.

The goal is that the puck will learn your RF environment and keep a journal of it.
You can see the Journal via WebUSB, and can choose to migrate channels whenever, along with setting your preference of startup channel.
It will continuously update your startup channel to the best one over time.
It will only switch channels when your controller(s) is/are idle or in between inputs in a similar fashion as the official puck.
It's meant to be autonomous and hands-off, and will keep you on only the good channels.

Changes:

  • A Build RF Journal option is available via WebUSB to do a comprehensive assessment/journal build ahead of time. It takes ~15 minutes, and prevents the controller(s) from shutting down from idling during the test, so no need to change the timeout on your end, if you have a 5 or 15 minute timeout.
  • Tracks per-channel link quality and use it to identify degraded RF conditions.
  • Coordinates controller handoff to a better recovery channel instead of switching the radio unilaterally.
  • Preserves rollback and recovery safeguards when a handoff does not establish a better link.
  • Persists the independently qualified startup/last-good channel for future boots and reconnects.
  • Maintains a power-loss-safe channel journal with learned good, poor, mixed, and unexplored state.
  • Progressively explores the recovery-channel pool rather than repeatedly retrying only previously known channels.
  • Adds an idle-only ambient RF survey.
  • Uses ambient RSSI only as a weak ranking prior for channels that do not yet have real link history.
  • Exposes RF status, channel history, survey state, and journal information through the WebUSB configuration panel.
  • Adds a guarded Hop action for each recovery-pool channel. Manual hops use the same coordinated handoff path as automatic recovery.
  • Adds a Startup action for each recovery-pool channel allowing you to choose what channel to start in.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/safijari/openpuck/pull/273 **Author:** [@ixelyth](https://github.com/ixelyth) **Created:** 9/3/2026 **Status:** ✅ Merged **Merged:** 10/14/2026 **Merged by:** [@safijari](https://github.com/safijari) **Base:** `main` ← **Head:** `rf-recovery` --- ### 📝 Commits (1) - [`34f7991`](https://github.com/safijari/openpuck/commit/34f799181a63db59d14ea8e5d25b2656c8dce1ca) RF recovery: reconcile with current upstream main ### 📊 Changes **17 files changed** (+3974 additions, -127 deletions) <details> <summary>View changed files</summary> 📝 `ARCHITECTURE.md` (+3 -0) 📝 `Makefile` (+3 -2) 📝 `OpenPuck/OpenPuck.ino` (+1 -0) 📝 `OpenPuck/config.cpp` (+30 -3) 📝 `OpenPuck/config.h` (+4 -0) 📝 `OpenPuck/fw_update.cpp` (+13 -3) 📝 `OpenPuck/haptics.cpp` (+39 -0) 📝 `OpenPuck/haptics.h` (+6 -0) 📝 `OpenPuck/puck_hid.cpp` (+4 -2) 📝 `OpenPuck/radio.cpp` (+26 -0) 📝 `OpenPuck/radio.h` (+3 -0) ➕ `OpenPuck/rf_journal_layout.h` (+22 -0) 📝 `OpenPuck/rf_link.cpp` (+3167 -107) 📝 `OpenPuck/rf_link.h` (+99 -0) 📝 `OpenPuck/serial_console.cpp` (+2 -3) 📝 `OpenPuck/webusb_config.cpp` (+136 -5) 📝 `docs/index.html` (+416 -2) </details> ### 📄 Description Adds adaptive RF channel recovery and coordinated channel handoff for degraded controller links, together with startup-channel persistence, persistent channel history, idle RF surveying, and WebUSB diagnostics. The goal is that the puck will learn your RF environment and keep a journal of it. You can see the Journal via WebUSB, and can choose to migrate channels whenever, along with setting your preference of startup channel. It will continuously update your startup channel to the best one over time. It will only switch channels when your controller(s) is/are idle or in between inputs in a similar fashion as the official puck. It's meant to be autonomous and hands-off, and will keep you on only the good channels. **Changes:** - A **Build RF Journal** option is available via WebUSB to do a comprehensive assessment/journal build ahead of time. It takes ~15 minutes, and prevents the controller(s) from shutting down from idling during the test, so no need to change the timeout on your end, if you have a 5 or 15 minute timeout. - Tracks per-channel link quality and use it to identify degraded RF conditions. - Coordinates controller handoff to a better recovery channel instead of switching the radio unilaterally. - Preserves rollback and recovery safeguards when a handoff does not establish a better link. - Persists the independently qualified startup/last-good channel for future boots and reconnects. - Maintains a power-loss-safe channel journal with learned good, poor, mixed, and unexplored state. - Progressively explores the recovery-channel pool rather than repeatedly retrying only previously known channels. - Adds an idle-only ambient RF survey. - Uses ambient RSSI only as a weak ranking prior for channels that do not yet have real link history. - Exposes RF status, channel history, survey state, and journal information through the WebUSB configuration panel. - Adds a guarded Hop action for each recovery-pool channel. Manual hops use the same coordinated handoff path as automatic recovery. - Adds a Startup action for each recovery-pool channel allowing you to choose what channel to start in. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
roman 2026-10-22 05:08:34 +00:00
Sign in to join this conversation.
No labels
pull-request
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
safijari/openpuck#271
No description provided.