diff --git a/README.md b/README.md index eb6de0ae0f4bf423c373f57616fbf64e92718746..7040549e33ea6d262b4bd347040a23ac5ebeabb3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# atkapi App Building +# Automatakit API ## what it do @@ -16,3 +16,152 @@ http://workshop.chromeexperiments.com/examples/gui/#1--Basic-Usage bootstrap, numeric.js ... http://backbonejs.org/#Events + + +... should figure out how mods does events, what do they attach to? +... can we do a browser / node agnostic architecture? + + +best approach is to design what you'd like + - code loading, unit sources, UI is built or specified in code? + - how to serve / build UI's on top of, or connect top-level nodes at API level + - like, no bash make + + +## Network Motion Control Scheme + +Motors eat trapezoid packets, acknowledge when complete with int32_t of steps taken, updates window transmission and current position tracker. + +Path planner has: + - complete path in memory + - current position + - path ptrs: + - plan end (last segment accel planned for, zero exit speed) + - current segment (last segment to go out network buffer) + + - path planning is an app that uses atkapi + - atkapi: create objs of hardware nodes, + - .settings + .reset() + .disable() + ... etc + - for replies, these obj's should fire events that can be listened to + +automatakit +automatickit + +# Ambitions for this page + + - landing page for all users, consider FAB14 workshop landing here + - is machine / robot control for fungible machines + - show video examples Reich, MoControl + - explain scheme, idea, statelessness and event-basedness + + - practicum + - how to mkterminal, what is + - how to atk api javascript + - explain example application entry point + - explain example C code + + + +XX Is a collection of hardware, firmware and software that lets you build machines in the same way we build software: quickly, with great joy, and with rapid reconfiguration of resources. + +With XX, all of the motors, sensors, and end effectors in a machine are connected via a low-latency network that we call [APA](link). An API allows us to interface with this network to build applications for machine control. + +```JavaScript +Stepper.trapezoid(entry,steps,rate,exit); +Stepper.onPacket(packet){ + // on return packet +} + +DCRotary.setPos(pos); +DCRotary.onPacket(packet){ + // +} + +// all have +Endpoint.sendPacket(packet); +Endpoint.onPacket(packet){ + // returning +} +``` + +Entry points to the network are through the [mksocketserver](link) and [mkterminal](link) interfaces. These open hardware ports on a host computer to send and receive messages across the network. + +Endpoints are hardware objects that receive control commands, and execute them faithfully: move motors, read sensors, heat things, control positions and currents, etc. + +## APA Networking + + - clean nomenclature: 'routers' are 'nodes' and can be just-routers or endpoints, etc, anything that lives on the network is a node + +### The Packet + +*Asynchronous Packet Automata* is a networking scheme from Neil Gershenfeld, wherein packets traverse a network not based on destination addresses, but on designated routes. In Technical Networking Language, is is a source-routed port-forwarding scheme, which means that routing is done at the source of the packet, and upon arriving at a position in the network, packets are forwarded along another port, or consumed at that position, based on the route contained in the packet. As the packet traverses the network, pieces of the route are 'consumed' and replaced with a reversed route, such that the destination knows how to return the packet. + +The structure of a packet is typically broken into bytes (8-bit long 'words') and is structured like this: + + + +The 1st byte of any packet denotes the length of the complete packet, in bytes, and is used to parse packets arriving at nodes. For example, when a node starts receiving a packet, it takes the first byte arriving to be the length, and counts bytes until the end is reached, when it can then act on the packet. + +### Routing + +Bytes in the route-header section of the packet designate the order of ports the packet should be forwarded on. When the packet arrives at a new network node, the node shifts-out the last port, and adds to the tail of the route-header the port that the packet arrived on, effectively adding return information to the route. The 'pointer' (we designate the byte representing 254, or ^ diagramatically), denotes the packet's current position in the route. + +We can see an example packet traversal here: + + + + + +Because of the route-header shifting, the 1st byte in the route-header always denotes the port number which the packet should leave the current node on. If the 1st byte in the route-header is the pointer (^ or 254) the packet is at its destination and should be consumed by that node. At this point, the tail of the packet-header contains a route which, when reversed, forms a route back to it's original source. + + + +### The Physical Layer + +APA does not designate a particular Physical Layer (in Networking Nomenclature, referred to as a 'PHY', or Layer 2). AutomataKit uses a microcontroller's UART peripheral for the PHY layer, but we are expanding to use FPGAs and a per-bit token-passing scheme, as well as exploring wireless links. + +### Hardware Implementation + +The network nodes implemented in AutomataKit use a UART Physical Layer. This means that network packets arrive on a per-byte basis, and are parsed into packets in the microcontroller's C code (firmware). + +... etc + + +## Endpoints + +Endpoints are hardware... + +Global API + +**127** test, turns on a light and returns the packet + +**128** reset, resets the board + +**129** setpos, + +**130** getpos, + +**131** trapezoid, + +### MKRouter + +### MKStepper17 + +### MKStepper23 + +### MKBLDCDriver + +### MKBreadBoardBoard + +### MKSmallRotary + +## Applications + + - example applications do: + - mocontrol acceleration + - dynamic control + - feedback? + diff --git a/includes/960/css/960.css b/event-testing/includes/960/css/960.css similarity index 100% rename from includes/960/css/960.css rename to event-testing/includes/960/css/960.css diff --git a/includes/960/css/960_12_col.css b/event-testing/includes/960/css/960_12_col.css similarity index 100% rename from includes/960/css/960_12_col.css rename to event-testing/includes/960/css/960_12_col.css diff --git a/includes/960/css/960_12_col_rtl.css b/event-testing/includes/960/css/960_12_col_rtl.css similarity index 100% rename from includes/960/css/960_12_col_rtl.css rename to event-testing/includes/960/css/960_12_col_rtl.css diff --git a/includes/960/css/960_16_col.css b/event-testing/includes/960/css/960_16_col.css similarity index 100% rename from includes/960/css/960_16_col.css rename to event-testing/includes/960/css/960_16_col.css diff --git a/includes/960/css/960_16_col_rtl.css b/event-testing/includes/960/css/960_16_col_rtl.css similarity index 100% rename from includes/960/css/960_16_col_rtl.css rename to event-testing/includes/960/css/960_16_col_rtl.css diff --git a/includes/960/css/960_24_col.css b/event-testing/includes/960/css/960_24_col.css similarity index 100% rename from includes/960/css/960_24_col.css rename to event-testing/includes/960/css/960_24_col.css diff --git a/includes/960/css/960_24_col_rtl.css b/event-testing/includes/960/css/960_24_col_rtl.css similarity index 100% rename from includes/960/css/960_24_col_rtl.css rename to event-testing/includes/960/css/960_24_col_rtl.css diff --git a/includes/960/css/960_rtl.css b/event-testing/includes/960/css/960_rtl.css similarity index 100% rename from includes/960/css/960_rtl.css rename to event-testing/includes/960/css/960_rtl.css diff --git a/includes/960/css/demo.css b/event-testing/includes/960/css/demo.css similarity index 100% rename from includes/960/css/demo.css rename to event-testing/includes/960/css/demo.css diff --git a/includes/960/css/min/960.css b/event-testing/includes/960/css/min/960.css similarity index 100% rename from includes/960/css/min/960.css rename to event-testing/includes/960/css/min/960.css diff --git a/includes/960/css/min/960_12_col.css b/event-testing/includes/960/css/min/960_12_col.css similarity index 100% rename from includes/960/css/min/960_12_col.css rename to event-testing/includes/960/css/min/960_12_col.css diff --git a/includes/960/css/min/960_12_col_rtl.css b/event-testing/includes/960/css/min/960_12_col_rtl.css similarity index 100% rename from includes/960/css/min/960_12_col_rtl.css rename to event-testing/includes/960/css/min/960_12_col_rtl.css diff --git a/includes/960/css/min/960_16_col.css b/event-testing/includes/960/css/min/960_16_col.css similarity index 100% rename from includes/960/css/min/960_16_col.css rename to event-testing/includes/960/css/min/960_16_col.css diff --git a/includes/960/css/min/960_16_col_rtl.css b/event-testing/includes/960/css/min/960_16_col_rtl.css similarity index 100% rename from includes/960/css/min/960_16_col_rtl.css rename to event-testing/includes/960/css/min/960_16_col_rtl.css diff --git a/includes/960/css/min/960_24_col.css b/event-testing/includes/960/css/min/960_24_col.css similarity index 100% rename from includes/960/css/min/960_24_col.css rename to event-testing/includes/960/css/min/960_24_col.css diff --git a/includes/960/css/min/960_24_col_rtl.css b/event-testing/includes/960/css/min/960_24_col_rtl.css similarity index 100% rename from includes/960/css/min/960_24_col_rtl.css rename to event-testing/includes/960/css/min/960_24_col_rtl.css diff --git a/includes/960/css/min/960_rtl.css b/event-testing/includes/960/css/min/960_rtl.css similarity index 100% rename from includes/960/css/min/960_rtl.css rename to event-testing/includes/960/css/min/960_rtl.css diff --git a/includes/960/css/min/reset.css b/event-testing/includes/960/css/min/reset.css similarity index 100% rename from includes/960/css/min/reset.css rename to event-testing/includes/960/css/min/reset.css diff --git a/includes/960/css/min/reset_rtl.css b/event-testing/includes/960/css/min/reset_rtl.css similarity index 100% rename from includes/960/css/min/reset_rtl.css rename to event-testing/includes/960/css/min/reset_rtl.css diff --git a/includes/960/css/min/text.css b/event-testing/includes/960/css/min/text.css similarity index 100% rename from includes/960/css/min/text.css rename to event-testing/includes/960/css/min/text.css diff --git a/includes/960/css/min/text_rtl.css b/event-testing/includes/960/css/min/text_rtl.css similarity index 100% rename from includes/960/css/min/text_rtl.css rename to event-testing/includes/960/css/min/text_rtl.css diff --git a/includes/960/css/reset.css b/event-testing/includes/960/css/reset.css similarity index 100% rename from includes/960/css/reset.css rename to event-testing/includes/960/css/reset.css diff --git a/includes/960/css/reset_rtl.css b/event-testing/includes/960/css/reset_rtl.css similarity index 100% rename from includes/960/css/reset_rtl.css rename to event-testing/includes/960/css/reset_rtl.css diff --git a/includes/960/css/text.css b/event-testing/includes/960/css/text.css similarity index 100% rename from includes/960/css/text.css rename to event-testing/includes/960/css/text.css diff --git a/includes/960/css/text_rtl.css b/event-testing/includes/960/css/text_rtl.css similarity index 100% rename from includes/960/css/text_rtl.css rename to event-testing/includes/960/css/text_rtl.css diff --git a/includes/960/demo.html b/event-testing/includes/960/demo.html similarity index 100% rename from includes/960/demo.html rename to event-testing/includes/960/demo.html diff --git a/includes/960/demo_24_col.html b/event-testing/includes/960/demo_24_col.html similarity index 100% rename from includes/960/demo_24_col.html rename to event-testing/includes/960/demo_24_col.html diff --git a/includes/960/demo_24_col_rtl.html b/event-testing/includes/960/demo_24_col_rtl.html similarity index 100% rename from includes/960/demo_24_col_rtl.html rename to event-testing/includes/960/demo_24_col_rtl.html diff --git a/includes/960/demo_rtl.html b/event-testing/includes/960/demo_rtl.html similarity index 100% rename from includes/960/demo_rtl.html rename to event-testing/includes/960/demo_rtl.html diff --git a/includes/960/img/12_col.gif b/event-testing/includes/960/img/12_col.gif similarity index 100% rename from includes/960/img/12_col.gif rename to event-testing/includes/960/img/12_col.gif diff --git a/includes/960/img/16_col.gif b/event-testing/includes/960/img/16_col.gif similarity index 100% rename from includes/960/img/16_col.gif rename to event-testing/includes/960/img/16_col.gif diff --git a/includes/960/img/24_col.gif b/event-testing/includes/960/img/24_col.gif similarity index 100% rename from includes/960/img/24_col.gif rename to event-testing/includes/960/img/24_col.gif diff --git a/index.html b/event-testing/index.html similarity index 100% rename from index.html rename to event-testing/index.html diff --git a/js/atkSocketClient.js b/event-testing/js/atkSocketClient.js similarity index 100% rename from js/atkSocketClient.js rename to event-testing/js/atkSocketClient.js diff --git a/js/base.js b/event-testing/js/base.js similarity index 82% rename from js/base.js rename to event-testing/js/base.js index 0c14ad9628ca578725bfd70f228dbdac6af35958..8b105e31ecd177d71b1f219e1f999a6ce6ef95e4 100644 --- a/js/base.js +++ b/event-testing/js/base.js @@ -10,6 +10,18 @@ things I believe I'll want: - clarity on writing classes - see possible confusion about this. or event. below, and in terminal - type-checking / sanity in what is an event-called function, what is more basic + - maybe inputs/outputs go in object.in[] and object.out[] or something like this? + - some notion of inputs being a set type / outputs being a set type, inherit from event? + - think type-checking etc + + - getting to motion control soon is a good test of inner guts, w/o UI probably + - then consider launch to bower-config node backbone, but it will take some oomph + + - separation: + - at network commands + - at 'this' level (i.e. just writing a splash-config thing and running it node-like) + - at browser level + */ function NewEvent(type){ diff --git a/js/main.js b/event-testing/js/main.js similarity index 79% rename from js/main.js rename to event-testing/js/main.js index 40782a56092ef91eeafaaae783fe38a7d92a53bf..305c370566c4c19bbde2ba3587fa5217fc345a7a 100644 --- a/js/main.js +++ b/event-testing/js/main.js @@ -3,6 +3,8 @@ Jake Read 2018 06 09 Test App of ATKAPI +an 'app' just specifies interconnectivity of modules, so we just make / init a handful and then +attach their inputs / outputs up */ @@ -39,4 +41,8 @@ terminal.newInput.attach(logOne.log) // the terminal has an event every time a new message comes in, // and other events available after parsing... -// one of these goes out to the packet server, which is another object... \ No newline at end of file +// one of these goes out to the packet server, which is another object ... + +var socketClient = NewSocketClient('ffff:127.0.0.1', '6789') +terminal.socketMessage.attach(socketClient.send) +socketClient.receive.attach(terminal.write) \ No newline at end of file diff --git a/lib/gcode.js b/lib/gcode.js new file mode 100644 index 0000000000000000000000000000000000000000..4a1598ecbc7f90691ab337847bb741bc46303c98 --- /dev/null +++ b/lib/gcode.js @@ -0,0 +1,77 @@ +const EventEmitter = require('events') +class Gcode extends EventEmitter {} + +function create() { + var gcode = new Gcode() + + // state + gcode.mode = 'G0' + gcode.speeds = { + G0: 1200, + G1: 400 + } + + // local functions + function getKeyValues(str) { + var kv = {} + for (var i = 0; i < str.length; i++) { + if (str[i].match('[A-Za-z]')) { // regex to match upper case letters + var lastIndex = str.indexOf(' ', i) + if (lastIndex < 0) { + lastIndex = str.length + } + var key = str[i].toUpperCase() + kv[key] = parseFloat(str.slice(i + 1, lastIndex)) + } + } + return kv + } + + function parseGcode(str){ + var instruction = { + position: {}, + hasMove: false, + speed: 0 + } + + kv = getKeyValues(str) + // track modality + if(kv.G == 0 | kv.G == 1){ + gcode.mode = 'G' + kv.G.toString() + } else if (kv.G != null) { + // no arcs pls + console.log('unfriendly Gcode mode!', kv) + } + + for(key in kv){ + if(key.match('[A-EX-Z]')){ + instruction.position[key] = kv[key] + instruction.hasMove = true + } else if (key.match('[F]')){ + gcode.speeds[gcode.mode] = kv.F + } + } + + instruction.speed = gcode.speeds[gcode.mode] + // and this for help later? + instruction.kv = kv + + return instruction + } + + // input functions + gcode.lineIn = function(str) { + var instruction = parseGcode(str) + if (instruction.hasMove){ + gcode.emit('newInstruction', instruction) + } else { + gcode.emit('modeChange', gcode.mode) + } + } + + return gcode +} + +module.exports = { + create: create +} \ No newline at end of file diff --git a/lib/terminal.js b/lib/terminal.js new file mode 100644 index 0000000000000000000000000000000000000000..849f0cce9201b655893e5c636b1f1a9a9423cdbf --- /dev/null +++ b/lib/terminal.js @@ -0,0 +1,31 @@ +const EventEmitter = require('events') +class Terminal extends EventEmitter {} + +const readline = require('readline') + +function create(){ + var terminal = new Terminal() + + terminal.rlInterface = readline.createInterface({ + input: process.stdin, + output: process.stdout + }); + + terminal.rlInterface.on('line', function(data){ + terminal.emit('newline', data) + }) + + // f'ns + + terminal.postline = function(text){ + console.log(text) + } + + return terminal +} + +// exports + +module.exports = { + create: create +} \ No newline at end of file diff --git a/local/atkSocketServer.js b/local/atkSocketServer.js deleted file mode 100644 index 70f149b59819bc075fbab2e46f5bd656f99c1ebe..0000000000000000000000000000000000000000 --- a/local/atkSocketServer.js +++ /dev/null @@ -1,7 +0,0 @@ -/* -Jake Read 2018 06 09 -Socket Server -of ATKAPI - -runs at machine head, listens to atkSocketClient and dishes / receives messages -*/ \ No newline at end of file diff --git a/local/mkserialserver.js b/local/mkserialserver.js deleted file mode 100644 index 366322fa61b5eb3da8ae4e51c15ecb6351ff912d..0000000000000000000000000000000000000000 --- a/local/mkserialserver.js +++ /dev/null @@ -1,152 +0,0 @@ -// -// serialserver.js -// WebSocket serial server -// -// Neil Gershenfeld and Jake Read -// (c) Massachusetts Institute of Technology 2016 -// -// This work may be reproduced, modified, distributed, performed, and -// displayed for any purpose, but must acknowledge the mods -// project. Copyright is retained and must be preserved. The work is -// provided as is; no warranty is provided, and users accept all -// liability. -// -// check command line -// -if (process.argv.length < 4) { - console.log("command line: node serialserver.js client_address server_port") - process.exit(-1) -} -// -// start server -// -var client_address = process.argv[2] -var server_port = process.argv[3] -console.log("listening for connection from client address " + client_address + " on server port " + server_port) -var SerialPort = require('serialport') -var port = null -var WebSocketServer = require('ws').Server -wss = new WebSocketServer({ - port: server_port -}) -// -// handle connection -// -wss.on('connection', function(ws) { - // - // check address - // - if (ws._socket.remoteAddress != client_address) { - console.log("connection rejected from " + ws._socket.remoteAddress) - var wsMessage = { - type: 'message', - message: 'socket closed' - } - ws.send(JSON.stringify(wsMessage)) - ws.close() - } else { - console.log("connection accepted from " + ws._socket.remoteAddress) - } - // - // handle messages - // - var cancel - var packet = new Array() - ws.on("message", function(message) { - var msg = JSON.parse(message) - // - // open port - // - if (msg.type == 'open') { - var device = msg.device - var baud = parseInt(msg.baud) - var flow = msg.flow - console.log('open ' + device + ' at ' + baud + ' flow ' + flow) - if (flow == 'none') - port = new SerialPort(device, { - baudRate: baud - }) - else if (flow == 'rtscts') - port = new SerialPort(device, { - baudRate: baud, - rtscts: true - }) - port.on('open', function() { - var wsMessage = { - type: 'message', - message: 'serial port opened' - } - ws.send(JSON.stringify(wsMessage)) - if (flow == 'dsrdtr') { - port.set({ - dsr: true, - dtr: true - }) - port.set({ - rts: false, - cts: false - }) - } - }) - port.on('error', function(err) { - var wsMessage = { - type: 'message', - message: err.message - } - ws.send(JSON.stringify(wsMessage)) - }) - port.on('data', function(data) { - var dataArray = new Array() - for(var i = 0; i < data.length; i ++){ - dataArray[i] = data[i] - } - console.log('data in', dataArray) - var wsMessage = { - type: 'array', - array: dataArray - } - ws.send(JSON.stringify(wsMessage)) - }) - } - // - // close port - // - else if (msg.type == 'close') { - var device = msg.device - console.log('close ' + device) - var wsMessage = { - type: 'message', - message: err.message - } - ws.send(JSON.stringify(wsMessage)) - port.close() - port = null - } - // - // send packet - // - else if (msg.type == 'packet') { - console.log('packet out', msg.packet) // packet is an array - port.write(msg.packet, function() { - port.drain(function(err) { - if (err) { - var wsMessage = { - type: 'message', - message: err.message - } - ws.send(JSON.stringify(wsMessage)) - } - }) - }) - } - }) - // - // close - // - ws.on("close", function() { - console.log("connection closed") - if (port != null) - port.close() - port = null - }) -}) \ No newline at end of file diff --git a/local/mkterminal.js b/local/mkterminal.js deleted file mode 100644 index 964e0133ffc3a1c1d6fdd0f96ebbca1996e7e2a9..0000000000000000000000000000000000000000 --- a/local/mkterminal.js +++ /dev/null @@ -1,206 +0,0 @@ -//----------------------------------------- mkterminal -/* -small program for sending apa packets along a serial line -*/ - -// check that we have portname -if (process.argv.length < 3) { - logAdvice() - process.exit(-1) -} - -if (process.argv[2] == '-h' || process.argv[2] == 'help') { - logAdvice() - process.exit(-1) -} - -var SerialPort = require('serialport'); - -var ByteLengthParser = SerialPort.parsers.ByteLength; - -var port = new SerialPort(process.argv[2], { - baudRate: 115200, - dataBits: 8, - parity: 'none', - flowControl: false, -}); - -//----------------------------------------- readline -/* -key input from terminal -*/ - -const readline = require('readline'); - -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout -}); - -rl.on('line', parseLineIn); - -function parseLineIn(data) { - /* - packet like "packet port,port,etc,ptr,byte,byte,byte..." - does like "len,int,int,int,254?,byte,byte,byte,etc" - next do key:type:values - apa_end_addr_delimiter 255 - apa_addr_pointer 254 - apa_addr_flood 253 - key_position_float 127 - key_speed_float 128 - key_position_steps 129 - key_speed_steps 130 - */ - if (data.includes('packet')) { - var argstring = data.split(' ')[1]; // everything following 'packet ' - var args = argstring.split(','); - var packet = new Array(); - var i = 0; // args - var u = 0; // packet - while (i < args.length) { - switch (args[i]) { - case 'ptr': - packet[u] = 254; - i++; - u++; - break; - - case 'end': - packet[u] = 255; - i++; - u++; - break; - - case 'test': - packet[u] = 127; - i++; - u++; - break; - - case 'reset': - packet[u] = 128; - i++; - u++; - break; - - case 'setPos': - packet[u] = 129 - var newPos = parseInt(args[i + 1]) - packet[u + 1] = (newPos >> 8) & 255 - packet[u + 2] = newPos & 255 - i += 2 - u += 3 - break - - case 'getPos': - packet[u] = 130 - i ++ - u++ - break - - case 'trapezoid': - packet[u] = 131; - // a linked acceleration planned segment - // we'll be going betwee float-space for steps in the higher levels, so - var steps = parseInt(args[i + 1]) - packet = packet.concat(pack32(steps)) - // but accel and speeds need to be in floats - var entry = parseInt(args[i + 2]) - packet = packet.concat(pack32(entry)) - // pack 64 bit float to 32 bit? - var accel = parseInt(args[i + 3]) - packet = packet.concat(pack32(accel)) - - var accelLength = parseInt(args[i + 4]) - packet = packet.concat(pack32(accelLength)) - - var deccelLength = parseInt(args[i + 5]) - packet = packet.concat(pack32(deccelLength)) - - i += 6 - u += 21 - break; - - default: - packet[u] = parseInt(args[i]); - u++; - i++; - break; - } - } - packet.unshift(packet.length + 1); // push the length into header - data_out(packet); - // now through bytes - } else if (data.includes('dummy packet')) { - var packet = Buffer.from([12, 3, 1, 254, 4, 255, 1, 2, 3, 4, 5, 6]); - data_out(packet); - } else if (data.includes('help')) { - logAdvice(); - } else if (data.includes('exit')) { - process.exit(0); - } else { - data_out(data); - } -} - -function pack32(val) { - var pack = new Array(); - pack[0] = (val >> 24) & 255; - pack[1] = (val >> 16) & 255; - pack[2] = (val >> 8) & 255; - pack[3] = val & 255; - - return pack; -} - -function packFloat(val) { - var pack; // the array of bytes - // as a view into a typed array - var view = new DataView(new ArrayBuffer(4)); - view.setFloat32(0, val); - - pack = Array.apply(null, { length: 4 }).map((_, i) => view.getUint8(i)) - console.log('packed', val, 'as', pack) - - return pack -} - -function logAdvice() { - console.log('use serialport-list to find ports') - console.log("command line: node serialterminal portname"); - console.log('route,ptr,end,command,args') - console.log('test: sends byte 128 to network test') - console.log('steps: {steps uint32_t, speed steps/s float, dir uint8_t}') - console.log('block: {steps float (also dir), cruise speed steps/s float, accelleration steps/s/s float, start speed float, end speed float') -} - -//----------------------------------------- parsing -/* -does the business -*/ - -var parser = port.pipe(new ByteLengthParser({ length: 1 })); - -parser.on('data', data_in); - -function data_in(data) { - console.log(data[0]); -} - -function data_out(data) { - console.log('sent: ', data); - port.write(data, function(err) { - if (err) { - return console.log('port error on write: ', err.message); - } - }); -} - -port.on('open', function(err) { - console.log('port open'); -}); - -port.on('error', function(err) { - console.log('port error: ', err.message); -}); \ No newline at end of file diff --git a/mkserialserver.js b/mkserialserver.js deleted file mode 100644 index 366322fa61b5eb3da8ae4e51c15ecb6351ff912d..0000000000000000000000000000000000000000 --- a/mkserialserver.js +++ /dev/null @@ -1,152 +0,0 @@ -// -// serialserver.js -// WebSocket serial server -// -// Neil Gershenfeld and Jake Read -// (c) Massachusetts Institute of Technology 2016 -// -// This work may be reproduced, modified, distributed, performed, and -// displayed for any purpose, but must acknowledge the mods -// project. Copyright is retained and must be preserved. The work is -// provided as is; no warranty is provided, and users accept all -// liability. -// -// check command line -// -if (process.argv.length < 4) { - console.log("command line: node serialserver.js client_address server_port") - process.exit(-1) -} -// -// start server -// -var client_address = process.argv[2] -var server_port = process.argv[3] -console.log("listening for connection from client address " + client_address + " on server port " + server_port) -var SerialPort = require('serialport') -var port = null -var WebSocketServer = require('ws').Server -wss = new WebSocketServer({ - port: server_port -}) -// -// handle connection -// -wss.on('connection', function(ws) { - // - // check address - // - if (ws._socket.remoteAddress != client_address) { - console.log("connection rejected from " + ws._socket.remoteAddress) - var wsMessage = { - type: 'message', - message: 'socket closed' - } - ws.send(JSON.stringify(wsMessage)) - ws.close() - } else { - console.log("connection accepted from " + ws._socket.remoteAddress) - } - // - // handle messages - // - var cancel - var packet = new Array() - ws.on("message", function(message) { - var msg = JSON.parse(message) - // - // open port - // - if (msg.type == 'open') { - var device = msg.device - var baud = parseInt(msg.baud) - var flow = msg.flow - console.log('open ' + device + ' at ' + baud + ' flow ' + flow) - if (flow == 'none') - port = new SerialPort(device, { - baudRate: baud - }) - else if (flow == 'rtscts') - port = new SerialPort(device, { - baudRate: baud, - rtscts: true - }) - port.on('open', function() { - var wsMessage = { - type: 'message', - message: 'serial port opened' - } - ws.send(JSON.stringify(wsMessage)) - if (flow == 'dsrdtr') { - port.set({ - dsr: true, - dtr: true - }) - port.set({ - rts: false, - cts: false - }) - } - }) - port.on('error', function(err) { - var wsMessage = { - type: 'message', - message: err.message - } - ws.send(JSON.stringify(wsMessage)) - }) - port.on('data', function(data) { - var dataArray = new Array() - for(var i = 0; i < data.length; i ++){ - dataArray[i] = data[i] - } - console.log('data in', dataArray) - var wsMessage = { - type: 'array', - array: dataArray - } - ws.send(JSON.stringify(wsMessage)) - }) - } - // - // close port - // - else if (msg.type == 'close') { - var device = msg.device - console.log('close ' + device) - var wsMessage = { - type: 'message', - message: err.message - } - ws.send(JSON.stringify(wsMessage)) - port.close() - port = null - } - // - // send packet - // - else if (msg.type == 'packet') { - console.log('packet out', msg.packet) // packet is an array - port.write(msg.packet, function() { - port.drain(function(err) { - if (err) { - var wsMessage = { - type: 'message', - message: err.message - } - ws.send(JSON.stringify(wsMessage)) - } - }) - }) - } - }) - // - // close - // - ws.on("close", function() { - console.log("connection closed") - if (port != null) - port.close() - port = null - }) -}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..d7d84039e39744ac8aa617f0836606eae8f520ef --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1553 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@serialport/parser-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-1.0.5.tgz", + "integrity": "sha512-GCz/v/KG2Wv7SdQ2nv8jYGBY6D4h5tibj9bs0+pnryCDAr8xmmvnesFW15FIu4rwOMgsKhCHyp7roD8bRGs63A==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "@serialport/parser-cctalk": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-1.0.5.tgz", + "integrity": "sha512-VdoG1rRXb5deHM1c9Akn9djoJuHn030v7owYHEqpJeS6Rs6wrC4Hrkw8NxvV9ZPlMqAJ+5uJCaAUzB1tbVd3rA==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "@serialport/parser-delimiter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-1.0.5.tgz", + "integrity": "sha512-srDzeNwGM/GjtqK/nFDRIDpcZ6XDgkakFMXBtNDSI+XP6fqO1ynEZok8ljKJxM2ay0CNG83C6/X2xIOHvWhFYQ==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "@serialport/parser-readline": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-1.0.5.tgz", + "integrity": "sha512-QkZoCQPHwdZOMQk7SHz3QSp7xqK4jdNql9M80oXqWt7kNhFvNXguWzf17FfQrPRIb0qiz+96+P6uAOIi02Yxbg==", + "requires": { + "@serialport/parser-delimiter": "1.0.5", + "safe-buffer": "5.1.2" + } + }, + "@serialport/parser-ready": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-1.0.5.tgz", + "integrity": "sha512-U/ZkxyY35Z7WrDc0O8TGcGPOdwv6fGVJcZq5vXVko2MRt8wiKVD192mmbfTRZXFAX+rARXtQa3ad3yJzXVhb1g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "@serialport/parser-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-1.0.5.tgz", + "integrity": "sha512-sX3tRuwwwGV+CZbKEUAKZD/wtG8ZRcGxbiDIm8nyzsPCGv52ck3RlQ9Vp4K8fYjcrGGwm3BWizC4uSzaTLOk1A==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "ansi-bgblack": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", + "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgblue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", + "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgcyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", + "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bggreen": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", + "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgmagenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", + "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgred": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", + "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgwhite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", + "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgyellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", + "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-black": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", + "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-blue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", + "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bold": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", + "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-colors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", + "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", + "requires": { + "ansi-bgblack": "0.1.1", + "ansi-bgblue": "0.1.1", + "ansi-bgcyan": "0.1.1", + "ansi-bggreen": "0.1.1", + "ansi-bgmagenta": "0.1.1", + "ansi-bgred": "0.1.1", + "ansi-bgwhite": "0.1.1", + "ansi-bgyellow": "0.1.1", + "ansi-black": "0.1.1", + "ansi-blue": "0.1.1", + "ansi-bold": "0.1.1", + "ansi-cyan": "0.1.1", + "ansi-dim": "0.1.1", + "ansi-gray": "0.1.1", + "ansi-green": "0.1.1", + "ansi-grey": "0.1.1", + "ansi-hidden": "0.1.1", + "ansi-inverse": "0.1.1", + "ansi-italic": "0.1.1", + "ansi-magenta": "0.1.1", + "ansi-red": "0.1.1", + "ansi-reset": "0.1.1", + "ansi-strikethrough": "0.1.1", + "ansi-underline": "0.1.1", + "ansi-white": "0.1.1", + "ansi-yellow": "0.1.1", + "lazy-cache": "2.0.2" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-dim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", + "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-grey": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", + "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-hidden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", + "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-inverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", + "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-italic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", + "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-magenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", + "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-reset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", + "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-strikethrough": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", + "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-underline": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", + "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-white": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", + "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "ansi-yellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", + "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-swap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arr-swap/-/arr-swap-1.0.1.tgz", + "integrity": "sha1-FHWQ7WX8gVvAf+8Jl8Llgj1kNTQ=", + "requires": { + "is-number": "3.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "choices-separator": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/choices-separator/-/choices-separator-2.0.0.tgz", + "integrity": "sha1-kv0XYxgteQM/XFxR0Lo1LlVnxpY=", + "requires": { + "ansi-dim": "0.1.1", + "debug": "2.6.9", + "strip-color": "0.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "clone-deep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-1.0.0.tgz", + "integrity": "sha512-hmJRX8x1QOJVV+GUjOBzi6iauhPqc9hIF6xitWRBbiPZOBb6vGo/mDRIK9P74RTKSQK7AE8B0DDWY/vpRrPmQw==", + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "5.1.0", + "shallow-clone": "1.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "1.0.2" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, + "error-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", + "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" + }, + "expand-template": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", + "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "1.0.2" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "info-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", + "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-number": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz", + "integrity": "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "3.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "koalas": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", + "integrity": "sha1-MYQz8HQjXbePrlZhoCqMpT7ilc0=" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "0.1.0" + } + }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "requires": { + "ansi-green": "0.1.1", + "success-symbol": "0.1.0" + } + }, + "log-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", + "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", + "requires": { + "ansi-colors": "0.2.0", + "error-symbol": "0.1.0", + "info-symbol": "0.1.0", + "log-ok": "0.1.1", + "success-symbol": "0.1.0", + "time-stamp": "1.1.0", + "warning-symbol": "0.1.0" + } + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "1.0.1" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "0.1.8", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "node-abi": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", + "integrity": "sha512-b656V5C0628gOOA2kwcpNA/bxdlqYF9FvxJ+qqVX0ctdXNVZpS8J6xEUYir3WAKc7U0BH/NRlSpNbGsy+azjeg==", + "requires": { + "semver": "5.5.0" + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "pointer-symbol": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pointer-symbol/-/pointer-symbol-1.0.0.tgz", + "integrity": "sha1-YPkRAgTqepKbYmRKITFVQ8uz1Ec=" + }, + "prebuild-install": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-4.0.0.tgz", + "integrity": "sha512-7tayxeYboJX0RbVzdnKyGl2vhQRWr6qfClEXDhOkXjuaOKCw2q8aiuFhONRYVsG/czia7KhpykIlI2S2VaPunA==", + "requires": { + "detect-libc": "1.0.3", + "expand-template": "1.1.1", + "github-from-package": "0.0.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "node-abi": "2.4.3", + "noop-logger": "0.1.1", + "npmlog": "4.1.2", + "os-homedir": "1.0.2", + "pump": "2.0.1", + "rc": "1.2.8", + "simple-get": "2.8.1", + "tar-fs": "1.16.3", + "tunnel-agent": "0.6.0", + "which-pm-runs": "1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promirepl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promirepl/-/promirepl-1.0.1.tgz", + "integrity": "sha1-KVGq66K/P+InT/Y6FtlMBMpghy4=" + }, + "prompt-actions": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prompt-actions/-/prompt-actions-3.0.2.tgz", + "integrity": "sha512-dhz2Fl7vK+LPpmnQ/S/eSut4BnH4NZDLyddHKi5uTU/2PDn3grEMGkgsll16V5RpVUh/yxdiam0xsM0RD4xvtg==", + "requires": { + "debug": "2.6.9" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "prompt-base": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prompt-base/-/prompt-base-4.1.0.tgz", + "integrity": "sha512-svGzgLUKZoqomz9SGMkf1hBG8Wl3K7JGuRCXc/Pv7xw8239hhaTBXrmjt7EXA9P/QZzdyT8uNWt9F/iJTXq75g==", + "requires": { + "component-emitter": "1.2.1", + "debug": "3.1.0", + "koalas": "1.0.2", + "log-utils": "0.2.1", + "prompt-actions": "3.0.2", + "prompt-question": "5.0.2", + "readline-ui": "2.2.3", + "readline-utils": "2.2.3", + "static-extend": "0.1.2" + } + }, + "prompt-checkbox": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/prompt-checkbox/-/prompt-checkbox-2.2.0.tgz", + "integrity": "sha512-T/QWgkdUmKjRSr0FQlV8O+LfgmBk8PwDbWhzllm7mwWNAjs3qOVuru5Y1gV4/14L73zCncqcuwGwvnDyVcVgvA==", + "requires": { + "ansi-cyan": "0.1.1", + "debug": "2.6.9", + "prompt-base": "4.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "prompt-choices": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prompt-choices/-/prompt-choices-4.1.0.tgz", + "integrity": "sha512-ZNYLv6rW9z9n0WdwCkEuS+w5nUAGzRgtRt6GQ5aFNFz6MIcU7nHFlHOwZtzy7RQBk80KzUGPSRQphvMiQzB8pg==", + "requires": { + "arr-flatten": "1.1.0", + "arr-swap": "1.0.1", + "choices-separator": "2.0.0", + "clone-deep": "4.0.0", + "collection-visit": "1.0.0", + "define-property": "2.0.2", + "is-number": "6.0.0", + "kind-of": "6.0.2", + "koalas": "1.0.2", + "log-utils": "0.2.1", + "pointer-symbol": "1.0.0", + "radio-symbol": "2.0.0", + "set-value": "3.0.0", + "strip-color": "0.1.0", + "terminal-paginator": "2.0.2", + "toggle-array": "1.0.1" + }, + "dependencies": { + "clone-deep": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.0.tgz", + "integrity": "sha512-aNJ5/7Bz2IYBb7nIj34TLGk78lBXpXUgV9qsLngtTvJ9+scsZNnlU0OX2S2N4ax/sUQt7sDBkXiGjGJEmNbXOQ==", + "requires": { + "kind-of": "6.0.2", + "shallow-clone": "3.0.0" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "shallow-clone": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.0.tgz", + "integrity": "sha512-Drg+nOI+ofeuslBf0nulyWLZhK1BZprqNvPJaiB4VvES+9gC6GG+qOVAfuO12zVSgxq9SKevcme7S3uDT6Be8w==", + "requires": { + "kind-of": "6.0.2" + } + } + } + }, + "prompt-list": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/prompt-list/-/prompt-list-3.2.0.tgz", + "integrity": "sha512-PDao47cmC9+m2zEUghH+WIIascd8SuyyWO+akuUubd0XxOQyUH96HMdIcL3YnNS8kJUHwddH1rHVgL9vZA1QsQ==", + "requires": { + "ansi-cyan": "0.1.1", + "ansi-dim": "0.1.1", + "prompt-radio": "1.2.1" + } + }, + "prompt-question": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/prompt-question/-/prompt-question-5.0.2.tgz", + "integrity": "sha512-wreaLbbu8f5+7zXds199uiT11Ojp59Z4iBi6hONlSLtsKGTvL2UY8VglcxQ3t/X4qWIxsNCg6aT4O8keO65v6Q==", + "requires": { + "clone-deep": "1.0.0", + "debug": "3.1.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "kind-of": "5.1.0", + "koalas": "1.0.2", + "prompt-choices": "4.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "prompt-radio": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prompt-radio/-/prompt-radio-1.2.1.tgz", + "integrity": "sha512-vH1iAkgbWyvZBC1BTajydiHmwJP4F1b684gq0fm2wOjPVW1zaDo01OXWr/Dske0XdoHhtZFNMOXNj/ZUSRBywg==", + "requires": { + "debug": "2.6.9", + "prompt-checkbox": "2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "radio-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/radio-symbol/-/radio-symbol-2.0.0.tgz", + "integrity": "sha1-eqm/xQSFY21S3XbWqOYxspB5muE=", + "requires": { + "ansi-gray": "0.1.1", + "ansi-green": "0.1.1", + "is-windows": "1.0.2" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=" + }, + "readline-ui": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/readline-ui/-/readline-ui-2.2.3.tgz", + "integrity": "sha512-ix7jz0PxqQqcIuq3yQTHv1TOhlD2IHO74aNO+lSuXsRYm1d+pdyup1yF3zKyLK1wWZrVNGjkzw5tUegO2IDy+A==", + "requires": { + "component-emitter": "1.2.1", + "debug": "2.6.9", + "readline-utils": "2.2.3", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "readline-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/readline-utils/-/readline-utils-2.2.3.tgz", + "integrity": "sha1-b4R9a48ZFcORtYHDZ81HhzhiNRo=", + "requires": { + "arr-flatten": "1.1.0", + "extend-shallow": "2.0.1", + "is-buffer": "1.1.6", + "is-number": "3.0.0", + "is-windows": "1.0.2", + "koalas": "1.0.2", + "mute-stream": "0.0.7", + "strip-color": "0.1.0", + "window-size": "1.1.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "serialport": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/serialport/-/serialport-6.2.2.tgz", + "integrity": "sha512-BQqTR06ZXKwKB6rUjeANm3aIZo0rqNbQsrQX5zKEDcNY4rxiu5dvdcfIOaAGuZkhW7jAKJsgKC5TjeURtLVuOQ==", + "requires": { + "@serialport/parser-byte-length": "1.0.5", + "@serialport/parser-cctalk": "1.0.5", + "@serialport/parser-delimiter": "1.0.5", + "@serialport/parser-readline": "1.0.5", + "@serialport/parser-ready": "1.0.5", + "@serialport/parser-regex": "1.0.5", + "bindings": "1.3.0", + "commander": "2.17.1", + "debug": "3.1.0", + "nan": "2.10.0", + "prebuild-install": "4.0.0", + "promirepl": "1.0.1", + "prompt-list": "3.2.0", + "safe-buffer": "5.1.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "0.3.0" + } + }, + "set-value": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-3.0.0.tgz", + "integrity": "sha512-tqkg9wJ2TOsxbzIMG5NMAmzjdbDTAD0in7XuUzmFpJE4Ipi2QFBfgC2Z1/gfxcAmWCPsuutiEJyDIMRsrjrMOQ==", + "requires": { + "is-plain-object": "2.0.4" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "requires": { + "is-extendable": "0.1.1", + "kind-of": "5.1.0", + "mixin-object": "2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "3.3.0", + "once": "1.4.0", + "simple-concat": "1.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "requires": { + "chownr": "1.0.1", + "mkdirp": "0.5.1", + "pump": "1.0.3", + "tar-stream": "1.6.1" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "tar-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "requires": { + "bl": "1.2.2", + "buffer-alloc": "1.2.0", + "end-of-stream": "1.4.1", + "fs-constants": "1.0.0", + "readable-stream": "2.3.6", + "to-buffer": "1.1.1", + "xtend": "4.0.1" + } + }, + "terminal-paginator": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/terminal-paginator/-/terminal-paginator-2.0.2.tgz", + "integrity": "sha512-IZMT5ECF9p4s+sNCV8uvZSW9E1+9zy9Ji9xz2oee8Jfo7hUFpauyjxkhfRcIH6Lu3Wdepv5D1kVRc8Hx74/LfQ==", + "requires": { + "debug": "2.6.9", + "extend-shallow": "2.0.1", + "log-utils": "0.2.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "3.2.2" + } + }, + "toggle-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toggle-array/-/toggle-array-1.0.1.tgz", + "integrity": "sha1-y/WEB5K9UJfzMReugkyTKv/ofVg=", + "requires": { + "isobject": "3.0.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "warning-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", + "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz", + "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==", + "requires": { + "define-property": "1.0.0", + "is-number": "3.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/run.js b/run.js new file mode 100644 index 0000000000000000000000000000000000000000..23087e0e5783194b53f21e16448658ca1da1fe3d --- /dev/null +++ b/run.js @@ -0,0 +1,15 @@ +var Terminal = require('./lib/terminal.js') +var Gcode = require('./lib/gcode.js') +//var Planner = require('./lib/planner.js') + +var terminal = Terminal.create() +var gcode = Gcode.create() + +terminal.on('newline', gcode.lineIn) +gcode.on('newInstruction', terminal.postline) +gcode.on('modeChange', terminal.postline) + + +// make output boxes, html? post two gcode instructions through to those, from one input terminal box? + +// might have to wrap intputs / outputs into gcode.outputs / gcode.inputs, extends BaseClass (extends EventEmitter) \ No newline at end of file diff --git a/terminalMachine.js b/terminalMachine.js new file mode 100644 index 0000000000000000000000000000000000000000..a76667f02c53849074b45cca0817e55bc22abd18 --- /dev/null +++ b/terminalMachine.js @@ -0,0 +1,63 @@ +// a run file: the machine in one js scratchpad + +// motors, +var xMotor = createStepper() +xMotor.route = [0,0] // apa route to hardware + +var ylMotor = createStepper() +ylMotor.route = [0,1] + +var yrMotor = createStepper() +yrMotor.route = [0,2] + +var zMotor = createStepper() +zMotor.route = [0,3] + +var spindle = createBLDC() +spindle.route = [0,4] + + +// a lookahead planner, eats movement instructions and makes smooth trapezoids, tracks motors and their state +var planner = createPlanner() +// will listen for these move axis enumerators, motion planning done with pt arrays in this order in cartesian space +planner.axisConfig = ['X', 'Y', 'Z'] +// will output to these actuators, should be able to write expressions here for kinematics: corexy, h-bot etc +planner.actuatorConfig = { + X: X * 200, + YL: Y * 300, + YR: -Y * 300, + Z: Z * 200 +} +// would have defaults, but +planner.accelRate = 250 // units/s +planner.jd = 0.5 // units for radius of imaginary junction + + +// an input +var terminal = createTerminal() +terminal.charWidth = 120 +terminal.linesTall = 64 + +// to parse gcode - hella stateful! +var gcodeParser = createGcodeParser() + + +// now we hook up: + +// terminal puts characters into the gcode parser, which writes move commands + +terminal.outputs.newline.attach(gcodeParser.inputs.parse) +gcodeParser.outputs.newmove.attach(planner.inputs.newMove) + +// motors and planner intimately connected +planner.outputs.X.attach(xMotor.inputs.command) +xMotor.outputs.updates.attach(planner.inputs.X) + +planner.outputs.YL.attach(ylMotor.inputs.command) +ylMotor.outputs.updates.attach(planner.inputs.YL) + +planner.outputs.YR.attach(yrMotor.inputs.command) +yrMotor.outputs.updates.attach(planner.inputs.YR) + +planner.outputs.Z.attach(zMotor.inputs.command) +zMotor.outputs.updates.attach(planner.inputs.Z) \ No newline at end of file