diff --git a/processes/devicepipe.js b/processes/devicepipe.js new file mode 100644 index 0000000000000000000000000000000000000000..e730cbb93ae054cc07ea2cf1b69485098130ba0e --- /dev/null +++ b/processes/devicepipe.js @@ -0,0 +1,142 @@ +/* + +browser -> filesys + +*/ + +const WebSocketServer = require('ws').Server +const fs = require('fs') + +const STATUS_UNKNOWN = 'unknown...' +const STATUS_OPENING = 'opening...' +const STATUS_OPEN = 'open' +const STATUS_CLOSED = 'closed' +const STATUS_ERROR = 'error' + +// port to issue on, +let port = '2042' +let deviceName = 'lp0' + +const WSS = new WebSocketServer({port: port}, () => { + if(process.send){ // check if we have a parent to send to + process.send({ + startup: true, + port: port + }) + } +}) + +let WS = null + +WSS.on('connection', (ws) => { + console.log('vfpts websocket connects') + // handles, + WS = ws + // send current status + sendSerialStatus() + // handlers, + ws.onmessage = (msg) => { + if(typeof msg.data === 'string'){ + // probably a control object, do + let data = JSON.parse(msg.data) + if(data.type === 'echo'){ + sendToBrowser(msg.data) + } else { + console.log("how to handle:", data) + } + } else { + if(Buffer.isBuffer(msg.data)){ + if(serport){ + serport.write(encode(msg.data, true), 'utf8') + } + } + } + } + ws.onclose = (evt) => { + // shutdown, + console.log('ws closes, pipe exiting') + process.exit() + } +}) + +// send wrapper +let sendToBrowser = (msg) => { + if (WS) { + WS.send(msg) + return true + } else { + return false + } +} + +// device business, + +let findDevice = () => { + let file = 'lp0' + fs.open(`/dev/usb/${file}`, 'w', (err, fd) => { + if(err){ + console.log(err) + } else { + // integers: 100 count in one mm, thx roland + let hx = 1000 + let hz = 1000 + let hy = 1000 + let cm = `PA;PA;!PZ0,${hz};PU$${hx},${hy};!MC0;\u0004` + console.log('attempt for', cm, 'to') + console.log(fd) + fs.write(fd, cm, (err, bytesWritten, buffer) => { + if(err){ + console.log(err) + } else { + console.log('numBytesWritten', bytesWritten) + console.log('buffer', buffer) + } + }) + } + }) + /* + fs.readdir('/dev/usb', (err, files) => { + if(err){ + console.log(err) + } else { + console.log(files) + for(file of files){ + if(file === deviceName){ + console.log('ok') + // let's write to it... + // first we have to open it... + // + } + } + } + }) + */ +} + +let sendSerialStatus = () => { + if(serport){ + if(serport.opening){ + sendToBrowser(JSON.stringify({ + type: 'serial status', + status: STATUS_OPENING + })) + } else if (serport.readable){ + sendToBrowser(JSON.stringify({ + type: 'serial status', + status: STATUS_OPEN + })) + } else { + sendToBrowser(JSON.stringify({ + type: 'serial status', + status: STATUS_CLOSED + })) + } + } else { + sendToBrowser(JSON.stringify({ + type: 'serial status', + status: STATUS_CLOSED + })) + } +} + +findDevice() diff --git a/processes/filepipe.js b/processes/filepipe.js deleted file mode 100644 index 51f84d9aed74a7983c4532bee4a4d40298ffe36b..0000000000000000000000000000000000000000 --- a/processes/filepipe.js +++ /dev/null @@ -1,204 +0,0 @@ -/* - -very fast ~~picket ship~~ pipe transport (server) - -*/ - -const WebSocketServer = require('ws').Server -const SerialPort = require('serialport') -const Delimiter = require('@serialport/parser-delimiter') - -const STATUS_UNKNOWN = 'unknown...' -const STATUS_OPENING = 'opening...' -const STATUS_OPEN = 'open' -const STATUS_CLOSED = 'closed' -const STATUS_ERROR = 'error' - -// port to issue on, -let port = '2042' -let pid = '8031' - -const WSS = new WebSocketServer({port: port}, () => { - process.send({ - startup: true, - port: port - }) -}) - -let WS = null - -WSS.on('connection', (ws) => { - console.log('vfpts websocket connects') - // handles, - WS = ws - // send current status - sendSerialStatus() - // handlers, - ws.onmessage = (msg) => { - if(typeof msg.data === 'string'){ - // probably a control object, do - let data = JSON.parse(msg.data) - if(data.type === 'echo'){ - sendToBrowser(msg.data) - } else { - console.log("how to handle:", data) - } - } else { - if(Buffer.isBuffer(msg.data)){ - if(serport){ - serport.write(encode(msg.data, true), 'utf8') - } - } - } - } - ws.onclose = (evt) => { - // shutdown, - console.log('ws closes, pipe exiting') - process.exit() - } -}) - -// send wrapper -let sendToBrowser = (msg) => { - if (WS) { - WS.send(msg) - return true - } else { - return false - } -} - -// now the usb, -let serport = null -let comname = '' - -let sendSerialStatus = () => { - if(serport){ - if(serport.opening){ - sendToBrowser(JSON.stringify({ - type: 'serial status', - status: STATUS_OPENING - })) - } else if (serport.readable){ - sendToBrowser(JSON.stringify({ - type: 'serial status', - status: STATUS_OPEN - })) - } else { - sendToBrowser(JSON.stringify({ - type: 'serial status', - status: STATUS_CLOSED - })) - } - } else { - sendToBrowser(JSON.stringify({ - type: 'serial status', - status: STATUS_CLOSED - })) - } -} - -// COBS https://github.com/tcr/node-cobs - -function encode (buf, zeroBack) { - var dest = [0]; - // vfpt starts @ 1, - var code_ptr = 0; - var code = 0x01; - - function finish (incllast) { - dest[code_ptr] = code; - code_ptr = dest.length; - incllast !== false && dest.push(0x00); - code = 0x01; - } - - for (var i = 0; i < buf.length; i++) { - if (buf[i] == 0) { - finish(); - } else { - dest.push(buf[i]); - code += 1; - if (code == 0xFF) { - finish(); - } - } - } - finish(false); - - if (zeroBack) { - dest.push(0x00); - } - - return new Buffer.from(dest); -} - - -function decode (buf) -{ - var dest = []; - for (var i = 0; i < buf.length; ) { - var code = buf[i++]; - for (var j = 1; j < code; j++) { - dest.push(buf[i++]); - } - if (code < 0xFF && i < buf.length) { - dest.push(0); - } - } - return new Buffer.from(dest) -} - -let findSerialPort = () => { - let found = false - SerialPort.list((err, ports) => { - ports.forEach((serialport) => { - console.log('port:', serialport.comName, serialport.productId) - console.log(serialport) - if (serialport.productId === pid) { - comname = serialport.comName - console.log(`found port at ${comname}, opening`) - openPort() - } - }) - }) -} - -let openPort = () => { - serport = new SerialPort(comname, { - baudRate: 3000000 - }) - serport.on('open', () => { - sendSerialStatus() - serport.on('error', (err) => { - sendSerialStatus() - console.log('port error', err) - }) - const parser = serport.pipe(new Delimiter({delimiter: [0]})) - parser.on('data', (buf) => { - // serialport doesn't guarantee packet sized events - //console.log('serport receives: ', buf) - let op = decode(buf) - if(op[0] === 252){ - // NEXT: write this as a JSON, ship -> vfpt, splash it uuup - console.log('LLM: ', buf.toString('utf8')) - } else { - //console.log('<- de-cobs: ', op.length) - if(WS){ - WS.send(op) - } - } - }) - }) -} - -findSerialPort() - -// this causes node to req. time from the OS more often (as often as possible) -// meaning that our events are handled more often, and we drop ring times by some ms -// does burn cycles though, - -let reminders = () => { - setImmediate(reminders) -} -reminders()