@sports-alliance/sports-lib
Version:
A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc
526 lines (525 loc) • 32.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventImporterFIT = void 0;
var event_1 = require("../../../event");
var activity_1 = require("../../../../activities/activity");
var lap_1 = require("../../../../laps/lap");
var creator_1 = require("../../../../creators/creator");
var activity_types_1 = require("../../../../activities/activity.types");
var data_duration_1 = require("../../../../data/data.duration");
var data_energy_1 = require("../../../../data/data.energy");
var data_distance_1 = require("../../../../data/data.distance");
var importer_fit_garmin_device_names_1 = require("./importer.fit.garmin.device.names");
var importer_fit_suunto_device_names_1 = require("./importer.fit.suunto.device.names");
var importer_fit_swift_device_names_1 = require("./importer.fit.swift.device.names");
var data_pause_1 = require("../../../../data/data.pause");
var data_cadence_avg_1 = require("../../../../data/data.cadence-avg");
var data_power_avg_1 = require("../../../../data/data.power-avg");
var data_speed_avg_1 = require("../../../../data/data.speed-avg");
var data_cadence_max_1 = require("../../../../data/data.cadence-max");
var data_power_max_1 = require("../../../../data/data.power-max");
var data_ascent_1 = require("../../../../data/data.ascent");
var data_descent_1 = require("../../../../data/data.descent");
var data_heart_rate_avg_1 = require("../../../../data/data.heart-rate-avg");
var data_heart_rate_max_1 = require("../../../../data/data.heart-rate-max");
var data_speed_max_1 = require("../../../../data/data.speed-max");
var lap_types_1 = require("../../../../laps/lap.types");
var data_heart_rate_min_1 = require("../../../../data/data.heart-rate-min");
var data_power_min_1 = require("../../../../data/data.power-min");
var data_total_training_effect_1 = require("../../../../data/data.total-training-effect");
var importer_fit_mapper_1 = require("./importer.fit.mapper");
var helpers_1 = require("../../../utilities/helpers");
var event_utilities_1 = require("../../../utilities/event.utilities");
var ibi_stream_1 = require("../../../../streams/ibi-stream");
var device_1 = require("../../../../activities/devices/device");
var importer_fit_ant_plus_device_names_1 = require("./importer.fit.ant-plus.device.names");
var data_recovery_time_1 = require("../../../../data/data.recovery-time");
var data_peak_epoc_1 = require("../../../../data/data.peak-epoc");
var data_feeling_1 = require("../../../../data/data.feeling");
var data_temperature_max_1 = require("../../../../data/data.temperature-max");
var data_temperature_min_1 = require("../../../../data/data.temperature-min");
var data_temperature_avg_1 = require("../../../../data/data.temperature-avg");
var data_speed_min_1 = require("../../../../data/data.speed-min");
var data_cadence_min_1 = require("../../../../data/data.cadence-min");
var data_swolf_avg_1 = require("../../../../data/data.swolf-avg");
var data_description_1 = require("../../../../data/data.description");
var data_vo2_max_1 = require("../../../../data/data.vo2-max");
var intensity_zones_1 = require("../../../../intensity-zones/intensity-zones");
var data_heart_rate_1 = require("../../../../data/data.heart-rate");
var data_power_1 = require("../../../../data/data.power");
var data_speed_1 = require("../../../../data/data.speed");
var data_heart_rate_zone_one_duration_1 = require("../../../../data/data.heart-rate-zone-one-duration");
var data_heart_rate_zone_two_duration_1 = require("../../../../data/data.heart-rate-zone-two-duration");
var data_heart_rate_zone_three_duration_1 = require("../../../../data/data.heart-rate-zone-three-duration");
var data_heart_rate_zone_four_duration_1 = require("../../../../data/data.heart-rate-zone-four-duration");
var data_heart_rate_zone_five_duration_1 = require("../../../../data/data.heart-rate-zone-five-duration");
var data_power_zone_one_duration_1 = require("../../../../data/data.power-zone-one-duration");
var data_power_zone_two_duration_1 = require("../../../../data/data.power-zone-two-duration");
var data_power_zone_three_duration_1 = require("../../../../data/data.power-zone-three-duration");
var data_power_zone_four_duration_1 = require("../../../../data/data.power-zone-four-duration");
var data_power_zone_five_duration_1 = require("../../../../data/data.power-zone-five-duration");
var data_speed_zone_one_duration_1 = require("../../../../data/data.speed-zone-one-duration");
var data_speed_zone_two_duration_1 = require("../../../../data/data.speed-zone-two-duration");
var data_speed_zone_three_duration_1 = require("../../../../data/data.speed-zone-three-duration");
var data_speed_zone_four_duration_1 = require("../../../../data/data.speed-zone-four-duration");
var data_speed_zone_five_duration_1 = require("../../../../data/data.speed-zone-five-duration");
var empty_event_sports_libs_error_1 = require("../../../../errors/empty-event-sports-libs.error");
var data_start_event_1 = require("../../../../data/data.start-event");
var data_stop_event_1 = require("../../../../data/data.stop-event");
var data_stop_all_event_1 = require("../../../../data/data.stop-all-event");
var activity_utilities_1 = require("../../../utilities/activity.utilities");
var FitFileParser = require('fit-file-parser').default;
var EventImporterFIT = /** @class */ (function () {
function EventImporterFIT() {
}
EventImporterFIT.getFromArrayBuffer = function (arrayBuffer, name) {
var _this = this;
if (name === void 0) { name = 'New Event'; }
return new Promise(function (resolve, reject) {
var fitFileParser = new FitFileParser({
force: true,
speedUnit: 'm/s',
lengthUnit: 'm',
temperatureUnit: 'celsius',
elapsedRecordField: false,
mode: 'both'
});
fitFileParser.parse(arrayBuffer, function (error, fitDataObject) {
// debugger;
// Iterate over the sessions and create their activities
var activities = fitDataObject.sessions.map(function (sessionObject) {
// Get the activity from the sessionObject
var activity = _this.getActivityFromSessionObject(sessionObject, fitDataObject);
// Go over the laps
sessionObject.laps.forEach(function (sessionLapObject) {
activity.addLap(_this.getLapFromSessionLapObject(sessionLapObject, activity));
});
// Go over the hr zone info
if (sessionObject.time_in_hr_zone && sessionObject.time_in_hr_zone.length) {
// Add the stats
if (helpers_1.isNumber(sessionObject.time_in_hr_zone[0])) {
activity.addStat(new data_heart_rate_zone_one_duration_1.DataHeartRateZoneOneDuration(sessionObject.time_in_hr_zone[0]));
}
if (helpers_1.isNumber(sessionObject.time_in_hr_zone[1])) {
activity.addStat(new data_heart_rate_zone_two_duration_1.DataHeartRateZoneTwoDuration(sessionObject.time_in_hr_zone[1]));
}
if (helpers_1.isNumber(sessionObject.time_in_hr_zone[2])) {
activity.addStat(new data_heart_rate_zone_three_duration_1.DataHeartRateZoneThreeDuration(sessionObject.time_in_hr_zone[2]));
}
if (helpers_1.isNumber(sessionObject.time_in_hr_zone[3])) {
activity.addStat(new data_heart_rate_zone_four_duration_1.DataHeartRateZoneFourDuration(sessionObject.time_in_hr_zone[3]));
}
if (helpers_1.isNumber(sessionObject.time_in_hr_zone[4])) {
activity.addStat(new data_heart_rate_zone_five_duration_1.DataHeartRateZoneFiveDuration(sessionObject.time_in_hr_zone[4]));
}
var hrIntensityZones = new intensity_zones_1.IntensityZones(data_heart_rate_1.DataHeartRate.type);
hrIntensityZones.zone1Duration = sessionObject.time_in_hr_zone[0] || 0;
hrIntensityZones.zone2Duration = sessionObject.time_in_hr_zone[1] || 0;
hrIntensityZones.zone3Duration = sessionObject.time_in_hr_zone[2] || 0;
hrIntensityZones.zone4Duration = sessionObject.time_in_hr_zone[3] || 0;
hrIntensityZones.zone5Duration = sessionObject.time_in_hr_zone[4] || 0;
activity.intensityZones.push(hrIntensityZones);
}
// Go over the power zone info
if (sessionObject.time_in_power_zone && sessionObject.time_in_power_zone.length) {
if (helpers_1.isNumber(sessionObject.time_in_power_zone[0])) {
activity.addStat(new data_power_zone_one_duration_1.DataPowerZoneOneDuration(sessionObject.time_in_power_zone[0]));
}
if (helpers_1.isNumber(sessionObject.time_in_power_zone[1])) {
activity.addStat(new data_power_zone_two_duration_1.DataPowerZoneTwoDuration(sessionObject.time_in_power_zone[1]));
}
if (helpers_1.isNumber(sessionObject.time_in_power_zone[2])) {
activity.addStat(new data_power_zone_three_duration_1.DataPowerZoneThreeDuration(sessionObject.time_in_power_zone[2]));
}
if (helpers_1.isNumber(sessionObject.time_in_power_zone[3])) {
activity.addStat(new data_power_zone_four_duration_1.DataPowerZoneFourDuration(sessionObject.time_in_power_zone[3]));
}
if (helpers_1.isNumber(sessionObject.time_in_power_zone[4])) {
activity.addStat(new data_power_zone_five_duration_1.DataPowerZoneFiveDuration(sessionObject.time_in_power_zone[4]));
}
var powerIntensityZones = new intensity_zones_1.IntensityZones(data_power_1.DataPower.type);
powerIntensityZones.zone1Duration = sessionObject.time_in_power_zone[0] || 0;
powerIntensityZones.zone2Duration = sessionObject.time_in_power_zone[1] || 0;
powerIntensityZones.zone3Duration = sessionObject.time_in_power_zone[2] || 0;
powerIntensityZones.zone4Duration = sessionObject.time_in_power_zone[3] || 0;
powerIntensityZones.zone5Duration = sessionObject.time_in_power_zone[4] || 0;
activity.intensityZones.push(powerIntensityZones);
}
// Go over the speed zone info
if (sessionObject.time_in_speed_zone && sessionObject.time_in_speed_zone.length) {
if (helpers_1.isNumber(sessionObject.time_in_speed_zone[0])) {
activity.addStat(new data_speed_zone_one_duration_1.DataSpeedZoneOneDuration(sessionObject.time_in_speed_zone[0]));
}
if (helpers_1.isNumber(sessionObject.time_in_speed_zone[1])) {
activity.addStat(new data_speed_zone_two_duration_1.DataSpeedZoneTwoDuration(sessionObject.time_in_speed_zone[1]));
}
if (helpers_1.isNumber(sessionObject.time_in_speed_zone[2])) {
activity.addStat(new data_speed_zone_three_duration_1.DataSpeedZoneThreeDuration(sessionObject.time_in_speed_zone[2]));
}
if (helpers_1.isNumber(sessionObject.time_in_speed_zone[3])) {
activity.addStat(new data_speed_zone_four_duration_1.DataSpeedZoneFourDuration(sessionObject.time_in_speed_zone[3]));
}
if (helpers_1.isNumber(sessionObject.time_in_speed_zone[4])) {
activity.addStat(new data_speed_zone_five_duration_1.DataSpeedZoneFiveDuration(sessionObject.time_in_speed_zone[4]));
}
var speedIntensityZones = new intensity_zones_1.IntensityZones(data_speed_1.DataSpeed.type);
speedIntensityZones.zone1Duration = sessionObject.time_in_speed_zone[0] || 0;
speedIntensityZones.zone2Duration = sessionObject.time_in_speed_zone[1] || 0;
speedIntensityZones.zone3Duration = sessionObject.time_in_speed_zone[2] || 0;
speedIntensityZones.zone4Duration = sessionObject.time_in_speed_zone[3] || 0;
speedIntensityZones.zone5Duration = sessionObject.time_in_speed_zone[4] || 0;
activity.intensityZones.push(speedIntensityZones);
}
// Add the events
fitDataObject.events
.filter(function (activityEvent) {
return (activityEvent.event === 'timer' &&
activityEvent.timestamp >= activity.startDate &&
activityEvent.timestamp <= activity.endDate);
})
.forEach(function (activityEvent) {
switch (activityEvent.event_type) {
case 'start':
activity.addEvent(new data_start_event_1.DataStartEvent(activity.getDateIndex(activityEvent.timestamp)));
break;
case 'stop':
activity.addEvent(new data_stop_event_1.DataStopEvent(activity.getDateIndex(activityEvent.timestamp)));
break;
case 'stop_all':
activity.addEvent(new data_stop_all_event_1.DataStopAllEvent(activity.getDateIndex(activityEvent.timestamp)));
break;
default:
break;
}
});
// Get the samples
var samples = fitDataObject.records.filter(function (record) {
return record.timestamp >= activity.startDate && record.timestamp <= activity.endDate;
});
importer_fit_mapper_1.FITSampleMapper.forEach(function (sampleMapping) {
// @todo not sure if we need to check for number only ...
var subjectSamples = (samples.filter(function (sample) { return helpers_1.isNumber(sampleMapping.getSampleValue(sample)); }));
if (subjectSamples.length) {
// When we create a stream here it has the length of the activity elapsed time (end-start) filled with nulls.
// We keep nulls in order to preserve the array length.
activity.addStream(activity.createStream(sampleMapping.dataType));
subjectSamples.forEach(function (subjectSample) {
activity.addDataToStream(sampleMapping.dataType, new Date(subjectSample.timestamp), sampleMapping.getSampleValue(subjectSample));
});
}
});
return activity;
});
// If there are no activities to parse ....
if (!activities.length) {
reject(new empty_event_sports_libs_error_1.EmptyEventLibError('Empty fit file'));
return;
}
// Get the HRV to IBI if exist
if (fitDataObject.hrv && fitDataObject.hrv.length) {
activities.forEach(function (activity) {
var timeSum = 0;
var ibiData = fitDataObject.hrv
.reduce(function (ibiArray, hrvRecord) { return ibiArray.concat(hrvRecord.time); }, [])
.map(function (ibi) { return ibi * 1000; })
.filter(function (ibi) {
// debugger;
// Some Garmin devices return a record of 65.535 (65535) for some reason so exlcude those
if (ibi === 65535) {
// timeSum += ibi;
return false;
}
timeSum += ibi;
var ibiDataDate = new Date(activities[0].startDate.getTime() + timeSum);
return ibiDataDate >= activity.startDate && ibiDataDate <= activity.endDate;
});
// set the IBI
activity.addStream(new ibi_stream_1.IBIStream(ibiData));
});
}
// Parse the device infos
if (fitDataObject.device_infos && fitDataObject.device_infos.length) {
activities.forEach(function (activity) {
activity.creator.devices = _this.getDeviceInfos(fitDataObject.device_infos);
});
}
// Create an event
// @todo check if the start and end date can derive from the file
var event = new event_1.Event(name, activities[0].startDate, activities[activities.length - 1].endDate);
activities.forEach(function (activity) { return event.addActivity(activity); });
// debugger;
event_utilities_1.EventUtilities.generateStatsForAll(event);
// debugger;
resolve(event);
});
});
};
EventImporterFIT.getDeviceInfos = function (deviceInfos) {
return deviceInfos.map(function (deviceInfo) {
var device = new device_1.Device(deviceInfo.device_type);
device.index = deviceInfo.device_index;
device.name = importer_fit_ant_plus_device_names_1.ImporterFitAntPlusDeviceNames[deviceInfo.ant_device_number] || deviceInfo.ant_device_number;
device.batteryStatus = deviceInfo.battery_status;
device.batteryVoltage = deviceInfo.battery_voltage;
device.manufacturer = deviceInfo.manufacturer;
device.serialNumber = deviceInfo.serial_number;
device.product = deviceInfo.product;
device.swInfo = deviceInfo.software_version;
device.hwInfo = deviceInfo.hardware_version;
device.antDeviceNumber = deviceInfo.ant_device_number;
device.antTransmissionType = deviceInfo.ant_transmission_type;
device.antNetwork = deviceInfo.ant_network;
device.sourceType = deviceInfo.source_type;
device.cumOperatingTime = deviceInfo.cum_operating_time;
return device;
});
};
EventImporterFIT.getLapFromSessionLapObject = function (sessionLapObject, activity) {
var lap = new lap_1.Lap(sessionLapObject.start_time ||
sessionLapObject.records[0].timestamp ||
new Date(sessionLapObject.timestamp.getTime() - sessionLapObject.total_elapsed_time * 1000), sessionLapObject.timestamp ||
new Date(sessionLapObject.start_time.getTime() + sessionLapObject.total_elapsed_time * 1000), // Some dont have a timestamp
lap_types_1.LapTypes[sessionLapObject.lap_trigger] || lap_types_1.LapTypes.unknown);
// Set the calories
if (sessionLapObject.total_calories) {
lap.addStat(new data_energy_1.DataEnergy(sessionLapObject.total_calories));
}
// Add stats to the lap
this.getStatsFromObject(sessionLapObject, activity).forEach(function (stat) { return lap.addStat(stat); });
return lap;
};
EventImporterFIT.getActivityFromSessionObject = function (sessionObject, fitDataObject) {
var startDate = sessionObject.start_time;
var totalElapsedTime = sessionObject.total_elapsed_time || sessionObject.total_timer_time || 0;
var endDate = sessionObject.timestamp || new Date(sessionObject.start_time.getTime() + totalElapsedTime * 1000);
// Some fit files have wrong dates for session.timestamp && session.start_time and those miss an elapsed time
if (!totalElapsedTime && // Elapsed time missing
fitDataObject.sessions.length === 1 && // Has only one session
fitDataObject.records &&
fitDataObject.records.length // There are records to try to guess
) {
startDate = fitDataObject.records[0].timestamp;
endDate = fitDataObject.records[fitDataObject.records.length - 1].timestamp;
}
else if (endDate < startDate) {
// If for some reason this happens
if (!fitDataObject.records || !fitDataObject.records[0]) {
throw new Error('Cannot parse dates. Start date is greater than the end date');
}
startDate = fitDataObject.records[0].timestamp;
endDate = fitDataObject.records[fitDataObject.records.length - 1].timestamp;
}
else if (+endDate - +startDate > activity_1.MAX_ACTIVITY_DURATION) {
endDate = new Date(sessionObject.start_time.getTime() + totalElapsedTime * 1000);
}
// Create an activity
var activity = new activity_1.Activity(startDate, endDate, this.getActivityTypeFromSessionObject(sessionObject), this.getCreatorFromFitDataObject(fitDataObject));
// Set the activity stats
this.getStatsFromObject(sessionObject, activity).forEach(function (stat) { return activity.addStat(stat); });
return activity;
};
EventImporterFIT.getActivityTypeFromSessionObject = function (session) {
if (session.sub_sport && session.sub_sport !== 'generic') {
return (activity_types_1.ActivityTypes[session.sport + "_" + session.sub_sport] ||
session.sport + "_" + session.sub_sport ||
session.sport ||
activity_types_1.ActivityTypes.unknown);
}
return activity_types_1.ActivityTypes[session.sport] || session.sport || activity_types_1.ActivityTypes.unknown;
};
// @todo move this to a mapper
EventImporterFIT.getStatsFromObject = function (object, activity) {
var stats = [];
// @todo can also check the events ;-)
var totalTimerTime = 0;
if (helpers_1.isNumber(object.total_timer_time) && helpers_1.isNumber(object.total_elapsed_time)) {
totalTimerTime =
object.total_elapsed_time < object.total_timer_time ? object.total_elapsed_time : object.total_timer_time;
}
else if (helpers_1.isNumber(object.total_timer_time)) {
totalTimerTime = object.total_elapsed_time;
}
else if ((object.timestamp - object.start_time) / 1000) {
totalTimerTime = (object.timestamp - object.start_time) / 1000;
}
// 0 should be not included aha it's not legit to have a 0 for total timer time
// And that typically is a device error we should look at the samples
// Since start and end date are inclusive for sample size eg at time [0] there can be a value
if (!totalTimerTime) {
totalTimerTime = activity_utilities_1.ActivityUtilities.getDataLength(activity.startDate, activity.endDate) - 1;
}
stats.push(new data_duration_1.DataDuration(totalTimerTime));
// Set the pause which is elapsed time - moving time (timer_time)
// There is although an exception for Zwift devices that have these fields vise versa
var pause = (object.total_elapsed_time > totalTimerTime
? object.total_elapsed_time - totalTimerTime
: totalTimerTime - object.total_elapsed_time) || 0;
stats.push(new data_pause_1.DataPause(pause));
if (helpers_1.isNumberOrString(object.total_distance)) {
stats.push(new data_distance_1.DataDistance(object.total_distance));
}
else {
stats.push(new data_distance_1.DataDistance(0));
}
// Heart Rate
if (helpers_1.isNumberOrString(object.avg_heart_rate)) {
stats.push(new data_heart_rate_avg_1.DataHeartRateAvg(object.avg_heart_rate));
}
if (helpers_1.isNumberOrString(object.min_heart_rate)) {
stats.push(new data_heart_rate_min_1.DataHeartRateMin(object.min_heart_rate));
}
if (helpers_1.isNumberOrString(object.max_heart_rate)) {
stats.push(new data_heart_rate_max_1.DataHeartRateMax(object.max_heart_rate));
}
// Cadence
if (helpers_1.isNumberOrString(object.avg_cadence)) {
stats.push(new data_cadence_avg_1.DataCadenceAvg(object.avg_cadence));
}
if (helpers_1.isNumberOrString(object.min_cadence)) {
stats.push(new data_cadence_min_1.DataCadenceMin(object.min_cadence));
}
if (helpers_1.isNumberOrString(object.max_cadence)) {
stats.push(new data_cadence_max_1.DataCadenceMax(object.max_cadence));
}
// Power
if (helpers_1.isNumberOrString(object.avg_power)) {
stats.push(new data_power_avg_1.DataPowerAvg(object.avg_power));
}
if (helpers_1.isNumberOrString(object.min_power)) {
stats.push(new data_power_min_1.DataPowerMin(object.min_power));
}
if (helpers_1.isNumberOrString(object.max_power)) {
stats.push(new data_power_max_1.DataPowerMax(object.max_power));
}
// Speed
if (helpers_1.isNumberOrString(object.avg_speed)) {
stats.push(new data_speed_avg_1.DataSpeedAvg(object.avg_speed));
}
if (helpers_1.isNumberOrString(object.min_speed)) {
stats.push(new data_speed_min_1.DataSpeedMin(object.min_speed));
}
if (helpers_1.isNumberOrString(object.max_speed)) {
stats.push(new data_speed_max_1.DataSpeedMax(object.max_speed));
}
// Keep latest , encanched @todo this can create a bug
if (helpers_1.isNumberOrString(object.enhanced_avg_speed)) {
stats.push(new data_speed_avg_1.DataSpeedAvg(object.enhanced_avg_speed));
}
if (helpers_1.isNumberOrString(object.enhanced_min_speed)) {
stats.push(new data_speed_min_1.DataSpeedMin(object.enhanced_min_speed));
}
if (helpers_1.isNumberOrString(object.enhanced_max_speed)) {
stats.push(new data_speed_max_1.DataSpeedMax(object.enhanced_max_speed));
}
// Temperature
if (helpers_1.isNumberOrString(object.avg_temperature)) {
stats.push(new data_temperature_avg_1.DataTemperatureAvg(object.avg_temperature));
}
if (helpers_1.isNumberOrString(object.min_temperature)) {
stats.push(new data_temperature_min_1.DataTemperatureMin(object.min_temperature));
}
if (helpers_1.isNumberOrString(object.max_temperature)) {
stats.push(new data_temperature_max_1.DataTemperatureMax(object.max_temperature));
}
// Ascent
if (helpers_1.isNumberOrString(object.total_ascent)) {
stats.push(new data_ascent_1.DataAscent(object.total_ascent));
}
// Descent
if (helpers_1.isNumberOrString(object.total_descent)) {
stats.push(new data_descent_1.DataDescent(object.total_descent));
}
// Calories
if (helpers_1.isNumberOrString(object.total_calories)) {
stats.push(new data_energy_1.DataEnergy(object.total_calories));
}
// Total training effect
if (helpers_1.isNumberOrString(object.total_training_effect)) {
stats.push(new data_total_training_effect_1.DataTotalTrainingEffect(object.total_training_effect));
}
// Vo2Max
if (helpers_1.isNumberOrString(object.estimated_vo2_max)) {
stats.push(new data_vo2_max_1.DataVO2Max(object.estimated_vo2_max));
}
// Peak Epoc
if (helpers_1.isNumberOrString(object.peak_epoc)) {
stats.push(new data_peak_epoc_1.DataPeakEPOC(object.peak_epoc));
}
// Recovery time
if (helpers_1.isNumberOrString(object.recovery_time)) {
stats.push(new data_recovery_time_1.DataRecoveryTime(object.recovery_time));
}
// Feeling
if (helpers_1.isNumberOrString(object.feeling)) {
stats.push(new data_feeling_1.DataFeeling(object.feeling));
}
// Average SWOLF
if (helpers_1.isNumberOrString(object.avg_swolf)) {
stats.push(new data_swolf_avg_1.DataSWOLFAvg(object.avg_swolf));
}
// Description
if (helpers_1.isNumberOrString(object.description)) {
stats.push(new data_description_1.DataDescription(object.description));
}
// @todo add support for more data
return stats;
};
EventImporterFIT.getCreatorFromFitDataObject = function (fitDataObject) {
var creator;
switch (fitDataObject.file_ids[0].manufacturer) {
case 'suunto': {
creator = new creator_1.Creator(importer_fit_suunto_device_names_1.ImporterFitSuuntoDeviceNames[fitDataObject.file_ids[0].product] ||
fitDataObject.file_ids[0].product_name ||
'Suunto Unknown');
break;
}
case 'coros': {
creator = new creator_1.Creator(fitDataObject.file_ids[0].product_name || fitDataObject.file_ids[0].product || 'Unknown');
break;
}
case 'garmin': {
creator = new creator_1.Creator(importer_fit_garmin_device_names_1.ImporterFitGarminDeviceNames[fitDataObject.file_ids[0].product] ||
fitDataObject.file_ids[0].product_name ||
'Garmin Unknown');
break;
}
case 'zwift': {
creator = new creator_1.Creator(importer_fit_swift_device_names_1.ImporterZwiftDeviceNames[fitDataObject.file_ids[0].product] ||
fitDataObject.file_ids[0].product_name ||
'Zwift Unknown');
break;
}
case 'stryd': {
creator = new creator_1.Creator('Stryd', fitDataObject.file_creator.software_version, fitDataObject.file_creator.hardware_version, fitDataObject.file_ids[0].serial_number);
break;
}
case 'development': {
creator = new creator_1.Creator(fitDataObject.file_ids[0].product_name || fitDataObject.file_ids[0].product || 'Unknown');
break;
}
default: {
creator = new creator_1.Creator(fitDataObject.file_ids[0].manufacturer
? fitDataObject.file_ids[0].manufacturer +
' ' +
(fitDataObject.file_ids[0].product_name || fitDataObject.file_ids[0].product || 'Unknown')
: fitDataObject.file_ids[0].product_name || fitDataObject.file_ids[0].product || 'Unknown');
}
}
// debugger;
if (fitDataObject.file_creator && helpers_1.isNumberOrString(fitDataObject.file_creator.hardware_version)) {
creator.hwInfo = String(fitDataObject.file_creator.hardware_version);
}
if (fitDataObject.file_creator && helpers_1.isNumberOrString(fitDataObject.file_creator.software_version)) {
creator.swInfo = String(fitDataObject.file_creator.software_version);
}
else if (fitDataObject.device_info && helpers_1.isNumberOrString(fitDataObject.device_info.software_version)) {
creator.swInfo = String(fitDataObject.device_info.software_version);
}
if (fitDataObject.file_ids[0] && helpers_1.isNumberOrString(fitDataObject.file_ids[0].serial_number)) {
creator.serialNumber = fitDataObject.file_ids[0].serial_number;
}
return creator;
};
return EventImporterFIT;
}());
exports.EventImporterFIT = EventImporterFIT;