uci-gpio/src/gpio.js

74 lines
2.1 KiB
JavaScript

import DeadJim from 'death'
import { Gpio } from 'onoff'
import to from 'await-to-js'
import logger from '@uci-utils/logger'
let log = logger({package:'@uci/gpio', file:'/src/gpio.js'})
class Pin extends Gpio {
constructor(pin, opts = {}) {
if (typeof pin !=='number') pin = parseInt(pin) // make sure pin is a number!
// TODO check against a set of known acceptable pin numbers based on SBC
log.debug({pin:pin, msg:'construtor - creating gpio pin'})
if (isNaN(pin)) throw new Error('not a valid gpio pin number')
super(pin,opts.direction || 'out',opts)
this.id = (opts.id || 'gpio') + ':' + pin
log.debug({ pin: pin, opts: opts, method:'constructor', line:15, msg:'created gpio with these opts'})
this.number = pin
this.direction = opts.direction || 'out'
this.value = opts.init || 0
} // end constructor
async init() {
this.set(this.value)
DeadJim((signal,err) => {
log.warn({signal:signal, method:'init', line:56, error:err, msg:'gpio process was killed, unexporting pin'})
this.unexport() // kill the kernel entry
})
}
async on() { return await this.set(1) }
async off() { return await this.set(0) }
async toggle() { return await this.set(!this.value) }
async set(value) {
let [err] = await to(this.write(parseInt(value) || 0))
if (err) {
log.warn({error:err, pin:this.number, msg:'error reading gpio pin'})
throw err
}
let curValue = await this.read()
if (value !== curValue) throw new Error(`pin ${this.number} was not set correctly: ${value}:${curValue}`)
return curValue
}
async read() {
let [err, res] = await to(super.read())
if (err) {
log.warn({error:err, pin:this.pin, msg:'error reading gpio pin'})
return err
}
this.value=res
this.state = res ? 'on' : 'off'
return res
}
async get() { return this.value }
} // end Class
export default Pin
//example hook
// async function defaultHook(packet) {
// return a promise or use await if anything async happens in hook
// new Promise((resolve) => {
// console.log('==========default hook =============')
// return packet
// resolve(packet)
// })
// }