uci-gpio/src/commands.js

55 lines
1.5 KiB
JavaScript

const pSettle = require('p-settle')
import logger from '@uci-utils/logger'
let log = logger({package:'@uci/gpio', file:'/src/commands.js'})
export default {
on: async function(packet) {
packet.pinCmd = 'on'
this.commands.set(packet)
return packet
},
off: async function(packet) {
packet.pinCmd = 'off'
await this.commands.set(packet)
return packet
},
toggle: async function(packet) {
packet.pinCmd = 'toggle'
await this.commands.set(packet)
return packet
},
set: async function(packet) {
packet.pinCmd = packet.pinCmd || 'set'
let pins = parsePins.call(this, packet.pins || packet.pin)
packet.res = await pSettle(
pins.map(pin => {
return this.pins[pin][packet.pinCmd](packet.value)
})
)
packet = await this.commands.get(packet)
this.emit('gpios',packet) // emit locally
this.push(packet) // will push on any socket
return packet
},
get: async function(packet) {
let pins = parsePins.call(this,packet.pins || packet.pin)
packet.pins = {}
pins.forEach(pin => packet.pins[pin] = this.pins[pin].value)
packet.cmd = 'status'
return packet
}
}
const parsePins = function(pins) {
if (typeof pins==='number') pins = [pins]
if (typeof pins==='string') {
if (pins==='all') pins = Object.keys(this.pins)
else {
pins = pins.split(/[,:\s]+/).map(Number).filter( (x) => !Number.isNaN(x))
}
}
// TODO plain object is pin and value pairs
return pins
}