openrowingmonitor/app/tools/RowingRecorder.js

59 lines
1.6 KiB
JavaScript

'use strict'
/*
Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
A utility to record and replay flywheel measurements for development purposes.
*/
import { fork } from 'child_process'
import fs from 'fs'
import readline from 'readline'
import log from 'loglevel'
function recordRowingSession (filename) {
// measure the gpio interrupts in another process, since we need
// to track time close to realtime
const gpioTimerService = fork('./app/gpio/GpioTimerService.js')
gpioTimerService.on('message', (dataPoint) => {
log.debug(dataPoint)
fs.appendFile(filename, `${dataPoint}\n`, (err) => { if (err) log.error(err) })
})
}
async function replayRowingSession (rotationImpulseHandler, options) {
if (!options?.filename) {
log.error('can not replay rowing session without filename')
return
}
do {
await replayRowingFile(rotationImpulseHandler, options)
// infinite looping only available when using realtime
} while (options.loop && options.realtime)
}
async function replayRowingFile (rotationImpulseHandler, options) {
const fileStream = fs.createReadStream(options.filename)
const readLine = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
})
for await (const line of readLine) {
const dt = parseFloat(line)
// if we want to replay in the original time, wait dt seconds
if (options.realtime) await wait(dt * 1000)
rotationImpulseHandler(dt)
}
}
async function wait (ms) {
return new Promise(resolve => {
setTimeout(resolve, ms)
})
}
export {
recordRowingSession,
replayRowingSession
}