ROWFILE/1
Un .rowfile conserva una sesión de remo completa en un solo archivo. Row Smarter ya lo exporta e importa. Contiene el registro de sesión sin pérdida junto con las exportaciones CSV y TCX para hojas de cálculo y sitios de entrenamiento.
Ya puedes compartir este archivo directamente. Contiene toda la sesión, por lo que no se pierde nada por el camino.
Estructura del contenedor
El contenedor es una concatenación determinista, no un archivo zip. Los delimitadores ASCII rodean los bytes sin procesar de cada entrada:
ROWFILE/1\n
>> <name> <size in bytes, decimal>\n
<size raw bytes>\n
...repeated per entry...manifest.json se escribe primero. Los lectores deben aceptar las entradas en cualquier orden, omitir nombres desconocidos y rechazar un nombre que aparezca dos veces.
Nombres de las entradas
Row Smarter escribe estos nombres fijos:
manifest.json: versión del archivo y datos del programa que lo escribió.session.json: la copia sin pérdida en la que confía el importador.summary.csv: exportación del resumen de sesión.samples.csv: muestras registradas.strokes.csv: paladas registradas.rowingdata.csv: exportación de estilo rowingdata.beats.csv: intervalos RR sin procesar.session.tcx: exportación TCX.
Las entradas CSV y TCX son idénticas, byte por byte, a las exportaciones individuales. Un archivo reconstruido puede no contener session.json; en ese caso, el importador recupera lo que puede de esas entradas.
manifest.json
formatVersion es la única clave obligatoria. Los demás valores pueden faltar cuando una herramienta reconstruye un archivo a partir de archivos individuales.
formatVersion: entero. El formato actual del contenedor es1.sessionID: cadena UUID opcional.appVersion: cadena opcional.writer: cadena opcional. Row Smarter escribeRowSmarter; la herramienta de recuperación escribestitch-rowfile.
session.json
El esquema de sesión es la versión 1. Los valores no se redondean. Las claves obligatorias se indican a continuación; todas las demás son opcionales.
Sesión
v: entero obligatorio, versión del esquema de sesión.id: cadena UUID obligatoria, identidad de la sesión.start: número obligatorio, segundos desde la fecha de referencia deDatede la plataforma.dur: objeto de duración obligatorio;mov: objeto de duración del tiempo en movimiento.dist: número obligatorio, distancia en metros.name: nombre del entrenamiento;tz: identificador de la zona horaria inicial;utc: desplazamiento UTC inicial en segundos.mass: masa corporal del deportista en kilogramos;age: edad en años.maxW: potencia máxima en vatios;minSplit: mínimo de segundos por 500 metros;maxSR: máximo de paladas por minuto.plan: documentoWorkoutPlanguardado;race: objeto de carrera.avgPace: promedio de segundos por 500 metros;avgW: potencia media en vatios;work: trabajo total en julios;kcal: kilocalorías.strokeCount: entero obligatorio;avgSR: promedio de paladas por minuto.avgHR: frecuencia cardíaca media en latidos por minuto;peakHR: frecuencia cardíaca máxima en latidos por minuto.avgLen: longitud de palada media en centímetros;avgRatio: ratio medio entre pasada y recuperación.samples: lista obligatoria de objetos de muestra;strokes: lista obligatoria de objetos de palada;beats: lista obligatoria de objetos de latido.prov: objeto de procedencia;hk: cadena UUID del entrenamiento de HealthKit.
Objeto de duración
s: entero obligatorio, segundos completos.a: entero obligatorio, attosegundos.
Objeto de muestra
t: objeto de duración obligatorio, tiempo transcurrido.d: distancia en metros;p: ritmo en segundos por 500 metros;w: vatios.sr: paladas por minuto;sc: número de paladas;hr: frecuencia cardíaca en latidos por minuto.df: drag factor;sl: longitud de palada en centímetros.ap: ritmo medio en segundos por 500 metros;aw: potencia media en vatios;wj: trabajo en julios.hr0: frecuencia cardíaca sin procesar en latidos por minuto.
Objeto de palada
i: entero obligatorio, identidad de la palada;t: objeto de duración obligatorio, instante de inicio.dr: duración de la pasada;rc: duración de la recuperación;ds: verdadero cuando la temporización se ha calculado en lugar de recibirse de la máquina.d: distancia en metros;w: potencia media en vatios.fc: objeto de curva de fuerza;pf: fuerza máxima en newtons;af: fuerza media en newtons.dl: longitud de la pasada en centímetros;sd: distancia por palada en metros.
Objeto de curva de fuerza
f: lista obligatoria de muestras de fuerza.dt: objeto de duración obligatorio, intervalo de muestreo.cal: booleano obligatorio que indica si las muestras están calibradas.
Objeto de latido
e: objeto de duración obligatorio, tiempo transcurrido.r: número obligatorio, intervalo RR en segundos.
Objeto de carrera
id: identidad de carrera obligatoria;name: nombre de la carrera;dist: distancia de la carrera en metros.own: identidad de participante del deportista;src: origen del resultado.field: lista obligatoria de participantes. Cada uno tiene la identidad de participante obligatoriapy, opcionalmente, el nombre visiblen, la callel, la posiciónr, la distancia en metrosd, los milisegundos transcurridosey el indicador de finalizaciónf.
Objeto de procedencia
kind: tipo de ergómetro;erg: nombre del ergómetro;hrm: nombre del monitor de frecuencia cardíaca.app: versión de la app;build: compilación de la app;ver: versión de grabación.si: intervalo de muestreo en segundos;npc: fuerza en newtons por unidad del contador;hrfix: número de correcciones de frecuencia cardíaca.imf: formato de importación;isrc: app de origen de la importación;iat: instante de importación en segundos desde la fecha de referencia deDatede la plataforma;ifn: nombre del archivo importado.fid: fidelidad de la sesión;mtd: indica si el tiempo en movimiento se ha calculado.