queclink-parser 1.9.8 → 1.9.10

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,15 @@
1
+ #### 1.9.10 (2024-10-08)
2
+
3
+ ##### New Features
4
+
5
+ * **canbus:** can data from ERI report and others ([8f590b6b](https://github.com/jaayesta/queclink-parser/commit/8f590b6bf35588a01c703c93a71f78b37b4cb1ac))
6
+
7
+ #### 1.9.9 (2024-10-04)
8
+
9
+ ##### Bug Fixes
10
+
11
+ * **input:** fix gv57cg input bits ([35d4199e](https://github.com/jaayesta/queclink-parser/commit/35d4199e1ff7236cdf48ccf8ad965c08df6599a7))
12
+
1
13
  #### 1.9.8 (2024-10-04)
2
14
 
3
15
  ##### New Features
package/example.js CHANGED
@@ -56,6 +56,7 @@ var pfr = '+RESP:GTPFR,8020060402,863835020303983,GV57CG,0,,,,,20150407094557,06
56
56
  var cra = '+RESP:GTCRA,8020060402,867488060596284,GV57CG,06,1,1.0,0,222.0,117.129815,31.839434,20230523062909,0460,0001,DF5C,027A4F1F,01,3,20230523160010,0B67$'
57
57
  var asc = '+RESP:GTASC,8020060402,867488060595542,GV57CG,0.86,0.52,0.01,0.52,-0.86,0.01,0.01,0.00,-1.00,1,12.6,267,39.7,117.115453,31.827255,20230523055431,0460,0001,DF5C,05F7B315,01,10,20230523135432,03BC$'
58
58
  var hbe = '+RESP:GTHBE,8020060402,866775051515393,GV57CG,,2,0,1,42.5,0,42.6,117.101321,31.827725,20231221034214,0460,0001,DF5C,05F7B40B,01,1,002500040054,FFE2FFFF0051,10,19.8,20231221034215,006B$'
59
+ var caneri = '+RESP:GTERI,6E0802,868589060350066,,00000104,28696,10,1,1,0.0,344,17.6,-71.604231,-33.043113,20241001170305,0730,0001,13F0,004E2212,01,6 ,10496.6,0000273:06:37,,,,98,210500,0,1,203FFFFF,,2,H4168131,5859.88,513,0,71,H2.4,P92.00,,,386.89,308.11,78.78,173.25,,FFFF,0000,,00,0.00,0.00,FFFFFF,62,,,,,,,,226631,181383,,386.89,79.35,,10178,,,,,,0000,0,0,,1,00,13,0,00000000,4007,,78054133C69C,1,0,20241001170312,26B5$'
59
60
 
60
61
  var data = {
61
62
  "imei": 864696060046190,
@@ -86,7 +87,8 @@ var data = {
86
87
  }
87
88
  }
88
89
 
89
- console.log(queclink.parseCommand(data))
90
- // const raw = new Buffer(hbe)
91
- // console.log(queclink.parse(raw))
92
- // queclink.parse(raw)
90
+ // console.log(queclink.parseCommand(data))
91
+ const raw = new Buffer(caneri)
92
+ console.log(queclink.parse(raw))
93
+ queclink.parse(raw)
94
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "queclink-parser",
3
- "version": "1.9.8",
3
+ "version": "1.9.10",
4
4
  "description": "Parse raw data from Queclink devices",
5
5
  "main": "src",
6
6
  "scripts": {
package/src/gv310lau.js CHANGED
@@ -113,7 +113,7 @@ const parse = raw => {
113
113
  state:
114
114
  utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6) !== ''
115
115
  ? utils.states[ // eslint-disable-line
116
- utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
116
+ utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
117
117
  ]
118
118
  : null
119
119
  },
@@ -229,6 +229,25 @@ const parse = raw => {
229
229
  let index = 7 + 12 * number // position append mask
230
230
  let satelliteInfo = false
231
231
 
232
+ // External Data
233
+ const digitFuelSensor =
234
+ utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[10] === '1'
235
+ const AC100 = utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[9] === '1'
236
+ const canData =
237
+ utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[8] === '1'
238
+ const fuelLevelPercentage =
239
+ utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[7] === '1'
240
+ const fuelVolume =
241
+ utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[6] === '1'
242
+ const bluetoothAccessory =
243
+ utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[2] === '1'
244
+
245
+ const fuelSensorData = digitFuelSensor ? parsedData[index + 9] : null
246
+ const ac100DevicesConnected =
247
+ AC100 && digitFuelSensor
248
+ ? parseInt(parsedData[index + 10], 10)
249
+ : AC100 && !digitFuelSensor ? parseInt(parsedData[index + 9], 10) : 0
250
+
232
251
  // If get satellites is configured
233
252
  if (utils.includeSatellites(parsedData[19])) {
234
253
  index = 7 + 13 * number
@@ -308,7 +327,7 @@ const parse = raw => {
308
327
  state:
309
328
  utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6) !== ''
310
329
  ? utils.states[ // eslint-disable-line
311
- utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
330
+ utils.nHexDigit(parsedData[index + 7], 10).substring(4, 6)
312
331
  ]
313
332
  : null
314
333
  },
@@ -348,33 +367,36 @@ const parse = raw => {
348
367
  hourmeter:
349
368
  parsedData[index + 2] !== ''
350
369
  ? utils.getHoursForHourmeter(parsedData[index + 2])
351
- : null
370
+ : null,
352
371
  })
353
- // External Data
354
- const digitFuelSensor =
355
- utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[10] === '1'
356
- const AC100 = utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[9] === '1'
357
- const reserved =
358
- utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[8] === '1'
359
- const fuelLevelPercentage =
360
- utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[7] === '1'
361
- const fuelVolume =
362
- utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[6] === '1'
363
- const bluetoothAccessory =
364
- utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[2] === '1'
365
372
 
366
- const fuelSensorData = digitFuelSensor ? parsedData[index + 9] : null
367
- const ac100DevicesConnected =
368
- AC100 && digitFuelSensor
369
- ? parseInt(parsedData[index + 10], 10)
370
- : AC100 && !digitFuelSensor ? parseInt(parsedData[index + 9], 10) : 0
373
+ if (canData) {
374
+ let canInfo = utils.getCanData(parsedData, index + 9)
375
+ data = Object.assign(data, { can: canInfo })
376
+ index = index + 49
377
+
378
+ if (canInfo?.totalDistance) {
379
+ data.gpsOdometer = data.odometer
380
+ data.odometer = canInfo.totalDistance
381
+ }
382
+
383
+ if (canInfo?.engineHours) {
384
+ data.gpsHourmeter = data.hourmeter
385
+ data.hourmeter = canInfo.engineHours
386
+ }
387
+
388
+ if (canInfo?.speed) {
389
+ data.gpsSpeed = data.speed
390
+ data.speed = canInfo.speed
391
+ }
392
+ }
371
393
 
372
394
  let externalData = {
373
395
  eriMask: {
374
396
  raw: parsedData[4],
375
397
  digitFuelSensor: digitFuelSensor,
376
398
  AC100: AC100,
377
- reserved: reserved,
399
+ canData: canData,
378
400
  fuelLevelPercentage: fuelLevelPercentage,
379
401
  fuelVolume: fuelVolume,
380
402
  bluetoothAccessory: bluetoothAccessory
@@ -1474,43 +1496,6 @@ const parse = raw => {
1474
1496
  satelliteInfo = true
1475
1497
  }
1476
1498
 
1477
- let inicatorsBin =
1478
- parsedData[24] !== ''
1479
- ? utils.nHexDigit(utils.hex2bin(parsedData[24]), 16)
1480
- : null
1481
- let lights =
1482
- parsedData[25] !== ''
1483
- ? utils.nHexDigit(utils.hex2bin(parsedData[25]), 8)
1484
- : null
1485
- let doors =
1486
- parsedData[26] !== ''
1487
- ? utils.nHexDigit(utils.hex2bin(parsedData[26]), 8)
1488
- : null
1489
- let canExpansionMask =
1490
- parsedData[29] !== ''
1491
- ? utils
1492
- .nHexDigit(utils.hex2bin(parsedData[29]), 32)
1493
- .split('')
1494
- .reverse()
1495
- .join('')
1496
- : null
1497
- let expansionBin =
1498
- parsedData[50] !== ''
1499
- ? utils
1500
- .nHexDigit(utils.hex2bin(parsedData[50]), 16)
1501
- .split('')
1502
- .reverse()
1503
- .join('')
1504
- : null
1505
- let tachographBin =
1506
- parsedData[23] !== ''
1507
- ? utils
1508
- .nHexDigit(utils.hex2bin(parsedData[23]), 8)
1509
- .split('')
1510
- .reverse()
1511
- .join('')
1512
- : null
1513
-
1514
1499
  data = Object.assign(data, {
1515
1500
  alarm: utils.getAlarm(command[1], parsedData[4]),
1516
1501
  loc: {
@@ -1544,201 +1529,9 @@ const parse = raw => {
1544
1529
  : null,
1545
1530
  odometer: null,
1546
1531
  hourmeter: null,
1547
- can: {
1548
- comunicationOk: parsedData[5] === '1',
1549
- vin: parsedData[7] !== '' ? parsedData[7] : null,
1550
- ignitionKey: parsedData[8] !== '' ? parseInt(parsedData[8], 10) : null,
1551
- distance: parsedData[9] !== '' ? parsedData[9] : null,
1552
- fuelUsed: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null, // float
1553
- rpm: parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null, // int
1554
- speed: parsedData[12] !== '' ? parseFloat(parsedData[12]) : null,
1555
- coolantTemp:
1556
- parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
1557
- fuelConsumption: parsedData[14] !== '' ? parsedData[14] : null,
1558
- fuelLevel: parsedData[15] !== '' ? parsedData[15] : null,
1559
- range: parsedData[16] !== '' ? parsedData[16] : null,
1560
- acceleratorPressure:
1561
- parsedData[17] !== '' ? parseFloat(parsedData[17]) : null, // %
1562
- engineHours: parsedData[18] !== '' ? parseFloat(parsedData[18]) : null,
1563
- drivingTime: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
1564
- idleTime: parsedData[20] !== '' ? parseFloat(parsedData[20]) : null,
1565
- idleFuelUsed: parsedData[21] !== '' ? parseFloat(parsedData[21]) : null,
1566
- axleWight: parsedData[22] !== '' ? parsedData[22] : null,
1567
- tachograph: {
1568
- raw: parsedData[23] !== '' ? parsedData[23] : null,
1569
- validDriverData: tachographBin ? tachographBin[7] === '1' : null,
1570
- insertedDriverCard: tachographBin ? tachographBin[5] === '1' : null,
1571
- driverWorkingState: tachographBin
1572
- ? utils.dWorkingStates[parseInt(tachographBin.substring(3, 5), 2)]
1573
- : null,
1574
- drivingTimeState: tachographBin
1575
- ? utils.dTimeStates[parseInt(tachographBin.substring(5, 8), 2)]
1576
- : null
1577
- },
1578
- indicators: {
1579
- raw: parsedData[24] !== '' ? parsedData[24] : null,
1580
- lowFuel: inicatorsBin ? inicatorsBin[0] === '1' : null,
1581
- driverSeatbelt: inicatorsBin ? inicatorsBin[1] === '1' : null,
1582
- airConditioning: inicatorsBin ? inicatorsBin[2] === '1' : null,
1583
- cruiseControl: inicatorsBin ? inicatorsBin[3] === '1' : null,
1584
- brakePedal: inicatorsBin ? inicatorsBin[4] === '1' : null,
1585
- clutchPedal: inicatorsBin ? inicatorsBin[5] === '1' : null,
1586
- handbrake: inicatorsBin ? inicatorsBin[6] === '1' : null,
1587
- centralLock: inicatorsBin ? inicatorsBin[7] === '1' : null,
1588
- reverseGear: inicatorsBin ? inicatorsBin[8] === '1' : null,
1589
- runningLights: inicatorsBin ? inicatorsBin[9] === '1' : null,
1590
- lowBeams: inicatorsBin ? inicatorsBin[10] === '1' : null,
1591
- highBeams: inicatorsBin ? inicatorsBin[11] === '1' : null,
1592
- rearFogLights: inicatorsBin ? inicatorsBin[12] === '1' : null,
1593
- frontFogLights: inicatorsBin ? inicatorsBin[13] === '1' : null,
1594
- doors: inicatorsBin ? inicatorsBin[14] === '1' : null,
1595
- trunk: inicatorsBin ? inicatorsBin[15] === '1' : null
1596
- },
1597
- lights: {
1598
- raw: parsedData[25] !== '' ? parsedData[25] : null,
1599
- running: lights ? lights[0] === '1' : null,
1600
- lowBeams: lights ? lights[1] === '1' : null,
1601
- frontFog: lights ? lights[2] === '1' : null,
1602
- rearFog: lights ? lights[3] === '1' : null,
1603
- hazard: lights ? lights[4] === '1' : null
1604
- },
1605
- doors: {
1606
- raw: parsedData[26] !== '' ? parsedData[26] : null,
1607
- driver: doors ? doors[0] === '1' : null,
1608
- passenger: doors ? doors[1] === '1' : null,
1609
- rearLeft: doors ? doors[2] === '1' : null,
1610
- rearRight: doors ? doors[3] === '1' : null,
1611
- trunk: doors ? doors[4] === '1' : null,
1612
- hood: doors ? doors[5] === '1' : null
1613
- },
1614
- overSpeedTime: parsedData[27] !== '' ? parsedData[27] : null,
1615
- overSpeedEngineTime: parsedData[28] !== '' ? parsedData[28] : null,
1616
- canReportExpansionMask: {
1617
- raw: parsedData[29] !== '' ? parsedData[29] : null,
1618
- engineTorque: canExpansionMask ? canExpansionMask[23] === '1' : null,
1619
- rapidAccelerations: canExpansionMask
1620
- ? canExpansionMask[22] === '1'
1621
- : null,
1622
- rapidBrakings: canExpansionMask ? canExpansionMask[21] === '1' : null,
1623
- expansionInformation: canExpansionMask
1624
- ? canExpansionMask[20] === '1'
1625
- : null,
1626
- registrationNumber: canExpansionMask
1627
- ? canExpansionMask[19] === '1'
1628
- : null,
1629
- tachographDriver2Name: canExpansionMask
1630
- ? canExpansionMask[18] === '1'
1631
- : null,
1632
- tachographDriver1Name: canExpansionMask
1633
- ? canExpansionMask[17] === '1'
1634
- : null,
1635
- tachographDriver2Card: canExpansionMask
1636
- ? canExpansionMask[16] === '1'
1637
- : null,
1638
- tachographDriver1Card: canExpansionMask
1639
- ? canExpansionMask[15] === '1'
1640
- : null,
1641
- totalBrakeApplications: canExpansionMask
1642
- ? canExpansionMask[14] === '1'
1643
- : null,
1644
- totalAcceleratorKickDownTime: canExpansionMask
1645
- ? canExpansionMask[13] === '1'
1646
- : null,
1647
- totalCruiseControlTime: canExpansionMask
1648
- ? canExpansionMask[12] === '1'
1649
- : null,
1650
- totalEffectiveEngineSpeedTime: canExpansionMask
1651
- ? canExpansionMask[11] === '1'
1652
- : null,
1653
- totalAcceleratorKickDown: canExpansionMask
1654
- ? canExpansionMask[10] === '1'
1655
- : null,
1656
- pedalBrakingFactor: canExpansionMask
1657
- ? canExpansionMask[9] === '1'
1658
- : null,
1659
- engineBrakingFactor: canExpansionMask
1660
- ? canExpansionMask[8] === '1'
1661
- : null,
1662
- analogInputValue: canExpansionMask
1663
- ? canExpansionMask[7] === '1'
1664
- : null,
1665
- tachographDrivingDirection: canExpansionMask
1666
- ? canExpansionMask[6] === '1'
1667
- : null,
1668
- tachographVehicleMotionSignal: canExpansionMask
1669
- ? canExpansionMask[5] === '1'
1670
- : null,
1671
- tachographOverspeedSignal: canExpansionMask
1672
- ? canExpansionMask[4] === '1'
1673
- : null,
1674
- AxleWeight4: canExpansionMask ? canExpansionMask[3] === '1' : null,
1675
- AxleWeight3: canExpansionMask ? canExpansionMask[2] === '1' : null,
1676
- AxleWeight1: canExpansionMask ? canExpansionMask[1] === '1' : null,
1677
- adBlueLevel: canExpansionMask ? canExpansionMask[0] === '1' : null
1678
- },
1679
- canExpanded: {
1680
- adBlueLevel:
1681
- parsedData[30] !== '' ? parseFloat(parsedData[30]) : null,
1682
- axleWeight1: parsedData[31] !== '' ? parseInt(parsedData[31]) : null,
1683
- axleWeight3: parsedData[32] !== '' ? parseInt(parsedData[32]) : null,
1684
- axleWeight4: parsedData[33] !== '' ? parseInt(parsedData[33]) : null,
1685
- tachographOverspeedSignal:
1686
- parsedData[34] !== '' ? parseInt(parsedData[34]) : null,
1687
- tachographVehicleMotionSignal:
1688
- parsedData[35] !== '' ? parseInt(parsedData[35]) : null,
1689
- tachographDrivingDirection:
1690
- parsedData[36] !== '' ? parseInt(parsedData[36]) : null,
1691
- analogInputValue:
1692
- parsedData[37] !== '' ? parseInt(parsedData[37]) : null,
1693
- engineBrakingFactor:
1694
- parsedData[38] !== '' ? parseInt(parsedData[38]) : null,
1695
- pedalBrakingFactor:
1696
- parsedData[39] !== '' ? parseInt(parsedData[39]) : null,
1697
- totalAcceleratorKickDown:
1698
- parsedData[40] !== '' ? parseInt(parsedData[40]) : null,
1699
- totalEffectiveEngineSpeedTime:
1700
- parsedData[41] !== '' ? parseFloat(parsedData[41]) : null,
1701
- totalCruiseControlTime:
1702
- parsedData[42] !== '' ? parseFloat(parsedData[42]) : null,
1703
- totalAcceleratorKickDownTime:
1704
- parsedData[43] !== '' ? parseFloat(parsedData[43]) : null,
1705
- totalBrakeApplications:
1706
- parsedData[44] !== '' ? parseInt(parsedData[44]) : null,
1707
- tachographDriver1Card:
1708
- parsedData[45] !== '' ? parseInt(parsedData[45]) : null,
1709
- tachographDriver2Card:
1710
- parsedData[46] !== '' ? parseInt(parsedData[46]) : null,
1711
- tachographDriver1Name: parsedData[47] !== '' ? parsedData[47] : null,
1712
- tachographDriver2Name: parsedData[48] !== '' ? parsedData[48] : null,
1713
- registrationNumber:
1714
- parsedData[49] !== '' ? parseInt(parsedData[49]) : null,
1715
- expansionInformation: {
1716
- raw: parsedData[50] !== '' ? parsedData[50] : null,
1717
- webasto: expansionBin ? expansionBin[0] === '1' : null,
1718
- brakeFluidLowIndicator: expansionBin
1719
- ? expansionBin[1] === '1'
1720
- : null,
1721
- coolantLevelLowIndicator: expansionBin
1722
- ? expansionBin[2] === '1'
1723
- : null,
1724
- batteryIndicator: expansionBin ? expansionBin[3] === '1' : null,
1725
- brakeSystemaFailureIndicator: expansionBin
1726
- ? expansionBin[4] === '1'
1727
- : null,
1728
- oilPressureIndicator: expansionBin ? expansionBin[5] === '1' : null,
1729
- engineHotIndicator: expansionBin ? expansionBin[6] === '1' : null,
1730
- ABSFailureIndicator: expansionBin ? expansionBin[7] === '1' : null,
1731
- checkEngineIndicator: expansionBin ? expansionBin[9] === '1' : null,
1732
- aribagsIndicator: expansionBin ? expansionBin[10] === '1' : null,
1733
- serviceCallIndicator: expansionBin
1734
- ? expansionBin[11] === '1'
1735
- : null,
1736
- oilLevelLowIndicator: expansionBin ? expansionBin[12] === '1' : null
1737
- },
1738
- adblueLevel: parsedData[30] !== '' ? parsedData[30] : null
1739
- }
1740
- }
1741
- })
1532
+ can: utils.getCanData(parsedData, 5),
1533
+ }
1534
+ )
1742
1535
  } else if (command[1] === 'GTDAT') {
1743
1536
  let dataIndex = 4
1744
1537
  // Short format
@@ -2185,13 +1978,13 @@ const parse = raw => {
2185
1978
  bluetoothInfo: {
2186
1979
  name:
2187
1980
  parsedData[index + 2] !== '' &&
2188
- utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[15] ===
1981
+ utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[15] ===
2189
1982
  '1'
2190
1983
  ? parsedData[index + 2]
2191
1984
  : null,
2192
1985
  mac:
2193
1986
  parsedData[index + 3] !== '' &&
2194
- utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[14] ===
1987
+ utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[14] ===
2195
1988
  '1'
2196
1989
  ? parsedData[index + 3]
2197
1990
  : null
@@ -2202,17 +1995,17 @@ const parse = raw => {
2202
1995
  name: null,
2203
1996
  role:
2204
1997
  parsedData[index + 4] !== '' &&
2205
- utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[7] === '1'
1998
+ utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[7] === '1'
2206
1999
  ? utils.peerRoles[parsedData[index + 4]]
2207
2000
  : null,
2208
2001
  type:
2209
2002
  parsedData[index + 5] !== '' &&
2210
- utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[5] === '1'
2003
+ utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[5] === '1'
2211
2004
  ? utils.peerAddressesTypes[parsedData[index + 5]]
2212
2005
  : null,
2213
2006
  mac:
2214
2007
  parsedData[index + 6] !== '' &&
2215
- utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[4] === '1'
2008
+ utils.nHexDigit(utils.hex2bin(parsedData[index + 1]), 16)[4] === '1'
2216
2009
  ? parsedData[index + 6]
2217
2010
  : null
2218
2011
  },
@@ -2549,29 +2342,29 @@ const parse = raw => {
2549
2342
  appendMask[0] === '1' && parsedData[typeIx + 1] !== ''
2550
2343
  ? {
2551
2344
  idMfrData:
2552
- parsedData[typeIx] === '0' && parsedData[typeIx + 1] !== ''
2553
- ? parsedData[typeIx + 1]
2554
- : null,
2345
+ parsedData[typeIx] === '0' && parsedData[typeIx + 1] !== ''
2346
+ ? parsedData[typeIx + 1]
2347
+ : null,
2555
2348
  uuid:
2556
- parsedData[typeIx] === '1' && parsedData[typeIx + 1] !== ''
2557
- ? parsedData[typeIx + 1]
2558
- : null,
2349
+ parsedData[typeIx] === '1' && parsedData[typeIx + 1] !== ''
2350
+ ? parsedData[typeIx + 1]
2351
+ : null,
2559
2352
  major:
2560
- parsedData[typeIx] === '1' && parsedData[typeIx + 2] !== ''
2561
- ? parsedData[typeIx + 2]
2562
- : null,
2353
+ parsedData[typeIx] === '1' && parsedData[typeIx + 2] !== ''
2354
+ ? parsedData[typeIx + 2]
2355
+ : null,
2563
2356
  minor:
2564
- parsedData[typeIx] === '1' && parsedData[typeIx + 3] !== ''
2565
- ? parsedData[typeIx + 3]
2566
- : null,
2357
+ parsedData[typeIx] === '1' && parsedData[typeIx + 3] !== ''
2358
+ ? parsedData[typeIx + 3]
2359
+ : null,
2567
2360
  nid:
2568
- parsedData[typeIx] === '2' && parsedData[typeIx + 1] !== ''
2569
- ? parsedData[typeIx + 1]
2570
- : null,
2361
+ parsedData[typeIx] === '2' && parsedData[typeIx + 1] !== ''
2362
+ ? parsedData[typeIx + 1]
2363
+ : null,
2571
2364
  bid:
2572
- parsedData[typeIx] === '2' && parsedData[typeIx + 2] !== ''
2573
- ? parsedData[typeIx + 2]
2574
- : null
2365
+ parsedData[typeIx] === '2' && parsedData[typeIx + 2] !== ''
2366
+ ? parsedData[typeIx + 2]
2367
+ : null
2575
2368
  }
2576
2369
  : null
2577
2370
  })
@@ -2652,12 +2445,12 @@ const parse = raw => {
2652
2445
  : null,
2653
2446
  lac:
2654
2447
  parsedData[index + 2] !== '' ||
2655
- parsedData[index + 2].toUpperCase() === 'FFFF'
2448
+ parsedData[index + 2].toUpperCase() === 'FFFF'
2656
2449
  ? parseInt(parsedData[index + 2], 16)
2657
2450
  : null,
2658
2451
  cid:
2659
2452
  parsedData[index + 3] !== '' ||
2660
- parsedData[index + 3].toUpperCase() === 'FFFF'
2453
+ parsedData[index + 3].toUpperCase() === 'FFFF'
2661
2454
  ? parseInt(parsedData[index + 3], 16)
2662
2455
  : null,
2663
2456
  rxLevel:
@@ -2686,12 +2479,12 @@ const parse = raw => {
2686
2479
  : null,
2687
2480
  lac:
2688
2481
  parsedData[index + 2] !== '' ||
2689
- parsedData[index + 2].toUpperCase() === 'FFFF'
2482
+ parsedData[index + 2].toUpperCase() === 'FFFF'
2690
2483
  ? parseInt(parsedData[index + 2], 16)
2691
2484
  : null,
2692
2485
  cid:
2693
2486
  parsedData[index + 3] !== '' ||
2694
- parsedData[index + 3].toUpperCase() === 'FFFF'
2487
+ parsedData[index + 3].toUpperCase() === 'FFFF'
2695
2488
  ? parseInt(parsedData[index + 3], 16)
2696
2489
  : null,
2697
2490
  rxLevel:
package/src/gv57cg.js CHANGED
@@ -221,12 +221,12 @@ const parse = raw => {
221
221
  utils.nHexDigit(
222
222
  utils.hex2bin(parsedData[index + 6].substring(2, 4)),
223
223
  8
224
- )[7] === '1',
224
+ )[6] === '1',
225
225
  '1':
226
226
  utils.nHexDigit(
227
227
  utils.hex2bin(parsedData[index + 6].substring(2, 4)),
228
228
  8
229
- )[6] === '1'
229
+ )[7] === '1'
230
230
  },
231
231
  output: {
232
232
  '3':
@@ -594,8 +594,8 @@ const parse = raw => {
594
594
  raw: `${parsedData[21]}${parsedData[22]}`,
595
595
  sos: false,
596
596
  input: {
597
- '2': utils.nHexDigit(utils.hex2bin(parsedData[21]), 8)[7] === '1',
598
- '1': utils.nHexDigit(utils.hex2bin(parsedData[21]), 8)[6] === '1'
597
+ '2': utils.nHexDigit(utils.hex2bin(parsedData[21]), 8)[6] === '1',
598
+ '1': utils.nHexDigit(utils.hex2bin(parsedData[21]), 8)[7] === '1'
599
599
  },
600
600
  output: {
601
601
  '3': utils.nHexDigit(utils.hex2bin(parsedData[22]), 8)[5] === '1',
@@ -1117,12 +1117,12 @@ const parse = raw => {
1117
1117
  utils.nHexDigit(
1118
1118
  utils.hex2bin(parsedData[index + 1].substring(2, 4)),
1119
1119
  8
1120
- )[7] === '1',
1120
+ )[6] === '1',
1121
1121
  '1':
1122
1122
  utils.nHexDigit(
1123
1123
  utils.hex2bin(parsedData[index + 1].substring(2, 4)),
1124
1124
  8
1125
- )[6] === '1'
1125
+ )[7] === '1'
1126
1126
  },
1127
1127
  output: {
1128
1128
  '3':
@@ -1764,12 +1764,12 @@ const parse = raw => {
1764
1764
  utils.nHexDigit(
1765
1765
  utils.hex2bin(parsedData[index + 1].substring(2, 4)),
1766
1766
  8
1767
- )[7] === '1',
1767
+ )[6] === '1',
1768
1768
  '1':
1769
1769
  utils.nHexDigit(
1770
1770
  utils.hex2bin(parsedData[index + 1].substring(2, 4)),
1771
1771
  8
1772
- )[6] === '1'
1772
+ )[7] === '1'
1773
1773
  },
1774
1774
  output: {
1775
1775
  '3':
@@ -1990,12 +1990,12 @@ const parse = raw => {
1990
1990
  utils.nHexDigit(
1991
1991
  utils.hex2bin(parsedData[index + 1].substring(2, 4)),
1992
1992
  8
1993
- )[7] === '1',
1993
+ )[6] === '1',
1994
1994
  '1':
1995
1995
  utils.nHexDigit(
1996
1996
  utils.hex2bin(parsedData[index + 1].substring(2, 4)),
1997
1997
  8
1998
- )[6] === '1'
1998
+ )[7] === '1'
1999
1999
  },
2000
2000
  output: {
2001
2001
  '3':
package/src/utils.js CHANGED
@@ -241,24 +241,24 @@ const beaconTypes = {
241
241
  Possible Driving Time Related States
242
242
  */
243
243
  const dTimeStates = {
244
- 0: 'Sin límites alcanzados',
245
- 1: 'Conducción sobre 4 horas y 15 minutos',
246
- 2: 'Conducción sobre 4 horas y 30 minutos',
247
- 3: 'Conducción sobre 8 horas y 45 minutos',
248
- 4: 'Conducción sobre 9 horas',
249
- 5: 'Conducción sobre 15 horas y 45 minutos (con descanso menor a 8 horas en las últimas 24 horas)',
250
- 6: 'Conducción sobre 16 horas',
251
- 7: 'Otro límite'
244
+ 0: 'normal',
245
+ 1: '04h_15min',
246
+ 2: '04h_30min',
247
+ 3: '08h_45min',
248
+ 4: '09h_00min',
249
+ 5: '15h_45min',
250
+ 6: '16h_00min',
251
+ 7: 'other'
252
252
  }
253
253
 
254
254
  /*
255
255
  Possible Driving Working States
256
256
  */
257
257
  const dWorkingStates = {
258
- 0: 'Normal',
259
- 1: 'En descanso - Durmiendo',
260
- 2: 'Conductor disponible - Descanso corto',
261
- 3: 'Conduciendo - En el volante'
258
+ 0: 'normal',
259
+ 1: 'rest',
260
+ 2: 'work',
261
+ 3: 'driving'
262
262
  }
263
263
 
264
264
  /*
@@ -518,69 +518,341 @@ const getMNC = (countryData, opData) => {
518
518
  let mnc = parseInt(opData, 10)
519
519
  let operator
520
520
  if (mcc === 716) {
521
- operator = (mnc === 6) ? 'Movistar' :
522
- (mnc === 7) ? 'Nextel' :
523
- (mnc === 10) ? 'Claro' :
524
- (mnc === 15) ? 'Viettel' :
525
- (mnc === 17) ? 'Entel' :
526
- (mnc === 20) ? 'Cuy Mobile (Claro)' :
521
+ operator = (mnc === 6) ? 'Movistar' :
522
+ (mnc === 7) ? 'Nextel' :
523
+ (mnc === 10) ? 'Claro' :
524
+ (mnc === 15) ? 'Viettel' :
525
+ (mnc === 17) ? 'Entel' :
526
+ (mnc === 20) ? 'Cuy Mobile (Claro)' :
527
527
  'Desconocido'
528
528
  } else if (mcc === 722) {
529
529
  operator = (mnc === 1) ? 'Tuenti' :
530
- (mnc === 10) ? 'Movicom' :
531
- (mnc === 20) ? 'Nextel' :
532
- (mnc === 34) ? 'Telecom Personal' :
533
- ([310, 320, 330].includes(mnc)) ? 'Claro' :
534
- 'Desconocido'
530
+ (mnc === 10) ? 'Movicom' :
531
+ (mnc === 20) ? 'Nextel' :
532
+ (mnc === 34) ? 'Telecom Personal' :
533
+ ([310, 320, 330].includes(mnc)) ? 'Claro' :
534
+ 'Desconocido'
535
535
  } else if (mcc === 724) {
536
536
  // Incomplete
537
537
  operator = ([2, 3, 4].includes(mnc)) ? 'TIM' :
538
- ([5, 6, 12].includes(mnc)) ? 'Claro' :
539
- 'Otra'
538
+ ([5, 6, 12].includes(mnc)) ? 'Claro' :
539
+ 'Otra'
540
540
  } else if (mcc === 730) {
541
541
  operator = ([1, 10].includes(mnc)) ? 'Entel' :
542
- ([2, 7].includes(mnc)) ? 'Movistar' :
543
- ([3, 23].includes(mnc)) ? 'Claro' :
544
- (mnc === 8) ? 'VTR (Claro)' :
545
- (mnc === 9) ? 'WOM' :
546
- ([14, 20, 21, 28].includes(mnc)) ? 'Otro' :
547
- 'Desconocido'
542
+ ([2, 7].includes(mnc)) ? 'Movistar' :
543
+ ([3, 23].includes(mnc)) ? 'Claro' :
544
+ (mnc === 8) ? 'VTR (Claro)' :
545
+ (mnc === 9) ? 'WOM' :
546
+ ([14, 20, 21, 28].includes(mnc)) ? 'Otro' :
547
+ 'Desconocido'
548
548
  } else if (mcc === 732) {
549
549
  operator = (mnc === 1) ? 'Telecom' :
550
- (mnc === 2) ? 'Edatel' :
551
- (mnc === 101) ? 'Claro' :
552
- (mnc === 103) ? 'Colombia Móvil' :
553
- ([102, 123].includes(mnc)) ? 'Movistar' :
554
- (mnc === 360) ? 'WOM' :
555
- 'Desconocido'
550
+ (mnc === 2) ? 'Edatel' :
551
+ (mnc === 101) ? 'Claro' :
552
+ (mnc === 103) ? 'Colombia Móvil' :
553
+ ([102, 123].includes(mnc)) ? 'Movistar' :
554
+ (mnc === 360) ? 'WOM' :
555
+ 'Desconocido'
556
556
  } else if (mcc === 736) {
557
557
  operator = (mnc === 1) ? 'Viva Bolivia' :
558
- (mnc === 2) ? 'Entel' :
559
- (mnc === 3) ? 'Telecel' :
560
- (mnc === 4) ? 'Cotas' :
561
- (mnc === 5) ? 'Comteco' :
562
- 'Desconocido'
558
+ (mnc === 2) ? 'Entel' :
559
+ (mnc === 3) ? 'Telecel' :
560
+ (mnc === 4) ? 'Cotas' :
561
+ (mnc === 5) ? 'Comteco' :
562
+ 'Desconocido'
563
563
  } else if (mcc === 740) {
564
564
  operator = (mnc === 1) ? 'Otecel (Movistar)' :
565
- (mnc === 2) ? 'Conecel (Claro)' :
566
- (mnc === 0) ? 'Telecsa (CNT' :
567
- 'Desconocido'
565
+ (mnc === 2) ? 'Conecel (Claro)' :
566
+ (mnc === 0) ? 'Telecsa (CNT' :
567
+ 'Desconocido'
568
568
  } else if (mcc === 744) {
569
569
  operator = (mnc === 1) ? 'Hola Paraguay' :
570
- (mnc === 2) ? 'AMX Paraguay' :
571
- (mnc === 3) ? 'Comunicaciones Privadas' :
572
- (mnc === 4) ? 'Telefónica Celular del Paraguay' :
573
- (mnc === 5) ? 'Núcleo' :
574
- 'Desconocido'
570
+ (mnc === 2) ? 'AMX Paraguay' :
571
+ (mnc === 3) ? 'Comunicaciones Privadas' :
572
+ (mnc === 4) ? 'Telefónica Celular del Paraguay' :
573
+ (mnc === 5) ? 'Núcleo' :
574
+ 'Desconocido'
575
575
  } else if (mcc === 748) {
576
576
  operator = ([0, 1].includes(mnc)) ? 'Ancel' :
577
- (mnc === 7) ? 'Movistar' :
578
- (mnc === 0) ? 'AMX Wireless' :
579
- 'Desconocido'
577
+ (mnc === 7) ? 'Movistar' :
578
+ (mnc === 0) ? 'AMX Wireless' :
579
+ 'Desconocido'
580
580
  } else {
581
581
  operator = 'Desconocido'
582
582
  }
583
- return {country: latamMcc[mcc], mnc: mnc, operator: operator
583
+ return {
584
+ country: latamMcc[mcc], mnc: mnc, operator: operator
585
+ }
586
+ }
587
+
588
+ /*
589
+ Hectometer to Kilometer
590
+ */
591
+ const hToKm = (data) => {
592
+ let h = parseFloat(data.slice(1))
593
+ return parseFloat((h * 0.1).toFixed(2))
594
+ }
595
+
596
+ /*
597
+ Parse CAN100 data
598
+ */
599
+ const parseCanData = (data, key) => {
600
+ switch (key) {
601
+ case 'ignitionKey':
602
+ return (data === '0' ? 'ignition_off' : data === '1' ? 'ignition_on' : data === '2' ? 'engine_on' : null)
603
+ case 'totalDistance':
604
+ if (data[0] === 'H') {
605
+ return hToKm(data)
606
+ } else {
607
+ return data
608
+ }
609
+ case 'range':
610
+ return hToKm(data)
611
+ case 'fuelConsumption':
612
+ if (data[0] === 'H') {
613
+ return hToKm(data) * 1000
614
+ } else if (data[0] === 'L') {
615
+ return parseFloat(parseFloat(data.slice(1)).toFixed(2))
616
+ } else {
617
+ return data
618
+ }
619
+ case 'tachographDrivingDirection':
620
+ return data === '0' ? 'forward' : 'backward'
621
+ default:
622
+ return data
623
+ }
624
+ }
625
+
626
+ /*
627
+ Get CANbus data
628
+ */
629
+ const getCanData = (parsedData, ix) => {
630
+ let inicatorsBin =
631
+ parsedData[ix + 19] !== ''
632
+ ? nHexDigit(hex2bin(parsedData[ix + 19]), 16)
633
+ : null
634
+ let lights =
635
+ parsedData[ix + 20] !== ''
636
+ ? nHexDigit(hex2bin(parsedData[ix + 20]), 8)
637
+ : null
638
+ let doors =
639
+ parsedData[ix + 21] !== ''
640
+ ? nHexDigit(hex2bin(parsedData[ix + 21]), 8)
641
+ : null
642
+ let canExpansionMask =
643
+ parsedData[ix + 24] !== ''
644
+ ? nHexDigit(hex2bin(parsedData[ix + 24]), 32)
645
+ .split('')
646
+ .reverse()
647
+ .join('')
648
+ : null
649
+ let expansionBin =
650
+ parsedData[ix + 45] !== ''
651
+ ? nHexDigit(hex2bin(parsedData[ix + 45]), 16)
652
+ .split('')
653
+ .reverse()
654
+ .join('')
655
+ : null
656
+ let tachographBin =
657
+ parsedData[ix + 18] !== ''
658
+ ? nHexDigit(hex2bin(parsedData[ix + 18]), 8)
659
+ .split('')
660
+ .reverse()
661
+ .join('')
662
+ : null
663
+
664
+ return {
665
+ comunicationOk: parsedData[ix] ? parsedData[ix] === '1' : null,
666
+ vin: parsedData[ix + 2] !== '' ? parsedData[ix + 2] : null,
667
+ ignitionKey: parsedData[ix + 3] !== '' ? parseCanData(parsedData[ix + 3], 'ignitionKey') : null,
668
+ totalDistance: parsedData[ix + 4] !== '' ? parseCanData(parsedData[ix + 4], 'totalDistance') : null,
669
+ fuelUsed: parsedData[ix + 5] !== '' ? parseFloat(parsedData[ix + 5]) : null, // float
670
+ rpm: parsedData[ix + 6] !== '' ? parseInt(parsedData[ix + 6], 10) : null, // int
671
+ speed: parsedData[ix + 7] !== '' ? parseFloat(parsedData[ix + 7]) : null,
672
+ engineCoolantTemp:
673
+ parsedData[ix + 8] !== '' ? parseInt(parsedData[ix + 8], 10) : null,
674
+ fuelConsumption: parsedData[ix + 9] !== '' ? parseCanData(parsedData[ix + 9], 'fuelConsumption') : null,
675
+ fuelLevel: parsedData[ix + 10] !== '' ? parsedData[ix + 10] : null,
676
+ range: parsedData[ix + 11] !== '' ? parseCanData(parsedData[ix + 11], 'range') : null,
677
+ acceleratorPressure:
678
+ parsedData[ix + 12] !== '' ? parseFloat(parsedData[ix + 12]) : null,
679
+ engineHours: parsedData[ix + 13] !== '' ? parseFloat(parsedData[ix + 13]) : null,
680
+ drivingTime: parsedData[ix + 14] !== '' ? parseFloat(parsedData[ix + 14]) : null,
681
+ idleTime: parsedData[ix + 15] !== '' ? parseFloat(parsedData[ix + 15]) : null,
682
+ idleFuelUsed: parsedData[ix + 16] !== '' ? parseFloat(parsedData[ix + 16]) : null,
683
+ axleWight: parsedData[ix + 17] !== '' ? parseFloat(parsedData[ix + 17]) : null,
684
+ tachograph: {
685
+ raw: parsedData[ix + 18] !== '' ? parsedData[ix + 18] : null,
686
+ validDriverData: tachographBin ? tachographBin[7] === '1' : null,
687
+ insertedDriverCard: tachographBin ? tachographBin[5] === '1' : null,
688
+ driverWorkingState: tachographBin
689
+ ? dWorkingStates[parseInt(tachographBin.substring(3, 5), 2)]
690
+ : null,
691
+ drivingTimeState: tachographBin
692
+ ? dTimeStates[parseInt(tachographBin.substring(5, 8), 2)]
693
+ : null
694
+ },
695
+ indicators: inicatorsBin ? {
696
+ raw: inicatorsBin !== '' ? parsedData[ix + 19] : null,
697
+ lowFuel: inicatorsBin ? inicatorsBin[0] === '1' : null,
698
+ driverSeatbelt: inicatorsBin ? inicatorsBin[1] === '1' : null,
699
+ airConditioning: inicatorsBin ? inicatorsBin[2] === '1' : null,
700
+ cruiseControl: inicatorsBin ? inicatorsBin[3] === '1' : null,
701
+ brakePedal: inicatorsBin ? inicatorsBin[4] === '1' : null,
702
+ clutchPedal: inicatorsBin ? inicatorsBin[5] === '1' : null,
703
+ handbrake: inicatorsBin ? inicatorsBin[6] === '1' : null,
704
+ centralLock: inicatorsBin ? inicatorsBin[7] === '1' : null,
705
+ reverseGear: inicatorsBin ? inicatorsBin[8] === '1' : null,
706
+ runningLights: inicatorsBin ? inicatorsBin[9] === '1' : null,
707
+ lowBeams: inicatorsBin ? inicatorsBin[10] === '1' : null,
708
+ highBeams: inicatorsBin ? inicatorsBin[11] === '1' : null,
709
+ rearFogLights: inicatorsBin ? inicatorsBin[12] === '1' : null,
710
+ frontFogLights: inicatorsBin ? inicatorsBin[13] === '1' : null,
711
+ doors: inicatorsBin ? inicatorsBin[14] === '1' : null,
712
+ trunk: inicatorsBin ? inicatorsBin[15] === '1' : null
713
+ } : null,
714
+ lights: lights ? {
715
+ raw: lights !== '' ? parsedData[ix + 20] : null,
716
+ running: lights ? lights[0] === '1' : null,
717
+ lowBeams: lights ? lights[1] === '1' : null,
718
+ frontFog: lights ? lights[2] === '1' : null,
719
+ rearFog: lights ? lights[3] === '1' : null,
720
+ hazard: lights ? lights[4] === '1' : null
721
+ } : null,
722
+ doors: doors ? {
723
+ raw: doors !== '' ? parsedData[ix + 21] : null,
724
+ driver: doors ? doors[0] === '1' : null,
725
+ passenger: doors ? doors[1] === '1' : null,
726
+ rearLeft: doors ? doors[2] === '1' : null,
727
+ rearRight: doors ? doors[3] === '1' : null,
728
+ trunk: doors ? doors[4] === '1' : null,
729
+ hood: doors ? doors[5] === '1' : null
730
+ } : null,
731
+ overSpeedTime: parsedData[ix + 22] !== '' ? parseFloat(parsedData[ix + 22]) : null,
732
+ overSpeedEngineTime: parsedData[ix + 23] !== '' ? parseFloat(parsedData[ix + 23]) : null,
733
+ canExpanded: {
734
+ canReportExpansionMask: {
735
+ raw: parsedData[ix + 24] !== '' ? parsedData[ix + 24] : null,
736
+ engineTorque: canExpansionMask ? canExpansionMask[23] === '1' : null,
737
+ rapidAccelerations: canExpansionMask
738
+ ? canExpansionMask[22] === '1'
739
+ : null,
740
+ rapidBrakings: canExpansionMask ? canExpansionMask[21] === '1' : null,
741
+ expansionInformation: canExpansionMask
742
+ ? canExpansionMask[20] === '1'
743
+ : null,
744
+ registrationNumber: canExpansionMask
745
+ ? canExpansionMask[19] === '1'
746
+ : null,
747
+ tachographDriver2Name: canExpansionMask
748
+ ? canExpansionMask[18] === '1'
749
+ : null,
750
+ tachographDriver1Name: canExpansionMask
751
+ ? canExpansionMask[17] === '1'
752
+ : null,
753
+ tachographDriver2Card: canExpansionMask
754
+ ? canExpansionMask[16] === '1'
755
+ : null,
756
+ tachographDriver1Card: canExpansionMask
757
+ ? canExpansionMask[15] === '1'
758
+ : null,
759
+ totalBrakeApplications: canExpansionMask
760
+ ? canExpansionMask[14] === '1'
761
+ : null,
762
+ totalAcceleratorKickDownTime: canExpansionMask
763
+ ? canExpansionMask[13] === '1'
764
+ : null,
765
+ totalCruiseControlTime: canExpansionMask
766
+ ? canExpansionMask[12] === '1'
767
+ : null,
768
+ totalEffectiveEngineSpeedTime: canExpansionMask
769
+ ? canExpansionMask[11] === '1'
770
+ : null,
771
+ totalAcceleratorKickDown: canExpansionMask
772
+ ? canExpansionMask[10] === '1'
773
+ : null,
774
+ pedalBrakingFactor: canExpansionMask
775
+ ? canExpansionMask[9] === '1'
776
+ : null,
777
+ engineBrakingFactor: canExpansionMask
778
+ ? canExpansionMask[8] === '1'
779
+ : null,
780
+ analogInputValue: canExpansionMask
781
+ ? canExpansionMask[7] === '1'
782
+ : null,
783
+ tachographDrivingDirection: canExpansionMask
784
+ ? canExpansionMask[6] === '1'
785
+ : null,
786
+ tachographVehicleMotionSignal: canExpansionMask
787
+ ? canExpansionMask[5] === '1'
788
+ : null,
789
+ tachographOverspeedSignal: canExpansionMask
790
+ ? canExpansionMask[4] === '1'
791
+ : null,
792
+ AxleWeight4: canExpansionMask ? canExpansionMask[3] === '1' : null,
793
+ AxleWeight3: canExpansionMask ? canExpansionMask[2] === '1' : null,
794
+ AxleWeight1: canExpansionMask ? canExpansionMask[1] === '1' : null,
795
+ adBlueLevel: canExpansionMask ? canExpansionMask[0] === '1' : null
796
+ },
797
+ adBlueLevel:
798
+ parsedData[ix + 25] !== '' ? parseFloat(parsedData[ix + 25]) : null,
799
+ axleWeight1: parsedData[ix + 26] !== '' ? parseInt(parsedData[ix + 26]) : null,
800
+ axleWeight3: parsedData[ix + 27] !== '' ? parseInt(parsedData[ix + 27]) : null,
801
+ axleWeight4: parsedData[ix + 28] !== '' ? parseInt(parsedData[ix + 28]) : null,
802
+ tachographOverspeedSignal:
803
+ parsedData[ix + 29] !== '' ? (parsedData[ix + 29] === '1') : null,
804
+ tachographVehicleMotionSignal:
805
+ parsedData[ix + 30] !== '' ? (parsedData[ix + 30] === '1') : null,
806
+ tachographDrivingDirection:
807
+ parsedData[ix + 31] !== '' ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
808
+ analogInputValue:
809
+ parsedData[ix + 32] !== '' ? parseFloat(parsedData[ix + 32]) * 1000 : null,
810
+ engineBrakingFactor:
811
+ parsedData[ix + 33] !== '' ? parseInt(parsedData[ix + 33]) : null,
812
+ pedalBrakingFactor:
813
+ parsedData[ix + 34] !== '' ? parseInt(parsedData[ix + 34]) : null,
814
+ totalAcceleratorKickDown:
815
+ parsedData[ix + 35] !== '' ? parseInt(parsedData[ix + 35]) : null,
816
+ totalEffectiveEngineSpeedTime:
817
+ parsedData[ix + 36] !== '' ? parseFloat(parsedData[ix + 36]) : null,
818
+ totalCruiseControlTime:
819
+ parsedData[ix + 37] !== '' ? parseFloat(parsedData[ix + 37]) : null,
820
+ totalAcceleratorKickDownTime:
821
+ parsedData[ix + 38] !== '' ? parseFloat(parsedData[ix + 38]) : null,
822
+ totalBrakeApplications:
823
+ parsedData[ix + 39] !== '' ? parseInt(parsedData[ix + 39]) : null,
824
+ tachographDriver1Card: parsedData[ix + 40] !== '' ? parsedData[ix + 40] : null,
825
+ tachographDriver2Card: parsedData[ix + 41] !== '' ? parsedData[ix + 41] : null,
826
+ tachographDriver1Name: parsedData[ix + 42] !== '' ? parsedData[ix + 42] : null,
827
+ tachographDriver2Name: parsedData[ix + 43] !== '' ? parsedData[ix + 43] : null,
828
+ registrationNumber: parsedData[ix + 44] !== '' ? parsedData[ix + 44] : null,
829
+ expansionInformation: {
830
+ raw: parsedData[ix + 45] !== '' ? parsedData[ix + 45] : null,
831
+ webasto: expansionBin ? expansionBin[0] === '1' : null,
832
+ brakeFluidLowIndicator: expansionBin
833
+ ? expansionBin[1] === '1'
834
+ : null,
835
+ coolantLevelLowIndicator: expansionBin
836
+ ? expansionBin[2] === '1'
837
+ : null,
838
+ batteryIndicator: expansionBin ? expansionBin[3] === '1' : null,
839
+ brakeSystemaFailureIndicator: expansionBin
840
+ ? expansionBin[4] === '1'
841
+ : null,
842
+ oilPressureIndicator: expansionBin ? expansionBin[5] === '1' : null,
843
+ engineHotIndicator: expansionBin ? expansionBin[6] === '1' : null,
844
+ ABSFailureIndicator: expansionBin ? expansionBin[7] === '1' : null,
845
+ checkEngineIndicator: expansionBin ? expansionBin[9] === '1' : null,
846
+ aribagsIndicator: expansionBin ? expansionBin[10] === '1' : null,
847
+ serviceCallIndicator: expansionBin
848
+ ? expansionBin[11] === '1'
849
+ : null,
850
+ oilLevelLowIndicator: expansionBin ? expansionBin[12] === '1' : null
851
+ },
852
+ rapidBrakings: parsedData[ix + 46] !== '' ? parseInt(parsedData[ix + 46]) : null,
853
+ rapidAccelerations: parsedData[ix + 47] !== '' ? parseInt(parsedData[ix + 47]) : null,
854
+ engineTorque: parsedData[ix + 48] !== '' ? parseFloat(parsedData[ix + 48]) : null,
855
+ }
584
856
  }
585
857
  }
586
858
 
@@ -1237,6 +1509,7 @@ module.exports = {
1237
1509
  getHoursForHourmeter: getHoursForHourmeter,
1238
1510
  getSignalStrength: getSignalStrength,
1239
1511
  getSignalPercentage: getSignalPercentage,
1512
+ getCanData: getCanData,
1240
1513
  getAlarm: getAlarm,
1241
1514
  bin2dec: bin2dec,
1242
1515
  bin2hex: bin2hex,