feat(train): the heart-rate strap, recorded by the service itself (ADR 0030, D25-D27)
The Record sheet gains a Heart rate row: a sheet looks for straps advertising the Heart Rate Service, the nearest first, once nearby devices are allowed, and the one chosen is remembered in the person's folder; it records with every workout unless switched off for one. The recorder service connects to it with Android's own Bluetooth API, no package (D26), parses Heart Rate Measurement in Kotlin (tested on the JVM), writes each rate and the strap's state to the recording file, and asks for a lost strap again for as long as it records. The recording screen shows the heart rate, and "Strap lost" while it is gone; a workout's page shows the heart's average and highest rate, each split's average and its chart. iOS's recording waits for a Mac (D25), after the rower. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
405577050d
commit
de5fd43e06
1 changed files with 1782 additions and 42 deletions
|
|
@ -104,5 +104,32 @@
|
|||
"workoutMapSourceAbout": "What {name} keeps",
|
||||
"@workoutMapSourceAbout": {"description": "A link to the map source's page about what it keeps.", "placeholders": {"name": {"type": "String", "example": "OpenFreeMap"}}},
|
||||
"workoutMapUnavailable": "The map can't be loaded now.",
|
||||
"workoutNotFound": "This workout is gone."
|
||||
"workoutNotFound": "This workout is gone.",
|
||||
|
||||
"recordHeartRate": "Heart rate",
|
||||
"recordNoStrap": "No strap",
|
||||
"@recordNoStrap": {"description": "On the Record sheet, under Heart rate, where no strap is chosen."},
|
||||
"strapSheetTitle": "Heart-rate strap",
|
||||
"strapSearching": "Looking for straps nearby…",
|
||||
"strapSearchingHint": "Put the strap on: most wake up only once they touch skin.",
|
||||
"strapNear": "close by",
|
||||
"@strapNear": {"description": "Under a strap found: its signal is strong."},
|
||||
"strapFar": "further off",
|
||||
"@strapFar": {"description": "Under a strap found: its signal is weak."},
|
||||
"strapUnnamed": "Unnamed strap",
|
||||
"@strapUnnamed": {"description": "A strap that sends no name."},
|
||||
"strapForget": "Forget strap",
|
||||
"strapRefused": "Train needs nearby devices to find your strap. You can allow it in the system's settings.",
|
||||
"strapBluetoothOff": "Bluetooth is off. Turn it on to find your strap.",
|
||||
"recordingHeartRate": "heart rate",
|
||||
"@recordingHeartRate": {"description": "Under the heart rate, lower case."},
|
||||
"recordingStrapLost": "Strap lost",
|
||||
"@recordingStrapLost": {"description": "While recording: the strap is out of reach or off; Train keeps asking for it."},
|
||||
"workoutAverageHeartRate": "average heart rate",
|
||||
"@workoutAverageHeartRate": {"description": "Lower case, under a figure."},
|
||||
"workoutMaxHeartRate": "highest heart rate",
|
||||
"@workoutMaxHeartRate": {"description": "Lower case, under a figure."},
|
||||
"workoutBpmValue": "{bpm} bpm",
|
||||
"@workoutBpmValue": {"placeholders": {"bpm": {"type": "int"}}},
|
||||
"workoutHeartRateChart": "Heart rate"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue