ROWFILE/1
.rowfile хранит одну полную гребную тренировку в одном файле. Row Smarter уже экспортирует и импортирует его. Он содержит запись без потерь вместе с экспортами CSV и TCX для электронных таблиц и тренировочных сайтов.
Этим файлом уже можно делиться напрямую. Он содержит всю тренировку, поэтому по пути ничего не теряется.
Структура контейнера
Контейнер — детерминированная последовательность, а не zip-файл. ASCII-обрамление окружает сырые байты каждой записи:
ROWFILE/1\n
>> <name> <size in bytes, decimal>\n
<size raw bytes>\n
...repeated per entry...manifest.json записывается первым. Читатели должны принимать записи в любом порядке, пропускать неизвестные имена и отклонять повторение имени.
Имена записей
Row Smarter использует эти фиксированные имена:
manifest.json: версия архива и сведения о программе-записывателе.session.json: копия без потерь, которой доверяет импортёр.summary.csv: экспорт итогов тренировки.samples.csv: записанные отсчёты.strokes.csv: записанные гребки.rowingdata.csv: экспорт в стиле rowingdata.beats.csv: сырые RR-интервалы.session.tcx: экспорт TCX.
Записи CSV и TCX побайтово совпадают с отдельными экспортами. В собранном архиве может не быть session.json; тогда импортёр восстанавливает то, что может, из этих записей.
manifest.json
formatVersion — единственный обязательный ключ. Остальные значения могут отсутствовать, когда инструмент собирает архив из отдельных файлов.
formatVersion: целое число. Текущий формат контейнера —1.sessionID: необязательная строка UUID.appVersion: необязательная строка.writer: необязательная строка. Row Smarter записываетRowSmarter; инструмент восстановления —stitch-rowfile.
session.json
Версия схемы тренировки — 1. Значения не округляются. Обязательные ключи отмечены ниже; остальные необязательны.
Тренировка
v: обязательное целое число, версия схемы тренировки.id: обязательная строка UUID, идентичность тренировки.start: обязательное число, секунды от опорной датыDateплатформы.dur: обязательный объект длительности;mov: объект длительности времени в движении.dist: обязательное число, дистанция в метрах.name: название тренировки;tz: идентификатор исходного часового пояса;utc: исходное смещение от UTC в секундах.mass: масса тела спортсмена в килограммах;age: возраст в годах.maxW: максимальные ватты;minSplit: минимальные секунды на 500 метров;maxSR: максимальный темп.plan: сохранённый документWorkoutPlan;race: объект гонки.avgPace: средние секунды на 500 метров;avgW: средние ватты;work: суммарная работа в джоулях;kcal: килокалории.strokeCount: обязательное целое число;avgSR: средний темп.avgHR: средний пульс в ударах в минуту;peakHR: пиковый пульс в ударах в минуту.avgLen: средняя длина гребка в сантиметрах;avgRatio: среднее соотношение проводки и подготовки.samples: обязательный массив объектов отсчётов;strokes: обязательный массив объектов гребков;beats: обязательный массив объектов ударов сердца.prov: объект происхождения;hk: строка UUID тренировки HealthKit.
Объект длительности
s: обязательное целое число, целые секунды.a: обязательное целое число, аттосекунды.
Объект отсчёта
t: обязательный объект длительности, время с начала.d: дистанция в метрах;p: время в секундах на 500 метров;w: ватты.sr: темп;sc: число гребков;hr: пульс в ударах в минуту.df: драг-фактор;sl: длина гребка в сантиметрах.ap: среднее время в секундах на 500 метров;aw: средние ватты;wj: работа в джоулях.hr0: сырой пульс в ударах в минуту.
Объект гребка
i: обязательное целое число, идентичность гребка;t: обязательный объект длительности, время начала.dr: длительность проводки;rc: длительность подготовки;ds: истина, если время рассчитано, а не получено.d: дистанция в метрах;w: средние ватты.fc: объект кривой усилия;pf: пиковое усилие в ньютонах;af: среднее усилие в ньютонах.dl: длина проводки в сантиметрах;sd: дистанция гребка в метрах.
Объект кривой усилия
f: обязательный массив отсчётов усилия.dt: обязательный объект длительности, интервал отсчётов.cal: обязательное логическое значение, калиброваны ли отсчёты.
Объект удара сердца
e: обязательный объект длительности, время с начала.r: обязательное число, RR-интервал в секундах.
Объект гонки
id: обязательная идентичность гонки;name: название;dist: дистанция гонки в метрах.own: идентичность спортсмена как участника;src: источник результата.field: обязательный массив соперников. У каждого есть обязательная идентичность участникаp, затем необязательные имяn, дорожкаl, местоr, дистанция в метрахd, время в миллисекундахeи флаг финишаf.
Объект происхождения
kind: тип эргометра;erg: название эргометра;hrm: название пульсометра.app: версия приложения;build: сборка;ver: версия записи.si: интервал отсчётов в секундах;npc: ньютонов усилия на единицу отсчёта;hrfix: число исправлений пульса.imf: формат импорта;isrc: приложение-источник импорта;iat: время импорта в секундах от опорной датыDateплатформы;ifn: имя импортированного файла.fid: полнота данных тренировки;mtd: рассчитано ли время в движении.