openrowingmonitor/app/gpio/GpioTimerService.js

52 lines
1.6 KiB
JavaScript

'use strict'
/*
Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
Measures the time between impulses on the GPIO pin. Started in a
separate thread, since we want the measured time to be as close as
possible to real time.
*/
import process from 'process'
import { Gpio } from 'onoff'
import os from 'os'
import config from '../tools/ConfigManager.js'
import log from 'loglevel'
log.setLevel(config.loglevel.default)
export function createGpioTimerService () {
if (Gpio.accessible) {
if (config.gpioHighPriority) {
// setting top (near-real-time) priority for the Gpio process, as we don't want to miss anything
log.debug('setting priority for the Gpio-service to maximum (-20)')
try {
// setting priority of current process
os.setPriority(-20)
} catch (err) {
log.debug('need root permission to set priority of Gpio-Thread')
}
}
// read the sensor data from one of the Gpio pins of Raspberry Pi
const sensor = new Gpio(config.gpioPin, 'in', 'rising')
// use hrtime for time measurement to get a higher time precision
let hrStartTime = process.hrtime()
// assumes that GPIO-Port 17 is set to pullup and reed is connected to GND
// therefore the value is 1 if the reed sensor is open
sensor.watch((err, value) => {
if (err) {
throw err
}
const hrDelta = process.hrtime(hrStartTime)
hrStartTime = process.hrtime()
const delta = hrDelta[0] + hrDelta[1] / 1e9
process.send(delta)
})
} else {
log.info('reading from Gpio is not (yet) supported on this platform')
}
}
createGpioTimerService()