diff --git a/lib/modem.js b/lib/modem.js index 4ab4a81..8ed3dba 100644 --- a/lib/modem.js +++ b/lib/modem.js @@ -5,6 +5,9 @@ const MAX_LAST_DATA_AGE_MS = 3 * 60 * 1000; const REGEX_WAIT_FOR_OK_OR_ERROR = /\n(?:OK|ERROR)\r/; // const REGEX_WAIT_FOR_OK_OR_ERROR_USSD = /\n(?:OK|ERROR)\r/; +const CUSD2_BEFORE = -1; +const CUSD2_AFTER = 1; + const moment = require('moment'); const SerialPort = require('serialport'); const ParserReadline = require('@serialport/parser-readline'); @@ -311,21 +314,42 @@ async function sendSMS(destination, msg) { * * @param {string} code - Kode USSD */ -function executeUSSD(code) { +function executeUSSD(code, includeCUSD2) { return new Promise(async (resolve) => { - const parser = new ParserRegex({ regex: REGEX_WAIT_FOR_OK_OR_ERROR }); - parser.on('data', (data) => { - port.unpipe(parser); + const parserMain = new ParserRegex({ regex: REGEX_WAIT_FOR_OK_OR_ERROR }); + parserMain.on('data', (data) => { + port.unpipe(parserMain); mutex.releaseLockWaitForSubCommand(); resolve(data); }); + const parserCUSD2 = new ParserRegex({ regex: REGEX_WAIT_FOR_OK_OR_ERROR }); + parserCUSD2.on('data', () => { + port.unpipe(parserCUSD2); + mutex.releaseLockWaitForSubCommand(); + }); + logger.verbose('Waiting for command lock to execute USSD'); await mutex.setLockWaitForCommand(); + if (includeCUSD2 === CUSD2_BEFORE) { + logger.info('Terminating existing USSD session'); + await mutex.setLockWaitForSubCommand(); + port.pipe(parserCUSD2); + await writeToPort('AT+CUSD=2\r'); + } + await mutex.setLockWaitForSubCommand(); + port.pipe(parserMain); await writeToPort(`AT+CUSD=1,"${code}",15\r`); + if (includeCUSD2 === CUSD2_AFTER) { + logger.info('Terminating existing USSD session'); + await mutex.setLockWaitForSubCommand(); + port.pipe(parserCUSD2); + await writeToPort('AT+CUSD=2\r'); + } + await mutex.setLockWaitForSubCommand(); mutex.releaseLockWaitForSubCommand(); @@ -389,6 +413,9 @@ function init() { init(); +exports.CUSD2_BEFORE = CUSD2_BEFORE; +exports.CUSD2_AFTER = CUSD2_AFTER; + exports.modemInfo = modemInfo; exports.sendSMS = sendSMS; exports.executeUSSD = executeUSSD;