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 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(test)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "queclink-parser",
3
- "version": "1.9.17",
3
+ "version": "1.9.19",
4
4
  "description": "Parse raw data from Queclink devices",
5
5
  "main": "src",
6
6
  "scripts": {
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 = utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[9] === '1'
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
- // } else if (parsedData[index + 8] === '7') {
545
- // index += 1
546
- // // RF433 Devices
547
- // let rf433Devices = []
548
- // // Review when RF433 devices are implemented
549
- // let count = index + 9
550
- // for (var l = 0; l < rf433DevicesConnected; l++) {
551
- // rf433Devices.push({
552
- // // deviceNumber: parsedData[count],
553
- // // deviceType: parsedData[count + 1],
554
- // // deviceData: parsedData[count + 2]
555
- // // ? utils.getTempInCelciousDegrees(parsedData[count + 2])
556
- // // : null
557
- // deviceData: parsedData[count]
558
- // })
559
- // count += 1
560
- // // count += 3
561
- // }
562
- // externalData = Object.assign(externalData, {
563
- // rf433Devices: rf433Devices
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 canInfo = utils.getCanData(parsedData, newIndex)
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 = index + 49
575
+ // index = parsedCanData[0]
574
576
 
575
- if (canInfo?.totalDistance) {
576
- data.gpsOdometer = data.odometer
577
- data.odometer = canInfo.totalDistance
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
- if (canInfo?.engineHours) {
581
- data.gpsHourmeter = data.hourmeter
582
- data.hourmeter = canInfo.engineHours
583
- }
583
+ if (typeof canInfo?.engineHours === 'number') {
584
+ data.gpsHourmeter = data.hourmeter
585
+ data.hourmeter = canInfo.engineHours
586
+ }
584
587
 
585
- if (canInfo?.speed) {
586
- data.gpsSpeed = data.speed
587
- data.speed = canInfo.speed
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 + 10 : index + 9
597
- if (canData) {
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 index = 67 // position append mask
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: utils.getCanData(parsedData, 5)
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 = utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[8] === '1'
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
- // Bluetooth Accessories
324
- if (bluetoothAccessory) {
325
- let btIndex
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
- if (canData) {
328
- btIndex = index + 58
329
- } else {
330
- btIndex = index + 9
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 satelliteInfo = utils.includeSatellites(parsedData[67])
1274
- let accuracyInfo = utils.includeGnnsAccuracy(parsedData[67]) ? 3 : 0
1275
- let index = 67 + (satelliteInfo + accuracyInfo)
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
- type: 'Point',
1281
- coordinates: [parseFloat(parsedData[60]), parseFloat(parsedData[61])]
1282
- },
1283
- speed: parsedData[57] !== '' ? parseFloat(parsedData[57]) : null,
1284
- gpsStatus: utils.checkGps(
1285
- parseFloat(parsedData[60]),
1286
- parseFloat(parsedData[61])
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
- battery: null,
1295
- inputCharge: null
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: utils.getCanData(parsedData, 5),
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] == '1'
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] == '1'
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] == '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] == '1'
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
- ? nHexDigit(hex2bin(parsedData[ix + 1]), 32)
701
- : null
702
- if (canAppendMask == 0) {
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[ix + 19] !== ''
708
- ? nHexDigit(hex2bin(parsedData[ix + 19]), 16)
829
+ canAppendMask[14] === '1' && parsedData[indIx] !== ''
830
+ ? nHexDigit(hex2bin(parsedData[indIx]), 16)
709
831
  : null
710
832
  let lights =
711
- canAppendMask[13] && parsedData[ix + 20] !== ''
712
- ? nHexDigit(hex2bin(parsedData[ix + 20]), 8)
833
+ canAppendMask[13] === '1' && parsedData[ligIx] !== ''
834
+ ? nHexDigit(hex2bin(parsedData[ligIx]), 8)
713
835
  : null
714
836
  let doors =
715
- canAppendMask[12] && parsedData[ix + 21] !== ''
716
- ? nHexDigit(hex2bin(parsedData[ix + 21]), 8)
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[ix + 45] !== ''
727
- ? nHexDigit(hex2bin(parsedData[ix + 45]), 16)
841
+ parsedData[expbIx] !== ''
842
+ ? nHexDigit(hex2bin(parsedData[expbIx]), 16)
728
843
  .split('')
729
844
  .reverse()
730
845
  .join('')
731
- : null
846
+ : '0000000000000000'
732
847
  let tachographBin =
733
- canAppendMask[15] && parsedData[ix + 18] !== ''
734
- ? nHexDigit(hex2bin(parsedData[ix + 18]), 8)
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
- comunicationOk: parsedData[ix] ? parsedData[ix] === '1' : null,
742
- vin: canAppendMask[31] && parsedData[ix + 2] ? parsedData[ix + 2] : null,
743
- ignitionKey: canAppendMask[30] && parsedData[ix + 3] ? parseCanData(parsedData[ix + 3], 'ignitionKey') : null,
744
- totalDistance: canAppendMask[29] && parsedData[ix + 4] ? parseCanData(parsedData[ix + 4], 'totalDistance') : null,
745
- totalDistanceUnit: canAppendMask[29] && parsedData[ix + 4] ? parsedData[ix + 4].slice(0, 1) === 'H' ? 'km' : 'I' : null,
746
- fuelUsed: canAppendMask[28] && parsedData[ix + 5] ? parseFloat(parsedData[ix + 5]) : null, // float
747
- rpm: canAppendMask[26] && parsedData[ix + 6] ? parseInt(parsedData[ix + 6], 10) : null, // int
748
- speed: canAppendMask[27] && parsedData[ix + 7] ? parseFloat(parsedData[ix + 7]) : null,
749
- engineCoolantTemp:
750
- canAppendMask[25] && parsedData[ix + 8] ? parseInt(parsedData[ix + 8], 10) : null,
751
- fuelConsumption: canAppendMask[24] && parsedData[ix + 9] ? parseCanData(parsedData[ix + 9], 'fuelConsumption') : null,
752
- fuelLevel: canAppendMask[23] && parsedData[ix + 10] ? parseFloat(parsedData[ix + 10].slice(1)) : null,
753
- fuelLevelUnit: canAppendMask[23] && parsedData[ix + 10] ? parsedData[ix + 10].slice(0, 1) === 'P' ? '%' : 'L' : null,
754
- range: canAppendMask[22] && parsedData[ix + 11] ? parseCanData(parsedData[ix + 11], 'range') : null,
755
- acceleratorPressure:
756
- canAppendMask[21] && parsedData[ix + 12] ? parseFloat(parsedData[ix + 12]) : null,
757
- engineHours: canAppendMask[20] && parsedData[ix + 13] ? parseFloat(parsedData[ix + 13]) : null,
758
- drivingTime: canAppendMask[19] && parsedData[ix + 14] ? parseFloat(parsedData[ix + 14]) : null,
759
- idleTime: canAppendMask[18] && parsedData[ix + 15] ? parseFloat(parsedData[ix + 15]) : null,
760
- idleFuelUsed: canAppendMask[17] && parsedData[ix + 16] ? parseFloat(parsedData[ix + 16]) : null,
761
- axleWeight: canAppendMask[16] && parsedData[ix + 17] ? parseFloat(parsedData[ix + 17]) : null,
762
- tachograph: parsedData[ix + 18] ? {
763
- raw: parsedData[ix + 18] ? parsedData[ix + 18] : null,
764
- validDriverData: tachographBin ? tachographBin[7] === '1' : null,
765
- insertedDriverCard: tachographBin ? tachographBin[5] === '1' : null,
766
- driverWorkingState: tachographBin
767
- ? dWorkingStates[parseInt(tachographBin.substring(3, 5), 2)]
768
- : null,
769
- drivingTimeState: tachographBin
770
- ? dTimeStates[parseInt(tachographBin.substring(5, 8), 2)]
771
- : null
772
- } : null,
773
- indicators: inicatorsBin ? {
774
- raw: inicatorsBin ? parsedData[ix + 19] : null,
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
- adBlueLevel:
876
- parsedData[ix + 25] ? parseCanData(parsedData[ix + 25], 'adBlueLevel') : null,
877
- adBlueLevelUnit: parsedData[ix + 25] ? parsedData[ix + 25].slice(0, 1) === 'P' ? '%' : 'L' ? 'L' : '%' : null,
878
- axleWeight1: parsedData[ix + 26] ? parseInt(parsedData[ix + 26]) : null,
879
- axleWeight3: parsedData[ix + 27] ? parseInt(parsedData[ix + 27]) : null,
880
- axleWeight4: parsedData[ix + 28] ? parseInt(parsedData[ix + 28]) : null,
881
- tachographOverspeedSignal:
882
- parsedData[ix + 29] ? (parsedData[ix + 29] === '1') : null,
883
- tachographVehicleMotionSignal:
884
- parsedData[ix + 30] ? (parsedData[ix + 30] === '1') : null,
885
- tachographDrivingDirection:
886
- parsedData[ix + 31] ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
887
- analogInputValue:
888
- parsedData[ix + 32] ? parseFloat(parsedData[ix + 32]) * 1000 : null,
889
- engineBrakingFactor:
890
- parsedData[ix + 33] ? parseInt(parsedData[ix + 33]) : null,
891
- pedalBrakingFactor:
892
- parsedData[ix + 34] ? parseInt(parsedData[ix + 34]) : null,
893
- totalAcceleratorKickDown:
894
- parsedData[ix + 35] ? parseInt(parsedData[ix + 35]) : null,
895
- totalEffectiveEngineSpeedTime:
896
- parsedData[ix + 36] ? parseFloat(parsedData[ix + 36]) : null,
897
- totalCruiseControlTime:
898
- parsedData[ix + 37] ? parseFloat(parsedData[ix + 37]) : null,
899
- totalAcceleratorKickDownTime:
900
- parsedData[ix + 38] ? parseFloat(parsedData[ix + 38]) : null,
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
- oilPressureIndicator: expansionBin ? expansionBin[5] === '1' : null,
922
- engineHotIndicator: expansionBin ? expansionBin[6] === '1' : null,
923
- ABSFailureIndicator: expansionBin ? expansionBin[7] === '1' : null,
924
- checkEngineIndicator: expansionBin ? expansionBin[9] === '1' : null,
925
- airbagsIndicator: expansionBin ? expansionBin[10] === '1' : null,
926
- serviceCallIndicator: expansionBin
927
- ? expansionBin[11] === '1'
928
- : null,
929
- oilLevelLowIndicator: expansionBin ? expansionBin[12] === '1' : null
930
- },
931
- rapidBrakings: parsedData[ix + 46] ? parseInt(parsedData[ix + 46]) : null,
932
- rapidAccelerations: parsedData[ix + 47] ? parseInt(parsedData[ix + 47]) : null,
933
- engineTorque: parsedData[ix + 48] ? parseFloat(parsedData[ix + 48]) : null,
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