feat(train): a recording follows a route, its turns told (ADR 0030, D45)

The Record sheet offers the routes with a way planned; the recorder's
service follows the one chosen offline (RouteGuide.kt): turns told 50 m
before them (100 m on a bike) after a tone, off the route past 40 m for
10 s a cue with the way back, told again on rejoining, the end told.
The recording file keeps the route and the guidance; the recording
screen shows the next turn or the way back, and swipes to a map of the
route, the track and the position, north or the heading up.

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 08:27:27 +01:00
commit b0c0eeb3d5
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 2153 additions and 171 deletions

View file

@ -416,5 +416,40 @@
"routeDelete": "Löschen",
"routeDeleteTitle": "Diese Route löschen?",
"routeDeleteMessage": "Sie wird auf all deinen Geräten gelöscht.",
"routeDeleted": "Route gelöscht"
"routeDeleted": "Route gelöscht",
"turnStraight": "Geradeaus",
"turnLeft": "Links abbiegen",
"turnSlightLeft": "Leicht links",
"turnSharpLeft": "Scharf links",
"turnRight": "Rechts abbiegen",
"turnSlightRight": "Leicht rechts",
"turnSharpRight": "Scharf rechts",
"turnKeepLeft": "Links halten",
"turnKeepRight": "Rechts halten",
"turnAround": "Wenden",
"turnRoundabout": "Im Kreisverkehr die {exit}. Ausfahrt nehmen",
"turnExitLeft": "Die Ausfahrt links nehmen",
"turnExitRight": "Die Ausfahrt rechts nehmen",
"routeSayIn": "In {metres} Metern: {turn}",
"routeSayOff": "Abseits der Route. Sie liegt {metres} Meter {direction}.",
"routeSayOn": "Zurück auf der Route",
"routeSayArrived": "Ende der Route",
"directionNorth": "nördlich",
"directionNorthEast": "nordöstlich",
"directionEast": "östlich",
"directionSouthEast": "südöstlich",
"directionSouth": "südlich",
"directionSouthWest": "südwestlich",
"directionWest": "westlich",
"directionNorthWest": "nordwestlich",
"recordRoute": "Route",
"recordNoRoute": "Keine",
"recordingNextTurn": "In {distance}",
"recordingOffRoute": "Abseits der Route: {distance} {direction}",
"recordingRouteEnd": "Ende der Route",
"recordingFollowRoute": "Route: {name}",
"recordingMapHint": "Wischen für die Karte",
"recordingFiguresHint": "Zurückwischen für die Werte",
"recordingNorthUp": "Norden oben",
"recordingHeadingUp": "Bewegungsrichtung oben"
}

View file

@ -524,5 +524,46 @@
"routeDelete": "Delete",
"routeDeleteTitle": "Delete this route?",
"routeDeleteMessage": "It's deleted on all your devices.",
"routeDeleted": "Route deleted"
"routeDeleted": "Route deleted",
"turnStraight": "Go straight on",
"turnLeft": "Turn left",
"turnSlightLeft": "Bear left",
"turnSharpLeft": "Turn sharp left",
"turnRight": "Turn right",
"turnSlightRight": "Bear right",
"turnSharpRight": "Turn sharp right",
"turnKeepLeft": "Keep left",
"turnKeepRight": "Keep right",
"turnAround": "Turn around",
"turnRoundabout": "At the roundabout, take exit {exit}",
"@turnRoundabout": {"placeholders": {"exit": {"type": "int"}}},
"turnExitLeft": "Take the exit on the left",
"turnExitRight": "Take the exit on the right",
"routeSayIn": "In {metres} metres: {turn}",
"@routeSayIn": {"description": "Spoken before a turn while following a route.", "placeholders": {"metres": {"type": "int"}, "turn": {"type": "String", "example": "Turn left"}}},
"routeSayOff": "Off the route. It lies {metres} metres {direction}.",
"@routeSayOff": {"description": "Spoken off the route; the recorder puts the figures in.", "placeholders": {"metres": {"type": "String", "example": "80"}, "direction": {"type": "String", "example": "to the north-east"}}},
"routeSayOn": "Back on the route",
"routeSayArrived": "End of the route",
"directionNorth": "to the north",
"directionNorthEast": "to the north-east",
"directionEast": "to the east",
"directionSouthEast": "to the south-east",
"directionSouth": "to the south",
"directionSouthWest": "to the south-west",
"directionWest": "to the west",
"directionNorthWest": "to the north-west",
"recordRoute": "Route",
"recordNoRoute": "None",
"recordingNextTurn": "In {distance}",
"@recordingNextTurn": {"placeholders": {"distance": {"type": "String", "example": "320 m"}}},
"recordingOffRoute": "Off the route: {distance} {direction}",
"@recordingOffRoute": {"placeholders": {"distance": {"type": "String", "example": "80 m"}, "direction": {"type": "String", "example": "to the north-east"}}},
"recordingRouteEnd": "End of the route",
"recordingFollowRoute": "Following {name}",
"@recordingFollowRoute": {"placeholders": {"name": {"type": "String"}}},
"recordingMapHint": "Swipe for the map",
"recordingFiguresHint": "Swipe back for the figures",
"recordingNorthUp": "North up",
"recordingHeadingUp": "Heading up"
}

