queclink-parser 1.9.17 → 1.9.19
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 +23 -0
- package/example.js +7 -2
- package/package.json +1 -1
- package/src/gv310lau.js +63 -65
- package/src/gv58lau.js +74 -36
- package/src/utils.js +299 -220
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
#### 1.9.19 (2025-10-27)
|
|
2
|
+
|
|
3
|
+
##### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* **GTBID:**
|
|
6
|
+
* se corrige dato sin precencia de <beacon Data> en GV58LAU ([fa52eba0](https://github.com/jaayesta/queclink-parser/commit/fa52eba014c77564f38c170923984646773f1854))
|
|
7
|
+
* se corrige dato sin precencia de <beacon Data> ([c8b2344a](https://github.com/jaayesta/queclink-parser/commit/c8b2344a74199fefe6b1c8bce06b94e01081b95e))
|
|
8
|
+
* **canbus:**
|
|
9
|
+
* se verifica para GTCAN y GTERI ([af7ea88b](https://github.com/jaayesta/queclink-parser/commit/af7ea88b41167aaab4fcf6eb9ccbcaf05c71cdab))
|
|
10
|
+
* se corrige lógica para obtención de velocidad en GTERI con CAN100 ([9a6971b7](https://github.com/jaayesta/queclink-parser/commit/9a6971b71576a6e0b59b29ff869ed09b954d799c))
|
|
11
|
+
* se corrige indexación para speed y rpm ([81995527](https://github.com/jaayesta/queclink-parser/commit/8199552714975aefd7137fb57e4897995b36ab7a))
|
|
12
|
+
|
|
13
|
+
#### 1.9.18 (2025-10-13)
|
|
14
|
+
|
|
15
|
+
##### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* **can:**
|
|
18
|
+
* se corrige indexación para GTERI sin datos CANbus ([2f80889d](https://github.com/jaayesta/queclink-parser/commit/2f80889de3d2d0adf77989ad37d9f336eb72a316))
|
|
19
|
+
* se adapta parser de GTERI con CANbus para FW12 ([20c6deee](https://github.com/jaayesta/queclink-parser/commit/20c6deeea2a688d0d1902eea69d448eb17bb064c))
|
|
20
|
+
* se corrige parser para GTERI con CANbus. ([a4aa7e68](https://github.com/jaayesta/queclink-parser/commit/a4aa7e689a9a36cae14c327568387dcded7c9ed3))
|
|
21
|
+
* se corrige parser para GTCAN. ([d1c72161](https://github.com/jaayesta/queclink-parser/commit/d1c721615f313d5fab1aaaff3766a37ac334dde0))
|
|
22
|
+
* **canbus:** asignación de odometro, horometro y velocidad dependen de comunicationOk ([6749610b](https://github.com/jaayesta/queclink-parser/commit/6749610beda92e671629a5b7b2f909c0a3a980b7))
|
|
23
|
+
|
|
1
24
|
#### 1.9.17 (2025-09-22)
|
|
2
25
|
|
|
3
26
|
##### New Features
|
package/example.js
CHANGED
|
@@ -84,9 +84,14 @@ var newdtt = '+RESP:GTDTT,6E0802,868589060722215,,,,0,264,�Q4���,OzJ(�
|
|
|
84
84
|
var tpms = '+RESP:GTERI,6E0802,868589060612317,,00000104,14134,10,1,1,0.0,160,536.2,-70.676717,-33.422117,20250331211305,0730,0001,3345,003B3901,01,12,5809.4,0000132:27:33,,,,98,110000,0,0,203FFFFF,,,,,,,,,,,,,,,,,,,,,,,FFFFFF,,,,,,,,,,,,,,,,,,,,,,,,,6,00,13,0,00000000,4007,,780541484188,1,0,02,6,5,0DAD092E,083F,,7805413E6D0D,1,3423,23,35,23.50,06,12,0,005E4EB3,0617,RF,08351B002230,1,38,235,20250331211239,07,12,0,005F50B3,0617,LF,08351B00234E,1,40,237,20250331211221,08,12,0,005F4CB3,0617,RR,08351B00222D,1,36,237,20250331211215,09,12,0,00624CB3,0617,LR,08351B002247,1,36,245,20250331211209,20250331211306,AD50$'
|
|
85
85
|
var newdtt = '+RESP:GTDTT,6E1102,866775051622785,GV310LAU,,,0,9,1134122,0,0.0,173,72.7,117.129363,31.839142,20221201085356,0460,0000,550B,085BE2AA,01,6,,,,,20221201085357,2E9E$'
|
|
86
86
|
var dis58 = '+RESP:GTDIS,8020040803,866314061861249,,,10,1,1,0.0,349,399.7,-70.770383,-33.474911,20250516154520,0730,0001,333F,003D0711,01,11,55.2,20250516154521,B08D$'
|
|
87
|
-
|
|
88
87
|
var test = '+RESP:GTERI,6E0C03,868589060367102,,00000104,13621,10,1,1,0.0,5,190.7,-71.541291,-33.576625,20250829142314,0730,0001,16A9,00305D03,01,12,31513.0,0002500:06:38,,,,100,110000,0,0,0,1,00,13,0,,4007,,FFFFFFFFFFFF,0,,20250829142315,D3AF$'
|
|
89
88
|
var test2 ="+RESP:GTERI,6E0C03,868589060839548,,00000104,27841,10,1,1,0.0,1,195.5,-71.541562,-33.576687,20250903005133,0730,0001,16A9,00305D03,01,12,21626.9,0000531:51:33,,,,100,210900,0,1,203A2B9F,,2,H7241302,243017.00,0,H4.5,P91.60,,37.09,10.33,0040,00,0.00,0.00,A2BAFF,62,,,,,,,,11910,37.09,1.50,2.20,,,0,, 1,00,13,0,00000000,4007,,78054143F0A5,1,0,20250903005134,C7A3$"
|
|
89
|
+
var cantest = "+RESP:GTCAN,6E0C03,868589061030451,gv310lau,00,1,E03DECFF,9BSP6X200N3999611,2,H3403506,99984.57,500,0,85,H1.9,0,264.64,30.70,63.92,6596,FFFF,,00,0.00,0.00,DED0FF,97,4374,0,,,,,,6.61,2238,,,,,0000,1,,,,1,0.0,92,473.0,-70.786429,-33.437795,20251024202114,0730,0003,9C4E,00063E0D,01,12,20251024202114,5FC2$"
|
|
90
|
+
var cantest2 = "+RESP:GTERI,6E0C03,868589060653113,,00000104,27690,10,1,0,9.6,93,634.9,-70.578870,-33.401553,20250829161508,0730,0001,3333,002FA204,01,0,771665.5,0001471:12:04,,,,100,120000,0,1,203FFFFF,,0,H7724170,251352.00,,0,45,H0.0,P39.60,,0,1470.49,902.47,568.02,1270.01,,FFFF,0040,,00,0.00,0.00,FFFFFF,62,,,,,,,,714181,857821,10804,1470.49,53.99,25.48,60368,,,,,,0000,10,0,,1,00,13,0,00000000,4007,,7805414843E0,1,0,20250829165819,68A1$"
|
|
91
|
+
var cantest3 = '+RESP:GTCAN,6E0C03,868589061014489,,00,1,E033A2BF,,2,H84671,2268.84,1187,88,H28.1,,30.77,,FFFF,0200,0.00,0.00,3A2CFF,0,,,,,,,,150,122.45,0.70,,,0000,2,,,1,86.8,31,159.5,-71.508382,-35.292014,20251024201914,0730,0003,177E,000F2C33,01,12,20251024201916,F485$'
|
|
92
|
+
var t = "+RESP:GTBID,6E0C03,868589061029669,,1,0,000A,7805413BD3C9,2989,0,0.0,258,670.8,-70.603452,-33.617190,20251024065630,0730,0001,332E,00307303,01,12,20251024065631,CE7B$"
|
|
93
|
+
var t2 = "+RESP:GTBID,6E0C03,868589061029669,,0,0,0.0,282,670.8,-70.603452,-33.617190,20251024065600,0730,0001,332E,00307303,01,12,20251024065601,CE77$"
|
|
94
|
+
|
|
90
95
|
var data = {
|
|
91
96
|
"imei": 868589060039404,
|
|
92
97
|
"instruction": "temp_alarm_off",
|
|
@@ -168,7 +173,7 @@ spd = {
|
|
|
168
173
|
"times": "30"
|
|
169
174
|
}
|
|
170
175
|
// console.log(queclink.parseCommand(action))
|
|
171
|
-
const raw = new Buffer.from(
|
|
176
|
+
const raw = new Buffer.from(cantest2)
|
|
172
177
|
console.log(JSON.stringify(queclink.parse(raw), null, 2))
|
|
173
178
|
queclink.parse(raw)
|
|
174
179
|
|
package/package.json
CHANGED
package/src/gv310lau.js
CHANGED
|
@@ -251,7 +251,8 @@ const parse = raw => {
|
|
|
251
251
|
// External Data
|
|
252
252
|
const digitFuelSensor =
|
|
253
253
|
utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[10] === '1'
|
|
254
|
-
const AC100 =
|
|
254
|
+
const AC100 =
|
|
255
|
+
utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[9] === '1'
|
|
255
256
|
const canData =
|
|
256
257
|
utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[8] === '1'
|
|
257
258
|
const fuelLevelPercentage =
|
|
@@ -541,63 +542,61 @@ const parse = raw => {
|
|
|
541
542
|
AC100Devices: ac100Devices
|
|
542
543
|
})
|
|
543
544
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
545
|
+
// } else if (parsedData[index + 8] === '7') {
|
|
546
|
+
// index += 1
|
|
547
|
+
// // RF433 Devices
|
|
548
|
+
// let rf433Devices = []
|
|
549
|
+
// // Review when RF433 devices are implemented
|
|
550
|
+
// let count = index + 9
|
|
551
|
+
// for (var l = 0; l < rf433DevicesConnected; l++) {
|
|
552
|
+
// rf433Devices.push({
|
|
553
|
+
// // deviceNumber: parsedData[count],
|
|
554
|
+
// // deviceType: parsedData[count + 1],
|
|
555
|
+
// // deviceData: parsedData[count + 2]
|
|
556
|
+
// // ? utils.getTempInCelciousDegrees(parsedData[count + 2])
|
|
557
|
+
// // : null
|
|
558
|
+
// deviceData: parsedData[count]
|
|
559
|
+
// })
|
|
560
|
+
// count += 1
|
|
561
|
+
// // count += 3
|
|
562
|
+
// }
|
|
563
|
+
// externalData = Object.assign(externalData, {
|
|
564
|
+
// rf433Devices: rf433Devices
|
|
565
|
+
// })
|
|
565
566
|
}
|
|
566
567
|
|
|
567
|
-
var isValidCanData = true
|
|
568
568
|
if (canData) {
|
|
569
569
|
let newIndex = digitFuelSensor && !AC100 ? index + 9 + 1 : !digitFuelSensor && AC100 ? index + 9 + 4 : digitFuelSensor && AC100 ? index + 9 + 5 : index + 9
|
|
570
|
-
let
|
|
570
|
+
let parsedCanData = utils.getCanData(parsedData, newIndex, command[1])
|
|
571
|
+
let canInfo = parsedCanData[3]
|
|
572
|
+
index = parsedCanData[0]
|
|
571
573
|
if (Object.keys(canInfo).length > 0) {
|
|
572
574
|
data = Object.assign(data, { can: canInfo })
|
|
573
|
-
index =
|
|
575
|
+
// index = parsedCanData[0]
|
|
574
576
|
|
|
575
|
-
if (canInfo?.
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
577
|
+
if (canInfo?.comunicationOk) {
|
|
578
|
+
if (typeof canInfo?.totalDistance === 'number') {
|
|
579
|
+
data.gpsOdometer = data.odometer
|
|
580
|
+
data.odometer = canInfo.totalDistance
|
|
581
|
+
}
|
|
579
582
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
583
|
+
if (typeof canInfo?.engineHours === 'number') {
|
|
584
|
+
data.gpsHourmeter = data.hourmeter
|
|
585
|
+
data.hourmeter = canInfo.engineHours
|
|
586
|
+
}
|
|
584
587
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
+
if (typeof canInfo?.speed === 'number' && canInfo?.speed > 0) {
|
|
589
|
+
data.gpsSpeed = data.speed;
|
|
590
|
+
data.speed = canInfo.speed;
|
|
591
|
+
}
|
|
588
592
|
}
|
|
589
|
-
} else {
|
|
590
|
-
isValidCanData = false
|
|
591
593
|
}
|
|
592
594
|
}
|
|
593
595
|
|
|
594
596
|
// Bluetooth Accessories
|
|
595
597
|
if (bluetoothAccessory) {
|
|
596
|
-
let btIndex = digitFuelSensor ? index +
|
|
597
|
-
|
|
598
|
-
btIndex = isValidCanData? btIndex : btIndex + 2
|
|
599
|
-
}
|
|
600
|
-
|
|
598
|
+
// let btIndex = digitFuelSensor ? index + 1 : index
|
|
599
|
+
let btIndex = canData ? index : index + 9
|
|
601
600
|
let btDevices = utils.getBleData(parsedData, btIndex)
|
|
602
601
|
externalData = Object.assign(externalData, {
|
|
603
602
|
btDevices: btDevices
|
|
@@ -1452,7 +1451,8 @@ const parse = raw => {
|
|
|
1452
1451
|
hourmeter: null
|
|
1453
1452
|
})
|
|
1454
1453
|
} else if (command[1] === 'GTCAN') {
|
|
1455
|
-
let
|
|
1454
|
+
let canData = utils.getCanData(parsedData, 5, command[1])
|
|
1455
|
+
let index = canData[0] // position append mask
|
|
1456
1456
|
let satelliteInfo = false
|
|
1457
1457
|
|
|
1458
1458
|
// If get satellites is configured
|
|
@@ -1463,20 +1463,7 @@ const parse = raw => {
|
|
|
1463
1463
|
|
|
1464
1464
|
data = Object.assign(data, {
|
|
1465
1465
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
1466
|
-
loc: {
|
|
1467
|
-
type: 'Point',
|
|
1468
|
-
coordinates: [parseFloat(parsedData[60]), parseFloat(parsedData[61])]
|
|
1469
|
-
},
|
|
1470
|
-
speed: parsedData[57] !== '' ? parseFloat(parsedData[57]) : null,
|
|
1471
|
-
gpsStatus: utils.checkGps(
|
|
1472
|
-
parseFloat(parsedData[60]),
|
|
1473
|
-
parseFloat(parsedData[61])
|
|
1474
|
-
),
|
|
1475
|
-
hdop: parsedData[56] !== '' ? parseFloat(parsedData[56]) : null,
|
|
1476
1466
|
status: null,
|
|
1477
|
-
azimuth: parsedData[58] !== '' ? parseFloat(parsedData[58]) : null,
|
|
1478
|
-
altitude: parsedData[59] !== '' ? parseFloat(parsedData[59]) : null,
|
|
1479
|
-
datetime: parsedData[62] !== '' ? utils.parseDate(parsedData[62]) : null,
|
|
1480
1467
|
voltage: {
|
|
1481
1468
|
battery: null,
|
|
1482
1469
|
inputCharge: null,
|
|
@@ -1484,19 +1471,20 @@ const parse = raw => {
|
|
|
1484
1471
|
adb: null,
|
|
1485
1472
|
adc: null
|
|
1486
1473
|
},
|
|
1487
|
-
mcc: parsedData[63] !== '' ? utils.latamMcc[parseInt(parsedData[63], 10)] : null,
|
|
1488
|
-
mnc: parsedData[64] !== '' ? utils.getMNC(parsedData[63], parsedData[64]) : null,
|
|
1489
|
-
lac: parsedData[65] !== '' ? parseInt(parsedData[65], 16) : null,
|
|
1490
|
-
cid: parsedData[66] !== '' ? parseInt(parsedData[66], 16) : null,
|
|
1491
1474
|
satellites:
|
|
1492
1475
|
satelliteInfo && parsedData[index]
|
|
1493
1476
|
? parseInt(parsedData[index], 10)
|
|
1494
1477
|
: null,
|
|
1495
1478
|
odometer: null,
|
|
1496
1479
|
hourmeter: null,
|
|
1497
|
-
can:
|
|
1480
|
+
can: canData[3]
|
|
1481
|
+
})
|
|
1482
|
+
|
|
1483
|
+
data = {
|
|
1484
|
+
...data,
|
|
1485
|
+
...canData[1], // gnnsData
|
|
1486
|
+
...canData[2] // gsmData
|
|
1498
1487
|
}
|
|
1499
|
-
)
|
|
1500
1488
|
} else if (command[1] === 'GTDAT') {
|
|
1501
1489
|
let dataIndex = 4
|
|
1502
1490
|
// Short format
|
|
@@ -1672,7 +1660,7 @@ const parse = raw => {
|
|
|
1672
1660
|
let satelliteInfo = utils.includeSatellites(parsedData[20])
|
|
1673
1661
|
let accuracyInfo = utils.includeGnnsAccuracy(parsedData[20]) ? 3 : 0
|
|
1674
1662
|
let index = 20 + satelliteInfo + accuracyInfo
|
|
1675
|
-
|
|
1663
|
+
|
|
1676
1664
|
|
|
1677
1665
|
data = Object.assign(data, {
|
|
1678
1666
|
alarm: utils.getAlarm(command[1], parsedData[8], parsedData[6]),
|
|
@@ -2204,17 +2192,27 @@ const parse = raw => {
|
|
|
2204
2192
|
// Bluetooth beacon detection
|
|
2205
2193
|
let number = parsedData[4] !== '' ? parseInt(parsedData[4]) : 1
|
|
2206
2194
|
let index = 4
|
|
2195
|
+
let binAppendMask = utils.nHexDigit(utils.hex2bin(parsedData[index + 2]), 8)
|
|
2196
|
+
let appendMask = {
|
|
2197
|
+
accessoryMac: binAppendMask[6] == '1',
|
|
2198
|
+
batteryLevel: binAppendMask[4] == '1',
|
|
2199
|
+
signalStrength: binAppendMask[1] == '1',
|
|
2200
|
+
beaconType: binAppendMask[0] == '1'
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2207
2203
|
let appMk, extra
|
|
2208
2204
|
for (let i = 1; i <= number; i++) {
|
|
2209
2205
|
appMk = utils.sumOnes(parsedData[index + 2])
|
|
2210
|
-
extra =
|
|
2206
|
+
extra = appendMask.beaconType ?
|
|
2211
2207
|
parsedData[index + 5] === '0'
|
|
2212
2208
|
? 1
|
|
2213
2209
|
: parsedData[index + 5] === '1'
|
|
2214
2210
|
? 3
|
|
2215
2211
|
: parsedData[index + 5] === '2' ? 2 : 0
|
|
2212
|
+
: 0
|
|
2216
2213
|
index += 2 + appMk + extra
|
|
2217
2214
|
}
|
|
2215
|
+
|
|
2218
2216
|
let satelliteInfo = false
|
|
2219
2217
|
let satIndex = index + 12
|
|
2220
2218
|
|
package/src/gv58lau.js
CHANGED
|
@@ -310,7 +310,8 @@ const parse = raw => {
|
|
|
310
310
|
// External Data
|
|
311
311
|
const bluetoothAccessory =
|
|
312
312
|
utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[2] === '1'
|
|
313
|
-
const canData =
|
|
313
|
+
const canData =
|
|
314
|
+
utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[8] === '1'
|
|
314
315
|
|
|
315
316
|
let externalData = {
|
|
316
317
|
eriMask: {
|
|
@@ -320,18 +321,36 @@ const parse = raw => {
|
|
|
320
321
|
}
|
|
321
322
|
}
|
|
322
323
|
|
|
323
|
-
//
|
|
324
|
-
if (
|
|
325
|
-
let
|
|
324
|
+
// CANBUS data
|
|
325
|
+
if (canData) {
|
|
326
|
+
let parsedCanData = utils.getCanData(parsedData, newIndex, command[1])
|
|
327
|
+
let canInfo = parsedCanData[3]
|
|
328
|
+
index = parsedCanData[0]
|
|
329
|
+
if (Object.keys(canInfo).length > 0) {
|
|
330
|
+
data = Object.assign(data, { can: canInfo })
|
|
331
|
+
if (canInfo?.comunicationOk) {
|
|
332
|
+
if (typeof canInfo?.totalDistance === 'number') {
|
|
333
|
+
data.gpsOdometer = data.odometer
|
|
334
|
+
data.odometer = canInfo.totalDistance
|
|
335
|
+
}
|
|
326
336
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
337
|
+
if (typeof canInfo?.engineHours === 'number') {
|
|
338
|
+
data.gpsHourmeter = data.hourmeter
|
|
339
|
+
data.hourmeter = canInfo.engineHours
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (typeof canInfo?.speed === 'number' && canInfo?.speed > 0) {
|
|
343
|
+
data.gpsSpeed = data.speed;
|
|
344
|
+
data.speed = canInfo.speed;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
331
347
|
}
|
|
348
|
+
}
|
|
332
349
|
|
|
350
|
+
// Bluetooth Accessories
|
|
351
|
+
if (bluetoothAccessory) {
|
|
352
|
+
let btIndex = canData ? index : index + 9
|
|
333
353
|
let btDevices = utils.getBleData(parsedData, btIndex)
|
|
334
|
-
|
|
335
354
|
externalData = Object.assign(externalData, {
|
|
336
355
|
btDevices: btDevices
|
|
337
356
|
})
|
|
@@ -1270,34 +1289,36 @@ const parse = raw => {
|
|
|
1270
1289
|
hourmeter: null
|
|
1271
1290
|
})
|
|
1272
1291
|
} else if (command[1] === 'GTCAN') {
|
|
1273
|
-
let
|
|
1274
|
-
let
|
|
1275
|
-
let
|
|
1292
|
+
let canData = utils.getCanData(parsedData, 5, command[1])
|
|
1293
|
+
let index = canData[0] // position append mask
|
|
1294
|
+
let satelliteInfo = utils.includeSatellites(parsedData[index])
|
|
1295
|
+
let accuracyInfo = utils.includeGnnsAccuracy(parsedData[index]) ? 3 : 0
|
|
1296
|
+
index = index + (satelliteInfo + accuracyInfo)
|
|
1276
1297
|
|
|
1277
1298
|
data = Object.assign(data, {
|
|
1278
1299
|
alarm: utils.getAlarm(command[1], parsedData[4]),
|
|
1279
|
-
loc: {
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
},
|
|
1283
|
-
speed: parsedData[57] !== '' ? parseFloat(parsedData[57]) : null,
|
|
1284
|
-
gpsStatus: utils.checkGps(
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
),
|
|
1288
|
-
hdop: parsedData[56] !== '' ? parseFloat(parsedData[56]) : null,
|
|
1289
|
-
status: null,
|
|
1290
|
-
azimuth: parsedData[58] !== '' ? parseFloat(parsedData[58]) : null,
|
|
1291
|
-
altitude: parsedData[59] !== '' ? parseFloat(parsedData[59]) : null,
|
|
1292
|
-
datetime: parsedData[62] !== '' ? utils.parseDate(parsedData[62]) : null,
|
|
1293
|
-
voltage: {
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
},
|
|
1297
|
-
mcc: parsedData[63] !== '' ? utils.latamMcc[parseInt(parsedData[63], 10)] || utils.latamMcc.default : null,
|
|
1298
|
-
mnc: parsedData[64] !== '' ? utils.getMNC(parsedData[63], parsedData[64]) : null,
|
|
1299
|
-
lac: parsedData[65] !== '' ? parseInt(parsedData[65], 16) : null,
|
|
1300
|
-
cid: parsedData[66] !== '' ? parseInt(parsedData[66], 16) : null,
|
|
1300
|
+
// loc: {
|
|
1301
|
+
// type: 'Point',
|
|
1302
|
+
// coordinates: [parseFloat(parsedData[60]), parseFloat(parsedData[61])]
|
|
1303
|
+
// },
|
|
1304
|
+
// speed: parsedData[57] !== '' ? parseFloat(parsedData[57]) : null,
|
|
1305
|
+
// gpsStatus: utils.checkGps(
|
|
1306
|
+
// parseFloat(parsedData[60]),
|
|
1307
|
+
// parseFloat(parsedData[61])
|
|
1308
|
+
// ),
|
|
1309
|
+
// hdop: parsedData[56] !== '' ? parseFloat(parsedData[56]) : null,
|
|
1310
|
+
// status: null,
|
|
1311
|
+
// azimuth: parsedData[58] !== '' ? parseFloat(parsedData[58]) : null,
|
|
1312
|
+
// altitude: parsedData[59] !== '' ? parseFloat(parsedData[59]) : null,
|
|
1313
|
+
// datetime: parsedData[62] !== '' ? utils.parseDate(parsedData[62]) : null,
|
|
1314
|
+
// voltage: {
|
|
1315
|
+
// battery: null,
|
|
1316
|
+
// inputCharge: null
|
|
1317
|
+
// },
|
|
1318
|
+
// mcc: parsedData[63] !== '' ? utils.latamMcc[parseInt(parsedData[63], 10)] || utils.latamMcc.default : null,
|
|
1319
|
+
// mnc: parsedData[64] !== '' ? utils.getMNC(parsedData[63], parsedData[64]) : null,
|
|
1320
|
+
// lac: parsedData[65] !== '' ? parseInt(parsedData[65], 16) : null,
|
|
1321
|
+
// cid: parsedData[66] !== '' ? parseInt(parsedData[66], 16) : null,
|
|
1301
1322
|
satellites:
|
|
1302
1323
|
satelliteInfo && parsedData[index - (satelliteInfo + accuracyInfo) + 1] !== ''
|
|
1303
1324
|
? parseInt(parsedData[index - (satelliteInfo + accuracyInfo) + 1], 10)
|
|
@@ -1316,8 +1337,14 @@ const parse = raw => {
|
|
|
1316
1337
|
: null,
|
|
1317
1338
|
odometer: null,
|
|
1318
1339
|
hourmeter: null,
|
|
1319
|
-
can:
|
|
1340
|
+
can: canData[3],
|
|
1320
1341
|
})
|
|
1342
|
+
|
|
1343
|
+
data = {
|
|
1344
|
+
...data,
|
|
1345
|
+
...canData[1], // gnnsData
|
|
1346
|
+
...canData[2] // gsmData
|
|
1347
|
+
}
|
|
1321
1348
|
} else if (command[1] === 'GTDAT') {
|
|
1322
1349
|
let dataIndex = 4
|
|
1323
1350
|
// Short format
|
|
@@ -1943,17 +1970,28 @@ const parse = raw => {
|
|
|
1943
1970
|
// Bluetooth beacon detection
|
|
1944
1971
|
let number = parsedData[4] !== '' ? parseInt(parsedData[4]) : 1
|
|
1945
1972
|
let index = 4
|
|
1973
|
+
|
|
1974
|
+
let binAppendMask = utils.nHexDigit(utils.hex2bin(parsedData[index + 2]), 8)
|
|
1975
|
+
let appendMask = {
|
|
1976
|
+
accessoryMac: binAppendMask[6] == '1',
|
|
1977
|
+
batteryLevel: binAppendMask[4] == '1',
|
|
1978
|
+
signalStrength: binAppendMask[1] == '1',
|
|
1979
|
+
beaconType: binAppendMask[0] == '1'
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1946
1982
|
let appMk, extra
|
|
1947
1983
|
for (let i = 1; i <= number; i++) {
|
|
1948
1984
|
appMk = utils.sumOnes(parsedData[index + 2])
|
|
1949
|
-
extra =
|
|
1985
|
+
extra = appendMask.beaconType ?
|
|
1950
1986
|
parsedData[index + 5] === '0'
|
|
1951
1987
|
? 1
|
|
1952
1988
|
: parsedData[index + 5] === '1'
|
|
1953
1989
|
? 3
|
|
1954
1990
|
: parsedData[index + 5] === '2' ? 2 : 0
|
|
1991
|
+
: 0
|
|
1955
1992
|
index += 2 + appMk + extra
|
|
1956
1993
|
}
|
|
1994
|
+
|
|
1957
1995
|
let satelliteInfo = false
|
|
1958
1996
|
let satIndex = number * index + 12
|
|
1959
1997
|
|
package/src/utils.js
CHANGED
|
@@ -388,7 +388,7 @@ const checkGps = (lng, lat) => {
|
|
|
388
388
|
included in the report
|
|
389
389
|
*/
|
|
390
390
|
const includeSatellites = positionAppendMask => {
|
|
391
|
-
return nHexDigit(hex2bin(positionAppendMask), 4)[3]
|
|
391
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[3] === '1'
|
|
392
392
|
}
|
|
393
393
|
|
|
394
394
|
/*
|
|
@@ -396,7 +396,7 @@ const includeSatellites = positionAppendMask => {
|
|
|
396
396
|
included in the report
|
|
397
397
|
*/
|
|
398
398
|
const includeGnssTrigger = positionAppendMask => {
|
|
399
|
-
return nHexDigit(hex2bin(positionAppendMask), 4)[2]
|
|
399
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[2] === '1'
|
|
400
400
|
}
|
|
401
401
|
|
|
402
402
|
/*
|
|
@@ -404,7 +404,7 @@ const includeGnssTrigger = positionAppendMask => {
|
|
|
404
404
|
included in the report
|
|
405
405
|
*/
|
|
406
406
|
const includeStatus = positionAppendMask => {
|
|
407
|
-
return nHexDigit(hex2bin(positionAppendMask), 4)[1]
|
|
407
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[1] === '1'
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/*
|
|
@@ -412,7 +412,7 @@ const includeStatus = positionAppendMask => {
|
|
|
412
412
|
included in the report
|
|
413
413
|
*/
|
|
414
414
|
const includeGnnsAccuracy = positionAppendMask => {
|
|
415
|
-
return nHexDigit(hex2bin(positionAppendMask), 4)[0]
|
|
415
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[0] === '1'
|
|
416
416
|
}
|
|
417
417
|
|
|
418
418
|
/*
|
|
@@ -695,244 +695,323 @@ const parseCanData = (data, key) => {
|
|
|
695
695
|
/*
|
|
696
696
|
Get CANbus data
|
|
697
697
|
*/
|
|
698
|
-
const getCanData = (parsedData, ix) => {
|
|
698
|
+
const getCanData = (parsedData, ix, type) => {
|
|
699
699
|
let canAppendMask = parsedData[ix + 1] !== ''
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
if (canAppendMask
|
|
700
|
+
? nHexDigit(hex2bin(parsedData[ix + 1]), 32)
|
|
701
|
+
: null
|
|
702
|
+
if (canAppendMask === 0) {
|
|
703
703
|
return {}
|
|
704
704
|
}
|
|
705
705
|
|
|
706
|
+
let vinIx = ix + 1 + parseInt(canAppendMask[31])
|
|
707
|
+
let ignIx = vinIx + parseInt(canAppendMask[30])
|
|
708
|
+
let disIx = ignIx + parseInt(canAppendMask[29])
|
|
709
|
+
let fuelIx = disIx + parseInt(canAppendMask[28])
|
|
710
|
+
// Inverted speed and rpm because of inconsistence in documentation
|
|
711
|
+
let rpmIx = fuelIx + parseInt(canAppendMask[26])
|
|
712
|
+
let spdIx = rpmIx + parseInt(canAppendMask[27])
|
|
713
|
+
let engcIx = spdIx + parseInt(canAppendMask[25])
|
|
714
|
+
let fuelcIx = engcIx + parseInt(canAppendMask[24])
|
|
715
|
+
let fuellIx = fuelcIx + parseInt(canAppendMask[23])
|
|
716
|
+
let rngIx = fuellIx + parseInt(canAppendMask[22])
|
|
717
|
+
let accIx = rngIx + parseInt(canAppendMask[21])
|
|
718
|
+
let enghIx = accIx + parseInt(canAppendMask[20])
|
|
719
|
+
let drvIx = enghIx + parseInt(canAppendMask[19])
|
|
720
|
+
let idltIx = drvIx + parseInt(canAppendMask[18])
|
|
721
|
+
let idlfIx = idltIx + parseInt(canAppendMask[17])
|
|
722
|
+
let axlwIx = idlfIx + parseInt(canAppendMask[16])
|
|
723
|
+
let tacIx = axlwIx + parseInt(canAppendMask[15])
|
|
724
|
+
let indIx = tacIx + parseInt(canAppendMask[14])
|
|
725
|
+
let ligIx = indIx + parseInt(canAppendMask[13])
|
|
726
|
+
let doorIx = ligIx + parseInt(canAppendMask[12])
|
|
727
|
+
let osptIx = doorIx + parseInt(canAppendMask[11])
|
|
728
|
+
let ospeIx = osptIx + parseInt(canAppendMask[10])
|
|
729
|
+
// Values from 9 to 3 are reserved
|
|
730
|
+
let canxIx = ospeIx + parseInt(canAppendMask[2])
|
|
731
|
+
|
|
732
|
+
let canExpansionMask =
|
|
733
|
+
canAppendMask[2] === '1' && parsedData[canxIx] !== ''
|
|
734
|
+
? nHexDigit(hex2bin(parsedData[canxIx]), 32)
|
|
735
|
+
.split('')
|
|
736
|
+
.reverse()
|
|
737
|
+
.join('')
|
|
738
|
+
: '00000000000000000000000000000000'
|
|
739
|
+
|
|
740
|
+
let repExpMask = canAppendMask[2] === '1' ? {
|
|
741
|
+
raw: parsedData[canxIx] ? parsedData[canxIx] : null,
|
|
742
|
+
adBlueLevel: canExpansionMask[0] === '1',
|
|
743
|
+
axleWeight1: canExpansionMask[1] === '1',
|
|
744
|
+
axleWeight3: canExpansionMask[2] === '1',
|
|
745
|
+
axleWeight4: canExpansionMask[3] === '1',
|
|
746
|
+
tachographOverspeedSignal: canExpansionMask[4] === '1',
|
|
747
|
+
tachographVehicleMotionSignal: canExpansionMask[5] === '1',
|
|
748
|
+
tachographDrivingDirection: canExpansionMask[6] === '1',
|
|
749
|
+
analogInputValue: canExpansionMask[7] === '1',
|
|
750
|
+
engineBrakingFactor: canExpansionMask[8] === '1',
|
|
751
|
+
pedalBrakingFactor: canExpansionMask[9] === '1',
|
|
752
|
+
totalAcceleratorKickDown: canExpansionMask[10] === '1',
|
|
753
|
+
totalEffectiveEngineSpeedTime: canExpansionMask[11] === '1',
|
|
754
|
+
totalCruiseControlTime: canExpansionMask[12] === '1',
|
|
755
|
+
totalAcceleratorKickDownTime: canExpansionMask[13] === '1',
|
|
756
|
+
totalBrakeApplications: canExpansionMask[14] === '1',
|
|
757
|
+
tachographDriver1Card: canExpansionMask[15] === '1',
|
|
758
|
+
tachographDriver2Card: canExpansionMask[16] === '1',
|
|
759
|
+
tachographDriver1Name: canExpansionMask[17] === '1',
|
|
760
|
+
tachographDriver2Name: canExpansionMask[18] === '1',
|
|
761
|
+
registrationNumber: canExpansionMask[19] === '1',
|
|
762
|
+
expansionInformation: canExpansionMask[20] === '1',
|
|
763
|
+
rapidBrakings: canExpansionMask[21] === '1',
|
|
764
|
+
rapidAccelerations: canExpansionMask[22] === '1',
|
|
765
|
+
engineTorque: canExpansionMask[23] === '1'
|
|
766
|
+
} : null
|
|
767
|
+
|
|
768
|
+
let adbIx = canxIx + parseInt(canExpansionMask[0])
|
|
769
|
+
let ax1Ix = adbIx + parseInt(canExpansionMask[1])
|
|
770
|
+
let ax3Ix = ax1Ix + parseInt(canExpansionMask[2])
|
|
771
|
+
let ax4Ix = ax3Ix + parseInt(canExpansionMask[3])
|
|
772
|
+
let tosIx = ax4Ix + parseInt(canExpansionMask[4])
|
|
773
|
+
let tvmIx = tosIx + parseInt(canExpansionMask[5])
|
|
774
|
+
let tddIx = tvmIx + parseInt(canExpansionMask[6])
|
|
775
|
+
let aivIx = tddIx + parseInt(canExpansionMask[7])
|
|
776
|
+
let ebrIx = aivIx + parseInt(canExpansionMask[8])
|
|
777
|
+
let pbrIx = ebrIx + parseInt(canExpansionMask[9])
|
|
778
|
+
let ackIx = pbrIx + parseInt(canExpansionMask[10])
|
|
779
|
+
let eesIx = ackIx + parseInt(canExpansionMask[11])
|
|
780
|
+
let crcIx = eesIx + parseInt(canExpansionMask[12])
|
|
781
|
+
let acktIx = crcIx + parseInt(canExpansionMask[13])
|
|
782
|
+
let braIx = acktIx + parseInt(canExpansionMask[14])
|
|
783
|
+
let tdc1Ix = braIx + parseInt(canExpansionMask[15])
|
|
784
|
+
let tdc2Ix = tdc1Ix + parseInt(canExpansionMask[16])
|
|
785
|
+
let tdn1Ix = tdc2Ix + parseInt(canExpansionMask[17])
|
|
786
|
+
let tdn2Ix = tdn1Ix + parseInt(canExpansionMask[18])
|
|
787
|
+
let regIx = tdn2Ix + parseInt(canExpansionMask[19])
|
|
788
|
+
let expbIx = regIx + parseInt(canExpansionMask[20])
|
|
789
|
+
let rbrIx = expbIx + parseInt(canExpansionMask[21])
|
|
790
|
+
let racIx = rbrIx + parseInt(canExpansionMask[22])
|
|
791
|
+
let etqIx = racIx + parseInt(canExpansionMask[23])
|
|
792
|
+
|
|
793
|
+
// Logic for CAN data
|
|
794
|
+
let gnnsIx = etqIx + 2 + parseInt(canAppendMask[1])
|
|
795
|
+
let gsmIx = canAppendMask[1] === '1' ? gnnsIx + parseInt(canAppendMask[0]) + 6 : gnnsIx + parseInt(canAppendMask[0])
|
|
796
|
+
|
|
797
|
+
let moreIx
|
|
798
|
+
let gnnsData = null
|
|
799
|
+
let gsmData = null
|
|
800
|
+
if (type === 'GTCAN') {
|
|
801
|
+
moreIx = canAppendMask[0] === '1' ? gsmIx + 4 : gsmIx
|
|
802
|
+
gnnsData = canAppendMask[1] === '1' ? {
|
|
803
|
+
hdop: parsedData[gnnsIx] ? parseFloat(parsedData[gnnsIx]) : null,
|
|
804
|
+
speed: parsedData[gnnsIx + 1] ? parseFloat(parsedData[gnnsIx + 1]) : null,
|
|
805
|
+
azimuth: parsedData[gnnsIx + 2] ? parseFloat(parsedData[gnnsIx + 2]) : null,
|
|
806
|
+
altitude: parsedData[gnnsIx + 3] ? parseFloat(parsedData[gnnsIx + 3]) : null,
|
|
807
|
+
loc: {
|
|
808
|
+
type: 'Point',
|
|
809
|
+
coordinates: [parseFloat(parsedData[gnnsIx + 4]), parseFloat(parsedData[gnnsIx + 5])]
|
|
810
|
+
},
|
|
811
|
+
gpsStatus: checkGps(
|
|
812
|
+
parseFloat(parsedData[gnnsIx + 4]),
|
|
813
|
+
parseFloat(parsedData[gnnsIx + 5])
|
|
814
|
+
),
|
|
815
|
+
datetime: parsedData[gnnsIx + 6] ? parseDate(parsedData[gnnsIx + 6]) : null,
|
|
816
|
+
} : null
|
|
817
|
+
|
|
818
|
+
gsmData = canAppendMask[0] === '1' ? {
|
|
819
|
+
mcc: parsedData[gsmIx] !== '' ? latamMcc[parseInt(parsedData[gsmIx], 10)] : null,
|
|
820
|
+
mnc: parsedData[gsmIx + 1] !== '' ? getMNC(parsedData[gsmIx], parsedData[gsmIx + 1]) : null,
|
|
821
|
+
lac: parsedData[gsmIx + 2] !== '' ? parseInt(parsedData[gsmIx + 2], 16) : null,
|
|
822
|
+
cid: parsedData[gsmIx + 3] !== '' ? parseInt(parsedData[gsmIx + 3], 16) : null
|
|
823
|
+
} : null
|
|
824
|
+
} else {
|
|
825
|
+
moreIx = etqIx + 1
|
|
826
|
+
}
|
|
827
|
+
|
|
706
828
|
let inicatorsBin =
|
|
707
|
-
canAppendMask[14] && parsedData[
|
|
708
|
-
? nHexDigit(hex2bin(parsedData[
|
|
829
|
+
canAppendMask[14] === '1' && parsedData[indIx] !== ''
|
|
830
|
+
? nHexDigit(hex2bin(parsedData[indIx]), 16)
|
|
709
831
|
: null
|
|
710
832
|
let lights =
|
|
711
|
-
canAppendMask[13] && parsedData[
|
|
712
|
-
? nHexDigit(hex2bin(parsedData[
|
|
833
|
+
canAppendMask[13] === '1' && parsedData[ligIx] !== ''
|
|
834
|
+
? nHexDigit(hex2bin(parsedData[ligIx]), 8)
|
|
713
835
|
: null
|
|
714
836
|
let doors =
|
|
715
|
-
canAppendMask[12] && parsedData[
|
|
716
|
-
? nHexDigit(hex2bin(parsedData[
|
|
717
|
-
: null
|
|
718
|
-
let canExpansionMask =
|
|
719
|
-
canAppendMask[2] && parsedData[ix + 24] !== ''
|
|
720
|
-
? nHexDigit(hex2bin(parsedData[ix + 24]), 32)
|
|
721
|
-
.split('')
|
|
722
|
-
.reverse()
|
|
723
|
-
.join('')
|
|
837
|
+
canAppendMask[12] === '1' && parsedData[doorIx] !== ''
|
|
838
|
+
? nHexDigit(hex2bin(parsedData[doorIx]), 8)
|
|
724
839
|
: null
|
|
725
840
|
let expansionBin =
|
|
726
|
-
parsedData[
|
|
727
|
-
? nHexDigit(hex2bin(parsedData[
|
|
841
|
+
parsedData[expbIx] !== ''
|
|
842
|
+
? nHexDigit(hex2bin(parsedData[expbIx]), 16)
|
|
728
843
|
.split('')
|
|
729
844
|
.reverse()
|
|
730
845
|
.join('')
|
|
731
|
-
:
|
|
846
|
+
: '0000000000000000'
|
|
732
847
|
let tachographBin =
|
|
733
|
-
canAppendMask[15] && parsedData[
|
|
734
|
-
? nHexDigit(hex2bin(parsedData[
|
|
848
|
+
canAppendMask[15] === '1' && parsedData[tacIx] !== ''
|
|
849
|
+
? nHexDigit(hex2bin(parsedData[tacIx]), 8)
|
|
735
850
|
.split('')
|
|
736
851
|
.reverse()
|
|
737
852
|
.join('')
|
|
738
853
|
: null
|
|
739
854
|
|
|
740
|
-
return
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
:
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
:
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
lowFuel: inicatorsBin ? inicatorsBin[0] === '1' : null,
|
|
776
|
-
driverSeatbelt: inicatorsBin ? inicatorsBin[1] === '1' : null,
|
|
777
|
-
airConditioning: inicatorsBin ? inicatorsBin[2] === '1' : null,
|
|
778
|
-
cruiseControl: inicatorsBin ? inicatorsBin[3] === '1' : null,
|
|
779
|
-
brakePedal: inicatorsBin ? inicatorsBin[4] === '1' : null,
|
|
780
|
-
clutchPedal: inicatorsBin ? inicatorsBin[5] === '1' : null,
|
|
781
|
-
handbrake: inicatorsBin ? inicatorsBin[6] === '1' : null,
|
|
782
|
-
centralLock: inicatorsBin ? inicatorsBin[7] === '1' : null,
|
|
783
|
-
reverseGear: inicatorsBin ? inicatorsBin[8] === '1' : null,
|
|
784
|
-
runningLights: inicatorsBin ? inicatorsBin[9] === '1' : null,
|
|
785
|
-
lowBeams: inicatorsBin ? inicatorsBin[10] === '1' : null,
|
|
786
|
-
highBeams: inicatorsBin ? inicatorsBin[11] === '1' : null,
|
|
787
|
-
rearFogLights: inicatorsBin ? inicatorsBin[12] === '1' : null,
|
|
788
|
-
frontFogLights: inicatorsBin ? inicatorsBin[13] === '1' : null,
|
|
789
|
-
doors: inicatorsBin ? inicatorsBin[14] === '1' : null,
|
|
790
|
-
trunk: inicatorsBin ? inicatorsBin[15] === '1' : null
|
|
791
|
-
} : null,
|
|
792
|
-
lights: lights ? {
|
|
793
|
-
raw: lights ? parsedData[ix + 20] : null,
|
|
794
|
-
running: lights ? lights[0] === '1' : null,
|
|
795
|
-
lowBeams: lights ? lights[1] === '1' : null,
|
|
796
|
-
frontFog: lights ? lights[2] === '1' : null,
|
|
797
|
-
rearFog: lights ? lights[3] === '1' : null,
|
|
798
|
-
hazard: lights ? lights[4] === '1' : null
|
|
799
|
-
} : null,
|
|
800
|
-
doors: doors ? {
|
|
801
|
-
raw: doors ? parsedData[ix + 21] : null,
|
|
802
|
-
driver: doors ? doors[0] === '1' : null,
|
|
803
|
-
passenger: doors ? doors[1] === '1' : null,
|
|
804
|
-
rearLeft: doors ? doors[2] === '1' : null,
|
|
805
|
-
rearRight: doors ? doors[3] === '1' : null,
|
|
806
|
-
trunk: doors ? doors[4] === '1' : null,
|
|
807
|
-
hood: doors ? doors[5] === '1' : null
|
|
808
|
-
} : null,
|
|
809
|
-
overSpeedTime: canAppendMask[11] && parsedData[ix + 22] ? parseFloat(parsedData[ix + 22]) : null,
|
|
810
|
-
overSpeedEngineTime: canAppendMask[10] && parsedData[ix + 23] ? parseFloat(parsedData[ix + 23]) : null,
|
|
811
|
-
canExpanded: {
|
|
812
|
-
canReportExpansionMask: {
|
|
813
|
-
raw: parsedData[ix + 24] ? parsedData[ix + 24] : null,
|
|
814
|
-
engineTorque: canExpansionMask ? canExpansionMask[23] === '1' : null,
|
|
815
|
-
rapidAccelerations: canExpansionMask
|
|
816
|
-
? canExpansionMask[22] === '1'
|
|
817
|
-
: null,
|
|
818
|
-
rapidBrakings: canExpansionMask ? canExpansionMask[21] === '1' : null,
|
|
819
|
-
expansionInformation: canExpansionMask
|
|
820
|
-
? canExpansionMask[20] === '1'
|
|
821
|
-
: null,
|
|
822
|
-
registrationNumber: canExpansionMask
|
|
823
|
-
? canExpansionMask[19] === '1'
|
|
824
|
-
: null,
|
|
825
|
-
tachographDriver2Name: canExpansionMask
|
|
826
|
-
? canExpansionMask[18] === '1'
|
|
827
|
-
: null,
|
|
828
|
-
tachographDriver1Name: canExpansionMask
|
|
829
|
-
? canExpansionMask[17] === '1'
|
|
830
|
-
: null,
|
|
831
|
-
tachographDriver2Card: canExpansionMask
|
|
832
|
-
? canExpansionMask[16] === '1'
|
|
833
|
-
: null,
|
|
834
|
-
tachographDriver1Card: canExpansionMask
|
|
835
|
-
? canExpansionMask[15] === '1'
|
|
836
|
-
: null,
|
|
837
|
-
totalBrakeApplications: canExpansionMask
|
|
838
|
-
? canExpansionMask[14] === '1'
|
|
839
|
-
: null,
|
|
840
|
-
totalAcceleratorKickDownTime: canExpansionMask
|
|
841
|
-
? canExpansionMask[13] === '1'
|
|
842
|
-
: null,
|
|
843
|
-
totalCruiseControlTime: canExpansionMask
|
|
844
|
-
? canExpansionMask[12] === '1'
|
|
845
|
-
: null,
|
|
846
|
-
totalEffectiveEngineSpeedTime: canExpansionMask
|
|
847
|
-
? canExpansionMask[11] === '1'
|
|
848
|
-
: null,
|
|
849
|
-
totalAcceleratorKickDown: canExpansionMask
|
|
850
|
-
? canExpansionMask[10] === '1'
|
|
851
|
-
: null,
|
|
852
|
-
pedalBrakingFactor: canExpansionMask
|
|
853
|
-
? canExpansionMask[9] === '1'
|
|
854
|
-
: null,
|
|
855
|
-
engineBrakingFactor: canExpansionMask
|
|
856
|
-
? canExpansionMask[8] === '1'
|
|
857
|
-
: null,
|
|
858
|
-
analogInputValue: canExpansionMask
|
|
859
|
-
? canExpansionMask[7] === '1'
|
|
860
|
-
: null,
|
|
861
|
-
tachographDrivingDirection: canExpansionMask
|
|
862
|
-
? canExpansionMask[6] === '1'
|
|
863
|
-
: null,
|
|
864
|
-
tachographVehicleMotionSignal: canExpansionMask
|
|
865
|
-
? canExpansionMask[5] === '1'
|
|
866
|
-
: null,
|
|
867
|
-
tachographOverspeedSignal: canExpansionMask
|
|
868
|
-
? canExpansionMask[4] === '1'
|
|
869
|
-
: null,
|
|
870
|
-
AxleWeight4: canExpansionMask ? canExpansionMask[3] === '1' : null,
|
|
871
|
-
AxleWeight3: canExpansionMask ? canExpansionMask[2] === '1' : null,
|
|
872
|
-
AxleWeight1: canExpansionMask ? canExpansionMask[1] === '1' : null,
|
|
873
|
-
adBlueLevel: canExpansionMask ? canExpansionMask[0] === '1' : null
|
|
855
|
+
return [
|
|
856
|
+
moreIx,
|
|
857
|
+
gnnsData,
|
|
858
|
+
gsmData,
|
|
859
|
+
{
|
|
860
|
+
comunicationOk: parsedData[ix] ? parsedData[ix] === '1' : null,
|
|
861
|
+
canAppendMask: {
|
|
862
|
+
hex: parsedData[ix + 1] !== '' ? parsedData[ix + 1] : null,
|
|
863
|
+
bin: canAppendMask,
|
|
864
|
+
vin: canAppendMask[31] === '1',
|
|
865
|
+
ignitionKey: canAppendMask[30] === '1',
|
|
866
|
+
totalDistance: canAppendMask[29] === '1',
|
|
867
|
+
totalFuelUsed: canAppendMask[28] === '1',
|
|
868
|
+
speed: canAppendMask[27] === '1',
|
|
869
|
+
rpm: canAppendMask[26] === '1',
|
|
870
|
+
engineCoolantTemp: canAppendMask[25] === '1',
|
|
871
|
+
fuelConsumption: canAppendMask[24] === '1',
|
|
872
|
+
fuelLevel: canAppendMask[23] === '1',
|
|
873
|
+
range: canAppendMask[22] === '1',
|
|
874
|
+
acceleratorPressure: canAppendMask[21] === '1',
|
|
875
|
+
engineHours: canAppendMask[20] === '1',
|
|
876
|
+
drivingTime: canAppendMask[19] === '1',
|
|
877
|
+
idleTime: canAppendMask[18] === '1',
|
|
878
|
+
idleFuelUsed: canAppendMask[17] === '1',
|
|
879
|
+
axleWeight2: canAppendMask[16] === '1',
|
|
880
|
+
tachograph: canAppendMask[15] === '1',
|
|
881
|
+
indicators: canAppendMask[14] === '1',
|
|
882
|
+
lights: canAppendMask[13] === '1',
|
|
883
|
+
doors: canAppendMask[12] === '1',
|
|
884
|
+
overSpeedTime: canAppendMask[11] === '1',
|
|
885
|
+
overSpeedEngineTime: canAppendMask[10] === '1',
|
|
886
|
+
totalDistanceImpulses: canAppendMask[9] === '1',
|
|
887
|
+
canExpanded: canAppendMask[2] === '1',
|
|
888
|
+
gnssInformation: canAppendMask[1] === '1',
|
|
889
|
+
gsmInformation: canAppendMask[0] === '1'
|
|
874
890
|
},
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
parsedData[
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
totalBrakeApplications:
|
|
902
|
-
parsedData[ix + 39] ? parseInt(parsedData[ix + 39]) : null,
|
|
903
|
-
tachographDriver1Card: parsedData[ix + 40] ? parsedData[ix + 40] : null,
|
|
904
|
-
tachographDriver2Card: parsedData[ix + 41] ? parsedData[ix + 41] : null,
|
|
905
|
-
tachographDriver1Name: parsedData[ix + 42] ? parsedData[ix + 42] : null,
|
|
906
|
-
tachographDriver2Name: parsedData[ix + 43] ? parsedData[ix + 43] : null,
|
|
907
|
-
registrationNumber: parsedData[ix + 44] ? parsedData[ix + 44] : null,
|
|
908
|
-
expansionInformation: {
|
|
909
|
-
raw: parsedData[ix + 45] ? parsedData[ix + 45] : null,
|
|
910
|
-
webasto: expansionBin ? expansionBin[0] === '1' : null,
|
|
911
|
-
brakeFluidLowIndicator: expansionBin
|
|
912
|
-
? expansionBin[1] === '1'
|
|
913
|
-
: null,
|
|
914
|
-
coolantLevelLowIndicator: expansionBin
|
|
915
|
-
? expansionBin[2] === '1'
|
|
916
|
-
: null,
|
|
917
|
-
batteryIndicator: expansionBin ? expansionBin[3] === '1' : null,
|
|
918
|
-
brakeSystemFailureIndicator: expansionBin
|
|
919
|
-
? expansionBin[4] === '1'
|
|
891
|
+
vin: canAppendMask[31] === '1' && parsedData[vinIx] ? parsedData[vinIx] : null,
|
|
892
|
+
ignitionKey: canAppendMask[30] === '1' && parsedData[ignIx] ? parseCanData(parsedData[ignIx], 'ignitionKey') : null,
|
|
893
|
+
totalDistance: canAppendMask[29] === '1' && parsedData[disIx] ? parseCanData(parsedData[disIx], 'totalDistance') : null,
|
|
894
|
+
totalDistanceUnit: canAppendMask[29] === '1' && parsedData[disIx] ? parsedData[disIx].slice(0, 1) === 'H' ? 'km' : 'I' : null,
|
|
895
|
+
fuelUsed: canAppendMask[28] === '1' && parsedData[fuelIx] ? parseFloat(parsedData[fuelIx]) : null,
|
|
896
|
+
speed: canAppendMask[27] === '1' && parsedData[spdIx] ? parseFloat(parsedData[spdIx]) : null,
|
|
897
|
+
rpm: canAppendMask[26] === '1' && parsedData[rpmIx] ? parseInt(parsedData[rpmIx], 10) : null,
|
|
898
|
+
engineCoolantTemp:
|
|
899
|
+
canAppendMask[25] === '1' && parsedData[engcIx] ? parseInt(parsedData[engcIx], 10) : null,
|
|
900
|
+
fuelConsumption: canAppendMask[24] === '1' && parsedData[fuelcIx] ? parseCanData(parsedData[fuelcIx], 'fuelConsumption') : null,
|
|
901
|
+
fuelLevel: canAppendMask[23] === '1' && parsedData[fuellIx] ? parseFloat(parsedData[fuellIx].slice(1)) : null,
|
|
902
|
+
fuelLevelUnit: canAppendMask[23] === '1' && parsedData[fuellIx] ? parsedData[fuellIx].slice(0, 1) === 'P' ? '%' : 'L' : null,
|
|
903
|
+
range: canAppendMask[22] === '1' && parsedData[rngIx] ? parseCanData(parsedData[rngIx], 'range') : null,
|
|
904
|
+
acceleratorPressure:
|
|
905
|
+
canAppendMask[21] === '1' && parsedData[accIx] ? parseFloat(parsedData[accIx]) : null,
|
|
906
|
+
engineHours: canAppendMask[20] === '1' && parsedData[enghIx] ? parseFloat(parsedData[enghIx]) : null,
|
|
907
|
+
drivingTime: canAppendMask[19] === '1' && parsedData[drvIx] ? parseFloat(parsedData[drvIx]) : null,
|
|
908
|
+
idleTime: canAppendMask[18] === '1' && parsedData[idltIx] ? parseFloat(parsedData[idltIx]) : null,
|
|
909
|
+
idleFuelUsed: canAppendMask[17] === '1' && parsedData[idlfIx] ? parseFloat(parsedData[idlfIx]) : null,
|
|
910
|
+
axleWeight2: canAppendMask[16] === '1' && parsedData[axlwIx] ? parseFloat(parsedData[axlwIx]) : null,
|
|
911
|
+
tachograph: canAppendMask[15] === '1' && parsedData[tacIx] ? {
|
|
912
|
+
raw: parsedData[tacIx] ? parsedData[tacIx] : null,
|
|
913
|
+
validDriverData: tachographBin ? tachographBin[7] === '1' : null,
|
|
914
|
+
insertedDriverCard: tachographBin ? tachographBin[5] === '1' : null,
|
|
915
|
+
driverWorkingState: tachographBin
|
|
916
|
+
? dWorkingStates[parseInt(tachographBin.substring(3, 5), 2)]
|
|
920
917
|
: null,
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
918
|
+
drivingTimeState: tachographBin
|
|
919
|
+
? dTimeStates[parseInt(tachographBin.substring(5, 8), 2)]
|
|
920
|
+
: null
|
|
921
|
+
} : null,
|
|
922
|
+
indicators: canAppendMask[14] === '1' && inicatorsBin ? {
|
|
923
|
+
raw: inicatorsBin ? parsedData[indIx] : null,
|
|
924
|
+
lowFuel: inicatorsBin ? inicatorsBin[0] === '1' : null,
|
|
925
|
+
driverSeatbelt: inicatorsBin ? inicatorsBin[1] === '1' : null,
|
|
926
|
+
airConditioning: inicatorsBin ? inicatorsBin[2] === '1' : null,
|
|
927
|
+
cruiseControl: inicatorsBin ? inicatorsBin[3] === '1' : null,
|
|
928
|
+
brakePedal: inicatorsBin ? inicatorsBin[4] === '1' : null,
|
|
929
|
+
clutchPedal: inicatorsBin ? inicatorsBin[5] === '1' : null,
|
|
930
|
+
handbrake: inicatorsBin ? inicatorsBin[6] === '1' : null,
|
|
931
|
+
centralLock: inicatorsBin ? inicatorsBin[7] === '1' : null,
|
|
932
|
+
reverseGear: inicatorsBin ? inicatorsBin[8] === '1' : null,
|
|
933
|
+
runningLights: inicatorsBin ? inicatorsBin[9] === '1' : null,
|
|
934
|
+
lowBeams: inicatorsBin ? inicatorsBin[10] === '1' : null,
|
|
935
|
+
highBeams: inicatorsBin ? inicatorsBin[11] === '1' : null,
|
|
936
|
+
rearFogLights: inicatorsBin ? inicatorsBin[12] === '1' : null,
|
|
937
|
+
frontFogLights: inicatorsBin ? inicatorsBin[13] === '1' : null,
|
|
938
|
+
doors: inicatorsBin ? inicatorsBin[14] === '1' : null,
|
|
939
|
+
trunk: inicatorsBin ? inicatorsBin[15] === '1' : null
|
|
940
|
+
} : null,
|
|
941
|
+
lights: canAppendMask[13] === '1' && lights ? {
|
|
942
|
+
raw: lights ? parsedData[ligIx] : null,
|
|
943
|
+
running: lights ? lights[0] === '1' : null,
|
|
944
|
+
lowBeams: lights ? lights[1] === '1' : null,
|
|
945
|
+
frontFog: lights ? lights[2] === '1' : null,
|
|
946
|
+
rearFog: lights ? lights[3] === '1' : null,
|
|
947
|
+
hazard: lights ? lights[4] === '1' : null
|
|
948
|
+
} : null,
|
|
949
|
+
doors: canAppendMask[12] === '1' && doors ? {
|
|
950
|
+
raw: doors ? parsedData[doorIx] : null,
|
|
951
|
+
driver: doors ? doors[0] === '1' : null,
|
|
952
|
+
passenger: doors ? doors[1] === '1' : null,
|
|
953
|
+
rearLeft: doors ? doors[2] === '1' : null,
|
|
954
|
+
rearRight: doors ? doors[3] === '1' : null,
|
|
955
|
+
trunk: doors ? doors[4] === '1' : null,
|
|
956
|
+
hood: doors ? doors[5] === '1' : null
|
|
957
|
+
} : null,
|
|
958
|
+
overSpeedTime: canAppendMask[11] === '1' && parsedData[osptIx] ? parseFloat(parsedData[osptIx]) : null,
|
|
959
|
+
overSpeedEngineTime: canAppendMask[10] === '1' && parsedData[ospeIx] ? parseFloat(parsedData[ospeIx]) : null,
|
|
960
|
+
canExpanded: {
|
|
961
|
+
canReportExpansionMask: repExpMask,
|
|
962
|
+
adBlueLevel: repExpMask?.adBlueLevel &&
|
|
963
|
+
parsedData[adbIx] ? parseCanData(parsedData[adbIx], 'adBlueLevel') : null,
|
|
964
|
+
adBlueLevelUnit: repExpMask?.adBlueLevelUnit && parsedData[adbIx] ? parsedData[adbIx].slice(0, 1) === 'P' ? '%' : 'L' ? 'L' : '%' : null,
|
|
965
|
+
axleWeight1: repExpMask?.axleWeight1 && parsedData[ax1Ix] ? parseInt(parsedData[ax1Ix]) : null,
|
|
966
|
+
axleWeight3: repExpMask?.axleWeight3 && parsedData[ax3Ix] ? parseInt(parsedData[ax3Ix]) : null,
|
|
967
|
+
axleWeight4: repExpMask?.axleWeight4 && parsedData[ax4Ix] ? parseInt(parsedData[ax4Ix]) : null,
|
|
968
|
+
tachographOverspeedSignal: repExpMask?.tachographOverspeedSignal &&
|
|
969
|
+
parsedData[tosIx] ? (parsedData[tosIx] === '1') : null,
|
|
970
|
+
tachographVehicleMotionSignal: repExpMask?.tachographVehicleMotionSignal &&
|
|
971
|
+
parsedData[tvmIx] ? (parsedData[tvmIx] === '1') : null,
|
|
972
|
+
tachographDrivingDirection: repExpMask?.tachographDrivingDirection &&
|
|
973
|
+
parsedData[tddIx] ? parseCanData(parsedData[tddIx], 'tachographDrivingDirection') : null,
|
|
974
|
+
analogInputValue: repExpMask?.analogInputValue &&
|
|
975
|
+
parsedData[aivIx] ? parseFloat(parsedData[aivIx]) * 1000 : null,
|
|
976
|
+
engineBrakingFactor: repExpMask?.engineBrakingFactor &&
|
|
977
|
+
parsedData[ebrIx] ? parseInt(parsedData[ebrIx]) : null,
|
|
978
|
+
pedalBrakingFactor: repExpMask?.pedalBrakingFactor &&
|
|
979
|
+
parsedData[pbrIx] ? parseInt(parsedData[pbrIx]) : null,
|
|
980
|
+
totalAcceleratorKickDown: repExpMask?.totalAcceleratorKickDown &&
|
|
981
|
+
parsedData[ackIx] ? parseInt(parsedData[ackIx]) : null,
|
|
982
|
+
totalEffectiveEngineSpeedTime: repExpMask?.totalEffectiveEngineSpeedTime &&
|
|
983
|
+
parsedData[eesIx] ? parseFloat(parsedData[eesIx]) : null,
|
|
984
|
+
totalCruiseControlTime: repExpMask?.totalCruiseControlTime &&
|
|
985
|
+
parsedData[crcIx] ? parseFloat(parsedData[crcIx]) : null,
|
|
986
|
+
totalAcceleratorKickDownTime: repExpMask?.totalAcceleratorKickDownTime &&
|
|
987
|
+
parsedData[acktIx] ? parseFloat(parsedData[acktIx]) : null,
|
|
988
|
+
totalBrakeApplications: repExpMask?.totalBrakeApplications &&
|
|
989
|
+
parsedData[braIx] ? parseInt(parsedData[braIx]) : null,
|
|
990
|
+
tachographDriver1Card: repExpMask?.tachographDriver1Card && parsedData[tdc1Ix] ? parsedData[tdc1Ix] : null,
|
|
991
|
+
tachographDriver2Card: repExpMask?.tachographDriver2Card && parsedData[tdc2Ix] ? parsedData[tdc2Ix] : null,
|
|
992
|
+
tachographDriver1Name: repExpMask?.tachographDriver1Name && parsedData[tdn1Ix] ? parsedData[tdn1Ix] : null,
|
|
993
|
+
tachographDriver2Name: repExpMask?.tachographDriver2Name && parsedData[tdn2Ix] ? parsedData[tdn2Ix] : null,
|
|
994
|
+
registrationNumber: repExpMask?.registrationNumber && parsedData[regIx] ? parsedData[regIx] : null,
|
|
995
|
+
expansionInformation: repExpMask?.expansionInformation && expansionBin != '0000000000000000' ? {
|
|
996
|
+
raw: parsedData[expbIx] ? parsedData[expbIx] : null,
|
|
997
|
+
webasto: expansionBin[0] === '1',
|
|
998
|
+
brakeFluidLowIndicator: expansionBin[1] === '1',
|
|
999
|
+
coolantLevelLowIndicator: expansionBin[2] === '1',
|
|
1000
|
+
batteryIndicator: expansionBin[3] === '1',
|
|
1001
|
+
brakeSystemFailureIndicator: expansionBin[4] === '1',
|
|
1002
|
+
oilPressureIndicator: expansionBin[5] === '1',
|
|
1003
|
+
engineHotIndicator: expansionBin[6] === '1',
|
|
1004
|
+
ABSFailureIndicator: expansionBin[7] === '1',
|
|
1005
|
+
checkEngineIndicator: expansionBin[9] === '1',
|
|
1006
|
+
airbagsIndicator: expansionBin[10] === '1',
|
|
1007
|
+
serviceCallIndicator: expansionBin[11] === '1',
|
|
1008
|
+
oilLevelLowIndicator: expansionBin[12] === '1'
|
|
1009
|
+
} : null,
|
|
1010
|
+
rapidBrakings: repExpMask?.rapidBrakings && parsedData[rbrIx] ? parseInt(parsedData[rbrIx]) : null,
|
|
1011
|
+
rapidAccelerations: repExpMask?.rapidAccelerations && parsedData[racIx] ? parseInt(parsedData[racIx]) : null,
|
|
1012
|
+
engineTorque: repExpMask?.engineTorque && parsedData[etqIx] ? parseFloat(parsedData[etqIx]) : null,
|
|
1013
|
+
}
|
|
1014
|
+
}]
|
|
936
1015
|
}
|
|
937
1016
|
|
|
938
1017
|
|