From 2a4678f67a1c6d279a2d4b343eb0cd9edd0a8242 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Wed, 16 Oct 2019 12:49:54 +0700
Subject: [PATCH] global MODEM_PORT

---
 lib/modem-commands/index.js | 146 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 116 insertions(+), 30 deletions(-)

diff --git a/lib/modem-commands/index.js b/lib/modem-commands/index.js
index f2b4551..293d291 100644
--- a/lib/modem-commands/index.js
+++ b/lib/modem-commands/index.js
@@ -1,22 +1,28 @@
 /**
  * Modul modem-commands
  *
- * @module
+ * @module modem-commands
  */
 
 
+/**
+ * Label mutex command
+ * @static
+ */
 const MUTEX_COMMAND = 'COMMAND';
-exports.MUTEX_COMMAND = MUTEX_COMMAND;
 
+/**
+ * Label mutex subcommand
+ * @static
+ */
 const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
-exports.MUTEX_SUBCOMMAND = MUTEX_SUBCOMMAND;
 
 /**
  * CTRL-Z string
- * @constant
+ * @static
  */
 const CTRLZ = '\u001a';
-exports.CTRLZ = CTRLZ;
+
 
 const pdu = require('node-pdu');
 const uuidv1 = require('uuid/v1');
@@ -30,10 +36,12 @@ const mutex = require('../mutex-common');
 const parsers = require('../serialport-parsers');
 const modemInfo = require('../modem-info');
 
