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 }