const SerialPort = require('serialport'); const config = require('komodo-sdk/config'); const logger = require('komodo-sdk/logger'); const ParserInterByteTimeout = require('@serialport/parser-inter-byte-timeout'); const parsers = require('./lib/serialport-parsers'); const modemCommands = require('./lib/modem-commands'); const parserInterByteTimeout = new ParserInterByteTimeout({ interval: 1000 }); parserInterByteTimeout.on('data', (data) => { logger.verbose('INCOMING', { parser: 'parserInterByteTimeout', data: data.toString() }); }); let port; function sleep(ms) { return new Promise((resolve) => { setTimeout(() => { resolve(); }, ms || 0); }); } function writeToPort(data) { return new Promise((resolve) => { port.write(data, (err, bytesWritten) => { if (err) logger.warn(`ERROR: ${err.toString()}`); logger.verbose('OUTGOING', { bytesWritten, data: data.toString() }); resolve(bytesWritten); }); }); } async function writeToPortDelayed(data, ms) { await sleep(ms || 500); const result = writeToPort(data); return result; } port = new SerialPort(config.modem.device, { baudRate: 115200 }, async (err) => { if (err) { logger.warn(`Error opening modem. ${err}. Terminating modem ${config.modem.device}.`); process.exit(1); } await writeToPortDelayed('AT\r'); const commands = [ 'AT&FE0\r', 'AT+CGSN\r', 'AT+CIMI\r', 'AT+COPS?\r', ]; const commandsCount = commands.length; // eslint-disable-next-line no-plusplus for (let i = 0; i < commandsCount; i++) { // eslint-disable-next-line no-await-in-loop await writeToPortDelayed(commands[i], 2000); } if (config && config.modem_tester && config.modem_tester.commands && config.modem_tester.commands.length) { const additionalCommandsLength = config.modem_tester.commands.length; // eslint-disable-next-line no-plusplus for (let i = 0; i < additionalCommandsLength; i++) { // eslint-disable-next-line no-await-in-loop await writeToPortDelayed(config.modem_tester.commands[i], 2000); } } setInterval(() => { modemCommands.querySignalQuality(); }, 30000); }); parsers.setPort(port); if (config && config.modem_tester && config.modem_tester.parser === 'regex') { logger.info('Using parserWaitForOkOrError'); port.pipe(parsers.parserWaitForOkOrError); } else if (config && config.modem_tester && config.modem_tester.parser === 'interbyte') { logger.info('Using parserInterByteTimeout'); port.pipe(parserInterByteTimeout); } else { logger.info('Using parserReadline'); port.pipe(parsers.parserReadline); }