Blame view

lib/modem-commands/index.js 12.1 KB
eb83d58a7   Adhidarma Hadiwinoto   jsdoc
1
2
3
  /**
   * Modul modem-commands
   *
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
4
   * @module modem-commands
eb83d58a7   Adhidarma Hadiwinoto   jsdoc
5
   */
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
6
7
8
9
  /**
   * Label mutex command
   * @static
   */
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
10
  const MUTEX_COMMAND = 'COMMAND';
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
11

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
12
13
14
15
  /**
   * Label mutex subcommand
   * @static
   */
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
16
  const MUTEX_SUBCOMMAND = 'SUBCOMMAND';
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
17

eb83d58a7   Adhidarma Hadiwinoto   jsdoc
18
19
  /**
   * CTRL-Z string
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
20
   * @static
eb83d58a7   Adhidarma Hadiwinoto   jsdoc
21
   */
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
22
  const CTRLZ = '\u001a';
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
23

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
24

ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
25
  const pdu = require('node-pdu');
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
26
  const uuidv1 = require('uuid/v1');
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
27

8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
28
  const ParserReadline = require('@serialport/parser-readline');
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
29
  const ParserRegex = require('@serialport/parser-regex');
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
30
  const ParserReady = require('@serialport/parser-ready');
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
31

e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
32
  const logger = require('komodo-sdk/logger');
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
33
34
35
  const mutex = require('../mutex-common');
  const parsers = require('../serialport-parsers');
  const modemInfo = require('../modem-info');
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
36

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
37
  // let port;
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
38
39
40
  
  function writeToPort(data) {
      return new Promise((resolve) => {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
41
          const port = global.MODEM_PORT;
3522ae5bc   Adhidarma Hadiwinoto   MODEM-INFO: stuck...
42
          modemInfo.lastWriteTs = new Date();
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
43
44
          port.write(data, (err, bytesWritten) => {
              if (err) logger.warn(`ERROR: ${err.toString()}`);
9883a918f   Adhidarma Hadiwinoto   Urutan log
45
              logger.verbose('OUTGOING', { data: data.toString(), bytesWritten, err });
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
46
47
48
49
              resolve(bytesWritten);
          });
      });
  }
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
50
  function writeToPortAndWaitForReadline(cmd, lockName) {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
51
      const port = global.MODEM_PORT;
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
52
      let resolved = false;
8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
53
54
55
      return new Promise(async (resolve) => {
          const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER });
          parser.on('data', (data) => {
afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
56
57
              port.unpipe(parser);
              mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim());
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
58
59
60
61
              if (!resolved) {
                  resolved = true;
                  resolve(data);
              }
afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
62
63
64
65
66
67
          });
  
          await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim());
          port.pipe(parser);
          await writeToPort(cmd);
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
68
  }
afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
69

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
70
  function writeToPortAndWaitForOkOrError(cmd, lockName) {
afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
71
      return new Promise(async (resolve) => {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
72
          const port = global.MODEM_PORT;
5b0551633   Adhidarma Hadiwinoto   Regex on writeToP...
73
74
          const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r
  / });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
75

afe1003d1   Adhidarma Hadiwinoto   Using modemComman...
76
          parser.on('data', (data) => {
8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
77
78
79
80
81
82
83
84
85
              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);
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
86
  }
8f7f6a139   Adhidarma Hadiwinoto   writeToPortAndWai...
87

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
88
89
90
91
92
93
  /**
   * Sleep async
   * @static
   * @param {number} ms - Milliseconds to sleep
   * @return {Promise}
   */
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
94
  function sleep(ms) {
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
95
96
97
98
99
      return new Promise((resolve) => {
          setTimeout(() => {
              resolve();
          }, ms || 0);
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
100
  }
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
101

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
102
103
104
105
106
107
108
109
110
111
112
  /**
   * Set port
   * @static
   * @param {SerialPort} val
   */
  
  /*
  function setPort(val) {
      // port = val || global.MODEM_PORT;
  }
  */
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
113

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
114
  function querySignalQuality() {
e509607c5   Adhidarma Hadiwinoto   MODEM-COMMANDS: CSQ
115
116
117
118
119
120
121
122
123
124
      return new Promise(async (resolve) => {
          if (!mutex.tryLock(MUTEX_COMMAND, 'querySignalQuality')) {
              resolve(false);
              return;
          }
  
          await writeToPort('AT+CSQ\r');
          mutex.unlock(MUTEX_COMMAND, 'querySignalQuality');
          resolve(true);
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
125
  }
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
126

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
127
  function queryCOPS(lockName) {
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
128
      return new Promise(async (resolve) => {
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
129
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryCOPS');
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
130
          await writeToPort('AT+COPS?\r');
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
131
132
133
          mutex.unlock(lockName || MUTEX_COMMAND, 'queryCOPS');
          resolve(true);
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
134
  }
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
135

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
136
  function queryCOPSAndSignalQuality(skipOnLocked) {
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
137
      return new Promise(async (resolve) => {
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
138
139
140
          if (!skipOnLocked) {
              await mutex.lock(MUTEX_COMMAND);
          } else if (!mutex.tryLock(MUTEX_COMMAND, 'queryCOPSAndSignalQuality')) {
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
141
142
143
              resolve(false);
              return;
          }
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
144
145
          await writeToPortAndWaitForOkOrError('AT+COPS?\r', MUTEX_SUBCOMMAND);
          await writeToPortAndWaitForOkOrError('AT+CSQ\r', MUTEX_SUBCOMMAND);
47910cce6   Adhidarma Hadiwinoto   queryCOPSAndSigna...
146
147
  
          mutex.unlock(MUTEX_COMMAND, 'queryCopsAndSignalQuality');
dee2ba97a   Adhidarma Hadiwinoto   queryCOPS
148
149
          resolve(true);
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
150
  }
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
151

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
152
  function queryIMEI(lockName) {
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
153
      return new Promise(async (resolve) => {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
154
          const port = global.MODEM_PORT;
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
155
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
156

e77dfd454   Adhidarma Hadiwinoto   queryIMEI
157
          parser.on('data', (data) => {
9883a918f   Adhidarma Hadiwinoto   Urutan log
158
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMEI' });
4cb2459b1   Adhidarma Hadiwinoto   queryIMEI unpipe ...
159
              port.unpipe(parser);
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
160
              mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMEI');
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
161
              modemInfo.imei = data.toString().trim() || null;
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
162
              logger.info('IMEI extracted', { imei: modemInfo.imei });
7f00b5aeb   Adhidarma Hadiwinoto   modemInfo.imei
163
              resolve(modemInfo.imei);
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
164
          });
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
165
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMEI');
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
166
167
168
  
          port.pipe(parser);
          await writeToPort('AT+CGSN\r');
e77dfd454   Adhidarma Hadiwinoto   queryIMEI
169
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
170
  }
b77537954   Adhidarma Hadiwinoto   queryIMSI
171

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
172
  function queryIMSI(lockName) {
b77537954   Adhidarma Hadiwinoto   queryIMSI
173
      return new Promise(async (resolve) => {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
174
          const port = global.MODEM_PORT;
b77537954   Adhidarma Hadiwinoto   queryIMSI
175
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
176

b77537954   Adhidarma Hadiwinoto   queryIMSI
177
          parser.on('data', (data) => {
9883a918f   Adhidarma Hadiwinoto   Urutan log
178
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMSI' });
b77537954   Adhidarma Hadiwinoto   queryIMSI
179
              port.unpipe(parser);
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
180
              mutex.unlock(lockName || MUTEX_COMMAND, 'queryIMSI');
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
181
              modemInfo.imsi = data.toString().trim() || null;
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
182
              logger.info('IMSI extracted', { imsi: modemInfo.imsi });
b77537954   Adhidarma Hadiwinoto   queryIMSI
183
184
              resolve(modemInfo.imsi);
          });
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
185
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryIMSI');
b77537954   Adhidarma Hadiwinoto   queryIMSI
186
187
188
189
  
          port.pipe(parser);
          await writeToPort('AT+CIMI\r');
      });
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
190
  }
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
191

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
192
  async function queryIMEIAndIMSI() {
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
193
      await mutex.lock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
194
195
      const imei = await queryIMEI(MUTEX_SUBCOMMAND);
      const imsi = await queryIMSI(MUTEX_SUBCOMMAND);
c5e93b5ea   Adhidarma Hadiwinoto   queryIMEIAndIMSI
196

08d2d23e1   Adhidarma Hadiwinoto   Perbaikan mutex u...
197
      await mutex.unlock(MUTEX_COMMAND, 'queryIMEIAndIMSI');
caac94e43   Adhidarma Hadiwinoto   modemInfo integrated
198
      return { imei, imsi };
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
199
  }
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
200

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
201
  function queryManufacturer(lockName) {
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
202
      return new Promise(async (resolve) => {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
203
          const port = global.MODEM_PORT;
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
204
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
205

ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
206
207
208
209
210
211
212
213
214
215
216
217
218
219
          parser.on('data', (data) => {
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserManufacturer' });
              port.unpipe(parser);
              mutex.unlock(lockName || MUTEX_COMMAND, 'parserManufacturer');
              modemInfo.manufacturer = data.toString().trim() || null;
              logger.info('Manufacturer extracted', { manufacturer: modemInfo.manufacturer });
              resolve(modemInfo.manufacturer);
          });
  
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryManufacturer');
  
          port.pipe(parser);
          await writeToPort('AT+CGMI\r');
      });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
220
  }
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
221

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
222
  function queryModel(lockName) {
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
223
      return new Promise(async (resolve) => {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
224
          const port = global.MODEM_PORT;
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
225
          const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
226

ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
227
228
229
230
231
232
233
234
235
236
237
238
239
240
          parser.on('data', (data) => {
              logger.verbose('INCOMING', { data: data.toString(), parser: 'parserModel' });
              port.unpipe(parser);
              mutex.unlock(lockName || MUTEX_COMMAND, 'parserModel');
              modemInfo.model = data.toString().trim() || null;
              logger.info('Model extracted', { model: modemInfo.model });
              resolve(modemInfo.model);
          });
  
          await mutex.lock(lockName || MUTEX_COMMAND, 'queryModel');
  
          port.pipe(parser);
          await writeToPort('AT+CGMM\r');
      });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
241
  }
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
242

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
243
244
245
246
  /**
   * Menulis CTRL-Z ke port.
   * @static
   */
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
247
248
249
  async function sendCtrlZ() {
      await writeToPort(CTRLZ);
  }
ea7f35320   Adhidarma Hadiwinoto   Refactor modem-co...
250

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
251
  async function initATCommands() {
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
252
      await mutex.lock(MUTEX_COMMAND, 'INIT MODEM');
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
253
      await this.writeToPortAndWaitForOkOrError(`${CTRLZ}ATE0\r`, MUTEX_SUBCOMMAND);
fad855259   Adhidarma Hadiwinoto   Perbaikan waitFor...
254
255
256
      await this.writeToPortAndWaitForOkOrError('AT+CMGF=0\r', MUTEX_SUBCOMMAND);
      await this.writeToPortAndWaitForOkOrError('AT+CNMI=1,2,0,1,0\r', MUTEX_SUBCOMMAND);
      mutex.unlock(MUTEX_COMMAND, 'INIT MODEM');
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
257
  }
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
258

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
259
260
261
262
263
  /**
   * Menulis awal pesan PDU.
   *
   * @param {number} pduLength
   */
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
264
265
  function sendCMGSPdu(pduLength) {
      return new Promise((resolve) => {
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
266
          const port = global.MODEM_PORT;
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
267
          const parser = new ParserReady({ delimiter: '>' });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
268

0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
269
270
271
272
273
274
275
276
277
278
279
280
          parser.on('data', () => {
              logger.verbose('Got ">" message prompt, gonna to write PDU message');
              port.unpipe(parser);
              mutex.unlock(MUTEX_SUBCOMMAND, 'sendSmsPduCommand');
              resolve(true);
          });
  
          mutex.lock(MUTEX_SUBCOMMAND, 'sendSmsPduCommand');
          port.pipe(parser);
          writeToPort(`AT+CMGS=${pduLength}\r`);
      });
  }
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
281
282
283
284
285
286
287
288
  /**
   * Mengirim sms
   * @param  {string} destination - nomor tujuan
   * @param  {string} msg - isi pesan
   * @return {Promise}
   * @static
   */
  function sendSMS(destination, msg) {
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
289
      return new Promise(async (resolve) => {
1d6334a9b   Adhidarma Hadiwinoto   Coba sms error
290
291
          async function responseHandler(data) {
              logger.verbose('SMS sent callback called', { data });
beba81d88   Adhidarma Hadiwinoto   SMS error
292
293
294
295
296
297
298
  
              if (data.indexOf('ERROR') >= 0 || data.indexOf('+CMS ERROR') >= 0 || data.indexOf('+CMGS') >= 0) {
                  logger.verbose('SMS sent');
                  parsers.setSmsSentCallback(null);
                  mutex.unlock(MUTEX_COMMAND, 'sendSMS');
                  resolve(data.indexOf('ERROR') >= 0 ? null : data.toString().trim());
              }
1d6334a9b   Adhidarma Hadiwinoto   Coba sms error
299
          }
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
          await mutex.lock(MUTEX_COMMAND, 'sendSMS');
  
          if (!destination || !destination.trim()) {
              resolve(false);
              return;
          }
  
          if (!msg || !msg.trim()) {
              resolve(false);
              return;
          }
  
          const correctedDestination = `+${destination.replace(/^0/, '62')}`.replace(/^\++/, '+');
          logger.verbose(`Sending sms to ${correctedDestination}`, { msg });
  
          await this.writeToPortAndWaitForOkOrError('AT+CMGF=0\r', MUTEX_SUBCOMMAND);
  
          const submit = pdu.Submit();
          submit.setAddress(correctedDestination);
          submit.setData(msg.trim());
          submit.getType().setSrr(0);
  
          await sendCMGSPdu(Math.floor(submit.toString().length / 2) - 1);
beba81d88   Adhidarma Hadiwinoto   SMS error
323
          // await writeToPortAndWaitForOkOrError(`${submit.toString()}${CTRLZ}`, MUTEX_SUBCOMMAND);
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
324

beba81d88   Adhidarma Hadiwinoto   SMS error
325
326
          parsers.setSmsSentCallback(responseHandler);
          await writeToPort(`${submit.toString()}${CTRLZ}`, MUTEX_SUBCOMMAND);
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
327
      });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
328
  }
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
329

2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
  /**
   * 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) {
0ea228ab6   Adhidarma Hadiwinoto   sms and ussd
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
      return new Promise(async (resolve) => {
          const includeCUSD2 = _includeCUSD2 || 0;
          const sessionId = _sessionId || uuidv1();
  
          async function responseHandler(data) {
              logger.verbose('Processing USSD response', { data });
              parsers.setUssdCallback(null);
  
              if (includeCUSD2 === 1 || includeCUSD2 === 2) {
                  await writeToPortAndWaitForOkOrError('AT+CUSD=2\r', MUTEX_SUBCOMMAND);
              }
  
              mutex.unlock(MUTEX_COMMAND, `executeUSSD ${sessionId}`);
              resolve(data);
          }
  
          mutex.lock(MUTEX_COMMAND, `executeUSSD ${sessionId}`);
          parsers.setUssdCallback(responseHandler);
  
          await this.writeToPortAndWaitForOkOrError(`${CTRLZ}AT+CMGF=0\r`, MUTEX_SUBCOMMAND);
  
          if (includeCUSD2 === -1 || includeCUSD2 === 2) {
              await this.writeToPortAndWaitForOkOrError('AT+CUSD=2\r', MUTEX_SUBCOMMAND);
          }
  
          await writeToPort(`AT+CUSD=1,"${code}",15\r`, MUTEX_SUBCOMMAND);
      });
2a4678f67   Adhidarma Hadiwinoto   global MODEM_PORT
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
  }
  
  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;