View file

@ -2523,6 +2523,216 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Route deleted'**
String get routeDeleted;
/// No description provided for @turnStraight.
///
/// In en, this message translates to:
/// **'Go straight on'**
String get turnStraight;
/// No description provided for @turnLeft.
///
/// In en, this message translates to:
/// **'Turn left'**
String get turnLeft;
/// No description provided for @turnSlightLeft.
///
/// In en, this message translates to:
/// **'Bear left'**
String get turnSlightLeft;
/// No description provided for @turnSharpLeft.
///
/// In en, this message translates to:
/// **'Turn sharp left'**
String get turnSharpLeft;
/// No description provided for @turnRight.
///
/// In en, this message translates to:
/// **'Turn right'**
String get turnRight;
/// No description provided for @turnSlightRight.
///
/// In en, this message translates to:
/// **'Bear right'**
String get turnSlightRight;
/// No description provided for @turnSharpRight.
///
/// In en, this message translates to:
/// **'Turn sharp right'**
String get turnSharpRight;
/// No description provided for @turnKeepLeft.
///
/// In en, this message translates to:
/// **'Keep left'**
String get turnKeepLeft;
/// No description provided for @turnKeepRight.
///
/// In en, this message translates to:
/// **'Keep right'**
String get turnKeepRight;
/// No description provided for @turnAround.
///
/// In en, this message translates to:
/// **'Turn around'**
String get turnAround;
/// No description provided for @turnRoundabout.
///
/// In en, this message translates to:
/// **'At the roundabout, take exit {exit}'**
String turnRoundabout(int exit);
/// No description provided for @turnExitLeft.
///
/// In en, this message translates to:
/// **'Take the exit on the left'**
String get turnExitLeft;
/// No description provided for @turnExitRight.
///
/// In en, this message translates to:
/// **'Take the exit on the right'**
String get turnExitRight;
/// Spoken before a turn while following a route.
///
/// In en, this message translates to:
/// **'In {metres} metres: {turn}'**
String routeSayIn(int metres, String turn);
/// Spoken off the route; the recorder puts the figures in.
///
/// In en, this message translates to:
/// **'Off the route. It lies {metres} metres {direction}.'**
String routeSayOff(String metres, String direction);
/// No description provided for @routeSayOn.
///
/// In en, this message translates to:
/// **'Back on the route'**
String get routeSayOn;
/// No description provided for @routeSayArrived.
///
/// In en, this message translates to:
/// **'End of the route'**
String get routeSayArrived;
/// No description provided for @directionNorth.
///
/// In en, this message translates to:
/// **'to the north'**
String get directionNorth;
/// No description provided for @directionNorthEast.
///
/// In en, this message translates to:
/// **'to the north-east'**
String get directionNorthEast;
/// No description provided for @directionEast.
///
/// In en, this message translates to:
/// **'to the east'**
String get directionEast;
/// No description provided for @directionSouthEast.
///
/// In en, this message translates to:
/// **'to the south-east'**
String get directionSouthEast;
/// No description provided for @directionSouth.
///
/// In en, this message translates to:
/// **'to the south'**
String get directionSouth;
/// No description provided for @directionSouthWest.
///
/// In en, this message translates to:
/// **'to the south-west'**
String get directionSouthWest;
/// No description provided for @directionWest.
///
/// In en, this message translates to:
/// **'to the west'**
String get directionWest;
/// No description provided for @directionNorthWest.
///
/// In en, this message translates to:
/// **'to the north-west'**
String get directionNorthWest;
/// No description provided for @recordRoute.
///
/// In en, this message translates to:
/// **'Route'**
String get recordRoute;
/// No description provided for @recordNoRoute.
///
/// In en, this message translates to:
/// **'None'**
String get recordNoRoute;
/// No description provided for @recordingNextTurn.
///
/// In en, this message translates to:
/// **'In {distance}'**
String recordingNextTurn(String distance);
/// No description provided for @recordingOffRoute.
///
/// In en, this message translates to:
/// **'Off the route: {distance} {direction}'**
String recordingOffRoute(String distance, String direction);
/// No description provided for @recordingRouteEnd.
///
/// In en, this message translates to:
/// **'End of the route'**
String get recordingRouteEnd;
/// No description provided for @recordingFollowRoute.
///
/// In en, this message translates to:
/// **'Following {name}'**
String recordingFollowRoute(String name);
/// No description provided for @recordingMapHint.
///
/// In en, this message translates to:
/// **'Swipe for the map'**
String get recordingMapHint;
/// No description provided for @recordingFiguresHint.
///
/// In en, this message translates to:
/// **'Swipe back for the figures'**
String get recordingFiguresHint;
/// No description provided for @recordingNorthUp.
///
/// In en, this message translates to:
/// **'North up'**
String get recordingNorthUp;
/// No description provided for @recordingHeadingUp.
///
/// In en, this message translates to:
/// **'Heading up'**
String get recordingHeadingUp;
}
class _AppLocalizationsDelegate

