52 lines
1.6 KiB
JavaScript
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()
|