ROWFILE/1
Plik .rowfile przechowuje jedną pełną sesję wioślarską. Row Smarter już teraz go eksportuje i importuje. Zawiera bezstratny zapis sesji obok eksportów CSV i TCX przeznaczonych do arkuszy kalkulacyjnych i serwisów treningowych.
Już teraz można udostępnić ten plik bezpośrednio. Zawiera całą sesję, więc po drodze nic nie ginie.
Struktura kontenera
Kontener jest deterministycznym połączeniem danych, a nie plikiem ZIP. Znaczniki ASCII otaczają surowe bajty każdego wpisu:
ROWFILE/1\n
>> <name> <size in bytes, decimal>\n
<size raw bytes>\n
...repeated per entry...manifest.json jest zapisywany jako pierwszy. Czytniki muszą akceptować dowolną kolejność wpisów, pomijać nieznane nazwy i odrzucać nazwę występującą dwukrotnie.
Nazwy wpisów
Row Smarter zapisuje następujące stałe nazwy:
manifest.json: wersja archiwum i informacje o programie zapisującym.session.json: bezstratna kopia, na której opiera się importer.summary.csv: eksport podsumowania sesji.samples.csv: zapisane próbki.strokes.csv: zapisane pociągnięcia.rowingdata.csv: eksport w stylu rowingdata.beats.csv: surowe odstępy między uderzeniami serca.session.tcx: eksport TCX.
Wpisy CSV i TCX są identyczne bajt po bajcie z osobnymi eksportami. Archiwum złożone z osobnych plików może nie zawierać session.json; wtedy importer odzyskuje z tych wpisów tyle danych, ile się da.
manifest.json
formatVersion jest jedynym wymaganym kluczem. Pozostałych wartości może brakować, gdy narzędzie składa archiwum z osobnych plików.
formatVersion: liczba całkowita. Bieżący format kontenera to1.sessionID: opcjonalny ciąg UUID.appVersion: opcjonalny ciąg znaków.writer: opcjonalny ciąg znaków. Row Smarter zapisujeRowSmarter, a narzędzie odzyskiwania —stitch-rowfile.
session.json
Schemat sesji ma wersję 1. Wartości nie są zaokrąglane. Wymagane klucze oznaczono poniżej; wszystkie pozostałe są opcjonalne.
Sesja
v: wymagana liczba całkowita, wersja schematu sesji.id: wymagany ciąg UUID, identyfikator sesji.start: wymagana liczba, sekundy od daty odniesienia typuDatena platformie.dur: wymagany obiekt czasu trwania;mov: obiekt czasu ruchu.dist: wymagana liczba, dystans w metrach.name: nazwa treningu;tz: identyfikator strefy czasowej na początku;utc: początkowe przesunięcie względem UTC w sekundach.mass: masa ciała zawodnika w kilogramach;age: wiek zawodnika w latach.maxW: maksymalna moc w watach;minSplit: minimalny czas w sekundach na 500 metrów;maxSR: maksymalne tempo.plan: zapisany dokumentWorkoutPlan;race: obiekt wyścigu.avgPace: średni czas w sekundach na 500 metrów;avgW: średnia moc w watach;work: całkowita praca w dżulach;kcal: kilokalorie.strokeCount: wymagana liczba całkowita;avgSR: średnie tempo.avgHR: średnie tętno w uderzeniach na minutę;peakHR: szczytowe tętno w uderzeniach na minutę.avgLen: średnia długość pociągnięcia w centymetrach;avgRatio: średni stosunek przeciągu do powrotu.samples: wymagana tablica obiektów próbek;strokes: wymagana tablica obiektów pociągnięć;beats: wymagana tablica obiektów uderzeń serca.prov: obiekt pochodzenia danych;hk: ciąg UUID treningu HealthKit.
Obiekt czasu trwania
s: wymagana liczba całkowita, pełne sekundy.a: wymagana liczba całkowita, attosekundy.
Obiekt próbki
t: wymagany obiekt czasu trwania, czas od początku.d: dystans w metrach;p: split w sekundach na 500 metrów;w: moc w watach.sr: tempo;sc: liczba pociągnięć;hr: tętno w uderzeniach na minutę.df: drag factor;sl: długość pociągnięcia w centymetrach.ap: średni split w sekundach na 500 metrów;aw: średnia moc w watach;wj: praca w dżulach.hr0: surowe tętno w uderzeniach na minutę.
Obiekt pociągnięcia
i: wymagana liczba całkowita, identyfikator pociągnięcia;t: wymagany obiekt czasu trwania, czas rozpoczęcia.dr: czas przeciągu;rc: czas powrotu;ds: true, gdy czas wyznaczono pośrednio, zamiast odczytać go z urządzenia.d: dystans w metrach;w: średnia moc w watach.fc: obiekt krzywej siły;pf: siła szczytowa w niutonach;af: średnia siła w niutonach.dl: długość przeciągu w centymetrach;sd: dystans pociągnięcia w metrach.
Obiekt krzywej siły
f: wymagana tablica próbek siły.dt: wymagany obiekt czasu trwania, odstęp między próbkami.cal: wymagana wartość logiczna określająca, czy próbki są skalibrowane.
Obiekt uderzenia serca
e: wymagany obiekt czasu trwania, czas od początku.r: wymagana liczba, odstęp między uderzeniami serca w sekundach.
Obiekt wyścigu
id: wymagany identyfikator wyścigu;name: nazwa wyścigu;dist: dystans wyścigu w metrach.own: identyfikator uczestnika przypisany zawodnikowi;src: źródło wyniku.field: wymagana tablica zawodników. Każdy ma wymagany identyfikator uczestnikap, a następnie opcjonalną nazwę wyświetlanąn, torl, miejscer, dystans w metrachd, czas w milisekundachei znacznik ukończeniaf.
Obiekt pochodzenia danych
kind: rodzaj ergometru;erg: nazwa ergometru;hrm: nazwa czujnika tętna.app: wersja aplikacji;build: numer kompilacji aplikacji;ver: wersja zapisu.si: odstęp między próbkami w sekundach;npc: siła w niutonach na jednostkę odczytu;hrfix: liczba korekt tętna.imf: format importu;isrc: aplikacja źródłowa importu;iat: czas importu w sekundach od daty odniesienia typuDatena platformie;ifn: nazwa importowanego pliku.fid: wierność zapisu sesji;mtd: czy czas ruchu wyznaczono pośrednio.