From 8f7f6a139765ede8f9b4c4413af76ef2d2423d3e Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Tue, 3 Sep 2019 19:45:40 +0700
Subject: [PATCH] writeToPortAndWaitForReadline

---
 lib/modem-commands.js | 17 +++++++++++++++++
 modem-tester.js       | 27 ++++-----------------------
 2 files changed, 21 insertions(+), 23 deletions(-)

diff --git a/lib/modem-commands.js b/lib/modem-commands.js
index 2237f43..aea547b 100644
--- a/lib/modem-commands.js
+++ b/lib/modem-commands.js
@@ -1,6 +1,7 @@
 const MUTEX_COMMAND = 'COMMAND';
 // const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
 
+const ParserReadline = require('@serialport/parser-readline');
 const ParserRegex = require('@serialport/parser-regex');
 
 const logger = require('komodo-sdk/logger');
@@ -21,6 +22,22 @@ function writeToPort(data) {
     });
 }
 
+exports.writeToPortAndWaitForReadline = function writeToPortAndWaitForReadline(cmd, lockName) {
+    return new Promise(async (resolve) => {
+        const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER });
+        parser.on('data', (data) => {
+            logger.verbose('INCOMING', { parser: 'customParserReadLine', data: `${data.toString()}${parsers.PARSER_READLINE_DELIMITER}` });
+            port.unpipe(parser);
+            mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim());
+            resolve(data);
+        });
+
+        await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim());
+        port.pipe(parser);
+        await writeToPort(cmd);
+    });
+};
+
 exports.sleep = function sleep(ms) {
     return new Promise((resolve) => {
         setTimeout(() => {
diff --git a/modem-tester.js b/modem-tester.js
index a36ac49..c1dcdc3 100644
--- a/modem-tester.js
+++ b/modem-tester.js
@@ -49,28 +49,9 @@ port = new SerialPort(config.modem.device, { baudRate: 115200 }, async (err) =>
 
     await writeToPortDelayed('AT\r');
 
-    const commands = [
-        'AT&FE0\r',
-        'AT+CMGF=0\r',
-        'AT+CNMI=1,2,0,1,0\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);
-        }
-    }
+    await modemCommands.writeToPortAndWaitForReadline('AT&FE0\r');
+    await modemCommands.writeToPortAndWaitForReadline('AT+CMGF=0\r');
+    await modemCommands.writeToPortAndWaitForReadline('AT+CNMI=1,2,0,1,0\r');
 
     const imei = await modemCommands.queryIMEI();
     logger.info(`**** IMEI: ${imei}`);
@@ -86,7 +67,7 @@ port = new SerialPort(config.modem.device, { baudRate: 115200 }, async (err) =>
 
     setInterval(() => {
         modemCommands.querySignalQuality();
-    }, 30000);
+    }, (config && config.interval_beetwen_signal_strength_ms) || 30000);
 });
 
 parsers.setPort(port);
-- 
1.9.0