queclink-parser 1.9.28 → 1.9.31
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/CHANGELOG.md +21 -0
- package/README.md +30 -23
- package/package.json +37 -35
- package/src/gl300.js +6 -6
- package/src/gl50.js +2 -2
- package/src/gl533cg.js +25 -9
- package/src/gmt100.js +10 -10
- package/src/gv200.js +56 -58
- package/src/gv300.js +55 -51
- package/src/gv300w.js +77 -73
- package/src/gv310lau.js +215 -200
- package/src/gv350ceu.js +278 -263
- package/src/gv500.js +2 -2
- package/src/gv50p.js +10 -10
- package/src/gv55.js +10 -10
- package/src/gv57cg.js +142 -142
- package/src/gv58lau.js +504 -483
- package/src/gv600w.js +39 -39
- package/src/gv75w.js +71 -67
- package/src/gv800w.js +44 -44
- package/src/index.js +16 -16
- package/src/utils.js +725 -720
package/src/gv310lau.js
CHANGED
|
@@ -23,17 +23,17 @@ const parse = raw => {
|
|
|
23
23
|
imei: parsedData[2],
|
|
24
24
|
protocolVersion: utils.getProtocolVersion(parsedData[1]),
|
|
25
25
|
temperature: null,
|
|
26
|
-
history
|
|
26
|
+
history,
|
|
27
27
|
sentTime: utils.parseDate(parsedData[parsedData.length - 2]),
|
|
28
28
|
serialId: parseInt(parsedData[parsedData.length - 1], 16)
|
|
29
29
|
}
|
|
30
30
|
// Gps
|
|
31
31
|
if (command[1] === 'GTFRI') {
|
|
32
32
|
try {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
const number = parsedData[6] !== '' ? parseInt(parsedData[6], 10) : 1
|
|
34
|
+
const satelliteInfo = utils.includeSatellites(parsedData[18])
|
|
35
|
+
const accuracyInfo = utils.includeGnnsAccuracy(parsedData[18]) ? 3 : 0
|
|
36
|
+
const index = 6 + (12 + satelliteInfo + accuracyInfo) * number
|
|
37
37
|
|
|
38
38
|
data = Object.assign(data, {
|
|
39
39
|
alarm: utils.getAlarm(command[1], null),
|
|
@@ -51,28 +51,28 @@ const parse = raw => {
|
|
|
51
51
|
raw: parsedData[index + 7],
|
|
52
52
|
sos: false,
|
|
53
53
|
input: {
|
|
54
|
-
|
|
54
|
+
1:
|
|
55
55
|
utils.nHexDigit(
|
|
56
56
|
utils.hex2bin(
|
|
57
57
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
58
58
|
),
|
|
59
59
|
4
|
|
60
60
|
)[3] === '1',
|
|
61
|
-
|
|
61
|
+
2:
|
|
62
62
|
utils.nHexDigit(
|
|
63
63
|
utils.hex2bin(
|
|
64
64
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
65
65
|
),
|
|
66
66
|
4
|
|
67
67
|
)[2] === '1',
|
|
68
|
-
|
|
68
|
+
3:
|
|
69
69
|
utils.nHexDigit(
|
|
70
70
|
utils.hex2bin(
|
|
71
71
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
72
72
|
),
|
|
73
73
|
4
|
|
74
74
|
)[1] === '1',
|
|
75
|
-
|
|
75
|
+
4:
|
|
76
76
|
utils.nHexDigit(
|
|
77
77
|
utils.hex2bin(
|
|
78
78
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
@@ -81,21 +81,21 @@ const parse = raw => {
|
|
|
81
81
|
)[0] === '1'
|
|
82
82
|
},
|
|
83
83
|
output: {
|
|
84
|
-
|
|
84
|
+
1:
|
|
85
85
|
utils.nHexDigit(
|
|
86
86
|
utils.hex2bin(
|
|
87
87
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
88
88
|
),
|
|
89
89
|
3
|
|
90
90
|
)[2] === '1',
|
|
91
|
-
|
|
91
|
+
2:
|
|
92
92
|
utils.nHexDigit(
|
|
93
93
|
utils.hex2bin(
|
|
94
94
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
95
95
|
),
|
|
96
96
|
3
|
|
97
97
|
)[1] === '1',
|
|
98
|
-
|
|
98
|
+
3:
|
|
99
99
|
utils.nHexDigit(
|
|
100
100
|
utils.hex2bin(
|
|
101
101
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
@@ -107,8 +107,8 @@ const parse = raw => {
|
|
|
107
107
|
state:
|
|
108
108
|
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6) !== ''
|
|
109
109
|
? utils.states[ // eslint-disable-line
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
|
|
111
|
+
]
|
|
112
112
|
: null
|
|
113
113
|
},
|
|
114
114
|
azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
|
|
@@ -149,9 +149,9 @@ const parse = raw => {
|
|
|
149
149
|
satelliteInfo &&
|
|
150
150
|
parsedData[index - (satelliteInfo + accuracyInfo) + 1] !== ''
|
|
151
151
|
? parseInt(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
152
|
+
parsedData[index - (satelliteInfo + accuracyInfo) + 1],
|
|
153
|
+
10
|
|
154
|
+
)
|
|
155
155
|
: null,
|
|
156
156
|
Hdop:
|
|
157
157
|
accuracyInfo && parsedData[index - accuracyInfo + 1] !== ''
|
|
@@ -177,9 +177,9 @@ const parse = raw => {
|
|
|
177
177
|
|
|
178
178
|
// More than 1 GNSS report in data
|
|
179
179
|
if (number > 1) {
|
|
180
|
-
|
|
180
|
+
const moreData = []
|
|
181
181
|
for (let i = 1; i < number; i++) {
|
|
182
|
-
|
|
182
|
+
const gnssIx = 7 + (12 + satelliteInfo + accuracyInfo) * i
|
|
183
183
|
moreData.push({
|
|
184
184
|
index: i,
|
|
185
185
|
loc: {
|
|
@@ -246,16 +246,16 @@ const parse = raw => {
|
|
|
246
246
|
})
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
-
data = Object.assign(data, { moreData
|
|
249
|
+
data = Object.assign(data, { moreData })
|
|
250
250
|
}
|
|
251
251
|
} catch (err) {
|
|
252
252
|
return { type: 'UNKNOWN', raw: data.raw.toString() }
|
|
253
253
|
}
|
|
254
254
|
} else if (command[1] === 'GTERI') {
|
|
255
255
|
// GPS with AC100 and/or Bluetoth Devices Connected
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
256
|
+
const number = parsedData[7] !== '' ? parseInt(parsedData[7], 10) : 1
|
|
257
|
+
const satelliteInfo = utils.includeSatellites(parsedData[19])
|
|
258
|
+
const accuracyInfo = utils.includeGnnsAccuracy(parsedData[19]) ? 3 : 0
|
|
259
259
|
let index = 7 + (12 + satelliteInfo + accuracyInfo) * number
|
|
260
260
|
|
|
261
261
|
// External Data
|
|
@@ -287,28 +287,28 @@ const parse = raw => {
|
|
|
287
287
|
raw: parsedData[index + 7],
|
|
288
288
|
sos: false,
|
|
289
289
|
input: {
|
|
290
|
-
|
|
290
|
+
1:
|
|
291
291
|
utils.nHexDigit(
|
|
292
292
|
utils.hex2bin(
|
|
293
293
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
294
294
|
),
|
|
295
295
|
4
|
|
296
296
|
)[3] === '1',
|
|
297
|
-
|
|
297
|
+
2:
|
|
298
298
|
utils.nHexDigit(
|
|
299
299
|
utils.hex2bin(
|
|
300
300
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
301
301
|
),
|
|
302
302
|
4
|
|
303
303
|
)[2] === '1',
|
|
304
|
-
|
|
304
|
+
3:
|
|
305
305
|
utils.nHexDigit(
|
|
306
306
|
utils.hex2bin(
|
|
307
307
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
308
308
|
),
|
|
309
309
|
4
|
|
310
310
|
)[1] === '1',
|
|
311
|
-
|
|
311
|
+
4:
|
|
312
312
|
utils.nHexDigit(
|
|
313
313
|
utils.hex2bin(
|
|
314
314
|
utils.nHexDigit(parsedData[index + 7], 10).substring(6, 8)
|
|
@@ -317,21 +317,21 @@ const parse = raw => {
|
|
|
317
317
|
)[0] === '1'
|
|
318
318
|
},
|
|
319
319
|
output: {
|
|
320
|
-
|
|
320
|
+
1:
|
|
321
321
|
utils.nHexDigit(
|
|
322
322
|
utils.hex2bin(
|
|
323
323
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
324
324
|
),
|
|
325
325
|
3
|
|
326
326
|
)[2] === '1',
|
|
327
|
-
|
|
327
|
+
2:
|
|
328
328
|
utils.nHexDigit(
|
|
329
329
|
utils.hex2bin(
|
|
330
330
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
331
331
|
),
|
|
332
332
|
3
|
|
333
333
|
)[1] === '1',
|
|
334
|
-
|
|
334
|
+
3:
|
|
335
335
|
utils.nHexDigit(
|
|
336
336
|
utils.hex2bin(
|
|
337
337
|
utils.nHexDigit(parsedData[index + 7], 10).substring(8, 10)
|
|
@@ -343,8 +343,8 @@ const parse = raw => {
|
|
|
343
343
|
state:
|
|
344
344
|
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6) !== ''
|
|
345
345
|
? utils.states[ // eslint-disable-line
|
|
346
|
-
|
|
347
|
-
|
|
346
|
+
utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
|
|
347
|
+
]
|
|
348
348
|
: null
|
|
349
349
|
},
|
|
350
350
|
azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
|
|
@@ -409,7 +409,9 @@ const parse = raw => {
|
|
|
409
409
|
const ac100DevicesConnected =
|
|
410
410
|
AC100 && digitFuelSensor
|
|
411
411
|
? parseInt(parsedData[index + 10], 10)
|
|
412
|
-
: AC100 && !digitFuelSensor
|
|
412
|
+
: AC100 && !digitFuelSensor
|
|
413
|
+
? parseInt(parsedData[index + 9], 10)
|
|
414
|
+
: 0
|
|
413
415
|
// Review when RF433 devices are implemented
|
|
414
416
|
// eslint-disable-next-line no-unused-vars
|
|
415
417
|
const rf433DevicesConnected =
|
|
@@ -418,12 +420,12 @@ const parse = raw => {
|
|
|
418
420
|
let externalData = {
|
|
419
421
|
eriMask: {
|
|
420
422
|
raw: parsedData[4],
|
|
421
|
-
digitFuelSensor
|
|
422
|
-
AC100
|
|
423
|
-
canData
|
|
424
|
-
fuelLevelPercentage
|
|
425
|
-
fuelVolume
|
|
426
|
-
bluetoothAccessory
|
|
423
|
+
digitFuelSensor,
|
|
424
|
+
AC100,
|
|
425
|
+
canData,
|
|
426
|
+
fuelLevelPercentage,
|
|
427
|
+
fuelVolume,
|
|
428
|
+
bluetoothAccessory
|
|
427
429
|
},
|
|
428
430
|
uartDeviceType:
|
|
429
431
|
parsedData[index + 8] !== ''
|
|
@@ -446,17 +448,17 @@ const parse = raw => {
|
|
|
446
448
|
fuelVolume && fuelLevelPercentage && parsedData[index + 12] !== ''
|
|
447
449
|
? parseInt(parsedData[index + 13], 10)
|
|
448
450
|
: fuelVolume &&
|
|
449
|
-
|
|
450
|
-
|
|
451
|
+
!fuelLevelPercentage &&
|
|
452
|
+
parsedData[index + 12] !== ''
|
|
451
453
|
? parseInt(parsedData[index + 12], 10)
|
|
452
454
|
: null
|
|
453
455
|
},
|
|
454
456
|
AC100Devices: null
|
|
455
457
|
})
|
|
456
458
|
} else if (!digitFuelSensor && AC100) {
|
|
457
|
-
|
|
459
|
+
const ac100Devices = []
|
|
458
460
|
let count = index + 11
|
|
459
|
-
for (
|
|
461
|
+
for (let i = 0; i < ac100DevicesConnected; i++) {
|
|
460
462
|
ac100Devices.push({
|
|
461
463
|
deviceNumber: parsedData[count],
|
|
462
464
|
deviceType: parsedData[count + 1],
|
|
@@ -472,12 +474,14 @@ const parse = raw => {
|
|
|
472
474
|
AC100Devices: ac100Devices
|
|
473
475
|
})
|
|
474
476
|
} else if (digitFuelSensor && AC100) {
|
|
475
|
-
|
|
477
|
+
const ac100Devices = []
|
|
476
478
|
let count =
|
|
477
479
|
fuelVolume && fuelLevelPercentage
|
|
478
480
|
? 33
|
|
479
|
-
: fuelVolume && !fuelLevelPercentage
|
|
480
|
-
|
|
481
|
+
: fuelVolume && !fuelLevelPercentage
|
|
482
|
+
? index + 13
|
|
483
|
+
: index + 12
|
|
484
|
+
for (let j = 0; j < ac100DevicesConnected; j++) {
|
|
481
485
|
ac100Devices.push({
|
|
482
486
|
deviceNumber: parsedData[count],
|
|
483
487
|
deviceType: parsedData[count + 1],
|
|
@@ -499,8 +503,8 @@ const parse = raw => {
|
|
|
499
503
|
fuelVolume && fuelLevelPercentage && parsedData[index + 13] !== ''
|
|
500
504
|
? parseInt(parsedData[index + 13], 10)
|
|
501
505
|
: fuelVolume &&
|
|
502
|
-
|
|
503
|
-
|
|
506
|
+
!fuelLevelPercentage &&
|
|
507
|
+
parsedData[index + 12] !== ''
|
|
504
508
|
? parseInt(parsedData[index + 12], 10)
|
|
505
509
|
: null
|
|
506
510
|
},
|
|
@@ -510,9 +514,9 @@ const parse = raw => {
|
|
|
510
514
|
} else if (parsedData[index + 8] === '2') {
|
|
511
515
|
// AC100 1 Wire Bus
|
|
512
516
|
if (!digitFuelSensor && AC100) {
|
|
513
|
-
|
|
517
|
+
const ac100Devices = []
|
|
514
518
|
let count = index + 10
|
|
515
|
-
for (
|
|
519
|
+
for (let k = 0; k < ac100DevicesConnected; k++) {
|
|
516
520
|
ac100Devices.push({
|
|
517
521
|
deviceNumber: parsedData[count],
|
|
518
522
|
deviceType: parsedData[count + 1],
|
|
@@ -537,9 +541,9 @@ const parse = raw => {
|
|
|
537
541
|
AC100Devices: null
|
|
538
542
|
})
|
|
539
543
|
} else if (digitFuelSensor && AC100) {
|
|
540
|
-
|
|
544
|
+
const ac100Devices = []
|
|
541
545
|
let count = index + 12
|
|
542
|
-
for (
|
|
546
|
+
for (let l = 0; l < ac100DevicesConnected; l++) {
|
|
543
547
|
ac100Devices.push({
|
|
544
548
|
deviceNumber: parsedData[count],
|
|
545
549
|
deviceType: parsedData[count + 1],
|
|
@@ -583,14 +587,16 @@ const parse = raw => {
|
|
|
583
587
|
}
|
|
584
588
|
|
|
585
589
|
if (canData) {
|
|
586
|
-
|
|
590
|
+
const newIndex =
|
|
587
591
|
digitFuelSensor && !AC100
|
|
588
592
|
? index + 9 + 1
|
|
589
593
|
: !digitFuelSensor && AC100
|
|
590
594
|
? index + 9 + 4
|
|
591
|
-
: digitFuelSensor && AC100
|
|
592
|
-
|
|
593
|
-
|
|
595
|
+
: digitFuelSensor && AC100
|
|
596
|
+
? index + 9 + 5
|
|
597
|
+
: index + 9
|
|
598
|
+
const parsedCanData = utils.getCanData(parsedData, newIndex, command[1])
|
|
599
|
+
const canInfo = parsedCanData[3]
|
|
594
600
|
index = parsedCanData[0]
|
|
595
601
|
if (Object.keys(canInfo).length > 0) {
|
|
596
602
|
data = Object.assign(data, { can: canInfo })
|
|
@@ -618,22 +624,22 @@ const parse = raw => {
|
|
|
618
624
|
// Bluetooth Accessories
|
|
619
625
|
if (bluetoothAccessory) {
|
|
620
626
|
// let btIndex = digitFuelSensor ? index + 1 : index
|
|
621
|
-
|
|
622
|
-
|
|
627
|
+
const btIndex = canData ? index : index + 9
|
|
628
|
+
const btDevices = utils.getBleData(parsedData, btIndex)
|
|
623
629
|
externalData = Object.assign(externalData, {
|
|
624
|
-
btDevices
|
|
630
|
+
btDevices
|
|
625
631
|
})
|
|
626
632
|
}
|
|
627
633
|
|
|
628
634
|
data = Object.assign(data, {
|
|
629
|
-
externalData
|
|
635
|
+
externalData
|
|
630
636
|
})
|
|
631
637
|
|
|
632
638
|
// More than 1 GNSS report in data
|
|
633
639
|
if (number > 1) {
|
|
634
|
-
|
|
640
|
+
const moreData = []
|
|
635
641
|
for (let i = 1; i < number; i++) {
|
|
636
|
-
|
|
642
|
+
const gnssIx = 8 + (12 + satelliteInfo + accuracyInfo) * i
|
|
637
643
|
moreData.push({
|
|
638
644
|
index: i,
|
|
639
645
|
loc: {
|
|
@@ -700,7 +706,7 @@ const parse = raw => {
|
|
|
700
706
|
})
|
|
701
707
|
}
|
|
702
708
|
|
|
703
|
-
data = Object.assign(data, { moreData
|
|
709
|
+
data = Object.assign(data, { moreData })
|
|
704
710
|
}
|
|
705
711
|
} else if (command[1] === 'GTHBD') {
|
|
706
712
|
// Heartbeat. It must response an ACK command
|
|
@@ -720,16 +726,16 @@ const parse = raw => {
|
|
|
720
726
|
RSSI_quality:
|
|
721
727
|
parsedData[10] !== ''
|
|
722
728
|
? utils.getSignalStrength(
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
729
|
+
utils.networkTypes[parsedData[10]],
|
|
730
|
+
parseInt(parsedData[6], 10)
|
|
731
|
+
)
|
|
726
732
|
: null, // Signal Strength
|
|
727
733
|
RSSI_percentage:
|
|
728
734
|
parsedData[10] !== ''
|
|
729
735
|
? utils.getSignalPercentage(
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
736
|
+
utils.networkTypes[parsedData[10]],
|
|
737
|
+
parseInt(parsedData[6], 10)
|
|
738
|
+
)
|
|
733
739
|
: null, // Signal Percetange
|
|
734
740
|
GSM_quality:
|
|
735
741
|
parsedData[7] !== ''
|
|
@@ -746,16 +752,16 @@ const parse = raw => {
|
|
|
746
752
|
raw: parsedData[18] + parsedData[19] + parsedData[20],
|
|
747
753
|
sos: false,
|
|
748
754
|
input: {
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
755
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[0] === '1',
|
|
756
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[1] === '1',
|
|
757
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[2] === '1',
|
|
758
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[21][1]), 4)[3] === '1'
|
|
753
759
|
},
|
|
754
760
|
output: {
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
761
|
+
4: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[0] === '1',
|
|
762
|
+
3: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[1] === '1',
|
|
763
|
+
2: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[2] === '1',
|
|
764
|
+
1: utils.nHexDigit(utils.hex2bin(parsedData[22][1]), 4)[3] === '1'
|
|
759
765
|
},
|
|
760
766
|
charge: parsedData[12] === '1'
|
|
761
767
|
},
|
|
@@ -787,15 +793,15 @@ const parse = raw => {
|
|
|
787
793
|
command[1] === 'GTHBM'
|
|
788
794
|
) {
|
|
789
795
|
// Common Alarms
|
|
790
|
-
|
|
791
|
-
|
|
796
|
+
const number = parsedData[6] !== '' ? parseInt(parsedData[6], 10) : 1
|
|
797
|
+
const posAppendMask = parsedData[18]
|
|
792
798
|
? utils.nHexDigit(utils.hex2bin(parsedData[18]), 8)
|
|
793
799
|
: null
|
|
794
800
|
|
|
795
801
|
// If get satellites is configured
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
802
|
+
const satelliteInfo = posAppendMask && posAppendMask[7] === '1' ? 1 : 0
|
|
803
|
+
const accuracyInfo = posAppendMask && posAppendMask[4] === '1' ? 3 : 0
|
|
804
|
+
const index = 6 + (12 + satelliteInfo + accuracyInfo) * number
|
|
799
805
|
|
|
800
806
|
data = Object.assign(data, {
|
|
801
807
|
alarm: utils.getAlarm(command[1], parsedData[5], 'gv310lau'),
|
|
@@ -856,12 +862,14 @@ const parse = raw => {
|
|
|
856
862
|
lastSpeedStateDuration:
|
|
857
863
|
parseInt(parsedData[4], 10) === 2
|
|
858
864
|
? parsedData[index + 2]
|
|
859
|
-
: parseInt(parsedData[4], 10) === 3
|
|
865
|
+
: parseInt(parsedData[4], 10) === 3
|
|
866
|
+
? parsedData[index + 3]
|
|
867
|
+
: null,
|
|
860
868
|
hourmeter: null
|
|
861
869
|
})
|
|
862
870
|
} else if (command[1] === 'GTEPS' || command[1] === 'GTAIS') {
|
|
863
871
|
// External low battery and voltage for analog input
|
|
864
|
-
|
|
872
|
+
const number = parsedData[6] !== '' ? parseInt(parsedData[6], 10) : 1
|
|
865
873
|
let index = 6 + 12 * number // position append mask
|
|
866
874
|
let satelliteInfo = false
|
|
867
875
|
|
|
@@ -914,7 +922,7 @@ const parse = raw => {
|
|
|
914
922
|
})
|
|
915
923
|
} else if (command[1] === 'GTTMP') {
|
|
916
924
|
// Temperature Alarm
|
|
917
|
-
|
|
925
|
+
const number = parsedData[7] !== '' ? parseInt(parsedData[7], 10) : 1
|
|
918
926
|
let index = 7 + 12 * number // position append mask
|
|
919
927
|
let satelliteInfo = false
|
|
920
928
|
|
|
@@ -944,27 +952,27 @@ const parse = raw => {
|
|
|
944
952
|
raw: `${parsedData[index + 6]}${parsedData[index + 7]}`,
|
|
945
953
|
sos: false,
|
|
946
954
|
input: {
|
|
947
|
-
|
|
955
|
+
4:
|
|
948
956
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[0] ===
|
|
949
957
|
'1',
|
|
950
|
-
|
|
958
|
+
3:
|
|
951
959
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[1] ===
|
|
952
960
|
'1',
|
|
953
|
-
|
|
961
|
+
2:
|
|
954
962
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[2] ===
|
|
955
963
|
'1',
|
|
956
|
-
|
|
964
|
+
1:
|
|
957
965
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 6][1]), 4)[3] ===
|
|
958
966
|
'1'
|
|
959
967
|
},
|
|
960
968
|
output: {
|
|
961
|
-
|
|
969
|
+
3:
|
|
962
970
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 7][1]), 4)[1] ===
|
|
963
971
|
'1',
|
|
964
|
-
|
|
972
|
+
2:
|
|
965
973
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 7][1]), 4)[2] ===
|
|
966
974
|
'1',
|
|
967
|
-
|
|
975
|
+
1:
|
|
968
976
|
utils.nHexDigit(utils.hex2bin(parsedData[index + 7][1]), 4)[3] ===
|
|
969
977
|
'1'
|
|
970
978
|
},
|
|
@@ -1169,7 +1177,7 @@ const parse = raw => {
|
|
|
1169
1177
|
hourmeter: null
|
|
1170
1178
|
})
|
|
1171
1179
|
} else if (command[1] === 'GTCRG') {
|
|
1172
|
-
|
|
1180
|
+
const number = parsedData[5] !== '' ? parseInt(parsedData[5]) : 1
|
|
1173
1181
|
let start = 6
|
|
1174
1182
|
|
|
1175
1183
|
data = Object.assign(data, {
|
|
@@ -1183,7 +1191,7 @@ const parse = raw => {
|
|
|
1183
1191
|
}
|
|
1184
1192
|
})
|
|
1185
1193
|
|
|
1186
|
-
|
|
1194
|
+
const more = []
|
|
1187
1195
|
for (let i = 1; i <= number; i++) {
|
|
1188
1196
|
more.push({
|
|
1189
1197
|
id: parsedData[start] !== '' ? parseInt(parsedData[start]) : null,
|
|
@@ -1489,7 +1497,7 @@ const parse = raw => {
|
|
|
1489
1497
|
})
|
|
1490
1498
|
} else if (command[1] === 'GTIDA') {
|
|
1491
1499
|
// iButton
|
|
1492
|
-
|
|
1500
|
+
const number = parsedData[7] !== '' ? parseInt(parsedData[7], 10) : 1
|
|
1493
1501
|
let index = 7 + 12 * number // position append mask
|
|
1494
1502
|
let satelliteInfo = false
|
|
1495
1503
|
|
|
@@ -1541,7 +1549,7 @@ const parse = raw => {
|
|
|
1541
1549
|
hourmeter: null
|
|
1542
1550
|
})
|
|
1543
1551
|
} else if (command[1] === 'GTCAN') {
|
|
1544
|
-
|
|
1552
|
+
const canData = utils.getCanData(parsedData, 5, command[1])
|
|
1545
1553
|
let index = canData[0] // position append mask
|
|
1546
1554
|
let satelliteInfo = false
|
|
1547
1555
|
|
|
@@ -1668,7 +1676,7 @@ const parse = raw => {
|
|
|
1668
1676
|
uartDeviceType: 'Camaleon',
|
|
1669
1677
|
fuelSensorData: null
|
|
1670
1678
|
}
|
|
1671
|
-
|
|
1679
|
+
const AC100Devices = [
|
|
1672
1680
|
{
|
|
1673
1681
|
deviceNumber: `${parsedData[2]}|1`,
|
|
1674
1682
|
deviceType: '1',
|
|
@@ -1685,11 +1693,11 @@ const parse = raw => {
|
|
|
1685
1693
|
})
|
|
1686
1694
|
}
|
|
1687
1695
|
externalData = Object.assign(externalData, {
|
|
1688
|
-
AC100Devices
|
|
1696
|
+
AC100Devices
|
|
1689
1697
|
})
|
|
1690
1698
|
data = Object.assign(data, {
|
|
1691
1699
|
alarm: utils.getAlarm('GTERI', null),
|
|
1692
|
-
externalData
|
|
1700
|
+
externalData
|
|
1693
1701
|
})
|
|
1694
1702
|
} else if (/^>ET/.test(parsedData[7])) {
|
|
1695
1703
|
// Temp Alarms
|
|
@@ -1701,7 +1709,7 @@ const parse = raw => {
|
|
|
1701
1709
|
parsedSerialData[4]
|
|
1702
1710
|
])
|
|
1703
1711
|
data = Object.assign(data, {
|
|
1704
|
-
alarm
|
|
1712
|
+
alarm
|
|
1705
1713
|
})
|
|
1706
1714
|
} else if (/^>ID/.test(parsedData[7])) {
|
|
1707
1715
|
// Checks if its a iButton GTDAT -> DT
|
|
@@ -1710,7 +1718,7 @@ const parse = raw => {
|
|
|
1710
1718
|
const driverID = parsedSerialData[2] ? parsedSerialData[2] : ''
|
|
1711
1719
|
const alarm = utils.getAlarm('GTIDA', `${driverID},1`)
|
|
1712
1720
|
data = Object.assign(data, {
|
|
1713
|
-
alarm
|
|
1721
|
+
alarm
|
|
1714
1722
|
})
|
|
1715
1723
|
} else {
|
|
1716
1724
|
// Normal GTDAT
|
|
@@ -1749,9 +1757,9 @@ const parse = raw => {
|
|
|
1749
1757
|
} else {
|
|
1750
1758
|
// Long format
|
|
1751
1759
|
// let index = 20 // position append mask
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1760
|
+
const satelliteInfo = utils.includeSatellites(parsedData[20])
|
|
1761
|
+
const accuracyInfo = utils.includeGnnsAccuracy(parsedData[20]) ? 3 : 0
|
|
1762
|
+
const index = 20 + satelliteInfo + accuracyInfo
|
|
1755
1763
|
|
|
1756
1764
|
data = Object.assign(data, {
|
|
1757
1765
|
alarm: utils.getAlarm(command[1], parsedData[8], parsedData[6]),
|
|
@@ -1791,9 +1799,9 @@ const parse = raw => {
|
|
|
1791
1799
|
satelliteInfo &&
|
|
1792
1800
|
parsedData[index - (satelliteInfo + accuracyInfo) + 1] !== ''
|
|
1793
1801
|
? parseInt(
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1802
|
+
parsedData[index - (satelliteInfo + accuracyInfo) + 1],
|
|
1803
|
+
10
|
|
1804
|
+
)
|
|
1797
1805
|
: null,
|
|
1798
1806
|
Hdop:
|
|
1799
1807
|
accuracyInfo && parsedData[index - accuracyInfo + 1] !== ''
|
|
@@ -2120,34 +2128,34 @@ const parse = raw => {
|
|
|
2120
2128
|
} else if (command[1] === 'GTBAA') {
|
|
2121
2129
|
// Bluetooth alarms
|
|
2122
2130
|
let satelliteInfo = false
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2131
|
+
const appendIx = 8
|
|
2132
|
+
const appendMask = utils.nHexDigit(utils.hex2bin(parsedData[appendIx]), 16)
|
|
2133
|
+
const btAccessory = parsedData[5]
|
|
2134
|
+
const aNameIx = appendIx + parseInt(appendMask[15])
|
|
2135
|
+
const aMacIx = aNameIx + parseInt(appendMask[14])
|
|
2136
|
+
const aStatIx = aMacIx + parseInt(appendMask[13])
|
|
2137
|
+
const aBatIx = aStatIx + parseInt(appendMask[12])
|
|
2138
|
+
const aTmpIx = aBatIx + parseInt(appendMask[11])
|
|
2139
|
+
const aHumIx = aTmpIx + parseInt(appendMask[10])
|
|
2140
|
+
const ioIx = aHumIx + parseInt(appendMask[8])
|
|
2141
|
+
const aEvIx =
|
|
2134
2142
|
appendMask[8] === '1' && appendMask[7] === '1'
|
|
2135
2143
|
? ioIx + 3
|
|
2136
2144
|
: ioIx + parseInt(appendMask[7])
|
|
2137
|
-
|
|
2145
|
+
const pressIx =
|
|
2138
2146
|
appendMask[7] === '1' && appendMask[6] === '1'
|
|
2139
2147
|
? aEvIx + 2
|
|
2140
2148
|
: aEvIx + parseInt(appendMask[6])
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2149
|
+
const timeIx = pressIx + parseInt(appendMask[5])
|
|
2150
|
+
const eTmpIx = timeIx + parseInt(appendMask[4])
|
|
2151
|
+
const magIx = eTmpIx + parseInt(appendMask[3])
|
|
2152
|
+
const aBatpIx =
|
|
2145
2153
|
appendMask[3] === '1' && appendMask[2] === '1'
|
|
2146
2154
|
? magIx + 3
|
|
2147
2155
|
: magIx + parseInt(appendMask[2])
|
|
2148
|
-
|
|
2156
|
+
const relIx = aBatpIx + parseInt(appendMask[1])
|
|
2149
2157
|
|
|
2150
|
-
|
|
2158
|
+
const newIndex = relIx + 1 + parseInt(appendMask[1])
|
|
2151
2159
|
let satIndex = newIndex + 11
|
|
2152
2160
|
|
|
2153
2161
|
// If get satellites is configured
|
|
@@ -2156,7 +2164,7 @@ const parse = raw => {
|
|
|
2156
2164
|
satelliteInfo = true
|
|
2157
2165
|
}
|
|
2158
2166
|
|
|
2159
|
-
|
|
2167
|
+
const bleInfo = {
|
|
2160
2168
|
accesory:
|
|
2161
2169
|
btAccessory !== '' ? utils.bluetoothAccessories[btAccessory] : null,
|
|
2162
2170
|
model: parsedData[6] !== '' ? parseInt(parsedData[6]) : null,
|
|
@@ -2184,7 +2192,7 @@ const parse = raw => {
|
|
|
2184
2192
|
: null
|
|
2185
2193
|
}
|
|
2186
2194
|
|
|
2187
|
-
|
|
2195
|
+
const bleData = {
|
|
2188
2196
|
temperature:
|
|
2189
2197
|
parsedData[aTmpIx] !== '' && appendMask[11] === '1'
|
|
2190
2198
|
? parseInt(parsedData[aTmpIx])
|
|
@@ -2321,15 +2329,18 @@ const parse = raw => {
|
|
|
2321
2329
|
// Bluetooth beacon detection
|
|
2322
2330
|
// Bluetooth beacon detection
|
|
2323
2331
|
let index = 4
|
|
2324
|
-
|
|
2332
|
+
const number = parsedData[index] !== '' ? parseInt(parsedData[index]) : 1
|
|
2325
2333
|
|
|
2326
|
-
|
|
2334
|
+
const btDevices = []
|
|
2327
2335
|
for (let i = 1; i <= number; i++) {
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2336
|
+
const appendMask = utils.nHexDigit(
|
|
2337
|
+
utils.hex2bin(parsedData[index + 2]),
|
|
2338
|
+
8
|
|
2339
|
+
)
|
|
2340
|
+
const macIx = index + 2 + parseInt(appendMask[6])
|
|
2341
|
+
const batIx = macIx + parseInt(appendMask[4])
|
|
2342
|
+
const sigIx = batIx + parseInt(appendMask[1])
|
|
2343
|
+
const typeIx = sigIx + parseInt(appendMask[0])
|
|
2333
2344
|
btDevices.push({
|
|
2334
2345
|
model:
|
|
2335
2346
|
parsedData[index + 1] !== ''
|
|
@@ -2355,44 +2366,48 @@ const parse = raw => {
|
|
|
2355
2366
|
data:
|
|
2356
2367
|
appendMask[0] === '1' && parsedData[typeIx + 1] !== ''
|
|
2357
2368
|
? {
|
|
2358
|
-
|
|
2369
|
+
idMfrData:
|
|
2359
2370
|
parsedData[typeIx] === '0' && parsedData[typeIx + 1] !== ''
|
|
2360
2371
|
? parsedData[typeIx + 1]
|
|
2361
2372
|
: null,
|
|
2362
|
-
|
|
2373
|
+
uuid:
|
|
2363
2374
|
parsedData[typeIx] === '1' && parsedData[typeIx + 1] !== ''
|
|
2364
2375
|
? parsedData[typeIx + 1]
|
|
2365
2376
|
: null,
|
|
2366
|
-
|
|
2377
|
+
major:
|
|
2367
2378
|
parsedData[typeIx] === '1' && parsedData[typeIx + 2] !== ''
|
|
2368
2379
|
? parsedData[typeIx + 2]
|
|
2369
2380
|
: null,
|
|
2370
|
-
|
|
2381
|
+
minor:
|
|
2371
2382
|
parsedData[typeIx] === '1' && parsedData[typeIx + 3] !== ''
|
|
2372
2383
|
? parsedData[typeIx + 3]
|
|
2373
2384
|
: null,
|
|
2374
|
-
|
|
2385
|
+
nid:
|
|
2375
2386
|
parsedData[typeIx] === '2' && parsedData[typeIx + 1] !== ''
|
|
2376
2387
|
? parsedData[typeIx + 1]
|
|
2377
2388
|
: null,
|
|
2378
|
-
|
|
2389
|
+
bid:
|
|
2379
2390
|
parsedData[typeIx] === '2' && parsedData[typeIx + 2] !== ''
|
|
2380
2391
|
? parsedData[typeIx + 2]
|
|
2381
2392
|
: null
|
|
2382
|
-
|
|
2393
|
+
}
|
|
2383
2394
|
: null
|
|
2384
2395
|
})
|
|
2385
|
-
|
|
2396
|
+
const extra =
|
|
2386
2397
|
parsedData[typeIx] === '0'
|
|
2387
2398
|
? 1
|
|
2388
|
-
: parsedData[typeIx] === '1'
|
|
2399
|
+
: parsedData[typeIx] === '1'
|
|
2400
|
+
? 3
|
|
2401
|
+
: parsedData[typeIx] === '2'
|
|
2402
|
+
? 2
|
|
2403
|
+
: 0
|
|
2389
2404
|
index = typeIx + 1 + extra
|
|
2390
2405
|
}
|
|
2391
2406
|
|
|
2392
2407
|
index = index - 1
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2408
|
+
const satelliteInfo = utils.includeSatellites(parsedData[index + 12])
|
|
2409
|
+
const jammingSate = utils.includeJammingSate(parsedData[index + 12])
|
|
2410
|
+
const satIndex = index + 12 + satelliteInfo + jammingSate
|
|
2396
2411
|
|
|
2397
2412
|
data = Object.assign(data, {
|
|
2398
2413
|
alarm: utils.getAlarm(command[1], null, 'gv310lau'),
|
|
@@ -2452,13 +2467,13 @@ const parse = raw => {
|
|
|
2452
2467
|
hourmeter: null
|
|
2453
2468
|
})
|
|
2454
2469
|
|
|
2455
|
-
|
|
2470
|
+
const bluetoothData = {
|
|
2456
2471
|
connectedDevices: number,
|
|
2457
|
-
btDevices
|
|
2472
|
+
btDevices
|
|
2458
2473
|
}
|
|
2459
2474
|
|
|
2460
2475
|
data = Object.assign(data, {
|
|
2461
|
-
bluetoothData
|
|
2476
|
+
bluetoothData
|
|
2462
2477
|
})
|
|
2463
2478
|
} else if (command[1] === 'GTVGN' || command[1] === 'GTVGF') {
|
|
2464
2479
|
// Virtual ignition
|
|
@@ -2517,8 +2532,8 @@ const parse = raw => {
|
|
|
2517
2532
|
alarm: utils.getAlarm(command[1], null),
|
|
2518
2533
|
fixType: parsedData[3] !== '' ? parsedData[3] : null
|
|
2519
2534
|
})
|
|
2520
|
-
|
|
2521
|
-
|
|
2535
|
+
const antData = []
|
|
2536
|
+
let index = 4
|
|
2522
2537
|
for (let i = 0; i < 6; i++) {
|
|
2523
2538
|
antData.push({
|
|
2524
2539
|
mcc: parsedData[index] !== '' ? parseInt(parsedData[index], 10) : null,
|
|
@@ -2539,16 +2554,16 @@ const parse = raw => {
|
|
|
2539
2554
|
rxLevel:
|
|
2540
2555
|
parsedData[index + 4] !== ''
|
|
2541
2556
|
? utils.getSignalStrength(
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2557
|
+
'GSM',
|
|
2558
|
+
parseInt(parsedData[index + 4], 10)
|
|
2559
|
+
)
|
|
2545
2560
|
: null,
|
|
2546
2561
|
rxSignalPercentage:
|
|
2547
2562
|
parsedData[index + 4] !== ''
|
|
2548
2563
|
? utils.getSignalPercentage(
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2564
|
+
'GSM',
|
|
2565
|
+
parseInt(parsedData[index + 4], 10)
|
|
2566
|
+
)
|
|
2552
2567
|
: null
|
|
2553
2568
|
})
|
|
2554
2569
|
index += 6
|
|
@@ -2577,9 +2592,9 @@ const parse = raw => {
|
|
|
2577
2592
|
rxSignalPercentage:
|
|
2578
2593
|
parsedData[index + 4] !== ''
|
|
2579
2594
|
? utils.getSignalPercentage(
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2595
|
+
'GSM',
|
|
2596
|
+
parseInt(parsedData[index + 4], 10)
|
|
2597
|
+
)
|
|
2583
2598
|
: null
|
|
2584
2599
|
})
|
|
2585
2600
|
} else if (command[1] === 'GTCLT') {
|
|
@@ -2593,65 +2608,65 @@ const parse = raw => {
|
|
|
2593
2608
|
satelliteInfo = true
|
|
2594
2609
|
}
|
|
2595
2610
|
|
|
2596
|
-
|
|
2611
|
+
const alarmMask1 =
|
|
2597
2612
|
parsedData[5] !== ''
|
|
2598
2613
|
? utils
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2614
|
+
.nHexDigit(utils.hex2bin(parsedData[5]), 32)
|
|
2615
|
+
.split('')
|
|
2616
|
+
.reverse()
|
|
2617
|
+
.join('')
|
|
2603
2618
|
: null
|
|
2604
|
-
|
|
2619
|
+
const alarmMask2 =
|
|
2605
2620
|
parsedData[6] !== ''
|
|
2606
2621
|
? utils
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2622
|
+
.nHexDigit(utils.hex2bin(parsedData[6]), 32)
|
|
2623
|
+
.split('')
|
|
2624
|
+
.reverse()
|
|
2625
|
+
.join('')
|
|
2611
2626
|
: null
|
|
2612
|
-
|
|
2627
|
+
const alarmMask3 =
|
|
2613
2628
|
parsedData[7] !== ''
|
|
2614
2629
|
? utils
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2630
|
+
.nHexDigit(utils.hex2bin(parsedData[7]), 32)
|
|
2631
|
+
.split('')
|
|
2632
|
+
.reverse()
|
|
2633
|
+
.join('')
|
|
2619
2634
|
: null
|
|
2620
|
-
|
|
2635
|
+
const inicatorsBin =
|
|
2621
2636
|
parsedData[28] !== ''
|
|
2622
2637
|
? utils.nHexDigit(utils.hex2bin(parsedData[28]), 16)
|
|
2623
2638
|
: null
|
|
2624
|
-
|
|
2639
|
+
const lights =
|
|
2625
2640
|
parsedData[29] !== ''
|
|
2626
2641
|
? utils.nHexDigit(utils.hex2bin(parsedData[29]), 8)
|
|
2627
2642
|
: null
|
|
2628
|
-
|
|
2643
|
+
const doors =
|
|
2629
2644
|
parsedData[30] !== ''
|
|
2630
2645
|
? utils.nHexDigit(utils.hex2bin(parsedData[30]), 8)
|
|
2631
2646
|
: null
|
|
2632
|
-
|
|
2647
|
+
const canExpansionMask =
|
|
2633
2648
|
parsedData[33] !== ''
|
|
2634
2649
|
? utils
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2650
|
+
.nHexDigit(utils.hex2bin(parsedData[33]), 32)
|
|
2651
|
+
.split('')
|
|
2652
|
+
.reverse()
|
|
2653
|
+
.join('')
|
|
2639
2654
|
: null
|
|
2640
|
-
|
|
2655
|
+
const expansionBin =
|
|
2641
2656
|
parsedData[54] !== ''
|
|
2642
2657
|
? utils
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2658
|
+
.nHexDigit(utils.hex2bin(parsedData[54]), 16)
|
|
2659
|
+
.split('')
|
|
2660
|
+
.reverse()
|
|
2661
|
+
.join('')
|
|
2647
2662
|
: null
|
|
2648
|
-
|
|
2663
|
+
const tachographBin =
|
|
2649
2664
|
parsedData[27] !== ''
|
|
2650
2665
|
? utils
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2666
|
+
.nHexDigit(utils.hex2bin(parsedData[27]), 8)
|
|
2667
|
+
.split('')
|
|
2668
|
+
.reverse()
|
|
2669
|
+
.join('')
|
|
2655
2670
|
: null
|
|
2656
2671
|
data = Object.assign(data, {
|
|
2657
2672
|
alarm: utils.getAlarm(command[1], parsedData[6], [
|
|
@@ -3127,13 +3142,13 @@ const parse = raw => {
|
|
|
3127
3142
|
satelliteInfo = true
|
|
3128
3143
|
}
|
|
3129
3144
|
|
|
3130
|
-
|
|
3131
|
-
|
|
3132
|
-
|
|
3145
|
+
const maxAcc = parsedData[index + 1] !== '' ? parsedData[index + 1] : null
|
|
3146
|
+
const avgAcc = parsedData[index + 2] !== '' ? parsedData[index + 2] : null
|
|
3147
|
+
const duration =
|
|
3133
3148
|
parsedData[index + 3] !== ''
|
|
3134
3149
|
? parseFloat(parsedData[index + 3]) / 100
|
|
3135
3150
|
: null
|
|
3136
|
-
|
|
3151
|
+
const speed = parsedData[8] !== '' ? parseFloat(parsedData[8]) : null
|
|
3137
3152
|
|
|
3138
3153
|
data = Object.assign(data, {
|
|
3139
3154
|
alarm: utils.getAlarm(
|
|
@@ -3145,7 +3160,7 @@ const parse = raw => {
|
|
|
3145
3160
|
type: 'Point',
|
|
3146
3161
|
coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
|
|
3147
3162
|
},
|
|
3148
|
-
speed
|
|
3163
|
+
speed,
|
|
3149
3164
|
gpsStatus: utils.checkGps(
|
|
3150
3165
|
parseFloat(parsedData[11]),
|
|
3151
3166
|
parseFloat(parsedData[12])
|
|
@@ -3202,7 +3217,7 @@ const parse = raw => {
|
|
|
3202
3217
|
? utils.getAccelerationMagnitude(avgAcc.substring(8, 12), 4)
|
|
3203
3218
|
: null
|
|
3204
3219
|
},
|
|
3205
|
-
duration
|
|
3220
|
+
duration,
|
|
3206
3221
|
odometer:
|
|
3207
3222
|
parsedData[index + 4] !== '' ? parseFloat(parsedData[index + 4]) : null,
|
|
3208
3223
|
hourmeter: null
|
|
@@ -3284,5 +3299,5 @@ const parse = raw => {
|
|
|
3284
3299
|
}
|
|
3285
3300
|
|
|
3286
3301
|
module.exports = {
|
|
3287
|
-
parse
|
|
3302
|
+
parse
|
|
3288
3303
|
}
|