Virtual gearing, trainer-speed blend, and cadence decode
Gears are expressed as an offset to the commanded gradient, leaving the physics on the route's true gradient so shifting changes effort, not speed. Neutral gear commands exactly the route gradient, so an un-shifted ride is unchanged. Cadence is not in FTMS on this trainer but is on its Zwift channel, decoded against captured frames. The undeclared FTMS trailing bytes were ruled out: wheel RPM restated at a fixed 73.8x speed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -60,6 +60,36 @@
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!--
|
||||
The Zwift Click is deliberately not in the device list below: that list is
|
||||
FTMS trainers, and a controller is a different kind of thing with a
|
||||
different failure mode (it sleeps in seconds and must be woken by hand).
|
||||
-->
|
||||
<div class="gate">
|
||||
<span class="dot {app.controller?.connected ? 'tone-ok' : 'tone-warn'}"></span>
|
||||
<span>
|
||||
{#if app.controller?.connected}
|
||||
Zwift Click connected{app.controller.batteryPercent != null
|
||||
? ` — battery ${app.controller.batteryPercent}%`
|
||||
: ''}. Paddles shift; the D-pad drives the UI.
|
||||
{:else if app.controller?.error}
|
||||
Controller: {app.controller.error}
|
||||
{:else}
|
||||
No controller. <strong>Press a button on the Click first</strong> — it only advertises
|
||||
while awake.
|
||||
{/if}
|
||||
</span>
|
||||
{#if app.controller?.connected}
|
||||
<button class="btn ghost" onclick={() => app.run(() => api.disconnectController())}>
|
||||
Disconnect
|
||||
</button>
|
||||
{:else}
|
||||
<button class="btn ghost" onclick={() => app.run(() => api.connectController())}>
|
||||
Connect Click
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{#if !trainerReady}
|
||||
<div class="gate">
|
||||
<span class="dot tone-warn"></span>
|
||||
|
||||
Reference in New Issue
Block a user