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/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' && data.password === 'gv57cg') {
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') {
@@ -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 ['01', '03', '05', '07'].includes(positionAppendMask)
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 ['02', '03', '06', '07'].includes(positionAppendMask)
376
+ return nHexDigit(hex2bin(positionAppendMask), 4)[2] == '1'
375
377
  }
376
378
 
377
379
  /*
378
- Returns if Possition Append Mask includes
379
- more information in the report
380
+ Returns if the Status is
381
+ included in the report
380
382
  */
381
- const appendMaskData = positionAppendMask => {
382
- let satelliteInfo = ['01', '03', '05', '07'].includes(positionAppendMask)
383
- let gnssTrigger = ['02', '03', '06', '07'].includes(positionAppendMask)
384
- let statusInfo = parseInt(positionAppendMask) > 3
383
+ const includeStatus = positionAppendMask => {
384
+ return nHexDigit(hex2bin(positionAppendMask), 4)[1] == '1'
385
+ }
385
386
 
386
- return satelliteInfo + gnssTrigger + statusInfo
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] !== '' ? 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
- totalDistanceUnit: parsedData[ix + 4] ? parsedData[ix + 4].slice(0,1) === 'H' ? 'Km' : 'I' : null,
670
- fuelUsed: parsedData[ix + 5] !== '' ? parseFloat(parsedData[ix + 5]) : null, // float
671
- rpm: parsedData[ix + 6] !== '' ? parseInt(parsedData[ix + 6], 10) : null, // int
672
- speed: parsedData[ix + 7] !== '' ? parseFloat(parsedData[ix + 7]) : null,
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] !== '' ? parseInt(parsedData[ix + 8], 10) : null,
675
- fuelConsumption: parsedData[ix + 9] !== '' ? parseCanData(parsedData[ix + 9], 'fuelConsumption') : null,
676
- fuelLevel: parsedData[ix + 10] !== '' ? parseFloat(parsedData[ix + 10].slice(1)) : null,
677
- fuelLevelUnit: parsedData[ix + 10] ? parsedData[ix + 10].slice(0,1) === 'P' ? '%' : 'L' : null,
678
- range: parsedData[ix + 11] !== '' ? parseCanData(parsedData[ix + 11], 'range') : null,
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] !== '' ? parseFloat(parsedData[ix + 12]) : null,
681
- engineHours: parsedData[ix + 13] !== '' ? parseFloat(parsedData[ix + 13]) : null,
682
- drivingTime: parsedData[ix + 14] !== '' ? parseFloat(parsedData[ix + 14]) : null,
683
- idleTime: parsedData[ix + 15] !== '' ? parseFloat(parsedData[ix + 15]) : null,
684
- idleFuelUsed: parsedData[ix + 16] !== '' ? parseFloat(parsedData[ix + 16]) : null,
685
- axleWight: parsedData[ix + 17] !== '' ? parseFloat(parsedData[ix + 17]) : null,
686
- tachograph: {
687
- raw: parsedData[ix + 18] !== '' ? parsedData[ix + 18] : null,
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 !== '' ? parsedData[ix + 19] : null,
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 !== '' ? parsedData[ix + 20] : null,
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 !== '' ? parsedData[ix + 21] : null,
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] !== '' ? parseFloat(parsedData[ix + 22]) : null,
734
- overSpeedEngineTime: parsedData[ix + 23] !== '' ? parseFloat(parsedData[ix + 23]) : null,
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] !== '' ? parsedData[ix + 24] : null,
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] !== '' ? parseFloat(parsedData[ix + 25]) : null,
801
- // adBlueLevelUnit: parsedData[ix + 25] ? parsedData[ix + 25].slice(0,1) === 'P' ? '%' : 'L' : null,
802
- axleWeight1: parsedData[ix + 26] !== '' ? parseInt(parsedData[ix + 26]) : null,
803
- axleWeight3: parsedData[ix + 27] !== '' ? parseInt(parsedData[ix + 27]) : null,
804
- axleWeight4: parsedData[ix + 28] !== '' ? parseInt(parsedData[ix + 28]) : null,
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] !== '' ? (parsedData[ix + 29] === '1') : null,
818
+ parsedData[ix + 29] ? (parsedData[ix + 29] === '1') : null,
807
819
  tachographVehicleMotionSignal:
