queclink-parser 1.9.11 → 1.9.12
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 +18 -0
- package/example.js +69 -3
- package/package.json +1 -1
- package/src/gv310lau.js +29 -27
- package/src/gv58lau.js +2 -2
- package/src/utils.js +57 -51
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
#### 1.9.12 (2024-10-14)
|
|
2
|
+
|
|
3
|
+
##### New Features
|
|
4
|
+
|
|
5
|
+
* **can:** added adBlueLevelUnit ([cfc663c8](https://github.com/jaayesta/queclink-parser/commit/cfc663c8339dadc6e36750019c7d881007942a45))
|
|
6
|
+
|
|
7
|
+
##### Bug Fixes
|
|
8
|
+
|
|
9
|
+
* **gv58lau:** digital inputs ([bb78b299](https://github.com/jaayesta/queclink-parser/commit/bb78b29970fa016571d93fd9c1959c73804d294a))
|
|
10
|
+
* **canbus:** new can index consider ac100 or digitFuelSensor data ([b0e9d23e](https://github.com/jaayesta/queclink-parser/commit/b0e9d23e69e9ffacddf0b76cc3a4d04523598ebe))
|
|
11
|
+
* **can:**
|
|
12
|
+
* evaluation for parsedData ([3427d98f](https://github.com/jaayesta/queclink-parser/commit/3427d98f85d273a262dc076c4b36cb88e51c3b54))
|
|
13
|
+
* typo ([08408de4](https://github.com/jaayesta/queclink-parser/commit/08408de4d52d38f8cd280736ff7d821303c5e756))
|
|
14
|
+
|
|
15
|
+
##### Tests
|
|
16
|
+
|
|
17
|
+
* **can:** test for database when can data exists ([424e28c6](https://github.com/jaayesta/queclink-parser/commit/424e28c63c39d6d3e6a4335d9f9b79c83d574b68))
|
|
18
|
+
|
|
1
19
|
#### 1.9.11 (2024-10-09)
|
|
2
20
|
|
|
3
21
|
##### New Features
|
package/example.js
CHANGED
|
@@ -90,7 +90,73 @@ var data = {
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
// console.log(queclink.parseCommand(data))
|
|
93
|
-
const raw = new Buffer(
|
|
94
|
-
console.log(queclink.parse(raw))
|
|
95
|
-
queclink.parse(raw)
|
|
93
|
+
const raw = new Buffer(caneri)
|
|
94
|
+
// console.log(queclink.parse(raw))
|
|
95
|
+
// queclink.parse(raw)
|
|
96
96
|
|
|
97
|
+
data = queclink.parse(raw)
|
|
98
|
+
// console.log(data)
|
|
99
|
+
if (data.can) {
|
|
100
|
+
const {
|
|
101
|
+
comunicationOk,
|
|
102
|
+
vin,
|
|
103
|
+
ignitionKey,
|
|
104
|
+
totalDistance,
|
|
105
|
+
totalDistanceUnit,
|
|
106
|
+
rpm,
|
|
107
|
+
speed,
|
|
108
|
+
engineCoolantTemp,
|
|
109
|
+
fuelConsumption,
|
|
110
|
+
fuelLevel,
|
|
111
|
+
fuelLevelUnit,
|
|
112
|
+
range,
|
|
113
|
+
acceleratorPressure,
|
|
114
|
+
engineHours,
|
|
115
|
+
drivingTime,
|
|
116
|
+
idleTime,
|
|
117
|
+
idleFuelUsed,
|
|
118
|
+
axleWeight,
|
|
119
|
+
tachograph,
|
|
120
|
+
indicators,
|
|
121
|
+
lights,
|
|
122
|
+
doors,
|
|
123
|
+
overSpeedTime,
|
|
124
|
+
overSpeedEngineTime
|
|
125
|
+
} = data.can
|
|
126
|
+
|
|
127
|
+
const canData = {
|
|
128
|
+
raw: data.raw,
|
|
129
|
+
imei: data.imei,
|
|
130
|
+
datetime: data.datetime,
|
|
131
|
+
point: data.point,
|
|
132
|
+
comunicationOk,
|
|
133
|
+
vin,
|
|
134
|
+
ignitionKey,
|
|
135
|
+
totalDistance,
|
|
136
|
+
totalDistanceUnit,
|
|
137
|
+
rpm,
|
|
138
|
+
speed,
|
|
139
|
+
engineCoolantTemp,
|
|
140
|
+
fuelConsumption,
|
|
141
|
+
fuelLevel,
|
|
142
|
+
fuelLevelUnit,
|
|
143
|
+
range,
|
|
144
|
+
acceleratorPressure,
|
|
145
|
+
engineHours,
|
|
146
|
+
drivingTime,
|
|
147
|
+
idleTime,
|
|
148
|
+
idleFuelUsed,
|
|
149
|
+
axleWeight,
|
|
150
|
+
tachograph,
|
|
151
|
+
indicators,
|
|
152
|
+
lights,
|
|
153
|
+
doors,
|
|
154
|
+
overSpeedTime,
|
|
155
|
+
overSpeedEngineTime,
|
|
156
|
+
...data.can.canExpanded
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
canData.canReportExpansionMask = canData.canReportExpansionMask.raw
|
|
160
|
+
console.log(canData)
|
|
161
|
+
delete data.can
|
|
162
|
+
}
|
package/package.json
CHANGED
package/src/gv310lau.js
CHANGED
|
@@ -229,6 +229,12 @@ const parse = raw => {
|
|
|
229
229
|
let index = 7 + 12 * number // position append mask
|
|
230
230
|
let satelliteInfo = false
|
|
231
231
|
|
|
232
|
+
// If get satellites is configured
|
|
233
|
+
if (utils.includeSatellites(parsedData[19])) {
|
|
234
|
+
index = 7 + 13 * number
|
|
235
|
+
satelliteInfo = true
|
|
236
|
+
}
|
|
237
|
+
|
|
232
238
|
// External Data
|
|
233
239
|
const digitFuelSensor =
|
|
234
240
|
utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[10] === '1'
|
|
@@ -242,12 +248,6 @@ const parse = raw => {
|
|
|
242
248
|
const bluetoothAccessory =
|
|
243
249
|
utils.nHexDigit(utils.hex2bin(parsedData[4]), 11)[2] === '1'
|
|
244
250
|
|
|
245
|
-
// If get satellites is configured
|
|
246
|
-
if (utils.includeSatellites(parsedData[19])) {
|
|
247
|
-
index = 7 + 13 * number
|
|
248
|
-
satelliteInfo = true
|
|
249
|
-
}
|
|
250
|
-
|
|
251
251
|
data = Object.assign(data, {
|
|
252
252
|
alarm: utils.getAlarm(command[1], null),
|
|
253
253
|
loc: {
|
|
@@ -369,27 +369,6 @@ const parse = raw => {
|
|
|
369
369
|
AC100 && digitFuelSensor
|
|
370
370
|
? parseInt(parsedData[index + 10], 10)
|
|
371
371
|
: AC100 && !digitFuelSensor ? parseInt(parsedData[index + 9], 10) : 0
|
|
372
|
-
|
|
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
|
-
}
|
|
393
372
|
|
|
394
373
|
let externalData = {
|
|
395
374
|
eriMask: {
|
|
@@ -442,6 +421,7 @@ const parse = raw => {
|
|
|
442
421
|
})
|
|
443
422
|
count += 3
|
|
444
423
|
}
|
|
424
|
+
|
|
445
425
|
externalData = Object.assign(externalData, {
|
|
446
426
|
fuelSensorData: null,
|
|
447
427
|
AC100Devices: ac100Devices
|
|
@@ -536,6 +516,28 @@ const parse = raw => {
|
|
|
536
516
|
}
|
|
537
517
|
}
|
|
538
518
|
|
|
519
|
+
if (canData) {
|
|
520
|
+
let newIndex = digitFuelSensor && !AC100 ? index + 9 + 1 : !digitFuelSensor && AC100 ? index + 9 + 4 : digitFuelSensor && AC100 ? index + 9 + 5 : index + 9
|
|
521
|
+
let canInfo = utils.getCanData(parsedData, newIndex)
|
|
522
|
+
data = Object.assign(data, { can: canInfo })
|
|
523
|
+
index = index + 49
|
|
524
|
+
|
|
525
|
+
if (canInfo?.totalDistance) {
|
|
526
|
+
data.gpsOdometer = data.odometer
|
|
527
|
+
data.odometer = canInfo.totalDistance
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
if (canInfo?.engineHours) {
|
|
531
|
+
data.gpsHourmeter = data.hourmeter
|
|
532
|
+
data.hourmeter = canInfo.engineHours
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
if (canInfo?.speed) {
|
|
536
|
+
data.gpsSpeed = data.speed
|
|
537
|
+
data.speed = canInfo.speed
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
539
541
|
// Bluetooth Accessories
|
|
540
542
|
if (bluetoothAccessory) {
|
|
541
543
|
let btDevices = []
|
package/src/gv58lau.js
CHANGED
|
@@ -56,12 +56,12 @@ const parse = raw => {
|
|
|
56
56
|
utils.nHexDigit(
|
|
57
57
|
utils.hex2bin(parsedData[index + 6].substring(2, 4)),
|
|
58
58
|
8
|
|
59
|
-
)[
|
|
59
|
+
)[6] === '1',
|
|
60
60
|
'1':
|
|
61
61
|
utils.nHexDigit(
|
|
62
62
|
utils.hex2bin(parsedData[index + 6].substring(2, 4)),
|
|
63
63
|
8
|
|
64
|
-
)[
|
|
64
|
+
)[7] === '1'
|
|
65
65
|
},
|
|
66
66
|
output: {
|
|
67
67
|
'3':
|
package/src/utils.js
CHANGED
|
@@ -618,6 +618,12 @@ const parseCanData = (data, key) => {
|
|
|
618
618
|
}
|
|
619
619
|
case 'tachographDrivingDirection':
|
|
620
620
|
return data === '0' ? 'forward' : 'backward'
|
|
621
|
+
case 'adBlueLevel':
|
|
622
|
+
if(['P','L'].includes(data.slice(0,1))) {
|
|
623
|
+
return parseFloat(parseFloat(data.slice(1)).toFixed(2))
|
|
624
|
+
} else {
|
|
625
|
+
return parseFloat(parseFloat(data).toFixed(2))
|
|
626
|
+
}
|
|
621
627
|
default:
|
|
622
628
|
return data
|
|
623
629
|
}
|
|
@@ -663,28 +669,28 @@ const getCanData = (parsedData, ix) => {
|
|
|
663
669
|
|
|
664
670
|
return {
|
|
665
671
|
comunicationOk: parsedData[ix] ? parsedData[ix] === '1' : null,
|
|
666
|
-
vin: parsedData[ix + 2]
|
|
667
|
-
ignitionKey: parsedData[ix + 3]
|
|
668
|
-
totalDistance: parsedData[ix + 4]
|
|
669
|
-
totalDistanceUnit: parsedData[ix + 4] ? parsedData[ix + 4].slice(0,1) === 'H' ? '
|
|
670
|
-
fuelUsed: parsedData[ix + 5]
|
|
671
|
-
rpm: parsedData[ix + 6]
|
|
672
|
-
speed: parsedData[ix + 7]
|
|
672
|
+
vin: parsedData[ix + 2] ? parsedData[ix + 2] : null,
|
|
673
|
+
ignitionKey: parsedData[ix + 3] ? parseCanData(parsedData[ix + 3], 'ignitionKey') : null,
|
|
674
|
+
totalDistance: parsedData[ix + 4] ? parseCanData(parsedData[ix + 4], 'totalDistance') : null,
|
|
675
|
+
totalDistanceUnit: parsedData[ix + 4] ? parsedData[ix + 4].slice(0,1) === 'H' ? 'km' : 'I' : null,
|
|
676
|
+
fuelUsed: parsedData[ix + 5] ? parseFloat(parsedData[ix + 5]) : null, // float
|
|
677
|
+
rpm: parsedData[ix + 6] ? parseInt(parsedData[ix + 6], 10) : null, // int
|
|
678
|
+
speed: parsedData[ix + 7] ? parseFloat(parsedData[ix + 7]) : null,
|
|
673
679
|
engineCoolantTemp:
|
|
674
|
-
parsedData[ix + 8]
|
|
675
|
-
fuelConsumption: parsedData[ix + 9]
|
|
676
|
-
fuelLevel: parsedData[ix + 10]
|
|
680
|
+
parsedData[ix + 8] ? parseInt(parsedData[ix + 8], 10) : null,
|
|
681
|
+
fuelConsumption: parsedData[ix + 9] ? parseCanData(parsedData[ix + 9], 'fuelConsumption') : null,
|
|
682
|
+
fuelLevel: parsedData[ix + 10] ? parseFloat(parsedData[ix + 10].slice(1)) : null,
|
|
677
683
|
fuelLevelUnit: parsedData[ix + 10] ? parsedData[ix + 10].slice(0,1) === 'P' ? '%' : 'L' : null,
|
|
678
|
-
range: parsedData[ix + 11]
|
|
684
|
+
range: parsedData[ix + 11] ? parseCanData(parsedData[ix + 11], 'range') : null,
|
|
679
685
|
acceleratorPressure:
|
|
680
|
-
parsedData[ix + 12]
|
|
681
|
-
engineHours: parsedData[ix + 13]
|
|
682
|
-
drivingTime: parsedData[ix + 14]
|
|
683
|
-
idleTime: parsedData[ix + 15]
|
|
684
|
-
idleFuelUsed: parsedData[ix + 16]
|
|
685
|
-
|
|
686
|
-
tachograph: {
|
|
687
|
-
raw: parsedData[ix + 18]
|
|
686
|
+
parsedData[ix + 12] ? parseFloat(parsedData[ix + 12]) : null,
|
|
687
|
+
engineHours: parsedData[ix + 13] ? parseFloat(parsedData[ix + 13]) : null,
|
|
688
|
+
drivingTime: parsedData[ix + 14] ? parseFloat(parsedData[ix + 14]) : null,
|
|
689
|
+
idleTime: parsedData[ix + 15] ? parseFloat(parsedData[ix + 15]) : null,
|
|
690
|
+
idleFuelUsed: parsedData[ix + 16] ? parseFloat(parsedData[ix + 16]) : null,
|
|
691
|
+
axleWeight: parsedData[ix + 17] ? parseFloat(parsedData[ix + 17]) : null,
|
|
692
|
+
tachograph: parsedData[ix + 18] ? {
|
|
693
|
+
raw: parsedData[ix + 18] ? parsedData[ix + 18] : null,
|
|
688
694
|
validDriverData: tachographBin ? tachographBin[7] === '1' : null,
|
|
689
695
|
insertedDriverCard: tachographBin ? tachographBin[5] === '1' : null,
|
|
690
696
|
driverWorkingState: tachographBin
|
|
@@ -693,9 +699,9 @@ const getCanData = (parsedData, ix) => {
|
|
|
693
699
|
drivingTimeState: tachographBin
|
|
694
700
|
? dTimeStates[parseInt(tachographBin.substring(5, 8), 2)]
|
|
695
701
|
: null
|
|
696
|
-
},
|
|
702
|
+
} : null,
|
|
697
703
|
indicators: inicatorsBin ? {
|
|
698
|
-
raw: inicatorsBin
|
|
704
|
+
raw: inicatorsBin ? parsedData[ix + 19] : null,
|
|
699
705
|
lowFuel: inicatorsBin ? inicatorsBin[0] === '1' : null,
|
|
700
706
|
driverSeatbelt: inicatorsBin ? inicatorsBin[1] === '1' : null,
|
|
701
707
|
airConditioning: inicatorsBin ? inicatorsBin[2] === '1' : null,
|
|
@@ -714,7 +720,7 @@ const getCanData = (parsedData, ix) => {
|
|
|
714
720
|
trunk: inicatorsBin ? inicatorsBin[15] === '1' : null
|
|
715
721
|
} : null,
|
|
716
722
|
lights: lights ? {
|
|
717
|
-
raw: lights
|
|
723
|
+
raw: lights ? parsedData[ix + 20] : null,
|
|
718
724
|
running: lights ? lights[0] === '1' : null,
|
|
719
725
|
lowBeams: lights ? lights[1] === '1' : null,
|
|
720
726
|
frontFog: lights ? lights[2] === '1' : null,
|
|
@@ -722,7 +728,7 @@ const getCanData = (parsedData, ix) => {
|
|
|
722
728
|
hazard: lights ? lights[4] === '1' : null
|
|
723
729
|
} : null,
|
|
724
730
|
doors: doors ? {
|
|
725
|
-
raw: doors
|
|
731
|
+
raw: doors ? parsedData[ix + 21] : null,
|
|
726
732
|
driver: doors ? doors[0] === '1' : null,
|
|
727
733
|
passenger: doors ? doors[1] === '1' : null,
|
|
728
734
|
rearLeft: doors ? doors[2] === '1' : null,
|
|
@@ -730,11 +736,11 @@ const getCanData = (parsedData, ix) => {
|
|
|
730
736
|
trunk: doors ? doors[4] === '1' : null,
|
|
731
737
|
hood: doors ? doors[5] === '1' : null
|
|
732
738
|
} : null,
|
|
733
|
-
overSpeedTime: parsedData[ix + 22]
|
|
734
|
-
overSpeedEngineTime: parsedData[ix + 23]
|
|
739
|
+
overSpeedTime: parsedData[ix + 22] ? parseFloat(parsedData[ix + 22]) : null,
|
|
740
|
+
overSpeedEngineTime: parsedData[ix + 23] ? parseFloat(parsedData[ix + 23]) : null,
|
|
735
741
|
canExpanded: {
|
|
736
742
|
canReportExpansionMask: {
|
|
737
|
-
raw: parsedData[ix + 24]
|
|
743
|
+
raw: parsedData[ix + 24] ? parsedData[ix + 24] : null,
|
|
738
744
|
engineTorque: canExpansionMask ? canExpansionMask[23] === '1' : null,
|
|
739
745
|
rapidAccelerations: canExpansionMask
|
|
740
746
|
? canExpansionMask[22] === '1'
|
|
@@ -797,40 +803,40 @@ const getCanData = (parsedData, ix) => {
|
|
|
797
803
|
adBlueLevel: canExpansionMask ? canExpansionMask[0] === '1' : null
|
|
798
804
|
},
|
|
799
805
|
adBlueLevel:
|
|
800
|
-
parsedData[ix + 25]
|
|
801
|
-
|
|
802
|
-
axleWeight1: parsedData[ix + 26]
|
|
803
|
-
axleWeight3: parsedData[ix + 27]
|
|
804
|
-
axleWeight4: parsedData[ix + 28]
|
|
806
|
+
parsedData[ix + 25] ? parseCanData(parsedData[ix + 25], 'adBlueLevel') : null,
|
|
807
|
+
adBlueLevelUnit: parsedData[ix + 25] ? parsedData[ix + 25].slice(0,1) === 'P' ? '%' : 'L' ? 'L': 'L' : null,
|
|
808
|
+
axleWeight1: parsedData[ix + 26] ? parseInt(parsedData[ix + 26]) : null,
|
|
809
|
+
axleWeight3: parsedData[ix + 27] ? parseInt(parsedData[ix + 27]) : null,
|
|
810
|
+
axleWeight4: parsedData[ix + 28] ? parseInt(parsedData[ix + 28]) : null,
|
|
805
811
|
tachographOverspeedSignal:
|
|
806
|
-
parsedData[ix + 29]
|
|
812
|
+
parsedData[ix + 29] ? (parsedData[ix + 29] === '1') : null,
|
|
807
813
|
tachographVehicleMotionSignal:
|
|
808
|
-
parsedData[ix + 30]
|
|
814
|
+
parsedData[ix + 30] ? (parsedData[ix + 30] === '1') : null,
|
|
809
815
|
tachographDrivingDirection:
|
|
810
|
-
parsedData[ix + 31]
|
|
816
|
+
parsedData[ix + 31] ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
|
|
811
817
|
analogInputValue:
|
|
812
|
-
parsedData[ix + 32]
|
|
818
|
+
parsedData[ix + 32] ? parseFloat(parsedData[ix + 32]) * 1000 : null,
|
|
813
819
|
engineBrakingFactor:
|
|
814
|
-
parsedData[ix + 33]
|
|
820
|
+
parsedData[ix + 33] ? parseInt(parsedData[ix + 33]) : null,
|
|
815
821
|
pedalBrakingFactor:
|
|
816
|
-
parsedData[ix + 34]
|
|
822
|
+
parsedData[ix + 34] ? parseInt(parsedData[ix + 34]) : null,
|
|
817
823
|
totalAcceleratorKickDown:
|
|
818
|
-
parsedData[ix + 35]
|
|
824
|
+
parsedData[ix + 35] ? parseInt(parsedData[ix + 35]) : null,
|
|
819
825
|
totalEffectiveEngineSpeedTime:
|
|
820
|
-
parsedData[ix + 36]
|
|
826
|
+
parsedData[ix + 36] ? parseFloat(parsedData[ix + 36]) : null,
|
|
821
827
|
totalCruiseControlTime:
|
|
822
|
-
parsedData[ix + 37]
|
|
828
|
+
parsedData[ix + 37] ? parseFloat(parsedData[ix + 37]) : null,
|
|
823
829
|
totalAcceleratorKickDownTime:
|
|
824
|
-
parsedData[ix + 38]
|
|
830
|
+
parsedData[ix + 38] ? parseFloat(parsedData[ix + 38]) : null,
|
|
825
831
|
totalBrakeApplications:
|
|
826
|
-
parsedData[ix + 39]
|
|
827
|
-
tachographDriver1Card: parsedData[ix + 40]
|
|
828
|
-
tachographDriver2Card: parsedData[ix + 41]
|
|
829
|
-
tachographDriver1Name: parsedData[ix + 42]
|
|
830
|
-
tachographDriver2Name: parsedData[ix + 43]
|
|
831
|
-
registrationNumber: parsedData[ix + 44]
|
|
832
|
+
parsedData[ix + 39] ? parseInt(parsedData[ix + 39]) : null,
|
|
833
|
+
tachographDriver1Card: parsedData[ix + 40] ? parsedData[ix + 40] : null,
|
|
834
|
+
tachographDriver2Card: parsedData[ix + 41] ? parsedData[ix + 41] : null,
|
|
835
|
+
tachographDriver1Name: parsedData[ix + 42] ? parsedData[ix + 42] : null,
|
|
836
|
+
tachographDriver2Name: parsedData[ix + 43] ? parsedData[ix + 43] : null,
|
|
837
|
+
registrationNumber: parsedData[ix + 44] ? parsedData[ix + 44] : null,
|
|
832
838
|
expansionInformation: {
|
|
833
|
-
raw: parsedData[ix + 45]
|
|
839
|
+
raw: parsedData[ix + 45] ? parsedData[ix + 45] : null,
|
|
834
840
|
webasto: expansionBin ? expansionBin[0] === '1' : null,
|
|
835
841
|
brakeFluidLowIndicator: expansionBin
|
|
836
842
|
? expansionBin[1] === '1'
|
|
@@ -852,9 +858,9 @@ const getCanData = (parsedData, ix) => {
|
|
|
852
858
|
: null,
|
|
853
859
|
oilLevelLowIndicator: expansionBin ? expansionBin[12] === '1' : null
|
|
854
860
|
},
|
|
855
|
-
rapidBrakings: parsedData[ix + 46]
|
|
856
|
-
rapidAccelerations: parsedData[ix + 47]
|
|
857
|
-
engineTorque: parsedData[ix + 48]
|
|
861
|
+
rapidBrakings: parsedData[ix + 46] ? parseInt(parsedData[ix + 46]) : null,
|
|
862
|
+
rapidAccelerations: parsedData[ix + 47] ? parseInt(parsedData[ix + 47]) : null,
|
|
863
|
+
engineTorque: parsedData[ix + 48] ? parseFloat(parsedData[ix + 48]) : null,
|
|
858
864
|
}
|
|
859
865
|
}
|
|
860
866
|
}
|