queclink-parser 1.9.11 → 1.9.13
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 +38 -0
- package/example.js +89 -16
- package/package.json +1 -1
- package/src/gv310lau.js +102 -51
- package/src/gv58lau.js +822 -1053
- package/src/index.js +3 -1
- package/src/messages/es.json +1 -0
- package/src/utils.js +79 -66
package/src/index.js
CHANGED
|
@@ -250,8 +250,10 @@ const parseCommand = data => {
|
|
|
250
250
|
const do5 = `${outputs[4]},${prevDurations['5']},${prevToggles['5']}`
|
|
251
251
|
const longOperation = data.longOperation || false ? '1' : '0'
|
|
252
252
|
const dosReport = data.dosReport || false ? '1' : '0'
|
|
253
|
-
if (data.device_serie === 'GV' &&
|
|
253
|
+
if (data.device_serie === 'GV' && password === 'gv57cg') {
|
|
254
254
|
command = `AT+GTDOS=${password},,,1,${do1},,,${dosReport},0,5,,,,${serialId}$`
|
|
255
|
+
} else if (data.device_serie === 'GV' && password === 'gv58lau') {
|
|
256
|
+
command = `AT+GTDOS=${password},0,3,1,${do1},0,,2,${do2},0,,3,${do3},0,,0,,,0${dosReport},,,FFFF$`
|
|
255
257
|
} else if (data.device_serie === 'GV') {
|
|
256
258
|
command = `AT+GTOUT=${password},${do1},${do2},${do3},${do4},${longOperation},${dosReport},,,${serialId}$`
|
|
257
259
|
} else if (data.device_serie === 'GMT') {
|
package/src/messages/es.json
CHANGED
|
@@ -283,6 +283,7 @@
|
|
|
283
283
|
"GTJDC": "Config: detección de jamming",
|
|
284
284
|
"GTASC": "Config: autocalibración de acelerómetro",
|
|
285
285
|
"GTOUT": "Config: salidas digitales",
|
|
286
|
+
"GTDOS": "Config: salidas digitales",
|
|
286
287
|
"GTDIS": "Config: entradas digitales",
|
|
287
288
|
"GTGDO": "Config: salidas digitales graduales",
|
|
288
289
|
"GTROS": "Config: restricción de salidas",
|
package/src/utils.js
CHANGED
|
@@ -293,9 +293,11 @@ const latamMcc = {
|
|
|
293
293
|
736: 'Bolivia',
|
|
294
294
|
740: 'Ecuador',
|
|
295
295
|
744: 'Paraguay',
|
|
296
|
-
748: 'Uruguay'
|
|
296
|
+
748: 'Uruguay',
|
|
297
|
+
default: 'Desconocido'
|
|
297
298
|
}
|
|
298
299
|
|
|
300
|
+
|
|
299
301
|
/*
|
|
300
302
|
Gets the Queclink Device Type
|
|
301
303
|
*/
|
|
@@ -363,7 +365,7 @@ const checkGps = (lng, lat) => {
|
|
|
363
365
|
included in the report
|
|
364
366
|
*/
|
|
365
367
|
const includeSatellites = positionAppendMask => {
|
|
366
|
-
return
|
|
368
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[3] == '1'
|
|
367
369
|
}
|
|
368
370
|
|
|
369
371
|
/*
|
|
@@ -371,19 +373,23 @@ const includeSatellites = positionAppendMask => {
|
|
|
371
373
|
included in the report
|
|
372
374
|
*/
|
|
373
375
|
const includeGnssTrigger = positionAppendMask => {
|
|
374
|
-
return
|
|
376
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[2] == '1'
|
|
375
377
|
}
|
|
376
378
|
|
|
377
379
|
/*
|
|
378
|
-
Returns if
|
|
379
|
-
|
|
380
|
+
Returns if the Status is
|
|
381
|
+
included in the report
|
|
380
382
|
*/
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
let statusInfo = parseInt(positionAppendMask) > 3
|
|
383
|
+
const includeStatus = positionAppendMask => {
|
|
384
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[1] == '1'
|
|
385
|
+
}
|
|
385
386
|
|
|
386
|
-
|
|
387
|
+
/*
|
|
388
|
+
Returns if the GNNS Accuracy is
|
|
389
|
+
included in the report
|
|
390
|
+
*/
|
|
391
|
+
const includeGnnsAccuracy = positionAppendMask => {
|
|
392
|
+
return nHexDigit(hex2bin(positionAppendMask), 4)[0] == '1'
|
|
387
393
|
}
|
|
388
394
|
|
|
389
395
|
/*
|
|
@@ -581,7 +587,7 @@ const getMNC = (countryData, opData) => {
|
|
|
581
587
|
operator = 'Desconocido'
|
|
582
588
|
}
|
|
583
589
|
return {
|
|
584
|
-
country: latamMcc[mcc], mnc: mnc, operator: operator
|
|
590
|
+
country: latamMcc[mcc] || latamMcc.default, mnc: mnc, operator: operator
|
|
585
591
|
}
|
|
586
592
|
}
|
|
587
593
|
|
|
@@ -601,7 +607,7 @@ const parseCanData = (data, key) => {
|
|
|
601
607
|
case 'ignitionKey':
|
|
602
608
|
return (data === '0' ? 'ignition_off' : data === '1' ? 'ignition_on' : data === '2' ? 'engine_on' : null)
|
|
603
609
|
case 'totalDistance':
|
|
604
|
-
if (data.slice(0,1) === 'H') {
|
|
610
|
+
if (data.slice(0, 1) === 'H') {
|
|
605
611
|
return hToKm(data)
|
|
606
612
|
} else {
|
|
607
613
|
return data
|
|
@@ -618,6 +624,12 @@ const parseCanData = (data, key) => {
|
|
|
618
624
|
}
|
|
619
625
|
case 'tachographDrivingDirection':
|
|
620
626
|
return data === '0' ? 'forward' : 'backward'
|
|
627
|
+
case 'adBlueLevel':
|
|
628
|
+
if (['P', 'L'].includes(data.slice(0, 1))) {
|
|
629
|
+
return parseFloat(parseFloat(data.slice(1)).toFixed(2))
|
|
630
|
+
} else {
|
|
631
|
+
return parseFloat(parseFloat(data).toFixed(2))
|
|
632
|
+
}
|
|
621
633
|
default:
|
|
622
634
|
return data
|
|
623
635
|
}
|
|
@@ -663,28 +675,28 @@ const getCanData = (parsedData, ix) => {
|
|
|
663
675
|
|
|
664
676
|
return {
|
|
665
677
|
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]
|
|
678
|
+
vin: parsedData[ix + 2] ? parsedData[ix + 2] : null,
|
|
679
|
+
ignitionKey: parsedData[ix + 3] ? parseCanData(parsedData[ix + 3], 'ignitionKey') : null,
|
|
680
|
+
totalDistance: parsedData[ix + 4] ? parseCanData(parsedData[ix + 4], 'totalDistance') : null,
|
|
681
|
+
totalDistanceUnit: parsedData[ix + 4] ? parsedData[ix + 4].slice(0, 1) === 'H' ? 'km' : 'I' : null,
|
|
682
|
+
fuelUsed: parsedData[ix + 5] ? parseFloat(parsedData[ix + 5]) : null, // float
|
|
683
|
+
rpm: parsedData[ix + 6] ? parseInt(parsedData[ix + 6], 10) : null, // int
|
|
684
|
+
speed: parsedData[ix + 7] ? parseFloat(parsedData[ix + 7]) : null,
|
|
673
685
|
engineCoolantTemp:
|
|
674
|
-
parsedData[ix + 8]
|
|
675
|
-
fuelConsumption: parsedData[ix + 9]
|
|
676
|
-
fuelLevel: parsedData[ix + 10]
|
|
677
|
-
fuelLevelUnit: parsedData[ix + 10] ? parsedData[ix + 10].slice(0,1) === 'P' ? '%' : 'L' : null,
|
|
678
|
-
range: parsedData[ix + 11]
|
|
686
|
+
parsedData[ix + 8] ? parseInt(parsedData[ix + 8], 10) : null,
|
|
687
|
+
fuelConsumption: parsedData[ix + 9] ? parseCanData(parsedData[ix + 9], 'fuelConsumption') : null,
|
|
688
|
+
fuelLevel: parsedData[ix + 10] ? parseFloat(parsedData[ix + 10].slice(1)) : null,
|
|
689
|
+
fuelLevelUnit: parsedData[ix + 10] ? parsedData[ix + 10].slice(0, 1) === 'P' ? '%' : 'L' : null,
|
|
690
|
+
range: parsedData[ix + 11] ? parseCanData(parsedData[ix + 11], 'range') : null,
|
|
679
691
|
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]
|
|
692
|
+
parsedData[ix + 12] ? parseFloat(parsedData[ix + 12]) : null,
|
|
693
|
+
engineHours: parsedData[ix + 13] ? parseFloat(parsedData[ix + 13]) : null,
|
|
694
|
+
drivingTime: parsedData[ix + 14] ? parseFloat(parsedData[ix + 14]) : null,
|
|
695
|
+
idleTime: parsedData[ix + 15] ? parseFloat(parsedData[ix + 15]) : null,
|
|
696
|
+
idleFuelUsed: parsedData[ix + 16] ? parseFloat(parsedData[ix + 16]) : null,
|
|
697
|
+
axleWeight: parsedData[ix + 17] ? parseFloat(parsedData[ix + 17]) : null,
|
|
698
|
+
tachograph: parsedData[ix + 18] ? {
|
|
699
|
+
raw: parsedData[ix + 18] ? parsedData[ix + 18] : null,
|
|
688
700
|
validDriverData: tachographBin ? tachographBin[7] === '1' : null,
|
|
689
701
|
insertedDriverCard: tachographBin ? tachographBin[5] === '1' : null,
|
|
690
702
|
driverWorkingState: tachographBin
|
|
@@ -693,9 +705,9 @@ const getCanData = (parsedData, ix) => {
|
|
|
693
705
|
drivingTimeState: tachographBin
|
|
694
706
|
? dTimeStates[parseInt(tachographBin.substring(5, 8), 2)]
|
|
695
707
|
: null
|
|
696
|
-
},
|
|
708
|
+
} : null,
|
|
697
709
|
indicators: inicatorsBin ? {
|
|
698
|
-
raw: inicatorsBin
|
|
710
|
+
raw: inicatorsBin ? parsedData[ix + 19] : null,
|
|
699
711
|
lowFuel: inicatorsBin ? inicatorsBin[0] === '1' : null,
|
|
700
712
|
driverSeatbelt: inicatorsBin ? inicatorsBin[1] === '1' : null,
|
|
701
713
|
airConditioning: inicatorsBin ? inicatorsBin[2] === '1' : null,
|
|
@@ -714,7 +726,7 @@ const getCanData = (parsedData, ix) => {
|
|
|
714
726
|
trunk: inicatorsBin ? inicatorsBin[15] === '1' : null
|
|
715
727
|
} : null,
|
|
716
728
|
lights: lights ? {
|
|
717
|
-
raw: lights
|
|
729
|
+
raw: lights ? parsedData[ix + 20] : null,
|
|
718
730
|
running: lights ? lights[0] === '1' : null,
|
|
719
731
|
lowBeams: lights ? lights[1] === '1' : null,
|
|
720
732
|
frontFog: lights ? lights[2] === '1' : null,
|
|
@@ -722,7 +734,7 @@ const getCanData = (parsedData, ix) => {
|
|
|
722
734
|
hazard: lights ? lights[4] === '1' : null
|
|
723
735
|
} : null,
|
|
724
736
|
doors: doors ? {
|
|
725
|
-
raw: doors
|
|
737
|
+
raw: doors ? parsedData[ix + 21] : null,
|
|
726
738
|
driver: doors ? doors[0] === '1' : null,
|
|
727
739
|
passenger: doors ? doors[1] === '1' : null,
|
|
728
740
|
rearLeft: doors ? doors[2] === '1' : null,
|
|
@@ -730,11 +742,11 @@ const getCanData = (parsedData, ix) => {
|
|
|
730
742
|
trunk: doors ? doors[4] === '1' : null,
|
|
731
743
|
hood: doors ? doors[5] === '1' : null
|
|
732
744
|
} : null,
|
|
733
|
-
overSpeedTime: parsedData[ix + 22]
|
|
734
|
-
overSpeedEngineTime: parsedData[ix + 23]
|
|
745
|
+
overSpeedTime: parsedData[ix + 22] ? parseFloat(parsedData[ix + 22]) : null,
|
|
746
|
+
overSpeedEngineTime: parsedData[ix + 23] ? parseFloat(parsedData[ix + 23]) : null,
|
|
735
747
|
canExpanded: {
|
|
736
748
|
canReportExpansionMask: {
|
|
737
|
-
raw: parsedData[ix + 24]
|
|
749
|
+
raw: parsedData[ix + 24] ? parsedData[ix + 24] : null,
|
|
738
750
|
engineTorque: canExpansionMask ? canExpansionMask[23] === '1' : null,
|
|
739
751
|
rapidAccelerations: canExpansionMask
|
|
740
752
|
? canExpansionMask[22] === '1'
|
|
@@ -797,40 +809,40 @@ const getCanData = (parsedData, ix) => {
|
|
|
797
809
|
adBlueLevel: canExpansionMask ? canExpansionMask[0] === '1' : null
|
|
798
810
|
},
|
|
799
811
|
adBlueLevel:
|
|
800
|
-
parsedData[ix + 25]
|
|
801
|
-
|
|
802
|
-
axleWeight1: parsedData[ix + 26]
|
|
803
|
-
axleWeight3: parsedData[ix + 27]
|
|
804
|
-
axleWeight4: parsedData[ix + 28]
|
|
812
|
+
parsedData[ix + 25] ? parseCanData(parsedData[ix + 25], 'adBlueLevel') : null,
|
|
813
|
+
adBlueLevelUnit: parsedData[ix + 25] ? parsedData[ix + 25].slice(0, 1) === 'P' ? '%' : 'L' ? 'L' : '%' : null,
|
|
814
|
+
axleWeight1: parsedData[ix + 26] ? parseInt(parsedData[ix + 26]) : null,
|
|
815
|
+
axleWeight3: parsedData[ix + 27] ? parseInt(parsedData[ix + 27]) : null,
|
|
816
|
+
axleWeight4: parsedData[ix + 28] ? parseInt(parsedData[ix + 28]) : null,
|
|
805
817
|
tachographOverspeedSignal:
|
|
806
|
-
parsedData[ix + 29]
|
|
818
|
+
parsedData[ix + 29] ? (parsedData[ix + 29] === '1') : null,
|
|
807
819
|
tachographVehicleMotionSignal:
|
|
808
|
-
parsedData[ix + 30]
|
|
820
|
+
parsedData[ix + 30] ? (parsedData[ix + 30] === '1') : null,
|
|
809
821
|
tachographDrivingDirection:
|
|
810
|
-
parsedData[ix + 31]
|
|
822
|
+
parsedData[ix + 31] ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
|
|
811
823
|
analogInputValue:
|
|
812
|
-
parsedData[ix + 32]
|
|
824
|
+
parsedData[ix + 32] ? parseFloat(parsedData[ix + 32]) * 1000 : null,
|
|
813
825
|
engineBrakingFactor:
|
|
814
|
-
parsedData[ix + 33]
|
|
826
|
+
parsedData[ix + 33] ? parseInt(parsedData[ix + 33]) : null,
|
|
815
827
|
pedalBrakingFactor:
|
|
816
|
-
parsedData[ix + 34]
|
|
828
|
+
parsedData[ix + 34] ? parseInt(parsedData[ix + 34]) : null,
|
|
817
829
|
totalAcceleratorKickDown:
|
|
818
|
-
parsedData[ix + 35]
|
|
830
|
+
parsedData[ix + 35] ? parseInt(parsedData[ix + 35]) : null,
|
|
819
831
|
totalEffectiveEngineSpeedTime:
|
|
820
|
-
parsedData[ix + 36]
|
|
832
|
+
parsedData[ix + 36] ? parseFloat(parsedData[ix + 36]) : null,
|
|
821
833
|
totalCruiseControlTime:
|
|
822
|
-
parsedData[ix + 37]
|
|
834
|
+
parsedData[ix + 37] ? parseFloat(parsedData[ix + 37]) : null,
|
|
823
835
|
totalAcceleratorKickDownTime:
|
|
824
|
-
parsedData[ix + 38]
|
|
836
|
+
parsedData[ix + 38] ? parseFloat(parsedData[ix + 38]) : null,
|
|
825
837
|
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]
|
|
838
|
+
parsedData[ix + 39] ? parseInt(parsedData[ix + 39]) : null,
|
|
839
|
+
tachographDriver1Card: parsedData[ix + 40] ? parsedData[ix + 40] : null,
|
|
840
|
+
tachographDriver2Card: parsedData[ix + 41] ? parsedData[ix + 41] : null,
|
|
841
|
+
tachographDriver1Name: parsedData[ix + 42] ? parsedData[ix + 42] : null,
|
|
842
|
+
tachographDriver2Name: parsedData[ix + 43] ? parsedData[ix + 43] : null,
|
|
843
|
+
registrationNumber: parsedData[ix + 44] ? parsedData[ix + 44] : null,
|
|
832
844
|
expansionInformation: {
|
|
833
|
-
raw: parsedData[ix + 45]
|
|
845
|
+
raw: parsedData[ix + 45] ? parsedData[ix + 45] : null,
|
|
834
846
|
webasto: expansionBin ? expansionBin[0] === '1' : null,
|
|
835
847
|
brakeFluidLowIndicator: expansionBin
|
|
836
848
|
? expansionBin[1] === '1'
|
|
@@ -852,9 +864,9 @@ const getCanData = (parsedData, ix) => {
|
|
|
852
864
|
: null,
|
|
853
865
|
oilLevelLowIndicator: expansionBin ? expansionBin[12] === '1' : null
|
|
854
866
|
},
|
|
855
|
-
rapidBrakings: parsedData[ix + 46]
|
|
856
|
-
rapidAccelerations: parsedData[ix + 47]
|
|
857
|
-
engineTorque: parsedData[ix + 48]
|
|
867
|
+
rapidBrakings: parsedData[ix + 46] ? parseInt(parsedData[ix + 46]) : null,
|
|
868
|
+
rapidAccelerations: parsedData[ix + 47] ? parseInt(parsedData[ix + 47]) : null,
|
|
869
|
+
engineTorque: parsedData[ix + 48] ? parseFloat(parsedData[ix + 48]) : null,
|
|
858
870
|
}
|
|
859
871
|
}
|
|
860
872
|
}
|
|
@@ -1258,7 +1270,7 @@ const getAlarm = (command, report, extra = false) => {
|
|
|
1258
1270
|
magnitude: Number(
|
|
1259
1271
|
Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)).toFixed(2)
|
|
1260
1272
|
).toString(),
|
|
1261
|
-
xyz: {x: x, y: y, z: z},
|
|
1273
|
+
xyz: { x: x, y: y, z: z },
|
|
1262
1274
|
message: messages[command][report[1]]
|
|
1263
1275
|
}
|
|
1264
1276
|
} else if (command === 'GTCRA') {
|
|
@@ -1504,7 +1516,8 @@ module.exports = {
|
|
|
1504
1516
|
checkGps: checkGps,
|
|
1505
1517
|
includeSatellites: includeSatellites,
|
|
1506
1518
|
includeGnssTrigger: includeGnssTrigger,
|
|
1507
|
-
|
|
1519
|
+
includeStatus: includeStatus,
|
|
1520
|
+
includeGnnsAccuracy: includeGnnsAccuracy,
|
|
1508
1521
|
getAccelerationMagnitude: getAccelerationMagnitude,
|
|
1509
1522
|
getTempInCelciousDegrees: getTempInCelciousDegrees,
|
|
1510
1523
|
getBtTempHumData: getBtTempHumData,
|