feat(train): a ride reads the bike's speed and cadence sensor and power meter (ADR 0030, D49)

11d, its sensors: a ride's Record sheet offers the CSC sensor (0x1816)
and the power meter (0x1818), found nearby and remembered as the strap
is; the person's devices are now one map of DeviceKind to DeviceStore.
The service parses CSC and Cycling Power measurements (JVM-tested,
counters' rollover, coasting), writes the wheel's revolutions, the
crank's cadence and the watts to the file and to series of their own.
The recording screen shows cadence and watts; the page the power's
chart, average, highest and normalised power and the cadence's chart and
average; GPX, TCX and FIT carry them. A plan's watts target reads the
power meter too.

The wheel's speed and distance follow. Not tried with a real sensor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-29 15:11:20 +01:00
commit 5c13e6f3c5
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -658,5 +658,27 @@
"workoutExportTitle": "Export the workout",
"workoutExportGpxHint": "The track, for maps and other apps",
"workoutExportTcxHint": "Laps, heart rate and cadence, for most training sites",
"workoutExportFitHint": "What Strava, Garmin and intervals.icu read best"
"workoutExportFitHint": "What Strava, Garmin and intervals.icu read best",
"recordSpeedSensor": "Speed and cadence sensor",
"recordNoSpeedSensor": "None chosen",
"recordPowerMeter": "Power meter",
"recordNoPowerMeter": "None chosen",
"speedSensorSheetTitle": "Speed and cadence sensor",
"speedSensorSearching": "Looking for speed and cadence sensors nearby…",
"speedSensorSearchingHint": "Turn the wheel or the crank to wake it. One another app holds can't be found: close that app first.",
"speedSensorUnnamed": "Unnamed sensor",
"speedSensorForget": "Forget sensor",
"speedSensorRefused": "Train needs nearby devices to find your sensor. You can allow it in the system's settings.",
"powerMeterSheetTitle": "Power meter",
"powerMeterSearching": "Looking for power meters nearby…",
"powerMeterSearchingHint": "Turn the crank to wake it. One another app holds can't be found: close that app first.",
"powerMeterUnnamed": "Unnamed power meter",
"powerMeterForget": "Forget power meter",
"powerMeterRefused": "Train needs nearby devices to find your power meter. You can allow it in the system's settings.",
"recordingCadence": "turns a minute",
"workoutPedalling": "Cadence",
"workoutAverageCadence": "average cadence",
"workoutNormalisedPower": "normalised power",
"workoutRpmValue": "{rpm} rpm",
"@workoutRpmValue": {"placeholders": {"rpm": {"type": "int"}}}
}