Skip to content

Add Echelon BLE proxy & advertising support for virtual rower and treadmill - #4581

Open
cagnulein wants to merge 18 commits into
masterfrom
codex/implement-firmware-unlock-for-treadmill-and-rower
Open

Add Echelon BLE proxy & advertising support for virtual rower and treadmill#4581
cagnulein wants to merge 18 commits into
masterfrom
codex/implement-firmware-unlock-for-treadmill-and-rower

Conversation

@cagnulein

Copy link
Copy Markdown
Owner

Motivation

  • Enable bridging between real Echelon devices and the virtual device peripherals so a real Echelon rower/treadmill can be proxied through the virtual device advertising (for clients to connect to).
  • Provide the Echelon BLE service/characteristics on virtual devices and route commands/notifications between virtual and real devices.
  • Make the Echelon feature configurable via existing settings (virtual_device_echelon).

Description

  • Added Echelon service and characteristics to virtualrower and virtualtreadmill advertising: new serviceDataEchelon/serviceEchelon with write characteristic 0bf669f2-... and notify characteristics 0bf669f3-... / 0bf669f4-..., and conditional inclusion controlled by QZSettings::virtual_device_echelon.
  • Implemented command proxying methods proxyVirtualRowerCommand and proxyVirtualTreadmillCommand in echelonrower/echelonstride to write incoming virtual-device commands to the real device, and call these from the virtual device when a real Echelon device is connected.
  • Added relayEchelonPacket implementations in virtualrower and virtualtreadmill to forward notifications from a connected real Echelon device to the corresponding virtual notify characteristics so connected clients receive real-device updates.
  • Hooked notification propagation into device characteristic handlers by relaying packets from characteristicChanged in echelonrower and echelonstride to any attached virtual device via dynamic_cast and relayEchelonPacket.
  • Updated reconnect logic to re-add the Echelon service if configured, and added small command-response fallbacks in the virtual devices when no real Echelon is connected.

Testing

  • Performed a full project build (make) after the changes and the build completed successfully.
  • No automated unit tests were added or modified for this change and no automated test suite specific to Echelon behavior was executed as part of this rollout.

Codex Task

@stale

stale Bot commented May 13, 2026

Copy link
Copy Markdown

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale Bot added the wontfix This will not be worked on label May 13, 2026
@stale stale Bot closed this May 20, 2026
@cagnulein cagnulein reopened this May 20, 2026
@stale stale Bot removed the wontfix This will not be worked on label May 20, 2026
@stale

stale Bot commented Jun 5, 2026

Copy link
Copy Markdown

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale Bot added the wontfix This will not be worked on label Jun 5, 2026
@stale stale Bot removed the wontfix This will not be worked on label Jun 8, 2026
@cagnulein cagnulein linked an issue Jun 24, 2026 that may be closed by this pull request
cagnulein and others added 8 commits June 24, 2026 08:48
The iOS Peloton cadence workaround (lockscreen virtualbike_ios) must not
start for fake rower, fake treadmill and the real echelon rower when the
virtual Echelon device is enabled, otherwise it conflicts with the Echelon
emulation. echelonstride has no Peloton workaround so it needs no guard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@cagnulein

Copy link
Copy Markdown
Owner Author

image

Fake rower works!

@cagnulein

Copy link
Copy Markdown
Owner Author
trim.D2465FD1-AF10-4D78-9F89-244D5F01677D.MOV

@stale

stale Bot commented Jul 24, 2026

Copy link
Copy Markdown

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale Bot added the wontfix This will not be worked on label Jul 24, 2026
@stale stale Bot closed this Aug 1, 2026
@cagnulein cagnulein reopened this Aug 1, 2026
@stale stale Bot removed the wontfix This will not be worked on label Aug 1, 2026
@stale

stale Bot commented Aug 16, 2026

Copy link
Copy Markdown

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale Bot added the wontfix This will not be worked on label Aug 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codex wontfix This will not be worked on

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Echelon Stride says found but no metrics are received by QZ Echelon Rower Unlock

1 participant