UNPKG

wpi-gpio

Version:

Wrapper around the WiringPi gpio command-line utility

147 lines (129 loc) 2.96 kB
/** * wpi-gpio - Wrapper around the WiringPi gpio command-line utility * https://github.com/gavinhungry/wpi-gpio */ (() => { 'use strict'; const exec = require('child_process').exec; const gpio = module.exports; gpio.BCM_GPIO = false; /** * Exec a call to gpio * * @param {String} method * @param {Number|String} pin * @param {Array} [args] * @return {Promise} */ let gpioExec = (method, pin, args) => { pin = parseInt(pin, 10) || 0; args = args || []; let flag = gpio.BCM_GPIO ? '-g' : ''; let cmd = ['gpio', flag, method, pin, args.join(' ')].join(' '); cmd = cmd.replace(/\s+/g, ' ').trim(); return new Promise((res, rej) => { exec(cmd, (err, stdout, stderr) => { return err ? rej(stderr) : res(stdout); }); }); }; /** * Set an input pin * * @param {Number|String} pin * @return {Promise} */ gpio.input = pin => { return gpioExec('mode', pin, ['in']); }; /** * Set an output pin * * @param {Number|String} pin * @param {Number} [val] * @return {Promise} */ gpio.output = (pin, val) => { return gpio.write(pin, val).then(() => { return gpioExec('mode', pin, ['out']); }); }; /** * Set pull up resistor on a pin * * @param {Number|String} pin * @return {Promise} */ gpio.pullUp = pin => { return gpioExec('mode', pin, ['up']); }; /** * Set pull down resistor on a pin * * @param {Number|String} pin * @return {Promise} */ gpio.pullDown = pin => { return gpioExec('mode', pin, ['down']); }; /** * Set tri state for a pin * * @param {Number|String} pin * @return {Promise} */ gpio.triState = pin => { return gpioExec('mode', pin, ['tri']); }; /** * Read the value of a pin * * @param {Number|String} pin * @return {Promise} -> {Number} */ gpio.read = pin => { return gpioExec('read', pin).then(val => { return parseInt(val, 10); }); }; /** * Set the value of an output pin * * @param {Number|String} pin * @param {Number} val * @return {Promise} */ gpio.write = (pin, val) => { if (val === undefined) { return Promise.resolve(); } return gpioExec('write', pin, [val ? 1 : 0]); }; /** * Set a sequence of values to an output pin * * @param {Number|String} pin * @param {Array} vals - values to write * @return {Promise} */ gpio.sequence = (pin, vals) => { return vals.reduce((p, val) => { return p.then(() => { return new Promise((res, rej) => { gpio.write(pin, val).then(() => { setTimeout(res, 100); }); }); }); }, gpio.output(pin)); }; /** * Simulate "tapping" an output pin by toggling it once * * @param {Number|String} pin * @return {Promise} */ gpio.tap = pin => { return gpio.sequence(pin, [1, 0, 1]); }; })();