feat(train): the Loop's live heart rate in a recording (ADR 0030, D41)

A recording with a Loop set up reads its heart rate through Polar's SDK
while no strap sends: the strap first, the Loop where there is none or
while it is lost. The SDK is one for the process, held by the open
app's bridge and by the recording service, so that the band stays
connected with the app gone; the app reopening finds it connected. The
recording file gains `loop` state lines; the rate is kept alone, as `h`
lines, and the Record sheet names the source.

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-28 21:32:13 +01:00
commit fa7680821d
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 577 additions and 72 deletions

View file

@ -88,6 +88,8 @@
"recordHeartRate": "Herzfrequenz",
"recordNoStrap": "Kein Brustgurt",
"recordHeartLoop": "Vom Polar Loop",
"recordHeartStrapThenLoop": "{strap}, der Loop, solange er nicht verbunden ist",
"strapSheetTitle": "Brustgurt",
"strapSearching": "Suche Brustgurte in der Nähe …",
"strapSearchingHint": "Leg den Gurt an: Die meisten wachen erst auf, wenn sie die Haut berühren.",

View file

@ -110,6 +110,9 @@
"recordHeartRate": "Heart rate",
"recordNoStrap": "No strap",
"recordHeartLoop": "From the Polar Loop",
"recordHeartStrapThenLoop": "{strap}, the Loop while it is lost",
"@recordHeartStrapThenLoop": {"placeholders": {"strap": {"type": "String", "example": "Polar H10"}}},
"@recordNoStrap": {"description": "On the Record sheet, under Heart rate, where no strap is chosen."},
"strapSheetTitle": "Heart-rate strap",
"strapSearching": "Looking for straps nearby…",

View file

@ -580,6 +580,18 @@ abstract class AppLocalizations {
/// **'No strap'**
String get recordNoStrap;
/// No description provided for @recordHeartLoop.
///
/// In en, this message translates to:
/// **'From the Polar Loop'**
String get recordHeartLoop;
/// No description provided for @recordHeartStrapThenLoop.
///
/// In en, this message translates to:
/// **'{strap}, the Loop while it is lost'**
String recordHeartStrapThenLoop(String strap);
/// No description provided for @strapSheetTitle.
///
/// In en, this message translates to:

View file

@ -311,6 +311,14 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get recordNoStrap => 'Kein Brustgurt';
@override
String get recordHeartLoop => 'Vom Polar Loop';
@override
String recordHeartStrapThenLoop(String strap) {
return '$strap, der Loop, solange er nicht verbunden ist';
}
@override
String get strapSheetTitle => 'Brustgurt';

View file

@ -308,6 +308,14 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get recordNoStrap => 'No strap';
@override
String get recordHeartLoop => 'From the Polar Loop';
@override
String recordHeartStrapThenLoop(String strap) {
return '$strap, the Loop while it is lost';
}
@override
String get strapSheetTitle => 'Heart-rate strap';