59 lines
1.6 KiB
JavaScript
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
|
|
}
|