Projekt

Allgemein

Profil

Feature #44

Von Julius Haman vor 15 Tagen aktualisiert

### Problem 

 Der Sollwert eines Profils landet aktuell für drei unterschiedliche Größen in derselben Spalte `ProfileHeight`: 

 | Profiltyp | Was `ProfileHeight` heute enthält | 
 |---|---| 
 | topographisch | Höhe in m | 
 | Leistungsprofil | Soll-Leistung in W | 
 | Pulsprofil | Sollpuls in bpm | 

 Solleistung hat mit `Power` zwar schon ein eigenes Feld, Sollpuls dagegen nicht - der steckt nur indirekt in `ProfileHeight`. 

 Außerdem fehlen Geschwindigkeit und GPS-Position als eigene Werte pro Trainingspunkt (aktuell nur nachträglich aus `Position`/Profil rekonstruierbar, siehe Exporte). 

 ### Vorschlag: TrainingPoint-Spalten umbenennen/ergänzen 

 | Alt | Neu | Bedeutung | 
 |---|---|---| 
 | `Frequency` | `Cadence` | Ist-Trittfrequenz | 
 | `Pulse` | `ActualPulse` | Ist-Puls | 
 | `Power` | `TargetPower` | Soll-Leistung (ans Ergometer gesendet) | 
 | `PowerActual` | `ActualPower` | Ist-Leistung | 
 | `Position` | `Distance` | Ist-Distanz in m | 
 | `ProfileHeight` | aufgeteilt in `Elevation` (nur topographisch, m) und `TargetPulse` (nur Pulsprofil, bpm) | siehe oben | 
 | `ProfilePosition` | entfällt bzw. wird `ProfileMinutes` (nur Puls-/Leistungsprofil) - bei topographisch identisch mit `Distance`, daher dort redundant | | 
 | `ProfileFinished` | bleibt | | 
 | *(neu)* | `Speed` | Ist-Geschwindigkeit in m/s | 
 | *(neu)* | `Latitude` / `Longitude` | GPS, nullable | 

 Mit `TargetPower`/`ActualPower` und `TargetPulse`/`ActualPulse` ergibt sich ein konsistentes Namensschema statt der bisherigen Mischung aus `Power`/`PowerActual`/`ProfileHeight`. 

 ### Aufzeichnungsintervall auf 1 s statt 2 s `ProfilePosition` speichert je nach Profiltyp etwas anderes, und bei einer der beiden Varianten ist der Wert schlicht eine Doppelung von `Distance`. 

 Aktuell Stelle, an der der Wert gesetzt wird jeder zweite Sekundentakt verworfen (`FreiesTrainingWindowViewModel.cs:1108`): 

 ```csharp 
 profilePosition = Profile.ProfileType == ProfileType.Topographic 
     ? distanceMeters 
     : ergoRunningElapsedCounter / 60m; 
 ``` 

 - **Topographisches Profil:** `ProfilePosition` = `distanceMeters` - also exakt derselbe Wert, der im selben Trainingspunkt auch in `Position` (künftig `Distance`) landet. Zwei Spalten, ein Wert. Beispiel: bei 500 m gefahrener Strecke stehen sowohl in `Position` als auch in `ProfilePosition` 500. 
 - **Leistungs-/Pulsprofil:** `ProfilePosition` = verstrichene **Minuten** seit Trainingsstart (`ergoRunningElapsedCounter % 2 != 0` in `RecordTrainingPoint`), obwohl das Ergometer ohnehin sekündlich abgefragt / 60m`). Das ist eine völlig andere Einheit (Zeit statt Strecke) und wird - gebraucht, weil `Profile.GivenPowerAt(minuten)`/`GivenPulseAt(minuten)` die zweite Sekunde wird also nur weggeworfen, X-Achse des Profils in Minuten erwartet, nicht eingespart. in Metern. 

 Andere Programme zeichnen heute standardmäßig sekündlich auf: Garmin hat den ressourcensparenden "Smart Recording"-Modus bei neueren Geräten (Edge 1040, Explore) ganz entfernt zugunsten Vorschlag: 
 - Bei topographisch: Feld **weglassen**, da redundant zu `Distance`. 
 - Bei Leistungs-/Pulsprofil: Feld **behalten, aber umbenennen** in `ProfileMinutes`, weil dort tatsächlich ein eigenständiger, sinnvoller Wert drinsteht (die Zeitposition auf der Profilkurve, unabhängig von "Every Second Recording", da moderner Speicherplatz kein limitierender Faktor mehr ist. Wahoo/Zwift zeichnen Leistung klassisch sekündlich auf, neuere Trainer sogar pro Kurbelumdrehung. der gefahrenen Strecke). 

 Vorschlag: Aufzeichnung auf 1 s umstellen (inkl. Anpassung `Interval=2` → `Interval=1` im HRM-Export). Damit gibt es eine Spalte, die nur noch in dem einen Fall existiert, wo sie wirklich eine eigene Bedeutung hat, statt einer Spalte, die mal Meter, mal Minuten bedeutet.

Zurück