Commit e14021d4c0d5962f1693c4ea31b836120c564dcb
1 parent
47910cce60
Exists in
master
queryCOPSAndSignalQualityising writeToPortAndWaitForOkOrError
Showing 1 changed file with 2 additions and 2 deletions Inline Diff
lib/modem-commands.js
1 | const MUTEX_COMMAND = 'COMMAND'; | 1 | const MUTEX_COMMAND = 'COMMAND'; |
2 | const MUTEX_SUBCOMMAND = 'SUBCOMMAND'; | 2 | const MUTEX_SUBCOMMAND = 'SUBCOMMAND'; |
3 | 3 | ||
4 | const ParserReadline = require('@serialport/parser-readline'); | 4 | const ParserReadline = require('@serialport/parser-readline'); |
5 | const ParserRegex = require('@serialport/parser-regex'); | 5 | const ParserRegex = require('@serialport/parser-regex'); |
6 | 6 | ||
7 | const logger = require('komodo-sdk/logger'); | 7 | const logger = require('komodo-sdk/logger'); |
8 | const mutex = require('./mutex-common'); | 8 | const mutex = require('./mutex-common'); |
9 | const parsers = require('./serialport-parsers'); | 9 | const parsers = require('./serialport-parsers'); |
10 | const modemInfo = require('./modem-info'); | 10 | const modemInfo = require('./modem-info'); |
11 | 11 | ||
12 | let port; | 12 | let port; |
13 | 13 | ||
14 | function writeToPort(data) { | 14 | function writeToPort(data) { |
15 | return new Promise((resolve) => { | 15 | return new Promise((resolve) => { |
16 | port.write(data, (err, bytesWritten) => { | 16 | port.write(data, (err, bytesWritten) => { |
17 | if (err) logger.warn(`ERROR: ${err.toString()}`); | 17 | if (err) logger.warn(`ERROR: ${err.toString()}`); |
18 | 18 | ||
19 | logger.verbose('OUTGOING', { data: data.toString(), bytesWritten, err }); | 19 | logger.verbose('OUTGOING', { data: data.toString(), bytesWritten, err }); |
20 | resolve(bytesWritten); | 20 | resolve(bytesWritten); |
21 | }); | 21 | }); |
22 | }); | 22 | }); |
23 | } | 23 | } |
24 | 24 | ||
25 | exports.writeToPortAndWaitForReadline = function writeToPortAndWaitForReadline(cmd, lockName) { | 25 | exports.writeToPortAndWaitForReadline = function writeToPortAndWaitForReadline(cmd, lockName) { |
26 | let resolved = false; | 26 | let resolved = false; |
27 | 27 | ||
28 | return new Promise(async (resolve) => { | 28 | return new Promise(async (resolve) => { |
29 | const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER }); | 29 | const parser = new ParserReadline({ delimiter: parsers.PARSER_READLINE_DELIMITER }); |
30 | parser.on('data', (data) => { | 30 | parser.on('data', (data) => { |
31 | port.unpipe(parser); | 31 | port.unpipe(parser); |
32 | mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim()); | 32 | mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim()); |
33 | if (!resolved) { | 33 | if (!resolved) { |
34 | resolved = true; | 34 | resolved = true; |
35 | resolve(data); | 35 | resolve(data); |
36 | } | 36 | } |
37 | }); | 37 | }); |
38 | 38 | ||
39 | await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim()); | 39 | await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim()); |
40 | port.pipe(parser); | 40 | port.pipe(parser); |
41 | await writeToPort(cmd); | 41 | await writeToPort(cmd); |
42 | }); | 42 | }); |
43 | }; | 43 | }; |
44 | 44 | ||
45 | exports.writeToPortAndWaitForOkOrError = function writeToPortAndWaitForOkOrError(cmd, lockName) { | 45 | exports.writeToPortAndWaitForOkOrError = function writeToPortAndWaitForOkOrError(cmd, lockName) { |
46 | return new Promise(async (resolve) => { | 46 | return new Promise(async (resolve) => { |
47 | const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r\n/ }); | 47 | const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r\n/ }); |
48 | parser.on('data', (data) => { | 48 | parser.on('data', (data) => { |
49 | port.unpipe(parser); | 49 | port.unpipe(parser); |
50 | mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim()); | 50 | mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim()); |
51 | resolve(data); | 51 | resolve(data); |
52 | }); | 52 | }); |
53 | 53 | ||
54 | await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim()); | 54 | await mutex.lock(lockName || MUTEX_COMMAND, cmd.trim()); |
55 | port.pipe(parser); | 55 | port.pipe(parser); |
56 | await writeToPort(cmd); | 56 | await writeToPort(cmd); |
57 | }); | 57 | }); |
58 | }; | 58 | }; |
59 | 59 | ||
60 | exports.sleep = function sleep(ms) { | 60 | exports.sleep = function sleep(ms) { |
61 | return new Promise((resolve) => { | 61 | return new Promise((resolve) => { |
62 | setTimeout(() => { | 62 | setTimeout(() => { |
63 | resolve(); | 63 | resolve(); |
64 | }, ms || 0); | 64 | }, ms || 0); |
65 | }); | 65 | }); |
66 | }; | 66 | }; |
67 | 67 | ||
68 | 68 | ||
69 | exports.setPort = function setPort(val) { | 69 | exports.setPort = function setPort(val) { |
70 | port = val; | 70 | port = val; |
71 | }; | 71 | }; |
72 | 72 | ||
73 | exports.querySignalQuality = function querySignalQuality() { | 73 | exports.querySignalQuality = function querySignalQuality() { |
74 | return new Promise(async (resolve) => { | 74 | return new Promise(async (resolve) => { |
75 | if (!mutex.tryLock(MUTEX_COMMAND, 'querySignalQuality')) { | 75 | if (!mutex.tryLock(MUTEX_COMMAND, 'querySignalQuality')) { |
76 | resolve(false); | 76 | resolve(false); |
77 | return; | 77 | return; |
78 | } | 78 | } |
79 | 79 | ||
80 | await writeToPort('AT+CSQ\r'); | 80 | await writeToPort('AT+CSQ\r'); |
81 | mutex.unlock(MUTEX_COMMAND, 'querySignalQuality'); | 81 | mutex.unlock(MUTEX_COMMAND, 'querySignalQuality'); |
82 | resolve(true); | 82 | resolve(true); |
83 | }); | 83 | }); |
84 | }; | 84 | }; |
85 | 85 | ||
86 | exports.queryCOPS = function queryCOPS(lockName) { | 86 | exports.queryCOPS = function queryCOPS(lockName) { |
87 | return new Promise(async (resolve) => { | 87 | return new Promise(async (resolve) => { |
88 | await mutex.lock(lockName || MUTEX_COMMAND, 'queryCOPS'); | 88 | await mutex.lock(lockName || MUTEX_COMMAND, 'queryCOPS'); |
89 | await writeToPort('AT+COPS?\r'); | 89 | await writeToPort('AT+COPS?\r'); |
90 | mutex.unlock(lockName || MUTEX_COMMAND, 'queryCOPS'); | 90 | mutex.unlock(lockName || MUTEX_COMMAND, 'queryCOPS'); |
91 | resolve(true); | 91 | resolve(true); |
92 | }); | 92 | }); |
93 | }; | 93 | }; |
94 | 94 | ||
95 | exports.queryCOPSAndSignalQuality = function queryCOPSAndSignalQuality() { | 95 | exports.queryCOPSAndSignalQuality = function queryCOPSAndSignalQuality() { |
96 | return new Promise(async (resolve) => { | 96 | return new Promise(async (resolve) => { |
97 | if (!mutex.tryLock(MUTEX_COMMAND, 'queryCOPSAndSignalQuality')) { | 97 | if (!mutex.tryLock(MUTEX_COMMAND, 'queryCOPSAndSignalQuality')) { |
98 | resolve(false); | 98 | resolve(false); |
99 | return; | 99 | return; |
100 | } | 100 | } |
101 | 101 | ||
102 | await this.writeToPortAndWaitForReadline('AT+COPS?\r', MUTEX_SUBCOMMAND); | 102 | await this.writeToPortAndWaitForOkOrError('AT+COPS?\r', MUTEX_SUBCOMMAND); |
103 | await this.writeToPortAndWaitForReadline('AT+CSQ\r', MUTEX_SUBCOMMAND); | 103 | await this.writeToPortAndWaitForOkOrError('AT+CSQ\r', MUTEX_SUBCOMMAND); |
104 | 104 | ||
105 | mutex.unlock(MUTEX_COMMAND, 'queryCopsAndSignalQuality'); | 105 | mutex.unlock(MUTEX_COMMAND, 'queryCopsAndSignalQuality'); |
106 | resolve(true); | 106 | resolve(true); |
107 | }); | 107 | }); |
108 | }; | 108 | }; |
109 | 109 | ||
110 | exports.queryIMEI = function queryIMEI() { | 110 | exports.queryIMEI = function queryIMEI() { |
111 | return new Promise(async (resolve) => { | 111 | return new Promise(async (resolve) => { |
112 | const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); | 112 | const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); |
113 | parser.on('data', (data) => { | 113 | parser.on('data', (data) => { |
114 | logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMEI' }); | 114 | logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMEI' }); |
115 | port.unpipe(parser); | 115 | port.unpipe(parser); |
116 | mutex.unlock(MUTEX_COMMAND, 'queryIMEI'); | 116 | mutex.unlock(MUTEX_COMMAND, 'queryIMEI'); |
117 | modemInfo.imei = data.toString().trim(); | 117 | modemInfo.imei = data.toString().trim(); |
118 | resolve(modemInfo.imei); | 118 | resolve(modemInfo.imei); |
119 | }); | 119 | }); |
120 | 120 | ||
121 | await mutex.lock(MUTEX_COMMAND, 'queryIMEI'); | 121 | await mutex.lock(MUTEX_COMMAND, 'queryIMEI'); |
122 | 122 | ||
123 | port.pipe(parser); | 123 | port.pipe(parser); |
124 | await writeToPort('AT+CGSN\r'); | 124 | await writeToPort('AT+CGSN\r'); |
125 | }); | 125 | }); |
126 | }; | 126 | }; |
127 | 127 | ||
128 | exports.queryIMSI = function queryIMSI() { | 128 | exports.queryIMSI = function queryIMSI() { |
129 | return new Promise(async (resolve) => { | 129 | return new Promise(async (resolve) => { |
130 | const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); | 130 | const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); |
131 | parser.on('data', (data) => { | 131 | parser.on('data', (data) => { |
132 | logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMSI' }); | 132 | logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMSI' }); |
133 | port.unpipe(parser); | 133 | port.unpipe(parser); |
134 | mutex.unlock(MUTEX_COMMAND, 'queryIMSI'); | 134 | mutex.unlock(MUTEX_COMMAND, 'queryIMSI'); |
135 | modemInfo.imsi = data.toString().trim(); | 135 | modemInfo.imsi = data.toString().trim(); |
136 | resolve(modemInfo.imsi); | 136 | resolve(modemInfo.imsi); |
137 | }); | 137 | }); |
138 | 138 | ||
139 | await mutex.lock(MUTEX_COMMAND, 'queryIMSI'); | 139 | await mutex.lock(MUTEX_COMMAND, 'queryIMSI'); |
140 | 140 | ||
141 | port.pipe(parser); | 141 | port.pipe(parser); |
142 | await writeToPort('AT+CIMI\r'); | 142 | await writeToPort('AT+CIMI\r'); |
143 | }); | 143 | }); |
144 | }; | 144 | }; |
145 | 145 |