feat(train): a workout out as GPX, TCX or FIT (ADR 0030, D49)

11b: Export on a workout's page hands it to the share sheet as GPX (with
a track only; heart rate and cadence in Garmin's TrackPointExtension),
TCX (laps, heart rate, cadence, watts, a row's distance) or FIT (file
ID, records, timer events at the pauses, laps with their intensities,
session, activity), all from the same points: the precise fixes while
moving, else the rower's frames, else the heart rates; a plan's steps
are the laps. The FIT writer is our own (protocol 1.0, CRC-16/ARC),
tested by a reader written from the specification.

Not tried yet with Strava, intervals.icu or Garmin Connect.

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 14:37:48 +01:00
commit 128ba1f6c8
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 1386 additions and 15 deletions

View file

@ -514,5 +514,10 @@
"announceTime": "Zeit {time}",
"announcePace": "Pace {pace} pro Kilometer",
"announceSpeed": "Tempo {speed} Kilometer pro Stunde",
"announceHeartRate": "Puls {bpm}"
"announceHeartRate": "Puls {bpm}",
"workoutExport": "Exportieren",
"workoutExportTitle": "Training exportieren",
"workoutExportGpxHint": "Die Strecke, für Karten und andere Apps",
"workoutExportTcxHint": "Runden, Puls und Kadenz, für die meisten Trainingsseiten",
"workoutExportFitHint": "Was Strava, Garmin und intervals.icu am besten lesen"
}

View file

@ -653,5 +653,10 @@
"announceSpeed": "Speed {speed} kilometres an hour",
"@announceSpeed": {"placeholders": {"speed": {"type": "String"}}},
"announceHeartRate": "Heart rate {bpm}",
"@announceHeartRate": {"placeholders": {"bpm": {"type": "String"}}}
"@announceHeartRate": {"placeholders": {"bpm": {"type": "String"}}},
"workoutExport": "Export",
"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"
}

View file

@ -3111,6 +3111,36 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Heart rate {bpm}'**
String announceHeartRate(String bpm);
/// No description provided for @workoutExport.
///
/// In en, this message translates to:
/// **'Export'**
String get workoutExport;
/// No description provided for @workoutExportTitle.
///
/// In en, this message translates to:
/// **'Export the workout'**
String get workoutExportTitle;
/// No description provided for @workoutExportGpxHint.
///
/// In en, this message translates to:
/// **'The track, for maps and other apps'**
String get workoutExportGpxHint;
/// No description provided for @workoutExportTcxHint.
///
/// In en, this message translates to:
/// **'Laps, heart rate and cadence, for most training sites'**
String get workoutExportTcxHint;
/// No description provided for @workoutExportFitHint.
///
/// In en, this message translates to:
/// **'What Strava, Garmin and intervals.icu read best'**
String get workoutExportFitHint;
}
class _AppLocalizationsDelegate

View file

@ -1872,4 +1872,21 @@ class AppLocalizationsDe extends AppLocalizations {
String announceHeartRate(String bpm) {
return 'Puls $bpm';
}
@override
String get workoutExport => 'Exportieren';
@override
String get workoutExportTitle => 'Training exportieren';
@override
String get workoutExportGpxHint => 'Die Strecke, für Karten und andere Apps';
@override
String get workoutExportTcxHint =>
'Runden, Puls und Kadenz, für die meisten Trainingsseiten';
@override
String get workoutExportFitHint =>
'Was Strava, Garmin und intervals.icu am besten lesen';
}

View file

@ -1860,6 +1860,23 @@ class AppLocalizationsEn extends AppLocalizations {
String announceHeartRate(String bpm) {
return 'Heart rate $bpm';
}
@override
String get workoutExport => 'Export';
@override
String get workoutExportTitle => 'Export the workout';
@override
String get workoutExportGpxHint => 'The track, for maps and other apps';
@override
String get workoutExportTcxHint =>
'Laps, heart rate and cadence, for most training sites';
@override
String get workoutExportFitHint =>
'What Strava, Garmin and intervals.icu read best';
}
/// The translations for English, as used in the United Kingdom (`en_GB`).