UNPKG

@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
"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;