View file

@ -1499,4 +1499,121 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get routeDeleted => 'Route gelöscht';
@override
String get turnStraight => 'Geradeaus';
@override
String get turnLeft => 'Links abbiegen';
@override
String get turnSlightLeft => 'Leicht links';
@override
String get turnSharpLeft => 'Scharf links';
@override
String get turnRight => 'Rechts abbiegen';
@override
String get turnSlightRight => 'Leicht rechts';
@override
String get turnSharpRight => 'Scharf rechts';
@override
String get turnKeepLeft => 'Links halten';
@override
String get turnKeepRight => 'Rechts halten';
@override
String get turnAround => 'Wenden';
@override
String turnRoundabout(int exit) {
return 'Im Kreisverkehr die $exit. Ausfahrt nehmen';
}
@override
String get turnExitLeft => 'Die Ausfahrt links nehmen';
@override
String get turnExitRight => 'Die Ausfahrt rechts nehmen';
@override
String routeSayIn(int metres, String turn) {
return 'In $metres Metern: $turn';
}
@override
String routeSayOff(String metres, String direction) {
return 'Abseits der Route. Sie liegt $metres Meter $direction.';
}
@override
String get routeSayOn => 'Zurück auf der Route';
@override
String get routeSayArrived => 'Ende der Route';
@override
String get directionNorth => 'nördlich';
@override
String get directionNorthEast => 'nordöstlich';
@override
String get directionEast => 'östlich';
@override
String get directionSouthEast => 'südöstlich';
@override
String get directionSouth => 'südlich';
@override
String get directionSouthWest => 'südwestlich';
@override
String get directionWest => 'westlich';
@override
String get directionNorthWest => 'nordwestlich';
@override
String get recordRoute => 'Route';
@override
String get recordNoRoute => 'Keine';
@override
String recordingNextTurn(String distance) {
return 'In $distance';
}
@override
String recordingOffRoute(String distance, String direction) {
return 'Abseits der Route: $distance $direction';
}
@override
String get recordingRouteEnd => 'Ende der Route';
@override
String recordingFollowRoute(String name) {
return 'Route: $name';
}
@override
String get recordingMapHint => 'Wischen für die Karte';
@override
String get recordingFiguresHint => 'Zurückwischen für die Werte';
@override
String get recordingNorthUp => 'Norden oben';
@override
String get recordingHeadingUp => 'Bewegungsrichtung oben';
}

View file

@ -1491,6 +1491,123 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get routeDeleted => 'Route deleted';
@override
String get turnStraight => 'Go straight on';
@override
String get turnLeft => 'Turn left';
@override
String get turnSlightLeft => 'Bear left';
@override
String get turnSharpLeft => 'Turn sharp left';
@override
String get turnRight => 'Turn right';
@override
String get turnSlightRight => 'Bear right';
@override
String get turnSharpRight => 'Turn sharp right';
@override
String get turnKeepLeft => 'Keep left';
@override
String get turnKeepRight => 'Keep right';
@override
String get turnAround => 'Turn around';
@override
String turnRoundabout(int exit) {
return 'At the roundabout, take exit $exit';
}
@override
String get turnExitLeft => 'Take the exit on the left';
@override
String get turnExitRight => 'Take the exit on the right';
@override
String routeSayIn(int metres, String turn) {
return 'In $metres metres: $turn';
}
@override
String routeSayOff(String metres, String direction) {
return 'Off the route. It lies $metres metres $direction.';
}
@override
String get routeSayOn => 'Back on the route';
@override
String get routeSayArrived => 'End of the route';
@override
String get directionNorth => 'to the north';
@override
String get directionNorthEast => 'to the north-east';
@override
String get directionEast => 'to the east';
@override
String get directionSouthEast => 'to the south-east';
@override
String get directionSouth => 'to the south';
@override
String get directionSouthWest => 'to the south-west';
@override
String get directionWest => 'to the west';
@override
String get directionNorthWest => 'to the north-west';
@override
String get recordRoute => 'Route';
@override
String get recordNoRoute => 'None';
@override
String recordingNextTurn(String distance) {
return 'In $distance';
}
@override
String recordingOffRoute(String distance, String direction) {
return 'Off the route: $distance $direction';
}
@override
String get recordingRouteEnd => 'End of the route';
@override
String recordingFollowRoute(String name) {
return 'Following $name';
}
@override
String get recordingMapHint => 'Swipe for the map';
@override
String get recordingFiguresHint => 'Swipe back for the figures';
@override
String get recordingNorthUp => 'North up';
@override
String get recordingHeadingUp => 'Heading up';
}
/// The translations for English, as used in the United Kingdom (`en_GB`).