UNPKG

multiwii-msp

Version:

NodeJS MultiWii Serial Protocol to send or receive commands from MultiWii via TCP/IP

118 lines (96 loc) 3.38 kB
var SerialPort = require('serialport').SerialPort; var Socket = require('net').Socket; var TcpProtocol = require('./TcpProtocol'); var MspProtocol = require('./MspProtocol'); /** * * @param {string} tcpHost * @param {int} tcpPort * @param {string} serialPort * @param {int} serialBaudRate * @param {boolean} [log=false] * @constructor */ function TcpClient(tcpHost, tcpPort, serialPort, serialBaudRate, log) { var tp, sp, tpProtocol, spProtocol, priorQueue, defaultQueue, current, processing, processTimeout; function logMsg() { if (log) { console.log.apply(this, arguments); } } function processQueue() { current = priorQueue.shift(); if (!current) { current = defaultQueue.shift(); } if (!current) { processing = false; return; } logMsg('CLIENT: Sp write data', current.id, current.code, spProtocol.serialize(current.code, current.data)); sp.write(spProtocol.serialize(current.code, current.data)); processTimeout = setTimeout(function () { logMsg('CLIENT: Timeout reached', current.id); processQueue(); }, 1000); } priorQueue = []; defaultQueue = []; tp = new Socket(); tpProtocol = new TcpProtocol(); sp = new SerialPort(serialPort, {baudRate: serialBaudRate}); spProtocol = new MspProtocol(); tp.on('close', function () { logMsg('CLIENT: Tcp reconnecting...'); tp.connect(tcpPort, tcpHost, function () { logMsg('CLIENT: Tcp reconnected'); }); }); tp.on('error', function (error) { logMsg('CLIENT: Tcp error: ' + error); }); logMsg('CLIENT: Sp connecting...'); sp.on('open', function () { logMsg('CLIENT: Sp connected'); logMsg('CLIENT: Tcp connecting...'); tp.connect(tcpPort, tcpHost, function () { logMsg('CLIENT: Tcp connected'); }); }); sp.on('data', function (data) { var result; logMsg('CLIENT: Sp data received ', data); result = spProtocol.unserialize(data); while (result.valid) { logMsg('CLIENT: Sp package unserialized', current.id, result.code, result.data); clearTimeout(processTimeout); tp.write(tpProtocol.serialize(current.id, result.code, result.data)); processQueue(); result = spProtocol.unserialize(); } }); tp.on('data', function (data) { var result, item; logMsg('CLIENT: Tcp data received ', data); result = tpProtocol.unserialize(data); while (result.valid) { logMsg('CLIENT: Tcp package unserialized', result.id, result.code, result.data); item = { id : result.id, code: result.code, data: result.data }; if (result.prior) { priorQueue.push(item); } else { defaultQueue.push(item); } if (!processing) { processing = true; processQueue(); } result = tpProtocol.unserialize(); } }); } module.exports = TcpClient;