808
- parsedData[ix + 30] !== '' ? (parsedData[ix + 30] === '1') : null,
820
+ parsedData[ix + 30] ? (parsedData[ix + 30] === '1') : null,
809
821
  tachographDrivingDirection:
810
- parsedData[ix + 31] !== '' ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
822
+ parsedData[ix + 31] ? parseCanData(parsedData[ix + 31], 'tachographDrivingDirection') : null,
811
823
  analogInputValue:
812
- parsedData[ix + 32] !== '' ? parseFloat(parsedData[ix + 32]) * 1000 : null,
824
+ parsedData[ix + 32] ? parseFloat(parsedData[ix + 32]) * 1000 : null,
813
825
  engineBrakingFactor:
814
- parsedData[ix + 33] !== '' ? parseInt(parsedData[ix + 33]) : null,
826
+ parsedData[ix + 33] ? parseInt(parsedData[ix + 33]) : null,
815
827
  pedalBrakingFactor:
816
- parsedData[ix + 34] !== '' ? parseInt(parsedData[ix + 34]) : null,
828
+ parsedData[ix + 34] ? parseInt(parsedData[ix + 34]) : null,
817
829
  totalAcceleratorKickDown:
818
- parsedData[ix + 35] !== '' ? parseInt(parsedData[ix + 35]) : null,
830
+ parsedData[ix + 35] ? parseInt(parsedData[ix + 35]) : null,
819
831
  totalEffectiveEngineSpeedTime:
820
- parsedData[ix + 36] !== '' ? parseFloat(parsedData[ix + 36]) : null,
832
+ parsedData[ix + 36] ? parseFloat(parsedData[ix + 36]) : null,
821
833
  totalCruiseControlTime:
822
- parsedData[ix + 37] !== '' ? parseFloat(parsedData[ix + 37]) : null,
834
+ parsedData[ix + 37] ? parseFloat(parsedData[ix + 37]) : null,
823
835
  totalAcceleratorKickDownTime:
824
- parsedData[ix + 38] !== '' ? parseFloat(parsedData[ix + 38]) : null,
836
+ parsedData[ix + 38] ? parseFloat(parsedData[ix + 38]) : null,
825
837
  totalBrakeApplications:
826
- parsedData[ix + 39] !== '' ? parseInt(parsedData[ix + 39]) : null,
827
- tachographDriver1Card: parsedData[ix + 40] !== '' ? parsedData[ix + 40] : null,
828
- tachographDriver2Card: parsedData[ix + 41] !== '' ? parsedData[ix + 41] : null,
829
- tachographDriver1Name: parsedData[ix + 42] !== '' ? parsedData[ix + 42] : null,
830
- tachographDriver2Name: parsedData[ix + 43] !== '' ? parsedData[ix + 43] : null,
831
- registrationNumber: parsedData[ix + 44] !== '' ? parsedData[ix + 44] : null,
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] !== '' ? parsedData[ix + 45] : null,
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] !== '' ? parseInt(parsedData[ix + 46]) : null,
856
- rapidAccelerations: parsedData[ix + 47] !== '' ? parseInt(parsedData[ix + 47]) : null,
857
- engineTorque: parsedData[ix + 48] !== '' ? parseFloat(parsedData[ix + 48]) : null,
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
- appendMaskData: appendMaskData,
1519
+ includeStatus: includeStatus,
1520
+ includeGnnsAccuracy: includeGnnsAccuracy,
1508
1521
  getAccelerationMagnitude: getAccelerationMagnitude,
1509
1522
  getTempInCelciousDegrees: getTempInCelciousDegrees,
1510
1523
  getBtTempHumData: getBtTempHumData,