ROWFILE/1
Un file .rowfile conserva un'intera sessione di canottaggio in un solo file. Row Smarter lo esporta e lo importa già oggi. Contiene la registrazione senza perdita di dati della sessione insieme alle esportazioni CSV e TCX destinate a fogli di calcolo e siti di allenamento.
Puoi condividere direttamente questo file già oggi. Contiene l'intera sessione, senza perdere nulla nel passaggio.
Struttura del contenitore
Il contenitore è una concatenazione deterministica, non un file zip. Una struttura ASCII delimita i byte grezzi di ogni voce:
ROWFILE/1\n
>> <name> <size in bytes, decimal>\n
<size raw bytes>\n
...repeated per entry...manifest.json viene scritto per primo. I lettori devono accettare le voci in qualsiasi ordine, ignorare i nomi sconosciuti e rifiutare un nome che compare due volte.
Nomi delle voci
Row Smarter scrive questi nomi fissi:
manifest.json: versione dell'archivio e dettagli del programma che lo ha scritto.session.json: la copia senza perdita di dati su cui si basa l'importatore.summary.csv: esportazione del riepilogo della sessione.samples.csv: campioni registrati.strokes.csv: colpi registrati.rowingdata.csv: esportazione in stile rowingdata.beats.csv: intervalli RR grezzi.session.tcx: esportazione TCX.
Le voci CSV e TCX sono identiche byte per byte alle esportazioni separate. Un archivio ricostruito può non contenere session.json; in quel caso l'importatore recupera ciò che può da queste voci.
manifest.json
formatVersion è l'unica chiave obbligatoria. Gli altri valori possono mancare quando uno strumento ricostruisce un archivio da file separati.
formatVersion: intero. Il formato attuale del contenitore è1.sessionID: stringa UUID facoltativa.appVersion: stringa facoltativa.writer: stringa facoltativa. Row Smarter scriveRowSmarter; lo strumento di recupero scrivestitch-rowfile.
session.json
Lo schema della sessione è alla versione 1. I valori non vengono arrotondati. Le chiavi obbligatorie sono indicate sotto; tutte le altre sono facoltative.
Sessione
v: intero obbligatorio, versione dello schema della sessione.id: stringa UUID obbligatoria, identità della sessione.start: numero obbligatorio, secondi dalla data di riferimento diDatedella piattaforma.dur: oggetto durata obbligatorio;mov: oggetto durata del tempo in movimento.dist: numero obbligatorio, distanza in metri.name: nome dell'allenamento;tz: identificatore del fuso orario iniziale;utc: scostamento iniziale da UTC in secondi.mass: massa corporea dell'atleta in chilogrammi;age: età dell'atleta in anni.maxW: watt massimi;minSplit: secondi minimi per 500 metri;maxSR: colpi al minuto massimi.plan: documentoWorkoutPlanmemorizzato;race: oggetto gara.avgPace: secondi medi per 500 metri;avgW: watt medi;work: lavoro totale in joule;kcal: chilocalorie.strokeCount: intero obbligatorio;avgSR: colpi al minuto medi.avgHR: frequenza cardiaca media in battiti al minuto;peakHR: frequenza cardiaca di picco in battiti al minuto.avgLen: lunghezza media del colpo in centimetri;avgRatio: rapporto medio tra passata e ritorno.samples: array obbligatorio di oggetti campione;strokes: array obbligatorio di oggetti colpo;beats: array obbligatorio di oggetti battito.prov: oggetto provenienza;hk: stringa UUID dell'allenamento HealthKit.
Oggetto durata
s: intero obbligatorio, secondi interi.a: intero obbligatorio, attosecondi.
Oggetto campione
t: oggetto durata obbligatorio, tempo trascorso.d: distanza in metri;p: passo in secondi per 500 metri;w: watt.sr: colpi al minuto;sc: numero di colpi;hr: frequenza cardiaca in battiti al minuto.df: drag factor;sl: lunghezza del colpo in centimetri.ap: passo medio in secondi per 500 metri;aw: watt medi;wj: lavoro in joule.hr0: frequenza cardiaca grezza in battiti al minuto.
Oggetto colpo
i: intero obbligatorio, identità del colpo;t: oggetto durata obbligatorio, istante iniziale.dr: durata della passata;rc: durata del ritorno;ds: vero se i tempi sono stati ricavati anziché comunicati.d: distanza in metri;w: watt medi.fc: oggetto curva di forza;pf: forza di picco in newton;af: forza media in newton.dl: lunghezza della passata in centimetri;sd: distanza del colpo in metri.
Oggetto curva di forza
f: array obbligatorio di campioni di forza.dt: oggetto durata obbligatorio, intervallo di campionamento.cal: booleano obbligatorio, indica se i campioni sono calibrati.
Oggetto battito
e: oggetto durata obbligatorio, tempo trascorso.r: numero obbligatorio, intervallo RR in secondi.
Oggetto gara
id: identità della gara obbligatoria;name: nome della gara;dist: distanza della gara in metri.own: identità del partecipante dell'atleta;src: fonte del risultato.field: array obbligatorio di concorrenti. Ogni concorrente ha l'identità obbligatoria del partecipantep, poi nome visualizzato facoltativon, corsial, posizioner, distanza in metrid, millisecondi trascorsiee indicatore di arrivof.
Oggetto provenienza
kind: tipo di ergometro;erg: nome dell'ergometro;hrm: nome del cardiofrequenzimetro.app: versione dell'app;build: build dell'app;ver: versione della registrazione.si: intervallo di campionamento in secondi;npc: newton di forza per conteggio;hrfix: numero di correzioni della frequenza cardiaca.imf: formato di importazione;isrc: app sorgente dell'importazione;iat: istante di importazione in secondi dalla data di riferimento diDatedella piattaforma;ifn: nome del file importato.fid: fedeltà della sessione;mtd: indica se il tempo in movimento è stato ricavato.