From f0fae8ce1bae903917dc041febf6c2ef6867d468 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Fri, 8 Mar 2019 11:27:24 -0500 Subject: [PATCH] Refactor arduino library as class, rather than object. --- lib/arduino/index.js | 627 +++++++++++++++++++------------------- lib/arduino/index.js.map | 2 +- src/arduino/index.ts | 630 +++++++++++++++++++-------------------- 3 files changed, 627 insertions(+), 632 deletions(-) diff --git a/lib/arduino/index.js b/lib/arduino/index.js index 992bebe..e928efc 100644 --- a/lib/arduino/index.js +++ b/lib/arduino/index.js @@ -7,6 +7,17 @@ const newlineRe = new RegExp('\n', 'g'); const returnRe = new RegExp('\r', 'g'); let eventEmitter; let cfg; +let arduino; +const KNOWN = [ + '/dev/tty.usbmodem1a161', + '/dev/tty.usbserial-A800f8dk', + '/dev/tty.usbserial-A900cebm', + '/dev/tty.usbmodem1a131', + '/dev/tty.usbserial-a900f6de', + '/dev/tty.usbmodem1a141', + '/dev/ttyACM0', + 'COM3' +]; /** * Pause the process for X milliseconds in async/await functions * @@ -20,352 +31,336 @@ async function delay(ms) { }); } /** - * Send a command to an Arduino using async/await - * - * @param {string} device Arduino identifier - * @param {string} cmd Single character command to send - * - * @returns {Promise} Resolves after sending + * Class representing the arduino communication features **/ -async function send(device, cmd) { - return new Promise((resolve, reject) => { - arduino.queue[cmd] = (ms) => { - return resolve(ms); - }; - return arduino.serial[device].write(cmd, (err, results) => { - if (err) { - //console.error(err) - return reject(err); - } - // - }); - }); -} -/** - * Send a string to an Arduino using async/await - * - * @param {string} device Arduino identifier - * @param {string} str String to send - * - * @returns {Promise} Resolves after sending - **/ -async function write(device, str) { - return new Promise((resolve, reject) => { - arduino.serial[device].write(str, function (err, results) { - if (err) { - return reject(err); - } - //console.log('sent: ' + str) - return resolve(results); - }); - }); -} -/** - * Connect to an Arduino using async/await - * - * @param {string} device Arduino identifier - * - * @returns {Promise} Resolves after opening - **/ -async function openArduino(device) { - return new Promise((resolve, reject) => { - return arduino.serial[device].open(error => { - if (error) { - return reject(error); - } - return resolve(true); - }); - }); -} -/** - * Close a connection to an Arduino using async/await - * - * @param {string} device Arduino identifier - * - * @returns {Promise} Resolves after closing - **/ -async function closeArduino(device) { - return new Promise((resolve, reject) => { - return arduino.serial[device].close((err) => { - if (err) { - return reject(err); - } - return resolve(true); - }); - }); -} -/****** - Arduino handlers -*******/ -const arduino = { - path: {}, - known: [ - '/dev/tty.usbmodem1a161', - '/dev/tty.usbserial-A800f8dk', - '/dev/tty.usbserial-A900cebm', - '/dev/tty.usbmodem1a131', - '/dev/tty.usbserial-a900f6de', - '/dev/tty.usbmodem1a141', - '/dev/ttyACM0', - 'COM3' - ], - alias: {}, - serial: { - connect: {}, - projector: {}, - camera: {}, - light: {} - }, - baud: 57600, - queue: {}, - timer: 0, - lock: false, - locks: {} -}; -arduino.enumerate = async function () { - return new Promise((resolve, reject) => { - return SerialPort.list((err, ports) => { - let matches = []; - if (err) { - return reject(err); - } - ports.forEach(port => { - if (arduino.known.indexOf(port.comName) !== -1) { - matches.push(port.comName); +class Arduino { + constructor() { + this.path = {}; + this.known = KNOWN; + this.alias = {}; + this.serial = { connect: {}, projector: {}, camera: {}, light: {} }; + this.baud = 57600; + this.queue = {}; + this.timer = 0; + this.lock = false; + this.locks = {}; + } + async enumerate() { + return new Promise((resolve, reject) => { + return SerialPort.list((err, ports) => { + let matches = []; + if (err) { + return reject(err); } - else if ((port.manufacturer + '').toLowerCase().indexOf('arduino') !== -1) { - matches.push(port.comName); + ports.forEach((port) => { + if (this.known.indexOf(port.comName) !== -1) { + matches.push(port.comName); + } + else if ((port.manufacturer + '').toLowerCase().indexOf('arduino') !== -1) { + matches.push(port.comName); + } + else if ((port.comName + '').toLowerCase().indexOf('usbserial') !== -1) { + matches.push(port.comName); + } + else if ((port.comName + '').toLowerCase().indexOf('usbmodem') !== -1) { + matches.push(port.comName); + } + }); + if (matches.length === 0) { + return reject('No USB devices found'); } - else if ((port.comName + '').toLowerCase().indexOf('usbserial') !== -1) { - matches.push(port.comName); - } - else if ((port.comName + '').toLowerCase().indexOf('usbmodem') !== -1) { - matches.push(port.comName); + else if (matches.length > 0) { + return resolve(matches); } }); - if (matches.length === 0) { - return reject('No USB devices found'); - } - else if (matches.length > 0) { - return resolve(matches); - } }); - }); -}; -//commands which respond to a sent char -arduino.send = async function (serial, cmd, res) { - const device = arduino.alias[serial]; - let results; - if (arduino.locks[serial]) { - return false; } - arduino.locks[serial] = true; - await delay(cfg.arduino.serialDelay); - try { - results = await send(device, cmd); + /** + * Send a command to an Arduino using async/await + * + * @param {string} device Arduino identifier + * @param {string} cmd Single character command to send + * + * @returns {Promise} Resolves after sending + **/ + async sendAsync(device, cmd) { + return new Promise((resolve, reject) => { + this.queue[cmd] = (ms) => { + return resolve(ms); + }; + return this.serial[device].write(cmd, (err, results) => { + if (err) { + //console.error(err) + return reject(err); + } + // + }); + }); } - catch (e) { - return console.error(e); - } - arduino.locks[serial] = false; - arduino.timer = new Date().getTime(); - return await eventEmitter.emit('arduino_send', cmd); -}; -//send strings, after char triggers firmware to accept -arduino.string = async function (serial, str) { - const device = arduino.alias[serial]; - let writeSuccess; - await delay(cfg.arduino.serialDelay); - if (typeof arduino.serial[device].fake !== 'undefined' - && arduino.serial[device].fake) { - return arduino.serial[device].string(str); - } - else { + async send(serial, cmd) { + const device = this.alias[serial]; + let results; + if (this.locks[serial]) { + return false; + } + this.locks[serial] = true; + await delay(cfg.arduino.serialDelay); try { - writeSuccess = await write(device, str); + results = await this.sendAsync(device, cmd); } catch (e) { return console.error(e); } - return writeSuccess; + this.locks[serial] = false; + this.timer = new Date().getTime(); + return await eventEmitter.emit('arduino_send', cmd); } -}; -//respond with same char over serial when done -arduino.end = async function (serial, data) { - const end = new Date().getTime(); - const ms = end - arduino.timer; - let complete; - if (arduino.queue[data] !== undefined) { - arduino.locks[serial] = false; - //console.log('Command ' + data + ' took ' + ms + 'ms'); - complete = arduino.queue[data](ms); //execute callback - eventEmitter.emit('arduino_end', data); - delete arduino.queue[data]; - } - else { - //console.log('Received stray "' + data + '"'); //silent to user - } - return complete; -}; -arduino.alias = function (serial, device) { - console.log(`Making "${serial}" an alias of ${device}`); - arduino.alias[serial] = device; -}; -arduino.connect = async function (serial, device, confirm) { - return new Promise(async (resolve, reject) => { - let connectSuccess; - arduino.path[serial] = device; - arduino.alias[serial] = device; - arduino.serial[device] = new SerialPort(arduino.path[serial], { - autoOpen: false, - baudRate: cfg.arduino.baud, - parser: parser - }); - arduino.locks[device] = false; - try { - connectSuccess = await openArduino(device); - } - catch (e) { - console.error('failed to open: ' + e); - return reject(e); - } - console.log(`Opened connection with ${arduino.path[serial]} as ${serial}`); - if (!confirm) { - arduino.serial[device].on('data', async (data) => { - let d = data.toString('utf8'); - d = d.replace(newlineRe, '').replace(returnRe, ''); - return await arduino.end(serial, d); - }); + async string(serial, str) { + const device = this.alias[serial]; + let writeSuccess; + await delay(cfg.arduino.serialDelay); + if (typeof this.serial[device].fake !== 'undefined' + && this.serial[device].fake) { + return this.serial[device].string(str); } else { - arduino.serial[device].on('data', async (data) => { - let d = data.toString('utf8'); - d = d.replace(newlineRe, '').replace(returnRe, ''); - return await arduino.confirmEnd(d); - }); + try { + writeSuccess = await this.writeAsync(device, str); + } + catch (e) { + return console.error(e); + } + return writeSuccess; } - return resolve(arduino.path[serial]); - }); -}; -arduino.confirmExec = {}; -arduino.confirmEnd = function (data) { - //console.dir(data) - if (data === cfg.arduino.cmd.connect - || data === cfg.arduino.cmd.proj_identifier - || data === cfg.arduino.cmd.cam_identifier - || data === cfg.arduino.cmd.light_identifier - || data === cfg.arduino.cmd.proj_light_identifier - || data === cfg.arduino.cmd.proj_cam_light_identifier - || data === cfg.arduino.cmd.proj_cam_identifier) { - arduino.confirmExec(null, data); - arduino.confirmExec = {}; } -}; -arduino.verify = async function () { - return new Promise(async (resolve, reject) => { - const device = arduino.alias['connect']; - let writeSuccess; - arduino.confirmExec = function (err, data) { - if (data === cfg.arduino.cmd.connect) { - return resolve(true); + /** + * Send a string to an Arduino using async/await + * + * @param {string} device Arduino identifier + * @param {string} str String to send + * + * @returns {Promise} Resolves after sending + **/ + async writeAsync(device, str) { + return new Promise((resolve, reject) => { + this.serial[device].write(str, function (err, results) { + if (err) { + return reject(err); + } + //console.log('sent: ' + str) + return resolve(results); + }); + }); + } + end(serial, data) { + const end = new Date().getTime(); + const ms = end - this.timer; + let complete; + if (this.queue[data] !== undefined) { + this.locks[serial] = false; + //console.log('Command ' + data + ' took ' + ms + 'ms'); + complete = this.queue[data](ms); //execute callback + eventEmitter.emit('arduino_end', data); + delete this.queue[data]; + } + else { + //console.log('Received stray "' + data + '"'); //silent to user + } + return complete; + } + aliasSerial(serial, device) { + console.log(`Making "${serial}" an alias of ${device}`); + this.alias[serial] = device; + } + async connect(serial, device, confirm) { + return new Promise(async (resolve, reject) => { + let connectSuccess; + this.path[serial] = device; + this.alias[serial] = device; + this.serial[device] = new SerialPort(this.path[serial], { + autoOpen: false, + baudRate: cfg.arduino.baud, + parser: parser + }); + this.locks[device] = false; + try { + connectSuccess = await this.openArduino(device); + } + catch (e) { + console.error('failed to open: ' + e); + return reject(e); + } + console.log(`Opened connection with ${this.path[serial]} as ${serial}`); + if (!confirm) { + this.serial[device].on('data', async (data) => { + let d = data.toString('utf8'); + d = d.replace(newlineRe, '').replace(returnRe, ''); + return this.end(serial, d); + }); } else { - return reject('Wrong data returned'); + this.serial[device].on('data', async (data) => { + let d = data.toString('utf8'); + d = d.replace(newlineRe, '').replace(returnRe, ''); + return await this.confirmEnd(d); + }); } - }; - await delay(cfg.arduino.serialDelay); - try { - writeSuccess = await send(device, cfg.arduino.cmd.connect); - } - catch (e) { - return reject(e); - } - return resolve(writeSuccess); - }); -}; -arduino.distinguish = async function () { - return new Promise(async (resolve, reject) => { - const device = arduino.alias['connect']; - let writeSuccess; - let type; - arduino.confirmExec = function (err, data) { - if (data === cfg.arduino.cmd.proj_identifier) { - type = 'projector'; - } - else if (data === cfg.arduino.cmd.cam_identifier) { - type = 'camera'; - } - else if (data === cfg.arduino.cmd.light_identifier) { - type = 'light'; - } - else if (data === cfg.arduino.cmd.proj_light_identifier) { - type = 'projector,light'; - } - else if (data === cfg.arduino.cmd.proj_cam_light_identifier) { - type = 'projector,camera,light'; - } - else if (data === cfg.arduino.cmd.proj_cam_identifier) { - type = 'projector,camera'; - } - else if (data === cfg.ardino.cmd.proj_second_identifier) { - type = 'projector_second'; - } - return resolve(type); - }; - await delay(cfg.arduino.serialDelay); - try { - writeSuccess = await send(device, cfg.arduino.cmd.mcopy_identifier); - } - catch (e) { - console.error(e); - return reject(e); - } - }); -}; -arduino.close = async function (callback) { - const device = arduino.alias['connect']; - let closeSuccess; - try { - closeSuccess = await closeArduino(device); + return resolve(this.path[serial]); + }); } - catch (e) { - return console.error(e); + confirmEnd(data) { + //console.dir(data) + if (data === cfg.arduino.cmd.connect + || data === cfg.arduino.cmd.proj_identifier + || data === cfg.arduino.cmd.cam_identifier + || data === cfg.arduino.cmd.light_identifier + || data === cfg.arduino.cmd.proj_light_identifier + || data === cfg.arduino.cmd.proj_cam_light_identifier + || data === cfg.arduino.cmd.proj_cam_identifier) { + this.confirmExec(null, data); + this.confirmExec = {}; + } } - return closeSuccess; -}; -arduino.fakeConnect = async function (serial) { - //console.log('Connecting to fake arduino...'); - const device = '/dev/fake'; - arduino.alias[serial] = device; - arduino.serial[device] = { - write: function (cmd, cb) { - const t = { - c: cfg.arduino.cam.time + cfg.arduino.cam.delay, - p: cfg.arduino.proj.time + cfg.arduino.proj.delay + async verify() { + return new Promise(async (resolve, reject) => { + const device = this.alias['connect']; + let writeSuccess; + this.confirmExec = function (err, data) { + if (data === cfg.arduino.cmd.connect) { + return resolve(true); + } + else { + return reject('Wrong data returned'); + } }; - let timeout = t[cmd]; - let end; - if (typeof timeout === 'undefined') - timeout = 10; - arduino.timer = +new Date(); - setTimeout(() => { + await delay(cfg.arduino.serialDelay); + try { + writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.connect); + } + catch (e) { + return reject(e); + } + return resolve(writeSuccess); + }); + } + async distinguish() { + return new Promise(async (resolve, reject) => { + const device = this.alias['connect']; + let writeSuccess; + let type; + this.confirmExec = function (err, data) { + if (data === cfg.arduino.cmd.proj_identifier) { + type = 'projector'; + } + else if (data === cfg.arduino.cmd.cam_identifier) { + type = 'camera'; + } + else if (data === cfg.arduino.cmd.light_identifier) { + type = 'light'; + } + else if (data === cfg.arduino.cmd.proj_light_identifier) { + type = 'projector,light'; + } + else if (data === cfg.arduino.cmd.proj_cam_light_identifier) { + type = 'projector,camera,light'; + } + else if (data === cfg.arduino.cmd.proj_cam_identifier) { + type = 'projector,camera'; + } + else if (data === cfg.ardino.cmd.proj_second_identifier) { + type = 'projector_second'; + } + return resolve(type); + }; + await delay(cfg.arduino.serialDelay); + try { + writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.mcopy_identifier); + } + catch (e) { + console.error(e); + return reject(e); + } + }); + } + async close() { + const device = this.alias['connect']; + let closeSuccess; + try { + closeSuccess = await this.closeArduino(device); + } + catch (e) { + return console.error(e); + } + return closeSuccess; + } + ; + async fakeConnect(serial) { + //console.log('Connecting to fake arduino...'); + const device = '/dev/fake'; + this.alias[serial] = device; + this.serial[device] = { + write: async function (cmd, cb) { + const t = { + c: cfg.arduino.cam.time + cfg.arduino.cam.delay, + p: cfg.arduino.proj.time + cfg.arduino.proj.delay + }; + let timeout = t[cmd]; + if (typeof timeout === 'undefined') + timeout = 10; + arduino.timer = +new Date(); + await delay(timeout); arduino.end(serial, cmd); return cb(); - }, timeout); - }, - string: async function (str) { - //do nothing - return true; - }, - fake: true - }; - //console.log('Connected to fake arduino! Not real! Doesn\'t exist!'); - return true; -}; + }, + string: async function (str) { + //do nothing + return true; + }, + fake: true + }; + //console.log('Connected to fake arduino! Not real! Does not exist!'); + return true; + } + /** + * Connect to an Arduino using async/await + * + * @param {string} device Arduino identifier + * + * @returns {Promise} Resolves after opening + **/ + async openArduino(device) { + return new Promise((resolve, reject) => { + return this.serial[device].open((err) => { + if (err) { + return reject(err); + } + return resolve(true); + }); + }); + } + /** + * Close a connection to an Arduino using async/await + * + * @param {string} device Arduino identifier + * + * @returns {Promise} Resolves after closing + **/ + async closeArduino(device) { + return new Promise((resolve, reject) => { + return this.serial[device].close((err) => { + if (err) { + return reject(err); + } + return resolve(true); + }); + }); + } +} if (typeof module !== 'undefined' && module.parent) { module.exports = function (c, ee) { eventEmitter = ee; cfg = c; + arduino = new Arduino(); return arduino; }; } diff --git a/lib/arduino/index.js.map b/lib/arduino/index.js.map index 8e9c98c..d999574 100644 --- a/lib/arduino/index.js.map +++ b/lib/arduino/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/arduino/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/arduino/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/arduino/index.ts b/src/arduino/index.ts index 9703770..8b77bc8 100644 --- a/src/arduino/index.ts +++ b/src/arduino/index.ts @@ -4,12 +4,24 @@ const SerialPort = require('serialport') const Readline = SerialPort.parsers.Readline const exec = require('child_process').exec -const parser = new Readline('') +const parser : any = new Readline('') const newlineRe : RegExp = new RegExp('\n', 'g') const returnRe : RegExp = new RegExp('\r', 'g') let eventEmitter : any -let cfg : object +let cfg : any +let arduino : any + +const KNOWN : string[] = [ + '/dev/tty.usbmodem1a161', + '/dev/tty.usbserial-A800f8dk', + '/dev/tty.usbserial-A900cebm', + '/dev/tty.usbmodem1a131', + '/dev/tty.usbserial-a900f6de', + '/dev/tty.usbmodem1a141', + '/dev/ttyACM0', + 'COM3' +] /** * Pause the process for X milliseconds in async/await functions @@ -25,351 +37,339 @@ async function delay (ms : number) { } /** - * Send a command to an Arduino using async/await - * - * @param {string} device Arduino identifier - * @param {string} cmd Single character command to send - * - * @returns {Promise} Resolves after sending - **/ -async function send (device : string, cmd : string) { - return new Promise ((resolve, reject) => { - arduino.queue[cmd] = (ms : number) => { - return resolve(ms) - } - return arduino.serial[device].write(cmd, (err : any, results : any) => { - if (err) { - //console.error(err) - return reject(err) - } - // - }) - }) -} + * Class representing the arduino communication features + **/ -/** - * Send a string to an Arduino using async/await - * - * @param {string} device Arduino identifier - * @param {string} str String to send - * - * @returns {Promise} Resolves after sending - **/ -async function write (device : string, str : string) { - return new Promise ((resolve, reject) => { - arduino.serial[device].write(str, function (err, results) { - if (err) { - return reject(err) - } - //console.log('sent: ' + str) - return resolve(results) - }) - }) -} +class Arduino { -/** - * Connect to an Arduino using async/await - * - * @param {string} device Arduino identifier - * - * @returns {Promise} Resolves after opening - **/ -async function openArduino (device : string) { - return new Promise((resolve, reject) => { - return arduino.serial[device].open(error => { - if (error) { - return reject(error) - } - return resolve(true) - }) - }) -} - -/** - * Close a connection to an Arduino using async/await - * - * @param {string} device Arduino identifier - * - * @returns {Promise} Resolves after closing - **/ -async function closeArduino (device : string) { - return new Promise((resolve : any, reject : any) => { - return arduino.serial[device].close((err) => { - if (err) { - return reject(err) - } - return resolve(true) - }) - }) -} - -/****** - Arduino handlers -*******/ -const arduino = { - path : {}, - known: [ - '/dev/tty.usbmodem1a161', - '/dev/tty.usbserial-A800f8dk', - '/dev/tty.usbserial-A900cebm', - '/dev/tty.usbmodem1a131', - '/dev/tty.usbserial-a900f6de', - '/dev/tty.usbmodem1a141', - '/dev/ttyACM0', - 'COM3' - ], - alias : { - - }, - serial : { - connect : {}, - projector : {}, - camera : {}, - light : {} - }, - baud : 57600, - queue : {}, - timer : 0, - lock : false, - locks : { + path : any = {} + known : string[] = KNOWN + alias : any = {} + serial : any = { connect : {}, projector : {}, camera : {}, light : {} } + baud : number = 57600 + queue : any = {} + timer : number = 0 + lock : boolean = false + locks : any = {} + confirmExec : any + constructor () { + } -} - -arduino.enumerate = async function () { - return new Promise( (resolve, reject) => { - return SerialPort.list((err, ports) => { - let matches = [] - if (err) { - return reject(err) - } - ports.forEach(port => { - if (arduino.known.indexOf(port.comName) !== -1) { - matches.push(port.comName) - } else if ((port.manufacturer + '').toLowerCase().indexOf('arduino') !== -1) { - matches.push(port.comName) - } else if ((port.comName + '').toLowerCase().indexOf('usbserial') !== -1) { - matches.push(port.comName) - } else if ((port.comName + '').toLowerCase().indexOf('usbmodem') !== -1) { - matches.push(port.comName) + async enumerate () { + return new Promise( (resolve, reject) => { + return SerialPort.list((err : any, ports : any[]) => { + let matches : string[] = [] + if (err) { + return reject(err) + } + ports.forEach((port : any) => { + if (this.known.indexOf(port.comName) !== -1) { + matches.push(port.comName) + } else if ((port.manufacturer + '').toLowerCase().indexOf('arduino') !== -1) { + matches.push(port.comName) + } else if ((port.comName + '').toLowerCase().indexOf('usbserial') !== -1) { + matches.push(port.comName) + } else if ((port.comName + '').toLowerCase().indexOf('usbmodem') !== -1) { + matches.push(port.comName) + } + }) + if (matches.length === 0) { + return reject('No USB devices found'); + } else if (matches.length > 0) { + return resolve(matches) } }) - if (matches.length === 0) { - return reject('No USB devices found'); - } else if (matches.length > 0) { - return resolve(matches) - } }) - }) -} - -//commands which respond to a sent char -arduino.send = async function (serial, cmd, res) { - const device = arduino.alias[serial] - let results - if (arduino.locks[serial]) { - return false } - arduino.locks[serial] = true - await delay(cfg.arduino.serialDelay) - try { - results = await send(device, cmd) - } catch (e) { - return console.error(e) - } - arduino.locks[serial] = false - arduino.timer = new Date().getTime() - return await eventEmitter.emit('arduino_send', cmd) -} -//send strings, after char triggers firmware to accept -arduino.string = async function (serial, str) { - const device = arduino.alias[serial] - let writeSuccess - await delay(cfg.arduino.serialDelay) - if (typeof arduino.serial[device].fake !== 'undefined' - && arduino.serial[device].fake) { - return arduino.serial[device].string(str) - } else { + /** + * Send a command to an Arduino using async/await + * + * @param {string} device Arduino identifier + * @param {string} cmd Single character command to send + * + * @returns {Promise} Resolves after sending + **/ + async sendAsync (device : string, cmd : string) { + return new Promise ((resolve, reject) => { + this.queue[cmd] = (ms : number) => { + return resolve(ms) + } + return this.serial[device].write(cmd, (err : any, results : any) => { + if (err) { + //console.error(err) + return reject(err) + } + // + }) + }) + } + + async send (serial : string, cmd : string) { + const device : any = this.alias[serial] + let results : any + if (this.locks[serial]) { + return false + } + this.locks[serial] = true + await delay(cfg.arduino.serialDelay) try { - writeSuccess = await write(device, str) + results = await this.sendAsync(device, cmd) } catch (e) { return console.error(e) } - return writeSuccess + this.locks[serial] = false + this.timer = new Date().getTime() + return await eventEmitter.emit('arduino_send', cmd) } -} -//respond with same char over serial when done -arduino.end = async function (serial, data) { - const end = new Date().getTime() - const ms = end - arduino.timer - let complete - if (arduino.queue[data] !== undefined) { - arduino.locks[serial] = false; - //console.log('Command ' + data + ' took ' + ms + 'ms'); - complete = arduino.queue[data](ms) //execute callback - eventEmitter.emit('arduino_end', data) - delete arduino.queue[data] - } else { - //console.log('Received stray "' + data + '"'); //silent to user - } - return complete -}; -arduino.alias = function (serial, device) { - console.log(`Making "${serial}" an alias of ${device}`) - arduino.alias[serial] = device -} -arduino.connect = async function (serial, device, confirm) { - return new Promise(async (resolve, reject) => { - let connectSuccess - arduino.path[serial] = device; - arduino.alias[serial] = device; - arduino.serial[device] = new SerialPort(arduino.path[serial], { - autoOpen : false, - baudRate: cfg.arduino.baud, - parser: parser - }) - arduino.locks[device] = false - try { - connectSuccess = await openArduino(device) - } catch (e) { - console.error('failed to open: ' + e) - return reject(e) - } - console.log(`Opened connection with ${arduino.path[serial]} as ${serial}`); - if (!confirm) { - arduino.serial[device].on('data', async (data) => { - let d = data.toString('utf8') - d = d.replace(newlineRe, '').replace(returnRe, '') - return await arduino.end(serial, d) - }) + async string (serial : string, str : string) { + const device : any = this.alias[serial] + let writeSuccess : any + await delay(cfg.arduino.serialDelay) + if (typeof this.serial[device].fake !== 'undefined' + && this.serial[device].fake) { + return this.serial[device].string(str) } else { - arduino.serial[device].on('data', async (data) => { - let d = data.toString('utf8') - d = d.replace(newlineRe, '').replace(returnRe, '') - return await arduino.confirmEnd(d) + try { + writeSuccess = await this.writeAsync(device, str) + } catch (e) { + return console.error(e) + } + return writeSuccess + } + } + + /** + * Send a string to an Arduino using async/await + * + * @param {string} device Arduino identifier + * @param {string} str String to send + * + * @returns {Promise} Resolves after sending + **/ + async writeAsync (device : string, str : string) { + return new Promise ((resolve, reject) => { + this.serial[device].write(str, function (err : any, results : any) { + if (err) { + return reject(err) + } + //console.log('sent: ' + str) + return resolve(results) }) - } - return resolve(arduino.path[serial]) - }) - -} - -arduino.confirmExec = {}; -arduino.confirmEnd = function (data) { - //console.dir(data) - if (data === cfg.arduino.cmd.connect - || data === cfg.arduino.cmd.proj_identifier - || data === cfg.arduino.cmd.cam_identifier - || data === cfg.arduino.cmd.light_identifier - || data === cfg.arduino.cmd.proj_light_identifier - || data === cfg.arduino.cmd.proj_cam_light_identifier - || data === cfg.arduino.cmd.proj_cam_identifier ) { - arduino.confirmExec(null, data); - arduino.confirmExec = {}; + }) } -} -arduino.verify = async function () { - return new Promise(async (resolve, reject) => { - const device = arduino.alias['connect'] - let writeSuccess - arduino.confirmExec = function (err, data) { - if (data === cfg.arduino.cmd.connect) { - return resolve(true) + end (serial : string, data : string) { + const end = new Date().getTime() + const ms = end - this.timer + let complete + if (this.queue[data] !== undefined) { + this.locks[serial] = false; + //console.log('Command ' + data + ' took ' + ms + 'ms'); + complete = this.queue[data](ms) //execute callback + eventEmitter.emit('arduino_end', data) + delete this.queue[data] + } else { + //console.log('Received stray "' + data + '"'); //silent to user + } + return complete + } + + aliasSerial (serial : string, device : string) { + console.log(`Making "${serial}" an alias of ${device}`) + this.alias[serial] = device + } + + async connect (serial : string, device : string, confirm : any) { + return new Promise(async (resolve, reject) => { + let connectSuccess : any + this.path[serial] = device; + this.alias[serial] = device; + this.serial[device] = new SerialPort(this.path[serial], { + autoOpen : false, + baudRate: cfg.arduino.baud, + parser: parser + }) + this.locks[device] = false + try { + connectSuccess = await this.openArduino(device) + } catch (e) { + console.error('failed to open: ' + e) + return reject(e) + } + console.log(`Opened connection with ${this.path[serial]} as ${serial}`); + if (!confirm) { + this.serial[device].on('data', async (data : Buffer) => { + let d = data.toString('utf8') + d = d.replace(newlineRe, '').replace(returnRe, '') + return this.end(serial, d) + }) } else { - return reject('Wrong data returned') + this.serial[device].on('data', async (data : Buffer) => { + let d = data.toString('utf8') + d = d.replace(newlineRe, '').replace(returnRe, '') + return await this.confirmEnd(d) + }) } - } - await delay(cfg.arduino.serialDelay) - try { - writeSuccess = await send(device, cfg.arduino.cmd.connect) - } catch (e) { - return reject(e) - } - return resolve(writeSuccess) - }) -} - -arduino.distinguish = async function () { - return new Promise(async (resolve, reject) => { - const device = arduino.alias['connect'] - let writeSuccess - let type - arduino.confirmExec = function (err, data) { - if (data === cfg.arduino.cmd.proj_identifier) { - type = 'projector' - } else if (data === cfg.arduino.cmd.cam_identifier) { - type = 'camera' - } else if (data === cfg.arduino.cmd.light_identifier) { - type = 'light' - } else if (data === cfg.arduino.cmd.proj_light_identifier) { - type = 'projector,light' - } else if (data === cfg.arduino.cmd.proj_cam_light_identifier) { - type = 'projector,camera,light' - } else if (data === cfg.arduino.cmd.proj_cam_identifier) { - type = 'projector,camera' - } else if (data === cfg.ardino.cmd.proj_second_identifier) { - type = 'projector_second' - } - return resolve(type) - } - await delay(cfg.arduino.serialDelay) - try { - writeSuccess = await send(device, cfg.arduino.cmd.mcopy_identifier) - } catch (e) { - console.error(e) - return reject(e) - } - }) -} - -arduino.close = async function (callback) { - const device = arduino.alias['connect'] - let closeSuccess - try { - closeSuccess = await closeArduino(device) - } catch (e) { - return console.error(e) + return resolve(this.path[serial]) + }) } - return closeSuccess -}; -arduino.fakeConnect = async function (serial) { - //console.log('Connecting to fake arduino...'); - const device = '/dev/fake' - arduino.alias[serial] = device - arduino.serial[device] = { - write : function (cmd, cb) { - const t = { - c : cfg.arduino.cam.time + cfg.arduino.cam.delay, - p : cfg.arduino.proj.time + cfg.arduino.proj.delay + confirmEnd (data : string) { + //console.dir(data) + if (data === cfg.arduino.cmd.connect + || data === cfg.arduino.cmd.proj_identifier + || data === cfg.arduino.cmd.cam_identifier + || data === cfg.arduino.cmd.light_identifier + || data === cfg.arduino.cmd.proj_light_identifier + || data === cfg.arduino.cmd.proj_cam_light_identifier + || data === cfg.arduino.cmd.proj_cam_identifier ) { + this.confirmExec(null, data); + this.confirmExec = {}; + } + } + + async verify () { + return new Promise(async (resolve, reject) => { + const device : any = this.alias['connect'] + let writeSuccess : any + this.confirmExec = function (err : any, data : string) { + if (data === cfg.arduino.cmd.connect) { + return resolve(true) + } else { + return reject('Wrong data returned') + } } - let timeout = t[cmd] - let end - if (typeof timeout === 'undefined') timeout = 10 - arduino.timer = +new Date() - setTimeout(() => { + + await delay(cfg.arduino.serialDelay) + + try { + writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.connect) + } catch (e) { + return reject(e) + } + return resolve(writeSuccess) + }) + } + + async distinguish () { + return new Promise(async (resolve, reject) => { + const device : any = this.alias['connect'] + let writeSuccess : any + let type : string + this.confirmExec = function (err : any, data : string) { + if (data === cfg.arduino.cmd.proj_identifier) { + type = 'projector' + } else if (data === cfg.arduino.cmd.cam_identifier) { + type = 'camera' + } else if (data === cfg.arduino.cmd.light_identifier) { + type = 'light' + } else if (data === cfg.arduino.cmd.proj_light_identifier) { + type = 'projector,light' + } else if (data === cfg.arduino.cmd.proj_cam_light_identifier) { + type = 'projector,camera,light' + } else if (data === cfg.arduino.cmd.proj_cam_identifier) { + type = 'projector,camera' + } else if (data === cfg.ardino.cmd.proj_second_identifier) { + type = 'projector_second' + } + return resolve(type) + } + await delay(cfg.arduino.serialDelay) + try { + writeSuccess = await this.sendAsync(device, cfg.arduino.cmd.mcopy_identifier) + } catch (e) { + console.error(e) + return reject(e) + } + }) + } + + async close () { + const device = this.alias['connect'] + let closeSuccess + try { + closeSuccess = await this.closeArduino(device) + } catch (e) { + return console.error(e) + } + return closeSuccess + }; + + async fakeConnect (serial : string) { + //console.log('Connecting to fake arduino...'); + const device : string = '/dev/fake' + this.alias[serial] = device + this.serial[device] = { + write : async function (cmd : string, cb : any) { + const t : any = { + c : cfg.arduino.cam.time + cfg.arduino.cam.delay, + p : cfg.arduino.proj.time + cfg.arduino.proj.delay + } + let timeout : number = t[cmd] + if (typeof timeout === 'undefined') timeout = 10 + arduino.timer = +new Date() + + await delay(timeout) + arduino.end(serial, cmd) return cb() - }, timeout) - }, - string : async function (str) { - //do nothing - return true - }, - fake : true - }; - //console.log('Connected to fake arduino! Not real! Doesn\'t exist!'); - return true + }, + string : async function (str : string) { + //do nothing + return true + }, + fake : true + }; + //console.log('Connected to fake arduino! Not real! Does not exist!'); + return true + } + + /** + * Connect to an Arduino using async/await + * + * @param {string} device Arduino identifier + * + * @returns {Promise} Resolves after opening + **/ + async openArduino (device : string) { + return new Promise((resolve, reject) => { + return this.serial[device].open((err : any) => { + if (err) { + return reject(err) + } + return resolve(true) + }) + }) + } + + /** + * Close a connection to an Arduino using async/await + * + * @param {string} device Arduino identifier + * + * @returns {Promise} Resolves after closing + **/ + async closeArduino (device : string) { + return new Promise((resolve : any, reject : any) => { + return this.serial[device].close((err : any) => { + if (err) { + return reject(err) + } + return resolve(true) + }) + }) + } } if (typeof module !== 'undefined' && module.parent) { - module.exports = function (c, ee) { + module.exports = function (c : any, ee : any) { eventEmitter = ee cfg = c + arduino = new Arduino() return arduino } } \ No newline at end of file