From 47910cce60174f617789aad87a054a56a7131227 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Tue, 3 Sep 2019 20:34:29 +0700
Subject: [PATCH] queryCOPSAndSignalQuality

---
 lib/modem-commands.js | 30 +++++++++++++++++++++++++-----
 modem-tester.js       |  3 ++-
 2 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/lib/modem-commands.js b/lib/modem-commands.js
index 82151cb..09e26e0 100644
--- a/lib/modem-commands.js
+++ b/lib/modem-commands.js
@@ -1,5 +1,5 @@
 const MUTEX_COMMAND = 'COMMAND';
-// const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
+const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
 
 const ParserReadline = require('@serialport/parser-readline');
 const ParserRegex = require('@serialport/parser-regex');
@@ -23,12 +23,17 @@ function writeToPort(data) {
 }
 
 exports.writeToPortAndWaitForReadline = function writeToPortAndWaitForReadline(cmd, lockName) {
+    let resolved = false;
+
     return new Promise(async (resolve) => {
         const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER });
         parser.on('data', (data) => {
             port.unpipe(parser);
             mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim());
-            resolve(data);
+            if (!resolved) {
+                resolved = true;
+                resolve(data);
+            }
         });
 
         await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim());
@@ -78,11 +83,26 @@ exports.querySignalQuality = function querySignalQuality() {
     });
 };
 
-exports.queryCOPS = function queryCOPS() {
+exports.queryCOPS = function queryCOPS(lockName) {
     return new Promise(async (resolve) => {
-        await mutex.lock(MUTEX_COMMAND, 'queryCOPS');
+        await mutex.lock(lockName || MUTEX_COMMAND, 'queryCOPS');
         await writeToPort('AT+COPS?\r');
-        mutex.unlock(MUTEX_COMMAND, 'queryCOPS');
+        mutex.unlock(lockName || MUTEX_COMMAND, 'queryCOPS');
+        resolve(true);
+    });
+};
+
+exports.queryCOPSAndSignalQuality = function queryCOPSAndSignalQuality() {
+    return new Promise(async (resolve) => {
+        if (!mutex.tryLock(MUTEX_COMMAND, 'queryCOPSAndSignalQuality')) {
+            resolve(false);
+            return;
+        }
+
+        await this.writeToPortAndWaitForReadline('AT+COPS?\r', MUTEX_SUBCOMMAND);
+        await this.writeToPortAndWaitForReadline('AT+CSQ\r', MUTEX_SUBCOMMAND);
+
+        mutex.unlock(MUTEX_COMMAND, 'queryCopsAndSignalQuality');
         resolve(true);
     });
 };
diff --git a/modem-tester.js b/modem-tester.js
index 577d026..3b42b40 100644
--- a/modem-tester.js
+++ b/modem-tester.js
@@ -38,7 +38,8 @@ const port = new SerialPort(config.modem.device, { baudRate: 115200 }, async (er
     logger.info(`**** Signal Quality: ${signalQuality}`);
 
     setInterval(() => {
-        modemCommands.querySignalQuality();
+        // modemCommands.querySignalQuality();
+        modemCommands.queryCOPSAndSignalQuality();
     }, (config && config.interval_beetwen_signal_strength_ms) || 30000);
 });
 
-- 
1.9.0