Skip to content

Commit

Permalink
Merge remote-tracking branch 'FrostDigital/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
jimmykane committed Jul 9, 2018
2 parents aacaa04 + 9aea666 commit 6fa9258
Show file tree
Hide file tree
Showing 10 changed files with 287 additions and 103 deletions.
105 changes: 76 additions & 29 deletions dist/binary.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,16 @@ function readData(blob, fDef, startIndex) {

return uint32Rep;
}

if (fDef.type === 'string') {
var _temp = [];
for (var _i = 0; _i < fDef.size; _i++) {
if (blob[startIndex + _i]) {
_temp.push(blob[startIndex + _i]);
}
}
return new Buffer(_temp).toString('utf-8');
}
return blob[startIndex];
}

Expand Down Expand Up @@ -148,25 +158,29 @@ function applyOptions(data, field, options) {
}
}

function readRecord(blob, messageTypes, startIndex, options, startDate) {
function readRecord(blob, messageTypes, developerFields, startIndex, options, startDate) {
var recordHeader = blob[startIndex];
var localMessageType = recordHeader & 15;

if ((recordHeader & 64) === 64) {
// is definition message
// startIndex + 1 is reserved

var hasDeveloperData = (recordHeader & 32) === 32;
var lEnd = blob[startIndex + 2] === 0;
var numberOfFields = blob[startIndex + 5];
var numberOfDeveloperDataFields = hasDeveloperData ? blob[startIndex + 5 + numberOfFields * 3 + 1] : 0;

var mTypeDef = {
littleEndian: lEnd,
globalMessageNumber: addEndian(lEnd, [blob[startIndex + 3], blob[startIndex + 4]]),
numberOfFields: blob[startIndex + 5],
numberOfFields: numberOfFields + numberOfDeveloperDataFields,
fieldDefs: []
};

var _message = (0, _messages.getFitMessage)(mTypeDef.globalMessageNumber);

for (var i = 0; i < mTypeDef.numberOfFields; i++) {
for (var i = 0; i < numberOfFields; i++) {
var fDefIndex = startIndex + 6 + i * 3;
var baseType = blob[fDefIndex + 2];

Expand All @@ -187,52 +201,85 @@ function readRecord(blob, messageTypes, startIndex, options, startDate) {

mTypeDef.fieldDefs.push(fDef);
}

for (var _i2 = 0; _i2 < numberOfDeveloperDataFields; _i2++) {
var _fDefIndex = startIndex + 6 + numberOfFields * 3 + 1 + _i2 * 3;

var fieldNum = blob[_fDefIndex];
var size = blob[_fDefIndex + 1];
var devDataIndex = blob[_fDefIndex + 2];

var devDef = developerFields[devDataIndex][fieldNum];

var _baseType = devDef.fit_base_type_id;

var _fDef = {
type: _fit.FIT.types.fit_base_type[_baseType],
fDefNo: fieldNum,
size: size,
endianAbility: (_baseType & 128) === 128,
littleEndian: lEnd,
baseTypeNo: _baseType & 15,
name: devDef.field_name,
dataType: (0, _messages.getFitMessageBaseType)(_baseType & 15),
isDeveloperField: true
};

mTypeDef.fieldDefs.push(_fDef);
}

messageTypes[localMessageType] = mTypeDef;

var nextIndex = startIndex + 6 + mTypeDef.numberOfFields * 3;
var nextIndexWithDeveloperData = nextIndex + 1;

return {
messageType: 'fieldDescription',
nextIndex: startIndex + 6 + mTypeDef.numberOfFields * 3
messageType: 'definition',
nextIndex: hasDeveloperData ? nextIndexWithDeveloperData : nextIndex
};
}

var messageType = void 0;

if (messageTypes[localMessageType]) {
messageType = messageTypes[localMessageType];
} else {
messageType = messageTypes[0];
}

// TODO: handle compressed header ((recordHeader & 128) == 128)
var messageType = messageTypes[localMessageType] || messageTypes[0];

// uncompressed header
var messageSize = 0;
var readDataFromIndex = startIndex + 1;
var fields = {};
var message = (0, _messages.getFitMessage)(messageType.globalMessageNumber);

for (var _i = 0; _i < messageType.fieldDefs.length; _i++) {
var _fDef = messageType.fieldDefs[_i];
var data = readData(blob, _fDef, readDataFromIndex);

if (!isInvalidValue(data, _fDef.type)) {
var _message$getAttribute2 = message.getAttributes(_fDef.fDefNo),
field = _message$getAttribute2.field,
type = _message$getAttribute2.type,
scale = _message$getAttribute2.scale,
offset = _message$getAttribute2.offset;

if (field !== 'unknown' && field !== '' && field !== undefined) {
fields[field] = applyOptions(formatByType(data, type, scale, offset), field, options);
for (var _i3 = 0; _i3 < messageType.fieldDefs.length; _i3++) {
var _fDef2 = messageType.fieldDefs[_i3];
var data = readData(blob, _fDef2, readDataFromIndex);

if (!isInvalidValue(data, _fDef2.type)) {

if (_fDef2.isDeveloperField) {
// Skip format of data if developer field
fields[_fDef2.name] = data;
} else {
var _message$getAttribute2 = message.getAttributes(_fDef2.fDefNo),
field = _message$getAttribute2.field,
type = _message$getAttribute2.type,
scale = _message$getAttribute2.scale,
offset = _message$getAttribute2.offset;

if (field !== 'unknown' && field !== '' && field !== undefined) {
fields[field] = applyOptions(formatByType(data, type, scale, offset), field, options);
}
}

if (message.name === 'record' && options.elapsedRecordField) {
fields.elapsed_time = (fields.timestamp - startDate) / 1000;
}
}

readDataFromIndex += _fDef.size;
messageSize += _fDef.size;
readDataFromIndex += _fDef2.size;
messageSize += _fDef2.size;
}

if (message.name === 'field_description') {
developerFields[fields.developer_data_index] = developerFields[fields.developer_data_index] || [];
developerFields[fields.developer_data_index][fields.field_definition_number] = fields;
}

var result = {
Expand Down
6 changes: 5 additions & 1 deletion dist/easy-fit.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,19 +92,23 @@ var EasyFit = function () {

var loopIndex = headerLength;
var messageTypes = [];
var developerFields = [];

var isModeCascade = this.options.mode === 'cascade';
var isCascadeNeeded = isModeCascade || this.options.mode === 'both';

var startDate = void 0;

var count = 0;

while (loopIndex < crcStart) {
var _readRecord = (0, _binary.readRecord)(blob, messageTypes, loopIndex, this.options, startDate),
var _readRecord = (0, _binary.readRecord)(blob, messageTypes, developerFields, loopIndex, this.options, startDate),
nextIndex = _readRecord.nextIndex,
messageType = _readRecord.messageType,
message = _readRecord.message;

loopIndex = nextIndex;

switch (messageType) {
case 'lap':
if (isCascadeNeeded) {
Expand Down
22 changes: 21 additions & 1 deletion dist/fit.js
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,10 @@ var FIT = exports.FIT = {
73: { field: 'enhanced_speed', type: 'uint32', scale: 1000, offset: 0, units: 'm/s' },
78: { field: 'enhanced_altitude', type: 'uint32', scale: 5, offset: 500, units: 'm' },
81: { field: 'battery_soc', type: 'uint8', scale: 2, offset: 0, units: 'percent' },
82: { field: 'motor_power', type: 'uint16', scale: null, offset: 0, units: 'watts' }
82: { field: 'motor_power', type: 'uint16', scale: null, offset: 0, units: 'watts' },
83: { field: 'vertical_ratio', type: 'uint16', scale: 100, offset: 0, units: '%' },
84: { field: 'stance_time_balance', type: 'uint16', scale: 100, offset: 0, units: '%' },
85: { field: 'step_length', type: 'uint16', scale: 10, offset: 0, units: 'mm' }
},
21: {
name: 'event',
Expand Down Expand Up @@ -639,6 +642,23 @@ var FIT = exports.FIT = {
7: { field: 'heart_rate_type', type: 'hr_type', scale: null, offset: 0, units: '' },
8: { field: 'status', type: 'bp_status', scale: null, offset: 0, units: '' },
9: { field: 'user_profile_index', type: 'message_index', scale: null, offset: 0, units: '' }
},
206: {
name: 'field_description',
0: { field: 'developer_data_index', type: 'uint8', scale: null, offset: 0, units: '' },
1: { field: 'field_definition_number', type: 'uint8', scale: null, offset: 0, units: '' },
2: { field: 'fit_base_type_id', type: 'uint8', scale: null, offset: 0, units: '' },
3: { field: 'field_name', type: 'string', scale: null, offset: 0, units: '' },
//4: { field: 'array', type: 'uint8', scale: null, offset: 0, units: '' },
//5: { field: 'components', type: 'string', scale: null, offset: 0, units: '' },
6: { field: 'scale', type: 'uint8', scale: null, offset: 0, units: '' },
7: { field: 'offset', type: 'sint8', scale: null, offset: 0, units: '' },
8: { field: 'units', type: 'string', scale: null, offset: 0, units: '' },
// 9: { field: 'bits', type: 'string', scale: null, offset: 0, units: '' },
// 10: { field: 'accumulate', type: 'string', scale: null, offset: 0, units: '' },
//13: { field: 'fit_base_unit_id', type: 'uint16', scale: null, offset: 0, units: '' },
// 14: { field: 'native_mesg_num', type: 'mesg_num', scale: null, offset: 0, units: '' },
15: { field: 'native_field_num', type: 'uint8', scale: null, offset: 0, units: '' }
}
},
types: {
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
"name": "Pierre Jacquier"
}
],
"dependencies": {},
"description": "Parse your .FIT files easily, directly from JS.",
"devDependencies": {
"babel": "^6.3.26",
Expand Down Expand Up @@ -57,7 +56,8 @@
"scripts": {
"example-output": "node_modules/gulp/bin/gulp.js; node examples/example.js examples/example.fit > examples/output.json",
"example": "node_modules/gulp/bin/gulp.js; node examples/example.js examples/example.fit",
"test": "node_modules/gulp/bin/gulp.js;"
"test": "node_modules/gulp/bin/gulp.js;",
"build": "node_modules/gulp/bin/gulp.js babel"
},
"version": "0.0.8"
}
}
Loading

0 comments on commit 6fa9258

Please sign in to comment.