-let port;
+// let port;
 
 function writeToPort(data) {
     return new Promise((resolve) => {
+        const port = global.MODEM_PORT;
+
         modemInfo.lastWriteTs = new Date();
         port.write(data, (err, bytesWritten) => {
             if (err) logger.warn(`ERROR: ${err.toString()}`);
@@ -43,9 +51,9 @@ function writeToPort(data) {
         });
     });
 }
-exports.writeToPort = writeToPort;
 
 function writeToPortAndWaitForReadline(cmd, lockName) {
+    const port = global.MODEM_PORT;
     let resolved = false;
 
     return new Promise(async (resolve) => {
@@ -64,11 +72,12 @@ function writeToPortAndWaitForReadline(cmd, lockName) {
         await writeToPort(cmd);
     });
 }
-exports.writeToPortAndWaitForReadline = writeToPortAndWaitForReadline;
 
 function writeToPortAndWaitForOkOrError(cmd, lockName) {
     return new Promise(async (resolve) => {
+        const port = global.MODEM_PORT;
         const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r\n/ });
+
         parser.on('data', (data) => {
             port.unpipe(parser);
             mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim());
@@ -80,8 +89,13 @@ function writeToPortAndWaitForOkOrError(cmd, lockName) {
         await writeToPort(cmd);
     });
 }
-exports.writeToPortAndWaitForOkOrError = writeToPortAndWaitForOkOrError;
 
+/**
+ * Sleep async
+ * @static
+ * @param {number} ms - Milliseconds to sleep
+ * @return {Promise}
+ */
 function sleep(ms) {
     return new Promise((resolve) => {
         setTimeout(() => {
@@ -89,11 +103,18 @@ function sleep(ms) {
         }, ms || 0);
     });
 }
-exports.sleep = sleep;
 
-exports.setPort = function setPort(val) {
-    port = val;
-};
+/**
+ * Set port
+ * @static
+ * @param {SerialPort} val
+ */
+
+/*
+function setPort(val) {
+    // port = val || global.MODEM_PORT;
+}
+*/
 
 function querySignalQuality() {
     return new Promise(async (resolve) => {
@@ -107,7 +128,6 @@ function querySignalQuality() {
         resolve(true);
     });
 }
-exports.querySignalQuality = querySignalQuality;
 
 function queryCOPS(lockName) {
     return new Promise(async (resolve) => {
@@ -117,7 +137,6 @@ function queryCOPS(lockName) {
         resolve(true);
     });
 }
-exports.queryCOPS = queryCOPS;
 
 function queryCOPSAndSignalQuality(skipOnLocked) {
     return new Promise(async (resolve) => {
@@ -135,11 +154,12 @@ function queryCOPSAndSignalQuality(skipOnLocked) {
         resolve(true);
     });
 }
-exports.queryCOPSAndSignalQuality = queryCOPSAndSignalQuality;
 
 function queryIMEI(lockName) {
     return new Promise(async (resolve) => {
+        const port = global.MODEM_PORT;
         const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
+
         parser.on('data', (data) => {
             logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMEI' });
             port.unpipe(parser);
@@ -155,11 +175,12 @@ function queryIMEI(lockName) {
         await writeToPort('AT+CGSN\r');
     });
 }
-exports.queryIMEI = queryIMEI;
 
 function queryIMSI(lockName) {
     return new Promise(async (resolve) => {
+        const port = global.MODEM_PORT;
         const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
+
         parser.on('data', (data) => {
             logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMSI' });
             port.unpipe(parser);
@@ -175,9 +196,8 @@ function queryIMSI(lockName) {
         await writeToPort('AT+CIMI\r');
     });
 }
-exports.queryIMSI = queryIMSI;
 
-exports.queryIMEIAndIMSI = async function queryIMEIAndIMSI() {
+async function queryIMEIAndIMSI() {
     await mutex.lock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
 
     const imei = await queryIMEI(MUTEX_SUBCOMMAND);
@@ -185,11 +205,13 @@ exports.queryIMEIAndIMSI = async function queryIMEIAndIMSI() {
 
     await mutex.unlock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
     return { imei, imsi };
-};
+}
 
-exports.queryManufacturer = function queryManufacturer(lockName) {
+function queryManufacturer(lockName) {
     return new Promise(async (resolve) => {
+        const port = global.MODEM_PORT;
         const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
+
         parser.on('data', (data) => {
             logger.verbose('INCOMING', { data: data.toString(), parser: 'parserManufacturer' });
             port.unpipe(parser);
@@ -204,11 +226,13 @@ exports.queryManufacturer = function queryManufacturer(lockName) {
         port.pipe(parser);
         await writeToPort('AT+CGMI\r');
     });
-};
+}
 
-exports.queryModel = function queryModel(lockName) {
+function queryModel(lockName) {
     return new Promise(async (resolve) => {
+        const port = global.MODEM_PORT;
         const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
+
         parser.on('data', (data) => {
             logger.verbose('INCOMING', { data: data.toString(), parser: 'parserModel' });
             port.unpipe(parser);
@@ -223,12 +247,15 @@ exports.queryModel = function queryModel(lockName) {
         port.pipe(parser);
         await writeToPort('AT+CGMM\r');
     });
-};
+}
 
+/**
+ * Menulis CTRL-Z ke port.
+ * @static
+ */
 async function sendCtrlZ() {
     await writeToPort(CTRLZ);
 }
-exports.sendCtrlZ = sendCtrlZ;
 
 async function initATCommands() {
     await mutex.lock(MUTEX_COMMAND, 'INIT MODEM');
@@ -237,11 +264,17 @@ async function initATCommands() {
     await this.writeToPortAndWaitForOkOrError('AT+CNMI=1,2,0,1,0\r', MUTEX_SUBCOMMAND);
     mutex.unlock(MUTEX_COMMAND, 'INIT MODEM');
 }
-exports.initATCommands = initATCommands;
 
+/**
+ * Menulis awal pesan PDU.
+ *
+ * @param {number} pduLength
+ */
 function sendCMGSPdu(pduLength) {
     return new Promise((resolve) => {
+        const port = global.MODEM_PORT;
         const parser = new ParserReady({ delimiter: '>' });
+
         parser.on('data', () => {
             logger.verbose('Got ">" message prompt, gonna to write PDU message');
             port.unpipe(parser);
@@ -255,7 +288,14 @@ function sendCMGSPdu(pduLength) {
     });
 }
 
-exports.sendSMS = function sendSMS(destination, msg) {
+/**
+ * Mengirim sms
+ * @param  {string} destination - nomor tujuan
+ * @param  {string} msg - isi pesan
+ * @return {Promise}
+ * @static
+ */
+function sendSMS(destination, msg) {
     return new Promise(async (resolve) => {
         async function responseHandler(data) {
             logger.verbose('SMS sent callback called', { data });
@@ -296,9 +336,23 @@ exports.sendSMS = function sendSMS(destination, msg) {
         parsers.setSmsSentCallback(responseHandler);
         await writeToPort(`${submit.toString()}${CTRLZ}`, MUTEX_SUBCOMMAND);
     });
-};
+}
 
-exports.executeUSSD = function executeUSSD(code, _includeCUSD2, _sessionId) {
+/**
+ * Ekseksusi kode USSD.
+ * <br>
+ * <br>Pilihan includeCUSD2:
+ * <br>-1: sebelum
+ * <br>0: tidak (default)
+ * <br>1: sesudah
+ * <br>2: sebelum dan sesudah
+ *
+ * @static
+ * @param  {string} code - Kode USSD
+ * @param  {number} [includeCUSD2=0] - Apakah ingin otomatis memasukkan CUSD=2
+ * @return {Promise}
+ */
+function executeUSSD(code, _includeCUSD2, _sessionId) {
     return new Promise(async (resolve) => {
         const includeCUSD2 = _includeCUSD2 || 0;
         const sessionId = _sessionId || uuidv1();
@@ -326,4 +380,36 @@ exports.executeUSSD = function executeUSSD(code, _includeCUSD2, _sessionId) {
 
         await writeToPort(`AT+CUSD=1,"${code}",15\r`, MUTEX_SUBCOMMAND);
     });
-};
+}
+
+exports.MUTEX_COMMAND = MUTEX_COMMAND;
+exports.MUTEX_SUBCOMMAND = MUTEX_SUBCOMMAND;
+exports.CTRLZ = CTRLZ;
+
+/**
+ * Modem info.
+ * @type {object}
+ */
+exports.modemInfo = modemInfo;
+// exports.setPort = setPort;
+
+exports.writeToPort = writeToPort;
+exports.writeToPortAndWaitForReadline = writeToPortAndWaitForReadline;
+exports.writeToPortAndWaitForOkOrError = writeToPortAndWaitForOkOrError;
+exports.sleep = sleep;
+
+exports.querySignalQuality = querySignalQuality;
+exports.queryCOPS = queryCOPS;
+exports.queryCOPSAndSignalQuality = queryCOPSAndSignalQuality;
+
+exports.queryIMEI = queryIMEI;
+exports.queryIMSI = queryIMSI;
+exports.queryIMEIAndIMSI = queryIMEIAndIMSI;
+
+exports.queryManufacturer = queryManufacturer;
+exports.queryModel = queryModel;
+
+exports.sendCtrlZ = sendCtrlZ;
+exports.initATCommands = initATCommands;
+exports.sendSMS = sendSMS;
+exports.executeUSSD = executeUSSD;
-- 
1.9.0