queclink-parser 1.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/gv800w.js ADDED
@@ -0,0 +1,1035 @@
1
+ 'use strict'
2
+ const utils = require('./utils.js')
3
+
4
+ /*
5
+ Parses messages data from GV800W devices
6
+ */
7
+ const parse = raw => {
8
+ raw = raw.substr(0, raw.length - 1)
9
+
10
+ const parsedData = raw.split(',')
11
+ const command = parsedData[0].split(':')
12
+
13
+ let history = false
14
+ if (utils.patterns.buffer.test(command[0])) {
15
+ history = true
16
+ }
17
+
18
+ let data = {
19
+ raw: `${raw.toString()}$`,
20
+ manufacturer: 'queclink',
21
+ device: 'Queclink-GV800W',
22
+ type: 'data',
23
+ imei: parsedData[2],
24
+ protocolVersion: utils.getProtocolVersion(parsedData[1]),
25
+ temperature: null,
26
+ history: history,
27
+ sentTime: utils.parseDate(parsedData[parsedData.length - 2]),
28
+ serialId: parseInt(parsedData[parsedData.length - 1], 16)
29
+ }
30
+
31
+ // Gps
32
+ if (command[1] === 'GTFRI') {
33
+ try {
34
+ data = Object.assign(data, {
35
+ alarm: utils.getAlarm(command[1], null),
36
+ loc: {
37
+ type: 'Point',
38
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
39
+ },
40
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
41
+ gpsStatus: utils.checkGps(
42
+ parseFloat(parsedData[11]),
43
+ parseFloat(parsedData[12])
44
+ ),
45
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
46
+ status: {
47
+ // parsedData[24]
48
+ raw: parsedData[26],
49
+ sos: false,
50
+ input: {
51
+ '1':
52
+ utils.nHexDigit(
53
+ utils.hex2bin(parsedData[26].substring(2, 4)),
54
+ 6
55
+ )[5] === '1',
56
+ '2':
57
+ utils.nHexDigit(
58
+ utils.hex2bin(parsedData[26].substring(2, 4)),
59
+ 6
60
+ )[4] === '1',
61
+ '3':
62
+ utils.nHexDigit(
63
+ utils.hex2bin(parsedData[26].substring(2, 4)),
64
+ 6
65
+ )[3] === '1',
66
+ '4':
67
+ utils.nHexDigit(
68
+ utils.hex2bin(parsedData[26].substring(2, 4)),
69
+ 6
70
+ )[2] === '1',
71
+ '5':
72
+ utils.nHexDigit(
73
+ utils.hex2bin(parsedData[26].substring(2, 4)),
74
+ 6
75
+ )[1] === '1',
76
+ '6':
77
+ utils.nHexDigit(
78
+ utils.hex2bin(parsedData[26].substring(2, 4)),
79
+ 6
80
+ )[0] === '1'
81
+ },
82
+ output: {
83
+ '1':
84
+ utils.nHexDigit(
85
+ utils.hex2bin(parsedData[26].substring(4, 6)),
86
+ 5
87
+ )[4] === '1',
88
+ '2':
89
+ utils.nHexDigit(
90
+ utils.hex2bin(parsedData[26].substring(4, 6)),
91
+ 5
92
+ )[3] === '1',
93
+ '3':
94
+ utils.nHexDigit(
95
+ utils.hex2bin(parsedData[26].substring(4, 6)),
96
+ 5
97
+ )[2] === '1',
98
+ '4':
99
+ utils.nHexDigit(
100
+ utils.hex2bin(parsedData[26].substring(4, 6)),
101
+ 5
102
+ )[1] === '1',
103
+ '5':
104
+ utils.nHexDigit(
105
+ utils.hex2bin(parsedData[26].substring(4, 6)),
106
+ 5
107
+ )[0] === '1'
108
+ },
109
+ charge: parseFloat(parsedData[4]) > 5,
110
+ state:
111
+ utils.nHexDigit(parsedData[26], 6).substring(0, 2) !== ''
112
+ ? utils.states[utils.nHexDigit(parsedData[26], 6).substring(0, 2)]
113
+ : null
114
+ },
115
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
116
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
117
+ datetime:
118
+ parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
119
+ voltage: {
120
+ battery: parsedData[25] !== '' ? parseFloat(parsedData[25]) : null, // percentage
121
+ inputCharge:
122
+ parsedData[4] !== '' ? parseFloat(parsedData[4]) / 1000 : null,
123
+ ada: parsedData[21] !== '' ? parseFloat(parsedData[21]) / 1000 : null,
124
+ adb: parsedData[22] !== '' ? parseFloat(parsedData[22]) / 1000 : null,
125
+ adc: parsedData[23] !== '' ? parseFloat(parsedData[23]) / 1000 : null,
126
+ add: parsedData[24] !== '' ? parseFloat(parsedData[24]) / 1000 : null
127
+ },
128
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
129
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
130
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
131
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
132
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
133
+ hourmeter:
134
+ parsedData[20] !== ''
135
+ ? utils.getHoursForHourmeter(parsedData[20])
136
+ : null
137
+ })
138
+ } catch (err) {
139
+ return { type: 'UNKNOWN', raw: data.raw.toString() }
140
+ }
141
+ } else if (command[1] === 'GTERI') {
142
+ // GPS with AC100 Devices Connected
143
+ data = Object.assign(data, {
144
+ alarm: utils.getAlarm(command[1], null),
145
+ loc: {
146
+ type: 'Point',
147
+ coordinates: [parseFloat(parsedData[12]), parseFloat(parsedData[13])]
148
+ },
149
+ speed: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
150
+ gpsStatus: utils.checkGps(
151
+ parseFloat(parsedData[12]),
152
+ parseFloat(parsedData[13])
153
+ ),
154
+ hdop: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
155
+ status: {
156
+ // parsedData[24]
157
+ raw: parsedData[27],
158
+ sos: false,
159
+ input: {
160
+ '1':
161
+ utils.nHexDigit(
162
+ utils.hex2bin(parsedData[27].substring(2, 4)),
163
+ 6
164
+ )[5] === '1',
165
+ '2':
166
+ utils.nHexDigit(
167
+ utils.hex2bin(parsedData[27].substring(2, 4)),
168
+ 6
169
+ )[4] === '1',
170
+ '3':
171
+ utils.nHexDigit(
172
+ utils.hex2bin(parsedData[27].substring(2, 4)),
173
+ 6
174
+ )[3] === '1',
175
+ '4':
176
+ utils.nHexDigit(
177
+ utils.hex2bin(parsedData[27].substring(2, 4)),
178
+ 6
179
+ )[2] === '1',
180
+ '5':
181
+ utils.nHexDigit(
182
+ utils.hex2bin(parsedData[27].substring(2, 4)),
183
+ 6
184
+ )[1] === '1',
185
+ '6':
186
+ utils.nHexDigit(
187
+ utils.hex2bin(parsedData[27].substring(2, 4)),
188
+ 6
189
+ )[0] === '1'
190
+ },
191
+ output: {
192
+ '1':
193
+ utils.nHexDigit(
194
+ utils.hex2bin(parsedData[27].substring(4, 6)),
195
+ 5
196
+ )[4] === '1',
197
+ '2':
198
+ utils.nHexDigit(
199
+ utils.hex2bin(parsedData[27].substring(4, 6)),
200
+ 5
201
+ )[3] === '1',
202
+ '3':
203
+ utils.nHexDigit(
204
+ utils.hex2bin(parsedData[27].substring(4, 6)),
205
+ 5
206
+ )[2] === '1',
207
+ '4':
208
+ utils.nHexDigit(
209
+ utils.hex2bin(parsedData[27].substring(4, 6)),
210
+ 5
211
+ )[1] === '1',
212
+ '5':
213
+ utils.nHexDigit(
214
+ utils.hex2bin(parsedData[27].substring(4, 6)),
215
+ 5
216
+ )[0] === '1'
217
+ },
218
+ charge: parseFloat(parsedData[4]) > 5,
219
+ state:
220
+ utils.nHexDigit(parsedData[27], 6).substring(0, 2) !== ''
221
+ ? utils.states[utils.nHexDigit(parsedData[27], 6).substring(0, 2)]
222
+ : null
223
+ },
224
+ azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
225
+ altitude: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
226
+ datetime: parsedData[14] !== '' ? utils.parseDate(parsedData[14]) : null,
227
+ voltage: {
228
+ battery: parsedData[26] !== '' ? parseFloat(parsedData[26]) : null, // percentage
229
+ inputCharge:
230
+ parsedData[5] !== '' ? parseFloat(parsedData[5]) / 1000 : null,
231
+ ada: parsedData[22] !== '' ? parseFloat(parsedData[22]) / 1000 : null,
232
+ adb: parsedData[23] !== '' ? parseFloat(parsedData[23]) / 1000 : null,
233
+ adc: parsedData[24] !== '' ? parseFloat(parsedData[24]) / 1000 : null,
234
+ add: parsedData[25] !== '' ? parseFloat(parsedData[25]) / 1000 : null
235
+ },
236
+ mcc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
237
+ mnc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
238
+ lac: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
239
+ cid: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
240
+ odometer: parsedData[20] !== '' ? parseFloat(parsedData[20]) : null,
241
+ hourmeter:
242
+ parsedData[21] !== ''
243
+ ? utils.getHoursForHourmeter(parsedData[21])
244
+ : null
245
+ })
246
+ // External Data
247
+
248
+ const oneWire = utils.nHexDigit(utils.hex2bin(parsedData[4]), 8)[7] !== '0'
249
+ const oneWireConnected = oneWire ? parseInt(parsedData[29], 10) : 0
250
+
251
+ let externalData = {
252
+ eriMask: {
253
+ raw: parsedData[4],
254
+ oneWire: oneWire,
255
+ digitFuelSensor: false,
256
+ rpm: false,
257
+ rf: false
258
+ },
259
+ uartDeviceType: null
260
+ }
261
+ if (oneWire) {
262
+ let oneWireDevices = []
263
+ let count = 30
264
+ for (var k = 0; k < oneWireConnected; k++) {
265
+ oneWireDevices.push({
266
+ deviceNumber: parsedData[count],
267
+ deviceType: parsedData[count + 1],
268
+ deviceData: parsedData[count + 2]
269
+ ? utils.getTempInCelciousDegrees(parsedData[count + 2])
270
+ : null
271
+ })
272
+ count += 3
273
+ }
274
+ externalData = Object.assign(externalData, {
275
+ fuelSensorData: null,
276
+ AC100Devices: oneWireDevices
277
+ })
278
+ }
279
+ data = Object.assign(data, {
280
+ externalData: externalData
281
+ })
282
+ } else if (command[1] === 'GTHBD') {
283
+ // Heartbeat. It must response an ACK command
284
+ data = Object.assign(data, {
285
+ alarm: utils.getAlarm(command[1], null)
286
+ })
287
+ } else if (
288
+ command[1] === 'GTTOW' ||
289
+ command[1] === 'GTDIS' ||
290
+ command[1] === 'GTIOB' ||
291
+ command[1] === 'GTSPD' ||
292
+ command[1] === 'GTSOS' ||
293
+ command[1] === 'GTRTL' ||
294
+ command[1] === 'GTPNL' ||
295
+ command[1] === 'GTDOG' ||
296
+ command[1] === 'GTIGL' ||
297
+ command[1] === 'GTHBM'
298
+ ) {
299
+ // Common Alarms
300
+ data = Object.assign(data, {
301
+ alarm: utils.getAlarm(command[1], parsedData[5], 'gv800w'),
302
+ loc: {
303
+ type: 'Point',
304
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
305
+ },
306
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
307
+ gpsStatus: utils.checkGps(
308
+ parseFloat(parsedData[11]),
309
+ parseFloat(parsedData[12])
310
+ ),
311
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
312
+ status: null,
313
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
314
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
315
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
316
+ voltage: {
317
+ battery: null,
318
+ inputCharge: null,
319
+ ada: null,
320
+ adb: null
321
+ },
322
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
323
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
324
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
325
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
326
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
327
+ hourmeter: null
328
+ })
329
+ } else if (command[1] === 'GTEPS' || command[1] === 'GTAIS') {
330
+ // External low battery and Low voltage for analog input
331
+ data = Object.assign(data, {
332
+ alarm: utils.getAlarm(command[1], parsedData[5]),
333
+ loc: {
334
+ type: 'Point',
335
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
336
+ },
337
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
338
+ gpsStatus: utils.checkGps(
339
+ parseFloat(parsedData[11]),
340
+ parseFloat(parsedData[12])
341
+ ),
342
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
343
+ status: null,
344
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
345
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
346
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
347
+ voltage: {
348
+ battery: null, // percentage
349
+ inputCharge:
350
+ parsedData[4] !== '' ? parseFloat(parsedData[4]) / 1000 : null,
351
+ ada: null,
352
+ adb: null,
353
+ adc: null,
354
+ add: null
355
+ },
356
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
357
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
358
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
359
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
360
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
361
+ hourmeter: null
362
+ })
363
+ } else if (
364
+ command[1] === 'GTPNA' ||
365
+ command[1] === 'GTPFA' ||
366
+ command[1] === 'GTPDP'
367
+ ) {
368
+ // Event report (It uses the last GPS data and MCC info)
369
+ data = Object.assign(data, {
370
+ alarm: utils.getAlarm(command[1], null),
371
+ loc: null,
372
+ speed: null,
373
+ gpsStatus: null,
374
+ hdop: null,
375
+ status: null,
376
+ azimuth: null,
377
+ altitude: null,
378
+ datetime: parsedData[4] !== '' ? utils.parseDate(parsedData[4]) : null,
379
+ voltage: {
380
+ battery: null,
381
+ inputCharge: null,
382
+ ada: null,
383
+ adb: null
384
+ },
385
+ mcc: null,
386
+ mnc: null,
387
+ lac: null,
388
+ cid: null,
389
+ odometer: null,
390
+ hourmeter: null
391
+ })
392
+ } else if (
393
+ command[1] === 'GTMPN' ||
394
+ command[1] === 'GTMPF' ||
395
+ command[1] === 'GTBTC' ||
396
+ command[1] === 'GTCRA' ||
397
+ command[1] === 'GTJDR'
398
+ ) {
399
+ data = Object.assign(data, {
400
+ alarm: utils.getAlarm(command[1], null),
401
+ loc: {
402
+ type: 'Point',
403
+ coordinates: [parseFloat(parsedData[8]), parseFloat(parsedData[9])]
404
+ },
405
+ speed: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
406
+ gpsStatus: utils.checkGps(
407
+ parseFloat(parsedData[8]),
408
+ parseFloat(parsedData[9])
409
+ ),
410
+ hdop: parsedData[4] !== '' ? parseFloat(parsedData[4]) : null,
411
+ status: null,
412
+ azimuth: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
413
+ altitude: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
414
+ datetime: parsedData[10] !== '' ? utils.parseDate(parsedData[10]) : null,
415
+ voltage: {
416
+ battery: null,
417
+ inputCharge: null,
418
+ ada: null,
419
+ adb: null,
420
+ adc: null,
421
+ add: null
422
+ },
423
+ mcc: parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null,
424
+ mnc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
425
+ lac: parsedData[13] !== '' ? parseInt(parsedData[13], 16) : null,
426
+ cid: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
427
+ odometer: null,
428
+ hourmeter: null
429
+ })
430
+ } else if (
431
+ command[1] === 'GTJDS' ||
432
+ command[1] === 'GTANT' ||
433
+ command[1] === 'GTRMD'
434
+ ) {
435
+ data = Object.assign(data, {
436
+ alarm: utils.getAlarm(command[1], parsedData[4]),
437
+ loc: {
438
+ type: 'Point',
439
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
440
+ },
441
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
442
+ gpsStatus: utils.checkGps(
443
+ parseFloat(parsedData[9]),
444
+ parseFloat(parsedData[10])
445
+ ),
446
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
447
+ status: null,
448
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
449
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
450
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
451
+ voltage: {
452
+ battery: null,
453
+ inputCharge: null,
454
+ ada: null,
455
+ adb: null,
456
+ adc: null,
457
+ add: null
458
+ },
459
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
460
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
461
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
462
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
463
+ odometer: null,
464
+ hourmeter: null
465
+ })
466
+ } else if (command[1] === 'GTBPL') {
467
+ data = Object.assign(data, {
468
+ alarm: utils.getAlarm(command[1], null),
469
+ loc: {
470
+ type: 'Point',
471
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
472
+ },
473
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
474
+ gpsStatus: utils.checkGps(
475
+ parseFloat(parsedData[9]),
476
+ parseFloat(parsedData[10])
477
+ ),
478
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
479
+ status: null,
480
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
481
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
482
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
483
+ voltage: {
484
+ battery: parsedData[4] !== '' ? parseFloat(parsedData[4]) : null,
485
+ inputCharge: null,
486
+ ada: null,
487
+ adb: null,
488
+ adc: null,
489
+ add: null
490
+ },
491
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
492
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
493
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
494
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
495
+ odometer: null,
496
+ hourmeter: null
497
+ })
498
+ } else if (command[1] === 'GTIGN' || command[1] === 'GTIGF') {
499
+ data = Object.assign(data, {
500
+ alarm: utils.getAlarm(command[1], parsedData[4]),
501
+ loc: {
502
+ type: 'Point',
503
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
504
+ },
505
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
506
+ gpsStatus: utils.checkGps(
507
+ parseFloat(parsedData[9]),
508
+ parseFloat(parsedData[10])
509
+ ),
510
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
511
+ status: null,
512
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
513
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
514
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
515
+ voltage: {
516
+ battery: null,
517
+ inputCharge: null,
518
+ ada: null,
519
+ adb: null,
520
+ adc: null,
521
+ add: null
522
+ },
523
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
524
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
525
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
526
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
527
+ odometer: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null,
528
+ hourmeter:
529
+ parsedData[17] !== ''
530
+ ? utils.getHoursForHourmeter(parsedData[17])
531
+ : null
532
+ })
533
+ } else if (command[1] === 'GTIDN' || command[1] === 'GTIDF') {
534
+ data = Object.assign(data, {
535
+ alarm: utils.getAlarm(command[1], parsedData[5]),
536
+ loc: {
537
+ type: 'Point',
538
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
539
+ },
540
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
541
+ gpsStatus: utils.checkGps(
542
+ parseFloat(parsedData[10]),
543
+ parseFloat(parsedData[11])
544
+ ),
545
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
546
+ status: null,
547
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
548
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
549
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
550
+ voltage: {
551
+ battery: null,
552
+ inputCharge: null,
553
+ ada: null,
554
+ adb: null,
555
+ adc: null,
556
+ add: null
557
+ },
558
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
559
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
560
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
561
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
562
+ odometer: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null,
563
+ hourmeter: null
564
+ })
565
+ } else if (
566
+ command[1] === 'GTSTR' ||
567
+ command[1] === 'GTSTP' ||
568
+ command[1] === 'GTLSP'
569
+ ) {
570
+ data = Object.assign(data, {
571
+ alarm: utils.getAlarm(command[1], null),
572
+ loc: {
573
+ type: 'Point',
574
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
575
+ },
576
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
577
+ gpsStatus: utils.checkGps(
578
+ parseFloat(parsedData[10]),
579
+ parseFloat(parsedData[11])
580
+ ),
581
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
582
+ status: null,
583
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
584
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
585
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
586
+ voltage: {
587
+ battery: null,
588
+ inputCharge: null,
589
+ ada: null,
590
+ adb: null,
591
+ adc: null,
592
+ add: null
593
+ },
594
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
595
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
596
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
597
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
598
+ odometer: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null,
599
+ hourmeter: null
600
+ })
601
+ } else if (command[1] === 'GTSTT') {
602
+ // Motion State Changed
603
+ data = Object.assign(data, {
604
+ alarm: utils.getAlarm(command[1], null),
605
+ loc: {
606
+ type: 'Point',
607
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
608
+ },
609
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
610
+ gpsStatus: utils.checkGps(
611
+ parseFloat(parsedData[9]),
612
+ parseFloat(parsedData[10])
613
+ ),
614
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
615
+ status: null,
616
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
617
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
618
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
619
+ voltage: {
620
+ battery: null,
621
+ inputCharge: null,
622
+ ada: null,
623
+ adb: null,
624
+ adc: null,
625
+ add: null
626
+ },
627
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
628
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
629
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
630
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
631
+ odometer: null,
632
+ hourmeter: null
633
+ })
634
+ } else if (command[1] === 'GTGPJ') {
635
+ data = Object.assign(data, {
636
+ alarm: utils.getAlarm(command[1], parsedData[5]),
637
+ loc: {
638
+ type: 'Point',
639
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
640
+ },
641
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
642
+ gpsStatus: utils.checkGps(
643
+ parseFloat(parsedData[10]),
644
+ parseFloat(parsedData[11])
645
+ ),
646
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
647
+ status: null,
648
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
649
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
650
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
651
+ voltage: {
652
+ battery: null,
653
+ inputCharge: null,
654
+ ada: null,
655
+ adb: null
656
+ },
657
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
658
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
659
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
660
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
661
+ odometer: null,
662
+ hourmeter: null
663
+ })
664
+ } else if (command[1] === 'GTGSS') {
665
+ // GPS Status
666
+ data = Object.assign(data, {
667
+ alarm: utils.getAlarm(command[1], parsedData[4]),
668
+ loc: {
669
+ type: 'Point',
670
+ coordinates: [parseFloat(parsedData[12]), parseFloat(parsedData[13])]
671
+ },
672
+ speed: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
673
+ gpsStatus: utils.checkGps(
674
+ parseFloat(parsedData[12]),
675
+ parseFloat(parsedData[13])
676
+ ),
677
+ hdop: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
678
+ status: null,
679
+ azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
680
+ altitude: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
681
+ datetime: parsedData[14] !== '' ? utils.parseDate(parsedData[14]) : null,
682
+ voltage: {
683
+ battery: null,
684
+ inputCharge: null,
685
+ ada: null,
686
+ adb: null,
687
+ adc: null,
688
+ add: null
689
+ },
690
+ mcc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
691
+ mnc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
692
+ lac: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
693
+ cid: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
694
+ odometer: null,
695
+ hourmeter: null
696
+ })
697
+ } else if (command[1] === 'GTIDA') {
698
+ // iButton
699
+ data = Object.assign(data, {
700
+ alarm: utils.getAlarm(command[1], `${parsedData[5]},${parsedData[6]}`),
701
+ loc: {
702
+ type: 'Point',
703
+ coordinates: [parseFloat(parsedData[12]), parseFloat(parsedData[13])]
704
+ },
705
+ speed: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
706
+ gpsStatus: utils.checkGps(
707
+ parseFloat(parsedData[12]),
708
+ parseFloat(parsedData[13])
709
+ ),
710
+ hdop: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
711
+ status: null,
712
+ azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
713
+ altitude: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
714
+ datetime: parsedData[14] !== '' ? utils.parseDate(parsedData[14]) : null,
715
+ voltage: {
716
+ battery: null,
717
+ inputCharge: null,
718
+ ada: null,
719
+ adb: null,
720
+ adc: null,
721
+ add: null
722
+ },
723
+ mcc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
724
+ mnc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
725
+ lac: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
726
+ cid: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
727
+ odometer: parsedData[20] !== '' ? parseFloat(parsedData[20]) : null,
728
+ hourmeter: null
729
+ })
730
+ } else if (command[1] === 'GTTMP') {
731
+ // Temperature Alarm
732
+ data = Object.assign(data, {
733
+ alarm: utils.getAlarm(command[1], parsedData[6], [
734
+ parsedData[30],
735
+ parsedData[32]
736
+ ]),
737
+ loc: {
738
+ type: 'Point',
739
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
740
+ },
741
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
742
+ gpsStatus: utils.checkGps(
743
+ parseFloat(parsedData[11]),
744
+ parseFloat(parsedData[12])
745
+ ),
746
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
747
+ status: {
748
+ // parsedData[24]
749
+ raw: parsedData[25] + parsedData[26],
750
+ sos: utils.nHexDigit(utils.hex2bin(parsedData[27]), 6)[4] === '1',
751
+ input: {
752
+ '1': utils.nHexDigit(utils.hex2bin(parsedData[27]), 6)[5] === '1',
753
+ '2': utils.nHexDigit(utils.hex2bin(parsedData[27]), 6)[4] === '1',
754
+ '3': utils.nHexDigit(utils.hex2bin(parsedData[27]), 6)[3] === '1',
755
+ '4': utils.nHexDigit(utils.hex2bin(parsedData[27]), 6)[2] === '1',
756
+ '5': utils.nHexDigit(utils.hex2bin(parsedData[27]), 6)[1] === '1',
757
+ '6': utils.nHexDigit(utils.hex2bin(parsedData[27]), 6)[0] === '1'
758
+ },
759
+ output: {
760
+ '1': utils.nHexDigit(utils.hex2bin(parsedData[27]), 5)[4] === '1',
761
+ '2': utils.nHexDigit(utils.hex2bin(parsedData[27]), 5)[3] === '1',
762
+ '3': utils.nHexDigit(utils.hex2bin(parsedData[27]), 5)[2] === '1',
763
+ '4': utils.nHexDigit(utils.hex2bin(parsedData[27]), 5)[1] === '1',
764
+ '5': utils.nHexDigit(utils.hex2bin(parsedData[27]), 5)[0] === '1'
765
+ },
766
+ charge: parseFloat(parsedData[4]) > 5
767
+ },
768
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
769
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
770
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
771
+ voltage: {
772
+ battery: null, // percentage
773
+ inputCharge:
774
+ parsedData[5] !== '' ? parseFloat(parsedData[4]) / 1000 : null,
775
+ ada: parsedData[21] !== '' ? parseFloat(parsedData[21]) / 1000 : null,
776
+ adb: parsedData[22] !== '' ? parseFloat(parsedData[22]) / 1000 : null,
777
+ adc: parsedData[23] !== '' ? parseFloat(parsedData[23]) / 1000 : null,
778
+ add: parsedData[24] !== '' ? parseFloat(parsedData[24]) / 1000 : null
779
+ },
780
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
781
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
782
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
783
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
784
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
785
+ hourmeter:
786
+ parsedData[20] !== ''
787
+ ? utils.getHoursForHourmeter(parsedData[20])
788
+ : null
789
+ })
790
+ } else if (command[1] === 'GTCAN') {
791
+ data = Object.assign(data, {
792
+ alarm: utils.getAlarm(command[1], parsedData[4]),
793
+ loc: {
794
+ type: 'Point',
795
+ coordinates: [parseFloat(parsedData[59]), parseFloat(parsedData[60])]
796
+ },
797
+ speed: parsedData[56] !== '' ? parseFloat(parsedData[56]) : null,
798
+ gpsStatus: utils.checkGps(
799
+ parseFloat(parsedData[59]),
800
+ parseFloat(parsedData[60])
801
+ ),
802
+ hdop: parsedData[55] !== '' ? parseFloat(parsedData[55]) : null,
803
+ status: null,
804
+ azimuth: parsedData[57] !== '' ? parseFloat(parsedData[57]) : null,
805
+ altitude: parsedData[58] !== '' ? parseFloat(parsedData[58]) : null,
806
+ datetime: parsedData[61] !== '' ? utils.parseDate(parsedData[61]) : null,
807
+ voltage: {
808
+ battery: null,
809
+ inputCharge: null,
810
+ ada: null,
811
+ adb: null,
812
+ adc: null,
813
+ add: null
814
+ },
815
+ mcc: parsedData[62] !== '' ? parseInt(parsedData[62], 10) : null,
816
+ mnc: parsedData[63] !== '' ? parseInt(parsedData[63], 10) : null,
817
+ lac: parsedData[64] !== '' ? parseInt(parsedData[64], 16) : null,
818
+ cid: parsedData[65] !== '' ? parseInt(parsedData[65], 16) : null,
819
+ odometer: null,
820
+ hourmeter: null,
821
+ can: {
822
+ mask: '',
823
+ comunicationOk: parsedData[5] === '1',
824
+ vin: parsedData[7] !== '' ? parsedData[7] : null,
825
+ ignitionKey: parsedData[8] !== '' ? parseInt(parsedData[8], 10) : null,
826
+ distance: parsedData[9] !== '' ? parsedData[9] : null,
827
+ fuelUsed: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null, // float
828
+ rpm: parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null, // int
829
+ speed: parsedData[12] !== '' ? parseFloat(parsedData[12]) : null,
830
+ coolantTemp:
831
+ parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
832
+ fuelConsumption: parsedData[14] !== '' ? parsedData[14] : null,
833
+ fuelLevel: parsedData[15] !== '' ? parsedData[15] : null,
834
+ range: parsedData[16] !== '' ? parsedData[16] : null,
835
+ acceleratorPressure:
836
+ parsedData[17] !== '' ? parseFloat(parsedData[17]) : null, // %
837
+ engineHours: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null, // hours
838
+ drivingTime: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null, // hours
839
+ idleTime: parsedData[20] !== '' ? parseFloat(parsedData[20]) : null, // hours
840
+ idleFuelUsed: parsedData[21] !== '' ? parseFloat(parsedData[21]) : null, // liters
841
+ axleWight: parsedData[22] !== '' ? parseFloat(parsedData[22]) : null, // kg
842
+ tachograph: parsedData[23] !== '' ? parsedData[23] : null,
843
+ detailedInfo: parsedData[24] !== '' ? parsedData[24] : null,
844
+ lights: parsedData[25] !== '' ? parsedData[25] : null,
845
+ doors: parsedData[26] !== '' ? parsedData[26] : null,
846
+ overSpeedTime:
847
+ parsedData[27] !== '' ? parseFloat(parsedData[27]) : null, // hours
848
+ overSpeedEngineTime:
849
+ parsedData[28] !== '' ? parseFloat(parsedData[28]) : null, // hours
850
+ expansionMask: parsedData[29] !== '' ? parsedData[29] : null,
851
+ addBlueLevel: parsedData[30] !== '' ? parsedData[30] : null,
852
+ axleWight1st: parsedData[31] !== '' ? parsedData[31] : null,
853
+ axleWight3rd: parsedData[32] !== '' ? parsedData[32] : null,
854
+ axleWight4rd: parsedData[33] !== '' ? parsedData[33] : null,
855
+ tachographOverSpeedSignal:
856
+ parsedData[34] !== '' ? parsedData[34] : null,
857
+ tachographMotionState: parsedData[35] !== '' ? parsedData[35] : null,
858
+ tachographDrivingDirection:
859
+ parsedData[36] !== '' ? parsedData[36] : null,
860
+ analogInput: parsedData[37] !== '' ? parsedData[37] : null,
861
+ engineBrakingFactor: parsedData[38] !== '' ? parsedData[38] : null,
862
+ pedalBrakingFactor: parsedData[39] !== '' ? parsedData[39] : null,
863
+ totalAcceleratorKickDowns:
864
+ parsedData[40] !== '' ? parseInt(parsedData[40], 10) : null,
865
+ totalEffectiveEngineSpeedTime:
866
+ parsedData[41] !== '' ? parseFloat(parsedData[41]) : null, // hours
867
+ totalCruiseControlTime:
868
+ parsedData[42] !== '' ? parseFloat(parsedData[42]) : null, // hours
869
+ totalAcceleratorKickDownTime:
870
+ parsedData[43] !== '' ? parseFloat(parsedData[43]) : null, // hours
871
+ totalBrakeApplications:
872
+ parsedData[44] !== '' ? parseInt(parsedData[44]) : null,
873
+ tachographDriver1Number: parsedData[45] !== '' ? parsedData[45] : null,
874
+ tachographDriver2Number: parsedData[46] !== '' ? parsedData[46] : null,
875
+ tachographDriver1Name: parsedData[47] !== '' ? parsedData[47] : null,
876
+ tachographDriver2Name: parsedData[48] !== '' ? parsedData[48] : null,
877
+ registrationNumber: parsedData[49] !== '' ? parsedData[49] : null,
878
+ expansionInformation: parsedData[50] !== '' ? parsedData[50] : null,
879
+ rapidBraking: parsedData[51] !== '' ? parsedData[51] : null,
880
+ rapidAccelerations: parsedData[52] !== '' ? parsedData[52] : null
881
+ }
882
+ })
883
+ } else if (command[1] === 'GTDAT') {
884
+ data = Object.assign(data, {
885
+ loc: {
886
+ type: 'Point',
887
+ coordinates: [parseFloat(parsedData[12]), parseFloat(parsedData[13])]
888
+ },
889
+ speed: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
890
+ gpsStatus: utils.checkGps(
891
+ parseFloat(parsedData[12]),
892
+ parseFloat(parsedData[13])
893
+ ),
894
+ hdop: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
895
+ status: null,
896
+ azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
897
+ altitude: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
898
+ datetime: parsedData[14] !== '' ? utils.parseDate(parsedData[14]) : null,
899
+ voltage: {
900
+ battery: null,
901
+ inputCharge: null,
902
+ ada: null,
903
+ adb: null,
904
+ adc: null,
905
+ add: null
906
+ },
907
+ mcc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
908
+ mnc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
909
+ lac: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
910
+ cid: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
911
+ odometer: null,
912
+ hourmeter: null,
913
+ serialData: parsedData[7] !== '' ? parsedData[7] : null
914
+ })
915
+
916
+ // Checks if its a temperature GTDAT -> DT
917
+ if (/^>DT/.test(parsedData[7])) {
918
+ const parsedSerialData =
919
+ parsedData[7] !== '' ? parsedData[7].split('|') : ''
920
+ let externalData = {
921
+ eriMask: {
922
+ raw: '00000000',
923
+ digitFuelSensor: false,
924
+ AC100: false,
925
+ reserved: false,
926
+ fuelLevelPercentage: false,
927
+ fuelVolume: false
928
+ },
929
+ uartDeviceType: 'Camaleon',
930
+ fuelSensorData: null
931
+ }
932
+ let AC100Devices = [
933
+ {
934
+ deviceNumber: `${parsedData[2]}|1`,
935
+ deviceType: '1',
936
+ deviceData:
937
+ parsedSerialData[3] !== '' ? parseFloat(parsedSerialData[3]) : null
938
+ }
939
+ ]
940
+ if (parsedSerialData[4] !== '') {
941
+ AC100Devices.push({
942
+ deviceNumber: `${parsedData[2]}|2`,
943
+ deviceType: '1',
944
+ deviceData:
945
+ parsedSerialData[4] !== '' ? parseFloat(parsedSerialData[4]) : null
946
+ })
947
+ }
948
+ externalData = Object.assign(externalData, {
949
+ AC100Devices: AC100Devices
950
+ })
951
+ data = Object.assign(data, {
952
+ alarm: utils.getAlarm('GTERI', null),
953
+ externalData: externalData
954
+ })
955
+ } else if (/^>ET/.test(parsedData[7])) {
956
+ // Temp Alarms
957
+ // GTTMP
958
+ const parsedSerialData =
959
+ parsedData[7] !== '' ? parsedData[7].split('|') : ''
960
+ const alarm = utils.getAlarm('GTTMP', `${parsedSerialData[2]}0`, [
961
+ `${parsedData[2]}|${parsedSerialData[2]}`,
962
+ parsedSerialData[4]
963
+ ])
964
+ data = Object.assign(data, {
965
+ alarm: alarm
966
+ })
967
+ } else if (/^>ID/.test(parsedData[7])) {
968
+ // Checks if its a iButton GTDAT -> DT
969
+ const parsedSerialData =
970
+ parsedData[7] !== '' ? parsedData[7].split('|') : ''
971
+ const driverID = parsedSerialData[2] ? parsedSerialData[2] : ''
972
+ const alarm = utils.getAlarm('GTIDA', `${driverID},1`)
973
+ data = Object.assign(data, {
974
+ alarm: alarm
975
+ })
976
+ } else {
977
+ // Normal GTDAT
978
+ data = Object.assign(data, {
979
+ alarm: utils.getAlarm(command[1], null)
980
+ })
981
+ }
982
+ } else if (command[1] === 'GTDOS') {
983
+ data = Object.assign(data, {
984
+ alarm: utils.getAlarm(command[1], `${parsedData[4]},${parsedData[5]}`),
985
+ loc: {
986
+ type: 'Point',
987
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
988
+ },
989
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
990
+ gpsStatus: utils.checkGps(
991
+ parseFloat(parsedData[10]),
992
+ parseFloat(parsedData[11])
993
+ ),
994
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
995
+ status: null,
996
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
997
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
998
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
999
+ voltage: {
1000
+ battery: null,
1001
+ inputCharge: null,
1002
+ ada: null,
1003
+ adb: null,
1004
+ adc: null,
1005
+ add: null
1006
+ },
1007
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
1008
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
1009
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
1010
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
1011
+ odometer: null,
1012
+ hourmeter: null
1013
+ })
1014
+ } else {
1015
+ data = Object.assign(data, {
1016
+ alarm: utils.getAlarm(command[1], null)
1017
+ })
1018
+ }
1019
+ // Check gps data
1020
+ if (data.loc !== null && typeof data.loc !== 'undefined') {
1021
+ if (
1022
+ data.loc.coordinates[0] === 0 ||
1023
+ isNaN(data.loc.coordinates[0]) ||
1024
+ data.loc.coordinates[1] === 0 ||
1025
+ isNaN(data.loc.coordinates[1])
1026
+ ) {
1027
+ data.loc = null
1028
+ }
1029
+ }
1030
+ return data
1031
+ }
1032
+
1033
+ module.exports = {
1034
+ parse: parse
1035
+ }