Blame view

lib/serialport-parsers.js 2.79 KB
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
1
2
  const PARSER_READLINE_DELIMITER = '\r
  ';
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
3
4
5
  const PARSER_WAIT_FOR_OK_OR_ERROR_REGEX = /\r
  (?:OK|ERROR)\r
  /;
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
6
7
  
  const ParserReadline = require('@serialport/parser-readline');
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
8
  const ParserRegex = require('@serialport/parser-regex');
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
9
  const logger = require('komodo-sdk/logger');
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
10
  const dbCops = require('./db-cops');
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
11
12
13
14
15
16
17
18
19
20
  let port;
  
  exports.setPort = function setPort(val) {
      logger.info('SERIALPORT-PARSERS: setting port');
      port = val;
  };
  
  exports.getPort = function getPort() {
      return port;
  };
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
21
22
  function onCSQ(data) {
      const val = data.toString().trim().match(/\+CSQ:\s*(.*)/);
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
23
      if (!val || !val[1]) return null;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
24

cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
25
26
      logger.info('Signal quality extracted', { signalQuality: val[1] });
      return val[1];
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
27
28
29
  }
  
  function onCOPS(data) {
cec4e78d3   Adhidarma Hadiwinoto   Perbaikan extract...
30
31
32
33
      const val = data.toString().trim().match(/\+COPS:\s*(.*)/);
      if (!val || !val[1]) return null;
  
      const cops = val[1];
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
34
35
36
37
38
39
40
41
42
43
44
45
46
  
      if (!cops) return null;
      const [mode, format, networkId] = cops.split(',');
      const networkName = networkId ? dbCops[networkId] || networkId : null;
  
      logger.verbose('COPS extracted', {
          cops, mode, format, networkId, networkName,
      });
  
      return {
          cops, mode, format, networkId, networkName,
      };
  }
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  function isResultCodeIs(data, resultCode) {
      if (!data) return false;
      const cleanedData = (data.toString() || '').trim();
      if (!cleanedData) return false;
  
      if (resultCode.indexOf('+') !== 0) {
          // eslint-disable-next-line no-param-reassign
          resultCode = `+${resultCode}`;
      }
  
      if (resultCode.search(/:$/) < 0) {
          // eslint-disable-next-line no-param-reassign
          resultCode += ':';
      }
  
      return cleanedData.indexOf(resultCode) === 0;
  }
  
  const parserReadline = new ParserReadline({ delimiter: PARSER_READLINE_DELIMITER });
  parserReadline.on('data', (data) => {
      logger.verbose('INCOMING', { parser: 'parserReadLine', data: `${data.toString()}${PARSER_READLINE_DELIMITER}` });
  
      if (!data) return;
      if (isResultCodeIs(data, 'CSQ')) {
          logger.verbose('Got a signal quality report', { data: data.toString() });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
72
          onCSQ(data);
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
73
74
      } else if (isResultCodeIs(data, 'COPS:')) {
          logger.verbose('Got a COPS report', { data: data.toString() });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
75
          onCOPS(data);
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
76
77
78
79
80
81
      } else if (isResultCodeIs(data, 'CMT')) {
          logger.verbose('Got a new message report', { data: data.toString() });
      } else if (isResultCodeIs(data, 'CMTI')) {
          logger.verbose('Got a new message notification report', { data: data.toString() });
      }
  });
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
82
83
84
85
  const parserWaitForOkOrError = new ParserRegex({ regex: PARSER_WAIT_FOR_OK_OR_ERROR_REGEX });
  parserWaitForOkOrError.on('data', (data) => {
      logger.verbose('INCOMING', { parser: 'parserWaitForOkOrError', data: data.toString() });
  });
fe3033bbf   Adhidarma Hadiwinoto   MODEM-TESTER: rep...
86
  exports.parserReadline = parserReadline;
9ee5f03e0   Adhidarma Hadiwinoto   MODEM-TESTER: onCops
87
  exports.parserWaitForOkOrError = parserWaitForOkOrError;