queclink-parser 1.3.20

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/gv500.js ADDED
@@ -0,0 +1,586 @@
1
+ 'use strict'
2
+ const utils = require('./utils.js')
3
+
4
+ /*
5
+ Parses messages data from GV500 devices
6
+ */
7
+ const parse = raw => {
8
+ raw = raw.substr(0, raw.length - 1)
9
+
10
+ const parsedData = raw.split(',')
11
+ const command = parsedData[0].split(':')
12
+
13
+ let history = false
14
+ if (utils.patterns.buffer.test(command[0])) {
15
+ history = true
16
+ }
17
+
18
+ let data = {
19
+ raw: `${raw.toString()}$`,
20
+ manufacturer: 'queclink',
21
+ device: 'Queclink-GV500',
22
+ type: 'data',
23
+ imei: parsedData[2],
24
+ protocolVersion: utils.getProtocolVersion(parsedData[1]),
25
+ temperature: null,
26
+ history: history,
27
+ sentTime: utils.parseDate(parsedData[parsedData.length - 2]),
28
+ serialId: parseInt(parsedData[parsedData.length - 1], 16)
29
+ }
30
+
31
+ // GPS
32
+ if (command[1] === 'GTFRI') {
33
+ data = Object.assign(data, {
34
+ alarm: utils.getAlarm(command[1], null),
35
+ loc: {
36
+ type: 'Point',
37
+ coordinates: [parseFloat(parsedData[12]), parseFloat(parsedData[13])]
38
+ },
39
+ speed: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
40
+ gpsStatus: utils.checkGps(
41
+ parseFloat(parsedData[12]),
42
+ parseFloat(parsedData[13])
43
+ ),
44
+ hdop: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
45
+ status: null,
46
+ azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
47
+ altitude: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
48
+ datetime: parsedData[14] !== '' ? utils.parseDate(parsedData[14]) : null,
49
+ voltage: {
50
+ battery:
51
+ parsedData[parsedData.length - 7] !== ''
52
+ ? parseFloat(parsedData[parsedData.length - 7])
53
+ : null, // percentage
54
+ inputCharge:
55
+ parsedData[5] !== '' ? parseFloat(parsedData[5]) / 1000 : null
56
+ },
57
+ mcc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
58
+ mnc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
59
+ lac: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
60
+ cid: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
61
+ odometer:
62
+ parsedData[parsedData.length - 11] !== ''
63
+ ? parseFloat(parsedData[parsedData.length - 11])
64
+ : null,
65
+ hourmeter:
66
+ parsedData[parsedData.length - 10] !== ''
67
+ ? utils.getHoursForHourmeter(parsedData[parsedData.length - 10])
68
+ : null,
69
+ canbus: {
70
+ vin: parsedData[3] !== '' ? parsedData[3] : null,
71
+ fuelLevel:
72
+ parsedData[parsedData.length - 3] !== ''
73
+ ? parseInt(parsedData[parsedData.length - 3], 10)
74
+ : null, // -3 percentage
75
+ fuelConsumption:
76
+ parsedData[parsedData.length - 4] !== ''
77
+ ? utils.getFuelConsumption(parsedData[parsedData.length - 4])
78
+ : null,
79
+ rpm:
80
+ parsedData[parsedData.length - 5] !== ''
81
+ ? parseInt(parsedData[parsedData.length - 5], 10)
82
+ : null,
83
+ state:
84
+ parsedData[parsedData.length - 6] !== ''
85
+ ? utils.states[parsedData[parsedData.length - 6].substring(0, 2)]
86
+ : null
87
+ }
88
+ })
89
+ } else if (command[1] === 'GTHBD') {
90
+ // Heartbeat. It must response an ACK command
91
+ data = Object.assign(data, {
92
+ alarm: utils.getAlarm(command[1], null)
93
+ })
94
+ } else if (
95
+ command[1] === 'GTGEO' ||
96
+ command[1] === 'GTSPD' ||
97
+ command[1] === 'GTTOW' ||
98
+ command[1] === 'GTRTL' ||
99
+ command[1] === 'GTDOG' ||
100
+ command[1] === 'GTIGL' ||
101
+ command[1] === 'GTHBM'
102
+ ) {
103
+ // Common Alarms
104
+ data = Object.assign(data, {
105
+ alarm: utils.getAlarm(command[1], parsedData[6]),
106
+ loc: {
107
+ type: 'Point',
108
+ coordinates: [parseFloat(parsedData[12]), parseFloat(parsedData[13])]
109
+ },
110
+ speed: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
111
+ gpsStatus: utils.checkGps(
112
+ parseFloat(parsedData[12]),
113
+ parseFloat(parsedData[13])
114
+ ),
115
+ hdop: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
116
+ status: null,
117
+ azimuth: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
118
+ altitude: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
119
+ datetime: parsedData[14] !== '' ? utils.parseDate(parsedData[14]) : null,
120
+ voltage: {
121
+ battery: null, // percentage
122
+ inputCharge: null
123
+ },
124
+ mcc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
125
+ mnc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
126
+ lac: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
127
+ cid: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
128
+ odometer:
129
+ parsedData[parsedData.length - 3] !== ''
130
+ ? parseFloat(parsedData.length - 3)
131
+ : null,
132
+ hourmeter: null,
133
+ canbus: null
134
+ })
135
+ } else if (
136
+ command[1] === 'GTPNA' ||
137
+ command[1] === 'GTPFA' ||
138
+ command[1] === 'GTPDP'
139
+ ) {
140
+ // Event report (It uses the last GPS data and MCC info)
141
+ data = Object.assign(data, {
142
+ alarm: utils.getAlarm(command[1], null),
143
+ loc: null,
144
+ speed: null,
145
+ gpsStatus: null,
146
+ hdop: null,
147
+ status: null,
148
+ azimuth: null,
149
+ altitude: null,
150
+ datetime: parsedData[4] !== '' ? utils.parseDate(parsedData[4]) : null,
151
+ voltage: {
152
+ battery: null,
153
+ inputCharge: null
154
+ },
155
+ mcc: null,
156
+ mnc: null,
157
+ lac: null,
158
+ cid: null,
159
+ odometer: null,
160
+ hourmeter: null,
161
+ canbus: null
162
+ })
163
+ } else if (
164
+ command[1] === 'GTMPN' ||
165
+ command[1] === 'GTMPF' ||
166
+ (command[1] === 'GTBTC') | (command[1] === 'GTCRA') ||
167
+ command[1] === 'GTJDR'
168
+ ) {
169
+ data = Object.assign(data, {
170
+ alarm: utils.getAlarm(command[1], null),
171
+ loc: {
172
+ type: 'Point',
173
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
174
+ },
175
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
176
+ gpsStatus: utils.checkGps(
177
+ parseFloat(parsedData[9]),
178
+ parseFloat(parsedData[10])
179
+ ),
180
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
181
+ status: null,
182
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
183
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
184
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
185
+ voltage: {
186
+ battery: null,
187
+ inputCharge: null
188
+ },
189
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
190
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
191
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
192
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
193
+ odometer: null,
194
+ hourmeter: null,
195
+ canbus: null
196
+ })
197
+ } else if (command[1] === 'GTJDS') {
198
+ data = Object.assign(data, {
199
+ alarm: utils.getAlarm(command[1], parsedData[5]),
200
+ loc: {
201
+ type: 'Point',
202
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
203
+ },
204
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
205
+ gpsStatus: utils.checkGps(
206
+ parseFloat(parsedData[10]),
207
+ parseFloat(parsedData[11])
208
+ ),
209
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
210
+ status: null,
211
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
212
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
213
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
214
+ voltage: {
215
+ battery: null,
216
+ inputCharge: null
217
+ },
218
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
219
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
220
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
221
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
222
+ odometer: null,
223
+ hourmeter: null,
224
+ canbus: null
225
+ })
226
+ } else if (command[1] === 'GTBPL' || command[1] === 'GTSTC') {
227
+ data = Object.assign(data, {
228
+ alarm: utils.getAlarm(command[1], null),
229
+ loc: {
230
+ type: 'Point',
231
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
232
+ },
233
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
234
+ gpsStatus: utils.checkGps(
235
+ parseFloat(parsedData[10]),
236
+ parseFloat(parsedData[11])
237
+ ),
238
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
239
+ status: null,
240
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
241
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
242
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
243
+ voltage: {
244
+ battery: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
245
+ inputCharge: null
246
+ },
247
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
248
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
249
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
250
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
251
+ odometer: null,
252
+ hourmeter: null,
253
+ canbus: null
254
+ })
255
+ } else if (command[1] === 'GTSTT') {
256
+ // Motion State Changed
257
+ data = Object.assign(data, {
258
+ alarm: utils.getAlarm(command[1], parsedData[5]),
259
+ loc: {
260
+ type: 'Point',
261
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
262
+ },
263
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
264
+ gpsStatus: utils.checkGps(
265
+ parseFloat(parsedData[10]),
266
+ parseFloat(parsedData[11])
267
+ ),
268
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
269
+ status: null,
270
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
271
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
272
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
273
+ voltage: {
274
+ battery: null,
275
+ inputCharge: null
276
+ },
277
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
278
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
279
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
280
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
281
+ odometer: null,
282
+ hourmeter: null,
283
+ canbus: null
284
+ })
285
+ } else if (command[1] === 'GTIGN' || command[1] === 'GTIGF') {
286
+ data = Object.assign(data, {
287
+ alarm: utils.getAlarm(command[1], parsedData[5]),
288
+ loc: {
289
+ type: 'Point',
290
+ coordinates: [parseFloat(parsedData[10]), parseFloat(parsedData[11])]
291
+ },
292
+ speed: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
293
+ gpsStatus: utils.checkGps(
294
+ parseFloat(parsedData[10]),
295
+ parseFloat(parsedData[11])
296
+ ),
297
+ hdop: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
298
+ status: null,
299
+ azimuth: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
300
+ altitude: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
301
+ datetime: parsedData[12] !== '' ? utils.parseDate(parsedData[12]) : null,
302
+ voltage: {
303
+ battery: null,
304
+ inputCharge: null
305
+ },
306
+ mcc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
307
+ mnc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
308
+ lac: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
309
+ cid: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
310
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
311
+ hourmeter:
312
+ parsedData[18] !== ''
313
+ ? utils.getHoursForHourmeter(parsedData[20])
314
+ : null,
315
+ canbus: null
316
+ })
317
+ } else if (
318
+ command[1] === 'GTIDN' ||
319
+ command[1] === 'GTSTR' ||
320
+ command[1] === 'GTSTP' ||
321
+ command[1] === 'GTLSP' ||
322
+ command[1] === 'GTIDF'
323
+ ) {
324
+ data = Object.assign(data, {
325
+ alarm: utils.getAlarm(command[1], parsedData[6]),
326
+ loc: {
327
+ type: 'Point',
328
+ coordinates: [parseFloat(parsedData[11]), parseFloat(parsedData[12])]
329
+ },
330
+ speed: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
331
+ gpsStatus: utils.checkGps(
332
+ parseFloat(parsedData[11]),
333
+ parseFloat(parsedData[12])
334
+ ),
335
+ hdop: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
336
+ status: null,
337
+ azimuth: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
338
+ altitude: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
339
+ datetime: parsedData[13] !== '' ? utils.parseDate(parsedData[13]) : null,
340
+ voltage: {
341
+ battery: null,
342
+ inputCharge: null
343
+ },
344
+ mcc: parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
345
+ mnc: parsedData[15] !== '' ? parseInt(parsedData[15], 10) : null,
346
+ lac: parsedData[16] !== '' ? parseInt(parsedData[16], 16) : null,
347
+ cid: parsedData[17] !== '' ? parseInt(parsedData[17], 16) : null,
348
+ odometer: parsedData[19] !== '' ? parseFloat(parsedData[19]) : null,
349
+ hourmeter: null,
350
+ canbus: null
351
+ })
352
+ } else if (command[1] === 'GTGSS') {
353
+ // GPS Status
354
+ data = Object.assign(data, {
355
+ alarm: utils.getAlarm(command[1], parsedData[5]),
356
+ loc: {
357
+ type: 'Point',
358
+ coordinates: [parseFloat(parsedData[13]), parseFloat(parsedData[14])]
359
+ },
360
+ speed: parsedData[10] !== '' ? parseFloat(parsedData[10]) : null,
361
+ gpsStatus: utils.checkGps(
362
+ parseFloat(parsedData[13]),
363
+ parseFloat(parsedData[14])
364
+ ),
365
+ hdop: parsedData[9] !== '' ? parseFloat(parsedData[9]) : null,
366
+ status: null,
367
+ azimuth: parsedData[11] !== '' ? parseFloat(parsedData[11]) : null,
368
+ altitude: parsedData[12] !== '' ? parseFloat(parsedData[12]) : null,
369
+ datetime: parsedData[15] !== '' ? utils.parseDate(parsedData[15]) : null,
370
+ voltage: {
371
+ battery: null,
372
+ inputCharge: null
373
+ },
374
+ mcc: parsedData[16] !== '' ? parseInt(parsedData[16], 10) : null,
375
+ mnc: parsedData[17] !== '' ? parseInt(parsedData[17], 10) : null,
376
+ lac: parsedData[18] !== '' ? parseInt(parsedData[18], 16) : null,
377
+ cid: parsedData[19] !== '' ? parseInt(parsedData[19], 16) : null,
378
+ odometer: null,
379
+ hourmeter: null,
380
+ canbus: null
381
+ })
382
+ } else if (command[1] === 'GTOPN' || command[1] === 'GTOPF') {
383
+ data = Object.assign(data, {
384
+ alarm: utils.getAlarm(command[1], null),
385
+ loc: {
386
+ type: 'Point',
387
+ coordinates: [parseFloat(parsedData[9]), parseFloat(parsedData[10])]
388
+ },
389
+ speed: parsedData[6] !== '' ? parseFloat(parsedData[6]) : null,
390
+ gpsStatus: utils.checkGps(
391
+ parseFloat(parsedData[9]),
392
+ parseFloat(parsedData[10])
393
+ ),
394
+ hdop: parsedData[5] !== '' ? parseFloat(parsedData[5]) : null,
395
+ status: null,
396
+ azimuth: parsedData[7] !== '' ? parseFloat(parsedData[7]) : null,
397
+ altitude: parsedData[8] !== '' ? parseFloat(parsedData[8]) : null,
398
+ datetime: parsedData[11] !== '' ? utils.parseDate(parsedData[11]) : null,
399
+ voltage: {
400
+ battery: null,
401
+ inputCharge: null
402
+ },
403
+ mcc: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
404
+ mnc: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
405
+ lac: parsedData[14] !== '' ? parseInt(parsedData[14], 16) : null,
406
+ cid: parsedData[15] !== '' ? parseInt(parsedData[15], 16) : null,
407
+ odometer: null,
408
+ hourmeter: null,
409
+ canbus: null
410
+ })
411
+ } else if (command[1] === 'GTOBD') {
412
+ data = Object.assign(data, {
413
+ alarm: utils.getAlarm(command[1], null),
414
+ loc: {
415
+ type: 'Point',
416
+ coordinates: [parseFloat(parsedData[29]), parseFloat(parsedData[30])]
417
+ },
418
+ speed: parsedData[26] !== '' ? parseFloat(parsedData[26]) : null,
419
+ gpsStatus: utils.checkGps(
420
+ parseFloat(parsedData[29]),
421
+ parseFloat(parsedData[30])
422
+ ),
423
+ hdop: parsedData[25] !== '' ? parseFloat(parsedData[25]) : null,
424
+ status: null,
425
+ azimuth: parsedData[27] !== '' ? parseFloat(parsedData[27]) : null,
426
+ altitude: parsedData[28] !== '' ? parseFloat(parsedData[28]) : null,
427
+ datetime: parsedData[31] !== '' ? utils.parseDate(parsedData[31]) : null,
428
+ voltage: {
429
+ battery: null,
430
+ inputCharge:
431
+ parsedData[9] !== '' ? parseFloat(parsedData[9]) / 1000 : null
432
+ },
433
+ mcc: parsedData[32] !== '' ? parseInt(parsedData[32], 10) : null,
434
+ mnc: parsedData[33] !== '' ? parseInt(parsedData[33], 10) : null,
435
+ lac: parsedData[34] !== '' ? parseInt(parsedData[34], 16) : null,
436
+ cid: parsedData[35] !== '' ? parseInt(parsedData[35], 16) : null,
437
+ odometer: parsedData[37] !== '' ? parseFloat(parsedData[37]) : null,
438
+ hourmeter: null,
439
+ canbus: null,
440
+ obd: {
441
+ vin: parsedData[3] !== '' ? parsedData[3] : null,
442
+ obdConnected: parsedData[8] === '1',
443
+ rpm: parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null,
444
+ speed: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
445
+ coolantTemp:
446
+ parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
447
+ fuelConsumption:
448
+ parsedData[14] !== ''
449
+ ? utils.getFuelConsumption(parsedData[14])
450
+ : null,
451
+ DTCclearedDistance:
452
+ parsedData[15] !== '' ? parseFloat(parsedData[15]) : null,
453
+ MILactivatedDistance:
454
+ parsedData[16] !== '' ? parseFloat(parsedData[16]) : null,
455
+ MILstatusOn: parsedData[17] === '1',
456
+ DTCsNumber: parsedData[18] !== '' ? parseInt(parsedData[18], 10) : null,
457
+ troubleCodes: parsedData[19] !== '' ? parsedData[19] : null,
458
+ throttlePosition:
459
+ parsedData[20] !== '' ? parseInt(parsedData[20], 10) : null, // percentage
460
+ engineLoad: parsedData[21] !== '' ? parseInt(parsedData[21], 10) : null, // percentage
461
+ fuelLevel: parsedData[22] !== '' ? parseInt(parsedData[22], 10) : null, // percentage
462
+ obdProtocol:
463
+ parsedData[23] !== '' ? utils.OBDIIProtocols[parsedData[23]] : null,
464
+ odometer: parsedData[24] !== '' ? parseInt(parsedData[24], 10) : null
465
+ }
466
+ })
467
+ } else if (command[1] === 'GTOSM') {
468
+ data = Object.assign(data, {
469
+ alarm: utils.getAlarm(command[1], `${parsedData[5]}${parsedData[6]}`),
470
+ loc: {
471
+ type: 'Point',
472
+ coordinates: [parseFloat(parsedData[30]), parseFloat(parsedData[31])]
473
+ },
474
+ speed: parsedData[27] !== '' ? parseFloat(parsedData[27]) : null,
475
+ gpsStatus: utils.checkGps(
476
+ parseFloat(parsedData[30]),
477
+ parseFloat(parsedData[31])
478
+ ),
479
+ hdop: parsedData[26] !== '' ? parseFloat(parsedData[26]) : null,
480
+ status: null,
481
+ azimuth: parsedData[28] !== '' ? parseFloat(parsedData[28]) : null,
482
+ altitude: parsedData[29] !== '' ? parseFloat(parsedData[29]) : null,
483
+ datetime: parsedData[32] !== '' ? utils.parseDate(parsedData[32]) : null,
484
+ voltage: {
485
+ battery: null,
486
+ inputCharge:
487
+ parsedData[10] !== '' ? parseFloat(parsedData[10]) / 1000 : null
488
+ },
489
+ mcc: parsedData[33] !== '' ? parseInt(parsedData[33], 10) : null,
490
+ mnc: parsedData[34] !== '' ? parseInt(parsedData[34], 10) : null,
491
+ lac: parsedData[35] !== '' ? parseInt(parsedData[35], 16) : null,
492
+ cid: parsedData[36] !== '' ? parseInt(parsedData[36], 16) : null,
493
+ odometer: parsedData[38] !== '' ? parseFloat(parsedData[38]) : null,
494
+ hourmeter: null,
495
+ canbus: null,
496
+ obd: {
497
+ vin: parsedData[3] !== '' ? parsedData[3] : null,
498
+ obdConnected: parsedData[9] === '1',
499
+ rpm: parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null,
500
+ speed: parsedData[13] !== '' ? parseInt(parsedData[13], 10) : null,
501
+ coolantTemp:
502
+ parsedData[14] !== '' ? parseInt(parsedData[14], 10) : null,
503
+ fuelConsumption:
504
+ parsedData[15] !== ''
505
+ ? utils.getFuelConsumption(parsedData[15])
506
+ : null,
507
+ DTCclearedDistance:
508
+ parsedData[16] !== '' ? parseFloat(parsedData[16]) : null,
509
+ MILactivatedDistance:
510
+ parsedData[17] !== '' ? parseFloat(parsedData[17]) : null,
511
+ MILstatusOn: parsedData[18] === '1',
512
+ DTCsNumber: parsedData[19] !== '' ? parseInt(parsedData[19], 10) : null,
513
+ troubleCodes: parsedData[20] !== '' ? parsedData[20] : null,
514
+ throttlePosition:
515
+ parsedData[21] !== '' ? parseInt(parsedData[21], 10) : null, // percentage
516
+ engineLoad: parsedData[22] !== '' ? parseInt(parsedData[22], 10) : null, // percentage
517
+ fuelLevel: parsedData[23] !== '' ? parseInt(parsedData[23], 10) : null, // percentage
518
+ obdProtocol: parsedData[24] !== '' ? parsedData[24] : null,
519
+ odometer: parsedData[25] !== '' ? parseInt(parsedData[25], 10) : null
520
+ }
521
+ })
522
+ } else if (command[1] === 'GTJES') {
523
+ data = Object.assign(data, {
524
+ alarm: utils.getAlarm(command[1], null),
525
+ loc: {
526
+ type: 'Point',
527
+ coordinates: [parseFloat(parsedData[17]), parseFloat(parsedData[18])]
528
+ },
529
+ speed: parsedData[14] !== '' ? parseFloat(parsedData[14]) : null,
530
+ gpsStatus: utils.checkGps(
531
+ parseFloat(parsedData[17]),
532
+ parseFloat(parsedData[18])
533
+ ),
534
+ hdop: parsedData[13] !== '' ? parseFloat(parsedData[13]) : null,
535
+ status: null,
536
+ azimuth: parsedData[15] !== '' ? parseFloat(parsedData[15]) : null,
537
+ altitude: parsedData[16] !== '' ? parseFloat(parsedData[16]) : null,
538
+ datetime: parsedData[19] !== '' ? utils.parseDate(parsedData[19]) : null,
539
+ voltage: {
540
+ battery: null,
541
+ inputCharge: null
542
+ },
543
+ mcc: parsedData[20] !== '' ? parseInt(parsedData[20], 10) : null,
544
+ mnc: parsedData[21] !== '' ? parseInt(parsedData[21], 10) : null,
545
+ lac: parsedData[22] !== '' ? parseInt(parsedData[22], 16) : null,
546
+ cid: parsedData[23] !== '' ? parseInt(parsedData[23], 16) : null,
547
+ odometer: parsedData[25] !== '' ? parseFloat(parsedData[25]) : null,
548
+ hourmeter: null,
549
+ canbus: null,
550
+ obdSummary: {
551
+ vin: parsedData[3] !== '' ? parsedData[3] : null,
552
+ fuelConsumption:
553
+ parsedData[6] !== '' ? utils.getFuelConsumption(parsedData[6]) : null,
554
+ maxRpm: parsedData[7] !== '' ? parseInt(parsedData[7], 10) : null,
555
+ averageRpm: parsedData[8] !== '' ? parseInt(parsedData[8], 10) : null,
556
+ maxThrottle: parsedData[9] !== '' ? parseInt(parsedData[9], 10) : null,
557
+ averageThrottle:
558
+ parsedData[10] !== '' ? parseInt(parsedData[10], 10) : null,
559
+ maxEngineLoad:
560
+ parsedData[11] !== '' ? parseInt(parsedData[11], 10) : null,
561
+ averageEngineLoad:
562
+ parsedData[12] !== '' ? parseInt(parsedData[12], 10) : null
563
+ }
564
+ })
565
+ } else {
566
+ data = Object.assign(data, {
567
+ alarm: utils.getAlarm(command[1], null)
568
+ })
569
+ }
570
+ // Check gps data
571
+ if (data.loc !== null && typeof data.loc !== 'undefined') {
572
+ if (
573
+ data.loc.coordinates[0] === 0 ||
574
+ isNaN(data.loc.coordinates[0]) ||
575
+ data.loc.coordinates[1] === 0 ||
576
+ isNaN(data.loc.coordinates[1])
577
+ ) {
578
+ data.loc = null
579
+ }
580
+ }
581
+ return data
582
+ }
583
+
584
+ module.exports = {
585
+ parse: parse
586
+ }