ROWFILE/1
Un .rowfile conserve une séance d'aviron complète dans un seul fichier. Row Smarter l'exporte et l'importe dès aujourd'hui. Il contient l'enregistrement sans perte de la séance, accompagné des exports CSV et TCX destinés aux tableurs et aux sites d'entraînement.
Vous pouvez déjà partager ce fichier directement. Il contient la séance entière : rien ne se perd en chemin.
Structure du conteneur
Le conteneur est une concaténation déterministe, pas un fichier zip. Une structure ASCII encadre les octets bruts de chaque entrée :
ROWFILE/1\n
>> <name> <size in bytes, decimal>\n
<size raw bytes>\n
...repeated per entry...manifest.json est écrit en premier. Les lecteurs doivent accepter les entrées dans n'importe quel ordre, ignorer les noms inconnus et refuser tout nom présent deux fois.
Noms des entrées
Row Smarter écrit ces noms fixes :
manifest.json: version de l'archive et informations sur le logiciel qui l'a écrite.session.json: la copie sans perte sur laquelle l'importateur s'appuie.summary.csv: l'export du résumé de séance.samples.csv: les échantillons enregistrés.strokes.csv: les coups enregistrés.rowingdata.csv: l'export au format rowingdata.beats.csv: les intervalles bruts entre battements cardiaques.session.tcx: l'export TCX.
Les entrées CSV et TCX sont identiques, octet pour octet, aux exports séparés. Une archive reconstituée peut ne pas contenir de session.json ; dans ce cas, l'importateur récupère ce qu'il peut à partir de ces entrées.
manifest.json
formatVersion est la seule clé obligatoire. Les autres valeurs peuvent être absentes lorsqu'un outil reconstitue une archive à partir de fichiers séparés.
formatVersion: entier. Le format actuel du conteneur est1.sessionID: chaîne UUID facultative.appVersion: chaîne facultative.writer: chaîne facultative. Row Smarter écritRowSmarter; l'outil de récupération écritstitch-rowfile.
session.json
Le schéma de séance est en version 1. Les valeurs ne sont pas arrondies. Les clés obligatoires sont signalées ci-dessous ; toutes les autres sont facultatives.
Séance
v: entier obligatoire, version du schéma de séance.id: chaîne UUID obligatoire, identifiant de la séance.start: nombre obligatoire, secondes depuis la date de référence deDatesur la plateforme.dur: objet durée obligatoire ;mov: objet durée du temps en mouvement.dist: nombre obligatoire, distance en mètres.name: nom de l'entraînement ;tz: identifiant du fuseau horaire au départ ;utc: décalage UTC au départ, en secondes.mass: masse corporelle de l'athlète en kilogrammes ;age: âge de l'athlète en années.maxW: puissance maximale en watts ;minSplit: minimum de secondes pour 500 mètres ;maxSR: cadence maximale.plan: documentWorkoutPlanenregistré ;race: objet course.avgPace: moyenne en secondes pour 500 mètres ;avgW: puissance moyenne en watts ;work: travail total en joules ;kcal: kilocalories.strokeCount: entier obligatoire ;avgSR: cadence moyenne.avgHR: fréquence cardiaque moyenne en battements par minute ;peakHR: fréquence cardiaque maximale en battements par minute.avgLen: longueur de coup moyenne en centimètres ;avgRatio: rapport moyen propulsion-retour.samples: tableau obligatoire d'objets échantillon ;strokes: tableau obligatoire d'objets coup ;beats: tableau obligatoire d'objets battement.prov: objet provenance ;hk: chaîne UUID de la séance HealthKit.
Objet durée
s: entier obligatoire, secondes entières.a: entier obligatoire, attosecondes.
Objet échantillon
t: objet durée obligatoire, temps écoulé.d: distance en mètres ;p: split en secondes pour 500 mètres ;w: watts.sr: cadence ;sc: nombre de coups ;hr: fréquence cardiaque en battements par minute.df: drag factor ;sl: longueur de coup en centimètres.ap: split moyen en secondes pour 500 mètres ;aw: watts moyens ;wj: travail en joules.hr0: fréquence cardiaque brute en battements par minute.
Objet coup
i: entier obligatoire, identifiant du coup ;t: objet durée obligatoire, instant de départ.dr: durée de propulsion ;rc: durée du retour ;ds: vrai si les durées sont calculées plutôt que transmises.d: distance en mètres ;w: watts moyens.fc: objet courbe de force ;pf: force maximale en newtons ;af: force moyenne en newtons.dl: longueur de propulsion en centimètres ;sd: distance par coup en mètres.
Objet courbe de force
f: tableau obligatoire d'échantillons de force.dt: objet durée obligatoire, intervalle d'échantillonnage.cal: booléen obligatoire indiquant si les échantillons sont étalonnés.
Objet battement
e: objet durée obligatoire, temps écoulé.r: nombre obligatoire, intervalle entre battements en secondes.
Objet course
id: identifiant de course obligatoire ;name: nom de la course ;dist: distance de course en mètres.own: identifiant du participant correspondant à l'athlète ;src: source du résultat.field: tableau obligatoire de concurrents. Chaque concurrent possède un identifiant de participant obligatoirep, puis un nom d'affichage facultatifn, un couloirl, un rangr, une distance en mètresd, un temps écoulé en millisecondeseet un indicateur d'arrivéef, tous facultatifs.
Objet provenance
kind: type d'ergomètre ;erg: nom de l'ergomètre ;hrm: nom du cardiofréquencemètre.app: version de l'app ;build: numéro de build de l'app ;ver: version d'enregistrement.si: intervalle d'échantillonnage en secondes ;npc: newtons de force par unité brute ;hrfix: nombre de corrections de fréquence cardiaque.imf: format d'import ;isrc: app source de l'import ;iat: instant d'import en secondes depuis la date de référence deDatesur la plateforme ;ifn: nom du fichier importé.fid: fidélité de la séance ;mtd: indique si le temps en mouvement a été calculé.