fit-file-parser 4.0.1 → 4.0.2
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 +7 -0
- package/dist/binary.d.ts +8 -0
- package/dist/binary.js +99 -39
- package/dist/cjs/binary.d.ts +8 -0
- package/dist/cjs/binary.js +99 -39
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## 4.0.2
|
|
4
|
+
|
|
5
|
+
- Preserve record alignment when developer-field descriptions are missing or
|
|
6
|
+
appear after their message definitions.
|
|
7
|
+
- Decode subsequent developer-field values once their descriptions become
|
|
8
|
+
available, in both strict and force modes.
|
|
9
|
+
|
|
3
10
|
## 4.0.0
|
|
4
11
|
|
|
5
12
|
### FIT decoder performance
|
package/dist/binary.d.ts
CHANGED
|
@@ -7,8 +7,16 @@ export interface MessageTypeDefinition {
|
|
|
7
7
|
globalMessageNumber: number;
|
|
8
8
|
numberOfFields: number;
|
|
9
9
|
fieldDefs: FieldDefinition[];
|
|
10
|
+
developerFieldDefs?: DeveloperFieldDefinition[];
|
|
10
11
|
rawData?: any[];
|
|
11
12
|
}
|
|
13
|
+
export interface DeveloperFieldDefinition {
|
|
14
|
+
developerDataIndex: number;
|
|
15
|
+
fieldDefinitionNumber: number;
|
|
16
|
+
size: number;
|
|
17
|
+
resolvedFieldDef?: FieldDefinition;
|
|
18
|
+
resolvedFrom?: unknown;
|
|
19
|
+
}
|
|
12
20
|
export declare function addEndian(littleEndian: boolean, bytes: number[]): number;
|
|
13
21
|
export declare function readRecord(blob: Uint8Array, messageTypes: MessageTypeDefinition[], developerFields: any[], startIndex: number, options: FitParserOptions, startDate: number | undefined, pausedTime: number, dataView?: DataView): {
|
|
14
22
|
messageType: MesgNum | '';
|
package/dist/binary.js
CHANGED
|
@@ -333,8 +333,49 @@ function applyGarminProductName(fields) {
|
|
|
333
333
|
fields.product_name = productName;
|
|
334
334
|
}
|
|
335
335
|
}
|
|
336
|
+
function resolveDeveloperFieldDefinition(developerFieldDef, littleEndian, developerFields, options) {
|
|
337
|
+
var _a, _b, _c, _d;
|
|
338
|
+
const description = (_a = developerFields[developerFieldDef.developerDataIndex]) === null || _a === void 0 ? void 0 : _a[developerFieldDef.fieldDefinitionNumber];
|
|
339
|
+
if (!description) {
|
|
340
|
+
developerFieldDef.resolvedFieldDef = undefined;
|
|
341
|
+
developerFieldDef.resolvedFrom = undefined;
|
|
342
|
+
return undefined;
|
|
343
|
+
}
|
|
344
|
+
if (developerFieldDef.resolvedFrom === description
|
|
345
|
+
&& developerFieldDef.resolvedFieldDef) {
|
|
346
|
+
return developerFieldDef.resolvedFieldDef;
|
|
347
|
+
}
|
|
348
|
+
const baseType = description.fit_base_type_id;
|
|
349
|
+
const type = FIT.types.fit_base_type[baseType];
|
|
350
|
+
if (typeof baseType !== 'number' || type === undefined) {
|
|
351
|
+
developerFieldDef.resolvedFieldDef = undefined;
|
|
352
|
+
developerFieldDef.resolvedFrom = undefined;
|
|
353
|
+
if (options.force) {
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
throw new Error(`Unsupported base type for developer data index ${developerFieldDef.developerDataIndex}, field ${developerFieldDef.fieldDefinitionNumber}`);
|
|
357
|
+
}
|
|
358
|
+
const resolvedFieldDef = {
|
|
359
|
+
type,
|
|
360
|
+
fDefNo: developerFieldDef.fieldDefinitionNumber,
|
|
361
|
+
size: developerFieldDef.size,
|
|
362
|
+
endianAbility: (baseType & 128) === 128,
|
|
363
|
+
littleEndian,
|
|
364
|
+
baseTypeNo: baseType,
|
|
365
|
+
name: (_b = description.field_name) !== null && _b !== void 0 ? _b : '',
|
|
366
|
+
dataType: getFitMessageBaseType(baseType & 15),
|
|
367
|
+
scale: (_c = description.scale) !== null && _c !== void 0 ? _c : 1,
|
|
368
|
+
offset: (_d = description.offset) !== null && _d !== void 0 ? _d : 0,
|
|
369
|
+
requiresBoundedDataView: requiresBoundedEndianDataView(type, developerFieldDef.size),
|
|
370
|
+
developerDataIndex: developerFieldDef.developerDataIndex,
|
|
371
|
+
isDeveloperField: true,
|
|
372
|
+
};
|
|
373
|
+
developerFieldDef.resolvedFieldDef = resolvedFieldDef;
|
|
374
|
+
developerFieldDef.resolvedFrom = description;
|
|
375
|
+
return resolvedFieldDef;
|
|
376
|
+
}
|
|
336
377
|
export function readRecord(blob, messageTypes, developerFields, startIndex, options, startDate, pausedTime, dataView = new DataView(blob.buffer, blob.byteOffset, blob.byteLength)) {
|
|
337
|
-
var _a, _b, _c, _d, _e;
|
|
378
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
338
379
|
const recordHeader = blob[startIndex];
|
|
339
380
|
let localMessageType = recordHeader & 15;
|
|
340
381
|
if ((recordHeader & CompressedHeaderMask) === CompressedHeaderMask) {
|
|
@@ -358,6 +399,7 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
|
|
|
358
399
|
]),
|
|
359
400
|
numberOfFields: numberOfFields + numberOfDeveloperDataFields,
|
|
360
401
|
fieldDefs: [],
|
|
402
|
+
developerFieldDefs: [],
|
|
361
403
|
rawData: [],
|
|
362
404
|
};
|
|
363
405
|
const message = getFitMessage(mTypeDef.globalMessageNumber);
|
|
@@ -380,41 +422,15 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
|
|
|
380
422
|
};
|
|
381
423
|
mTypeDef.fieldDefs.push(fDef);
|
|
382
424
|
}
|
|
383
|
-
// numberOfDeveloperDataFields = 0 so it wont crash here and wont loop
|
|
384
425
|
for (let i = 0; i < numberOfDeveloperDataFields; i++) {
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
const devDef = developerFields[devDataIndex][fieldNum];
|
|
392
|
-
const baseType = devDef.fit_base_type_id;
|
|
393
|
-
const fDef = {
|
|
394
|
-
type: FIT.types.fit_base_type[baseType],
|
|
395
|
-
fDefNo: fieldNum,
|
|
396
|
-
size,
|
|
397
|
-
endianAbility: (baseType & 128) === 128,
|
|
398
|
-
littleEndian: lEnd,
|
|
399
|
-
baseTypeNo: baseType,
|
|
400
|
-
name: devDef.field_name,
|
|
401
|
-
dataType: getFitMessageBaseType(baseType & 15),
|
|
402
|
-
scale: devDef.scale || 1,
|
|
403
|
-
offset: devDef.offset || 0,
|
|
404
|
-
requiresBoundedDataView: requiresBoundedEndianDataView(FIT.types.fit_base_type[baseType], size),
|
|
405
|
-
developerDataIndex: devDataIndex,
|
|
406
|
-
isDeveloperField: true,
|
|
407
|
-
};
|
|
408
|
-
mTypeDef.fieldDefs.push(fDef);
|
|
409
|
-
}
|
|
410
|
-
catch (e) {
|
|
411
|
-
if (options.force) {
|
|
412
|
-
continue;
|
|
413
|
-
}
|
|
414
|
-
throw e;
|
|
415
|
-
}
|
|
426
|
+
const fDefIndex = startIndex + 6 + numberOfFields * 3 + 1 + i * 3;
|
|
427
|
+
(_a = mTypeDef.developerFieldDefs) === null || _a === void 0 ? void 0 : _a.push({
|
|
428
|
+
fieldDefinitionNumber: blob[fDefIndex],
|
|
429
|
+
size: blob[fDefIndex + 1],
|
|
430
|
+
developerDataIndex: blob[fDefIndex + 2],
|
|
431
|
+
});
|
|
416
432
|
}
|
|
417
|
-
mTypeDef.rawData = Array.from({ length: mTypeDef.
|
|
433
|
+
mTypeDef.rawData = Array.from({ length: mTypeDef.numberOfFields }, () => InvalidFieldData);
|
|
418
434
|
messageTypes[localMessageType] = mTypeDef;
|
|
419
435
|
const nextIndex = startIndex + 6 + mTypeDef.numberOfFields * 3;
|
|
420
436
|
const nextIndexWithDeveloperData = nextIndex + 1;
|
|
@@ -430,7 +446,9 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
|
|
|
430
446
|
let readDataFromIndex = startIndex + 1;
|
|
431
447
|
const fields = {};
|
|
432
448
|
const message = getFitMessage(messageType.globalMessageNumber);
|
|
433
|
-
const
|
|
449
|
+
const developerFieldDefs = (_b = messageType.developerFieldDefs) !== null && _b !== void 0 ? _b : [];
|
|
450
|
+
const totalFieldCount = messageType.fieldDefs.length + developerFieldDefs.length;
|
|
451
|
+
const rawData = (_c = messageType.rawData) !== null && _c !== void 0 ? _c : (messageType.rawData = Array.from({ length: totalFieldCount }, () => InvalidFieldData));
|
|
434
452
|
let validFieldCount = 0;
|
|
435
453
|
for (let i = 0; i < messageType.fieldDefs.length; i++) {
|
|
436
454
|
const fDef = messageType.fieldDefs[i];
|
|
@@ -445,6 +463,26 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
|
|
|
445
463
|
readDataFromIndex += fDef.size;
|
|
446
464
|
messageSize += fDef.size;
|
|
447
465
|
}
|
|
466
|
+
for (let i = 0; i < developerFieldDefs.length; i++) {
|
|
467
|
+
const developerFieldDef = developerFieldDefs[i];
|
|
468
|
+
const rawDataIndex = messageType.fieldDefs.length + i;
|
|
469
|
+
const fDef = resolveDeveloperFieldDefinition(developerFieldDef, messageType.littleEndian, developerFields, options);
|
|
470
|
+
if (fDef) {
|
|
471
|
+
const data = readData(blob, dataView, fDef, readDataFromIndex, options);
|
|
472
|
+
if (!isInvalidValue(data, fDef.type) && !isInvalidBaseTypeValue(data, fDef.baseTypeNo)) {
|
|
473
|
+
rawData[rawDataIndex] = data;
|
|
474
|
+
validFieldCount++;
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
rawData[rawDataIndex] = InvalidFieldData;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
rawData[rawDataIndex] = InvalidFieldData;
|
|
482
|
+
}
|
|
483
|
+
readDataFromIndex += developerFieldDef.size;
|
|
484
|
+
messageSize += developerFieldDef.size;
|
|
485
|
+
}
|
|
448
486
|
for (let i = 0; i < messageType.fieldDefs.length; i++) {
|
|
449
487
|
const data = rawData[i];
|
|
450
488
|
if (data === InvalidFieldData) {
|
|
@@ -456,6 +494,17 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
|
|
|
456
494
|
fields[field] = data;
|
|
457
495
|
}
|
|
458
496
|
}
|
|
497
|
+
for (let i = 0; i < developerFieldDefs.length; i++) {
|
|
498
|
+
const data = rawData[messageType.fieldDefs.length + i];
|
|
499
|
+
const fDef = developerFieldDefs[i].resolvedFieldDef;
|
|
500
|
+
if (data === InvalidFieldData || !fDef) {
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
const field = fDef.name;
|
|
504
|
+
if (field !== 'unknown' && field !== '') {
|
|
505
|
+
fields[field] = data;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
459
508
|
for (let i = 0; i < messageType.fieldDefs.length; i++) {
|
|
460
509
|
const data = rawData[i];
|
|
461
510
|
if (data === InvalidFieldData) {
|
|
@@ -465,19 +514,30 @@ export function readRecord(blob, messageTypes, developerFields, startIndex, opti
|
|
|
465
514
|
if (fDef.isDeveloperField) {
|
|
466
515
|
const field = fDef.name;
|
|
467
516
|
const { type } = fDef;
|
|
468
|
-
const scale = (
|
|
469
|
-
const offset = (
|
|
517
|
+
const scale = (_d = fDef.scale) !== null && _d !== void 0 ? _d : null;
|
|
518
|
+
const offset = (_e = fDef.offset) !== null && _e !== void 0 ? _e : 0;
|
|
470
519
|
fields[fDef.name] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
|
|
471
520
|
}
|
|
472
521
|
else {
|
|
473
522
|
const { name: field, type } = fDef;
|
|
474
|
-
const scale = (
|
|
475
|
-
const offset = (
|
|
523
|
+
const scale = (_f = fDef.scale) !== null && _f !== void 0 ? _f : null;
|
|
524
|
+
const offset = (_g = fDef.offset) !== null && _g !== void 0 ? _g : 0;
|
|
476
525
|
if (field !== 'unknown' && field !== '' && field !== undefined) {
|
|
477
526
|
fields[field] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
|
|
478
527
|
}
|
|
479
528
|
}
|
|
480
529
|
}
|
|
530
|
+
for (let i = 0; i < developerFieldDefs.length; i++) {
|
|
531
|
+
const data = rawData[messageType.fieldDefs.length + i];
|
|
532
|
+
const fDef = developerFieldDefs[i].resolvedFieldDef;
|
|
533
|
+
if (data === InvalidFieldData || !fDef) {
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
const field = fDef.name;
|
|
537
|
+
if (field !== 'unknown' && field !== '') {
|
|
538
|
+
fields[field] = applyOptions(formatByType(data, fDef.type, (_h = fDef.scale) !== null && _h !== void 0 ? _h : null, (_j = fDef.offset) !== null && _j !== void 0 ? _j : 0), field, options, fields);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
481
541
|
applyGarminProductName(fields);
|
|
482
542
|
if (validFieldCount > 0 && message.name === 'record' && options.elapsedRecordField) {
|
|
483
543
|
fields.elapsed_time = (fields.timestamp - (startDate || 0)) / 1000;
|
package/dist/cjs/binary.d.ts
CHANGED
|
@@ -7,8 +7,16 @@ export interface MessageTypeDefinition {
|
|
|
7
7
|
globalMessageNumber: number;
|
|
8
8
|
numberOfFields: number;
|
|
9
9
|
fieldDefs: FieldDefinition[];
|
|
10
|
+
developerFieldDefs?: DeveloperFieldDefinition[];
|
|
10
11
|
rawData?: any[];
|
|
11
12
|
}
|
|
13
|
+
export interface DeveloperFieldDefinition {
|
|
14
|
+
developerDataIndex: number;
|
|
15
|
+
fieldDefinitionNumber: number;
|
|
16
|
+
size: number;
|
|
17
|
+
resolvedFieldDef?: FieldDefinition;
|
|
18
|
+
resolvedFrom?: unknown;
|
|
19
|
+
}
|
|
12
20
|
export declare function addEndian(littleEndian: boolean, bytes: number[]): number;
|
|
13
21
|
export declare function readRecord(blob: Uint8Array, messageTypes: MessageTypeDefinition[], developerFields: any[], startIndex: number, options: FitParserOptions, startDate: number | undefined, pausedTime: number, dataView?: DataView): {
|
|
14
22
|
messageType: MesgNum | '';
|
package/dist/cjs/binary.js
CHANGED
|
@@ -339,8 +339,49 @@ function applyGarminProductName(fields) {
|
|
|
339
339
|
fields.product_name = productName;
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
|
+
function resolveDeveloperFieldDefinition(developerFieldDef, littleEndian, developerFields, options) {
|
|
343
|
+
var _a, _b, _c, _d;
|
|
344
|
+
const description = (_a = developerFields[developerFieldDef.developerDataIndex]) === null || _a === void 0 ? void 0 : _a[developerFieldDef.fieldDefinitionNumber];
|
|
345
|
+
if (!description) {
|
|
346
|
+
developerFieldDef.resolvedFieldDef = undefined;
|
|
347
|
+
developerFieldDef.resolvedFrom = undefined;
|
|
348
|
+
return undefined;
|
|
349
|
+
}
|
|
350
|
+
if (developerFieldDef.resolvedFrom === description
|
|
351
|
+
&& developerFieldDef.resolvedFieldDef) {
|
|
352
|
+
return developerFieldDef.resolvedFieldDef;
|
|
353
|
+
}
|
|
354
|
+
const baseType = description.fit_base_type_id;
|
|
355
|
+
const type = fit_js_1.FIT.types.fit_base_type[baseType];
|
|
356
|
+
if (typeof baseType !== 'number' || type === undefined) {
|
|
357
|
+
developerFieldDef.resolvedFieldDef = undefined;
|
|
358
|
+
developerFieldDef.resolvedFrom = undefined;
|
|
359
|
+
if (options.force) {
|
|
360
|
+
return undefined;
|
|
361
|
+
}
|
|
362
|
+
throw new Error(`Unsupported base type for developer data index ${developerFieldDef.developerDataIndex}, field ${developerFieldDef.fieldDefinitionNumber}`);
|
|
363
|
+
}
|
|
364
|
+
const resolvedFieldDef = {
|
|
365
|
+
type,
|
|
366
|
+
fDefNo: developerFieldDef.fieldDefinitionNumber,
|
|
367
|
+
size: developerFieldDef.size,
|
|
368
|
+
endianAbility: (baseType & 128) === 128,
|
|
369
|
+
littleEndian,
|
|
370
|
+
baseTypeNo: baseType,
|
|
371
|
+
name: (_b = description.field_name) !== null && _b !== void 0 ? _b : '',
|
|
372
|
+
dataType: (0, messages_js_1.getFitMessageBaseType)(baseType & 15),
|
|
373
|
+
scale: (_c = description.scale) !== null && _c !== void 0 ? _c : 1,
|
|
374
|
+
offset: (_d = description.offset) !== null && _d !== void 0 ? _d : 0,
|
|
375
|
+
requiresBoundedDataView: requiresBoundedEndianDataView(type, developerFieldDef.size),
|
|
376
|
+
developerDataIndex: developerFieldDef.developerDataIndex,
|
|
377
|
+
isDeveloperField: true,
|
|
378
|
+
};
|
|
379
|
+
developerFieldDef.resolvedFieldDef = resolvedFieldDef;
|
|
380
|
+
developerFieldDef.resolvedFrom = description;
|
|
381
|
+
return resolvedFieldDef;
|
|
382
|
+
}
|
|
342
383
|
function readRecord(blob, messageTypes, developerFields, startIndex, options, startDate, pausedTime, dataView = new DataView(blob.buffer, blob.byteOffset, blob.byteLength)) {
|
|
343
|
-
var _a, _b, _c, _d, _e;
|
|
384
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
344
385
|
const recordHeader = blob[startIndex];
|
|
345
386
|
let localMessageType = recordHeader & 15;
|
|
346
387
|
if ((recordHeader & CompressedHeaderMask) === CompressedHeaderMask) {
|
|
@@ -364,6 +405,7 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
|
|
|
364
405
|
]),
|
|
365
406
|
numberOfFields: numberOfFields + numberOfDeveloperDataFields,
|
|
366
407
|
fieldDefs: [],
|
|
408
|
+
developerFieldDefs: [],
|
|
367
409
|
rawData: [],
|
|
368
410
|
};
|
|
369
411
|
const message = (0, messages_js_1.getFitMessage)(mTypeDef.globalMessageNumber);
|
|
@@ -386,41 +428,15 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
|
|
|
386
428
|
};
|
|
387
429
|
mTypeDef.fieldDefs.push(fDef);
|
|
388
430
|
}
|
|
389
|
-
// numberOfDeveloperDataFields = 0 so it wont crash here and wont loop
|
|
390
431
|
for (let i = 0; i < numberOfDeveloperDataFields; i++) {
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
const devDef = developerFields[devDataIndex][fieldNum];
|
|
398
|
-
const baseType = devDef.fit_base_type_id;
|
|
399
|
-
const fDef = {
|
|
400
|
-
type: fit_js_1.FIT.types.fit_base_type[baseType],
|
|
401
|
-
fDefNo: fieldNum,
|
|
402
|
-
size,
|
|
403
|
-
endianAbility: (baseType & 128) === 128,
|
|
404
|
-
littleEndian: lEnd,
|
|
405
|
-
baseTypeNo: baseType,
|
|
406
|
-
name: devDef.field_name,
|
|
407
|
-
dataType: (0, messages_js_1.getFitMessageBaseType)(baseType & 15),
|
|
408
|
-
scale: devDef.scale || 1,
|
|
409
|
-
offset: devDef.offset || 0,
|
|
410
|
-
requiresBoundedDataView: requiresBoundedEndianDataView(fit_js_1.FIT.types.fit_base_type[baseType], size),
|
|
411
|
-
developerDataIndex: devDataIndex,
|
|
412
|
-
isDeveloperField: true,
|
|
413
|
-
};
|
|
414
|
-
mTypeDef.fieldDefs.push(fDef);
|
|
415
|
-
}
|
|
416
|
-
catch (e) {
|
|
417
|
-
if (options.force) {
|
|
418
|
-
continue;
|
|
419
|
-
}
|
|
420
|
-
throw e;
|
|
421
|
-
}
|
|
432
|
+
const fDefIndex = startIndex + 6 + numberOfFields * 3 + 1 + i * 3;
|
|
433
|
+
(_a = mTypeDef.developerFieldDefs) === null || _a === void 0 ? void 0 : _a.push({
|
|
434
|
+
fieldDefinitionNumber: blob[fDefIndex],
|
|
435
|
+
size: blob[fDefIndex + 1],
|
|
436
|
+
developerDataIndex: blob[fDefIndex + 2],
|
|
437
|
+
});
|
|
422
438
|
}
|
|
423
|
-
mTypeDef.rawData = Array.from({ length: mTypeDef.
|
|
439
|
+
mTypeDef.rawData = Array.from({ length: mTypeDef.numberOfFields }, () => InvalidFieldData);
|
|
424
440
|
messageTypes[localMessageType] = mTypeDef;
|
|
425
441
|
const nextIndex = startIndex + 6 + mTypeDef.numberOfFields * 3;
|
|
426
442
|
const nextIndexWithDeveloperData = nextIndex + 1;
|
|
@@ -436,7 +452,9 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
|
|
|
436
452
|
let readDataFromIndex = startIndex + 1;
|
|
437
453
|
const fields = {};
|
|
438
454
|
const message = (0, messages_js_1.getFitMessage)(messageType.globalMessageNumber);
|
|
439
|
-
const
|
|
455
|
+
const developerFieldDefs = (_b = messageType.developerFieldDefs) !== null && _b !== void 0 ? _b : [];
|
|
456
|
+
const totalFieldCount = messageType.fieldDefs.length + developerFieldDefs.length;
|
|
457
|
+
const rawData = (_c = messageType.rawData) !== null && _c !== void 0 ? _c : (messageType.rawData = Array.from({ length: totalFieldCount }, () => InvalidFieldData));
|
|
440
458
|
let validFieldCount = 0;
|
|
441
459
|
for (let i = 0; i < messageType.fieldDefs.length; i++) {
|
|
442
460
|
const fDef = messageType.fieldDefs[i];
|
|
@@ -451,6 +469,26 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
|
|
|
451
469
|
readDataFromIndex += fDef.size;
|
|
452
470
|
messageSize += fDef.size;
|
|
453
471
|
}
|
|
472
|
+
for (let i = 0; i < developerFieldDefs.length; i++) {
|
|
473
|
+
const developerFieldDef = developerFieldDefs[i];
|
|
474
|
+
const rawDataIndex = messageType.fieldDefs.length + i;
|
|
475
|
+
const fDef = resolveDeveloperFieldDefinition(developerFieldDef, messageType.littleEndian, developerFields, options);
|
|
476
|
+
if (fDef) {
|
|
477
|
+
const data = readData(blob, dataView, fDef, readDataFromIndex, options);
|
|
478
|
+
if (!isInvalidValue(data, fDef.type) && !isInvalidBaseTypeValue(data, fDef.baseTypeNo)) {
|
|
479
|
+
rawData[rawDataIndex] = data;
|
|
480
|
+
validFieldCount++;
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
rawData[rawDataIndex] = InvalidFieldData;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
rawData[rawDataIndex] = InvalidFieldData;
|
|
488
|
+
}
|
|
489
|
+
readDataFromIndex += developerFieldDef.size;
|
|
490
|
+
messageSize += developerFieldDef.size;
|
|
491
|
+
}
|
|
454
492
|
for (let i = 0; i < messageType.fieldDefs.length; i++) {
|
|
455
493
|
const data = rawData[i];
|
|
456
494
|
if (data === InvalidFieldData) {
|
|
@@ -462,6 +500,17 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
|
|
|
462
500
|
fields[field] = data;
|
|
463
501
|
}
|
|
464
502
|
}
|
|
503
|
+
for (let i = 0; i < developerFieldDefs.length; i++) {
|
|
504
|
+
const data = rawData[messageType.fieldDefs.length + i];
|
|
505
|
+
const fDef = developerFieldDefs[i].resolvedFieldDef;
|
|
506
|
+
if (data === InvalidFieldData || !fDef) {
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
const field = fDef.name;
|
|
510
|
+
if (field !== 'unknown' && field !== '') {
|
|
511
|
+
fields[field] = data;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
465
514
|
for (let i = 0; i < messageType.fieldDefs.length; i++) {
|
|
466
515
|
const data = rawData[i];
|
|
467
516
|
if (data === InvalidFieldData) {
|
|
@@ -471,19 +520,30 @@ function readRecord(blob, messageTypes, developerFields, startIndex, options, st
|
|
|
471
520
|
if (fDef.isDeveloperField) {
|
|
472
521
|
const field = fDef.name;
|
|
473
522
|
const { type } = fDef;
|
|
474
|
-
const scale = (
|
|
475
|
-
const offset = (
|
|
523
|
+
const scale = (_d = fDef.scale) !== null && _d !== void 0 ? _d : null;
|
|
524
|
+
const offset = (_e = fDef.offset) !== null && _e !== void 0 ? _e : 0;
|
|
476
525
|
fields[fDef.name] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
|
|
477
526
|
}
|
|
478
527
|
else {
|
|
479
528
|
const { name: field, type } = fDef;
|
|
480
|
-
const scale = (
|
|
481
|
-
const offset = (
|
|
529
|
+
const scale = (_f = fDef.scale) !== null && _f !== void 0 ? _f : null;
|
|
530
|
+
const offset = (_g = fDef.offset) !== null && _g !== void 0 ? _g : 0;
|
|
482
531
|
if (field !== 'unknown' && field !== '' && field !== undefined) {
|
|
483
532
|
fields[field] = applyOptions(formatByType(data, type, scale, offset), field, options, fields);
|
|
484
533
|
}
|
|
485
534
|
}
|
|
486
535
|
}
|
|
536
|
+
for (let i = 0; i < developerFieldDefs.length; i++) {
|
|
537
|
+
const data = rawData[messageType.fieldDefs.length + i];
|
|
538
|
+
const fDef = developerFieldDefs[i].resolvedFieldDef;
|
|
539
|
+
if (data === InvalidFieldData || !fDef) {
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
const field = fDef.name;
|
|
543
|
+
if (field !== 'unknown' && field !== '') {
|
|
544
|
+
fields[field] = applyOptions(formatByType(data, fDef.type, (_h = fDef.scale) !== null && _h !== void 0 ? _h : null, (_j = fDef.offset) !== null && _j !== void 0 ? _j : 0), field, options, fields);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
487
547
|
applyGarminProductName(fields);
|
|
488
548
|
if (validFieldCount > 0 && message.name === 'record' && options.elapsedRecordField) {
|
|
489
549
|
fields.elapsed_time = (fields.timestamp - (startDate || 0)) / 1000;
|