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

728 lines (727 loc) 40 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SuuntoSampleMapper = exports.SuuntoIntensityZonesMapper = exports.SuuntoSettingsMapper = exports.EventImporterSuuntoJSON = void 0; var event_1 = require("../../../event"); var activity_1 = require("../../../../activities/activity"); var creator_1 = require("../../../../creators/creator"); var lap_1 = require("../../../../laps/lap"); var data_altitude_1 = require("../../../../data/data.altitude"); var data_cadence_1 = require("../../../../data/data.cadence"); var data_heart_rate_1 = require("../../../../data/data.heart-rate"); var data_speed_1 = require("../../../../data/data.speed"); var data_vertical_speed_1 = require("../../../../data/data.vertical-speed"); var data_temperature_1 = require("../../../../data/data.temperature"); var data_sea_level_pressure_1 = require("../../../../data/data.sea-level-pressure"); var data_latitude_degrees_1 = require("../../../../data/data.latitude-degrees"); var data_longitude_degrees_1 = require("../../../../data/data.longitude-degrees"); var data_power_1 = require("../../../../data/data.power"); var data_altitude_gps_1 = require("../../../../data/data.altitude-gps"); var data_absolute_pressure_1 = require("../../../../data/data.absolute-pressure"); var data_ehpe_1 = require("../../../../data/data.ehpe"); var data_evpe_1 = require("../../../../data/data.evpe"); var data_number_of_satellites_1 = require("../../../../data/data.number-of-satellites"); var data_satellite_5_best_snr_1 = require("../../../../data/data.satellite-5-best-snr"); var intensity_zones_1 = require("../../../../intensity-zones/intensity-zones"); var data_ibi_1 = require("../../../../data/ibi/data.ibi"); var importer_suunto_activity_ids_1 = require("./importer.suunto.activity.ids"); var importer_suunto_device_names_1 = require("./importer.suunto.device.names"); var data_duration_1 = require("../../../../data/data.duration"); var data_altitude_max_1 = require("../../../../data/data.altitude-max"); var data_distance_1 = require("../../../../data/data.distance"); var data_ascent_time_1 = require("../../../../data/data.ascent-time"); var data_descent_time_1 = require("../../../../data/data.descent-time"); var data_descent_1 = require("../../../../data/data.descent"); var data_ascent_1 = require("../../../../data/data.ascent"); var data_epoc_1 = require("../../../../data/data.epoc"); var data_energy_1 = require("../../../../data/data.energy"); var data_feeling_1 = require("../../../../data/data.feeling"); var data_recovery_time_1 = require("../../../../data/data.recovery-time"); var data_vo2_max_1 = require("../../../../data/data.vo2-max"); var data_pause_1 = require("../../../../data/data.pause"); 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_heart_rate_min_1 = require("../../../../data/data.heart-rate-min"); var data_cadence_avg_1 = require("../../../../data/data.cadence-avg"); var data_cadence_max_1 = require("../../../../data/data.cadence-max"); var data_cadence_min_1 = require("../../../../data/data.cadence-min"); var data_power_avg_1 = require("../../../../data/data.power-avg"); var data_power_max_1 = require("../../../../data/data.power-max"); var data_power_min_1 = require("../../../../data/data.power-min"); var data_speed_avg_1 = require("../../../../data/data.speed-avg"); var data_speed_max_1 = require("../../../../data/data.speed-max"); var data_speed_min_1 = require("../../../../data/data.speed-min"); var data_temperature_avg_1 = require("../../../../data/data.temperature-avg"); var data_temperature_max_1 = require("../../../../data/data.temperature-max"); var data_temperature_min_1 = require("../../../../data/data.temperature-min"); var data_vertical_speed_avg_1 = require("../../../../data/data.vertical-speed-avg"); var data_vertical_speed_max_1 = require("../../../../data/data.vertical-speed-max"); var data_vertical_speed_min_1 = require("../../../../data/data.vertical-speed-min"); var data_altitude_avg_1 = require("../../../../data/data.altitude-avg"); var data_altitude_min_1 = require("../../../../data/data.altitude-min"); var data_fused_location_1 = require("../../../../data/data.fused-location"); var activity_types_1 = require("../../../../activities/activity.types"); var lap_types_1 = require("../../../../laps/lap.types"); var data_pace_avg_1 = require("../../../../data/data.pace-avg"); var data_pace_max_1 = require("../../../../data/data.pace-max"); var data_pace_min_1 = require("../../../../data/data.pace-min"); var data_fused_altitude_1 = require("../../../../data/data.fused-altitude"); var data_battery_charge_1 = require("../../../../data/data.battery-charge"); var data_battery_current_1 = require("../../../../data/data.battery-current"); var data_battery_voltage_1 = require("../../../../data/data.battery-voltage"); var helpers_1 = require("../../../utilities/helpers"); var event_utilities_1 = require("../../../utilities/event.utilities"); var data_alti_baro_profile_1 = require("../../../../data/data.alti-baro-profile"); var data_auto_lap_distance_1 = require("../../../../data/data.auto-lap-distance"); var data_auto_lap_duration_1 = require("../../../../data/data.auto-lap-duration"); var data_auto_pause_used_1 = require("../../../../data/data.auto-pause-used"); var data_bike_pod_used_1 = require("../../../../data/data.bike-pod-used"); var data_enabled_navigation_systems_1 = require("../../../../data/data.enabled-navigation-systems"); var data_foot_pod_used_1 = require("../../../../data/data.foot-pod-used"); var data_heart_rate_used_1 = require("../../../../data/data.heart-rate-used"); var data_power_pod_used_1 = require("../../../../data/data.power-pod-used"); var data_store_1 = require("../../../../data/data.store"); var ibi_stream_1 = require("../../../../streams/ibi-stream"); var data_steps_1 = require("../../../../data/data.steps"); var data_pool_length_1 = require("../../../../data/data.pool-length"); var data_device_location_1 = require("../../../../data/data.device-location"); var data_total_training_effect_1 = require("../../../../data/data.total-training-effect"); 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 EventImporterSuuntoJSON = /** @class */ (function () { function EventImporterSuuntoJSON() { } EventImporterSuuntoJSON.getFromJSONString = function (jsonString) { var _this = this; return new Promise(function (resolve, reject) { var eventJSONObject = JSON.parse(jsonString); // debugger; // Create a creator and pass it to all activities (later) var creator = new creator_1.Creator(importer_suunto_device_names_1.ImporterSuuntoDeviceNames[eventJSONObject.DeviceLog.Device.Name] || // Try to get a listed name eventJSONObject.DeviceLog.Device.Name // If not fallback to typed ); creator.serialNumber = eventJSONObject.DeviceLog.Device.SerialNumber; creator.hwInfo = eventJSONObject.DeviceLog.Device.Info.HW; creator.swInfo = eventJSONObject.DeviceLog.Device.Info.SW; // Go over the samples and get the ones with activity start times var activityStartEventSamples = eventJSONObject.DeviceLog.Samples.filter(function (sample) { return sample.Events && sample.Events[0] && sample.Events[0].Activity; }); // Check if there is a Fused Altitude event var fusedAltitudeEventSamples = eventJSONObject.DeviceLog.Samples.filter(function (sample) { return sample.Events && sample.Events[0] && sample.Events[0].Altitude; }); // Get the lap start events var lapEventSamples = eventJSONObject.DeviceLog.Samples.filter(function (sample) { return (sample.Events && sample.Events[0] && sample.Events[0].Lap && sample.Events[0].Lap.Type !== 'Start' && sample.Events[0].Lap.Type !== 'Stop'); }); // Get the stop event var stopEventSample = eventJSONObject.DeviceLog.Samples.find(function (sample) { return sample.Events && sample.Events[0] && sample.Events[0].Lap && sample.Events[0].Lap.Type === 'Stop'; }); // Add the stop event to the laps since it's also a lap stop event if (stopEventSample) { lapEventSamples.push(stopEventSample); } // Get the activity windows var activityWindows = eventJSONObject.DeviceLog.Windows ? eventJSONObject.DeviceLog.Windows.filter(function (windowObj) { return windowObj.Window.Type === 'Activity'; }).map(function (activityWindow) { return activityWindow.Window; }) : []; // Get the lap windows var lapWindows = eventJSONObject.DeviceLog.Windows ? eventJSONObject.DeviceLog.Windows.filter(function (windowObj) { return windowObj.Window.Type === 'Lap' || windowObj.Window.Type === 'Autolap'; }).map(function (lapWindow) { return lapWindow.Window; }) : []; // Create the activities var activities = activityStartEventSamples.map(function (activityStartEventSample, index) { var activity = new activity_1.Activity(new Date(activityStartEventSample.TimeISO8601), activityStartEventSamples.length - 1 === index ? new Date(stopEventSample ? stopEventSample.TimeISO8601 : eventJSONObject.DeviceLog.Header.TimeISO8601) : new Date(activityStartEventSamples[index + 1].TimeISO8601), activity_types_1.ActivityTypes[(importer_suunto_activity_ids_1.ImporterSuuntoActivityIds[activityStartEventSample.Events[0].Activity.ActivityType])], creator); // Set the end date to the stop event time if the activity is the last or the only one else set it on the next itery time // Create the stats these are a 1:1 ref arrays if (activityWindows[index]) { _this.getStats(activityWindows[index]).forEach(function (stat) { activity.addStat(stat); }); } // Add the pause from end date minurs start date and removing the duration as widows do not contain the pause time if (!activity.getDuration()) { activity.setDuration(new data_duration_1.DataDuration((activity.endDate.getTime() - activity.startDate.getTime()) / 1000)); } activity.setPause(new data_pause_1.DataPause((activity.endDate.getTime() - activity.startDate.getTime()) / 1000 - activity.getDuration().getValue())); // Set the zones for the activity @todo fix _this.setIntensityZones(activity, eventJSONObject.DeviceLog.Header); // Add the fused altitude event if (fusedAltitudeEventSamples.length) { activity.addStat(new data_fused_altitude_1.DataFusedAltitude(true)); } return activity; }); // If nothing found if (!activities.length) { activities.push(new activity_1.Activity(new Date(eventJSONObject.DeviceLog.Header.DateTime), new Date(new Date(eventJSONObject.DeviceLog.Header.DateTime).getTime() + eventJSONObject.DeviceLog.Header.Duration * 1000), activity_types_1.ActivityTypes.unknown, creator)); } // set the start dates of all lap types to the start of the first activity var lapStartDatesByType = lapEventSamples.reduce(function (lapStartDatesByTypeObject, lapEventSample, index) { // If its a stop event then set the start date to the previous if (lapEventSample.Events[0].Lap.Type === 'Stop' && lapEventSamples.length > 1) { lapStartDatesByTypeObject[lapEventSample.Events[0].Lap.Type] = new Date(lapEventSamples[index - 1].TimeISO8601); return lapStartDatesByTypeObject; } lapStartDatesByTypeObject[lapEventSample.Events[0].Lap.Type] = activities[0].startDate; return lapStartDatesByTypeObject; }, {}); var laps = lapEventSamples.reduce(function (lapArray, lapEventSample, index) { // if there is only one lap then skip it's the whole activity if (lapEventSamples.length === 1) { return lapArray; } // Set the end date var lapEndDate = new Date(lapEventSample.TimeISO8601); // Set the start date. // Set it for the next run var lap = new lap_1.Lap(lapStartDatesByType[lapEventSample.Events[0].Lap.Type], lapEndDate, lap_types_1.LapTypes[lapEventSample.Events[0].Lap.Type]); lapStartDatesByType[lapEventSample.Events[0].Lap.Type] = lapEndDate; if (lapWindows[index]) { _this.getStats(lapWindows[index]).forEach(function (stat) { lap.addStat(stat); }); } // Add the pause from end date minurs start date and removing the duration as widows do not contain the pause time if (!lap.getDuration()) { lap.setDuration(new data_duration_1.DataDuration((lap.endDate.getTime() - lap.startDate.getTime()) / 1000)); } lap.setPause(new data_pause_1.DataPause((lap.endDate.getTime() - lap.startDate.getTime()) / 1000 - lap.getDuration().getValue())); lapArray.push(lap); return lapArray; }, []); // Add the laps to the belonging activity. If a lap starts or stops at the activity date delta then it belong to the acitvity // @todo move laps to event so we don't have cross border laps to acivities and decouple them activities.forEach(function (activity) { laps .filter(function (lap) { // If the lap start belongs to the activity if (lap.startDate <= activity.endDate && lap.startDate >= activity.startDate) { return true; } // if the lap end belongs also... if (lap.endDate >= activity.startDate && lap.endDate <= activity.endDate) { return true; } return false; }) .forEach(function (activityLap) { activity.addLap(activityLap); }); }); // Add the samples that belong to the activity and the ibi data. activities.forEach(function (activity) { // Get the samples that belong to this activity var activitySamples = eventJSONObject.DeviceLog.Samples.filter(function (sample) { return new Date(sample.TimeISO8601) >= activity.startDate && new Date(sample.TimeISO8601) <= activity.endDate; }); // debugger; // Check if there is fused Location activity.addStat(new data_fused_location_1.DataFusedLocation(false)); activity.addStat(new data_fused_location_1.DataFusedLocation(activitySamples.filter(function (sample) { return _this.hasFusedLocData(sample); }).length > 0)); // Should filter on type and create the samples _this.setStreamsForActivity(activity, activitySamples); }); // Add the ibiData if (eventJSONObject.DeviceLog['R-R'] && eventJSONObject.DeviceLog['R-R'].Data) { // prepare the data array per activity removing the offset activities.forEach(function (activity) { var timeSum = 0; var ibiData = eventJSONObject.DeviceLog['R-R'].Data.filter(function (ibi) { timeSum += ibi; var ibiDataDate = new Date(activities[0].startDate.getTime() + timeSum); return ibiDataDate >= activity.startDate && ibiDataDate <= activity.endDate; }); // set the HR // @todo perhaps create new 'types' var existingHRStream = activity.getAllStreams().find(function (stream) { return stream.type === data_heart_rate_1.DataHeartRate.type; }); if (existingHRStream) { activity.removeStream(existingHRStream); } _this.setStreamsForActivity(activity, _this.getHRSamplesFromIBIData(activity, ibiData)); activity.addStream(new ibi_stream_1.IBIStream(ibiData)); }); } // Create an event // @todo check if start and end date can derive from the json var event = new event_1.Event('', activities[0].startDate, activities[activities.length - 1].endDate); activities.forEach(function (activity) { return event.addActivity(activity); }); // Populate the event stats from the Header Object // @todo maybe remove _this.getStats(eventJSONObject.DeviceLog.Header).forEach(function (stat) { event.addStat(stat); }); // Get the settings and add it to all activities as it's logical if (eventJSONObject.DeviceLog.Header.Settings) { _this.getSettings(eventJSONObject.DeviceLog.Header.Settings).forEach(function (stat) { event.getActivities().forEach(function (activity) { return activity.addStat(stat); }); }); } if (activities.length === 1) { var stats = _this.getStats(eventJSONObject.DeviceLog.Header).filter(function (stat) { return stat instanceof data_steps_1.DataSteps || stat instanceof data_vo2_max_1.DataVO2Max || stat instanceof data_device_location_1.DataDeviceLocation || stat instanceof data_pool_length_1.DataPoolLength; }); stats.forEach(function (stat) { return activities[0].addStat(stat); }); } // @todo see how we can have those event stats persisted as the below generation wipes those off. // Generate stats event_utilities_1.EventUtilities.generateStatsForAll(event); resolve(event); }); }; EventImporterSuuntoJSON.hasFusedLocData = function (sample) { return !!sample.Inertial || !!sample.GpsRef; }; EventImporterSuuntoJSON.setIntensityZones = function (activity, object) { exports.SuuntoIntensityZonesMapper.forEach(function (intensityZonesMap) { if (!object[intensityZonesMap.sampleField]) { return; } var zones = new intensity_zones_1.IntensityZones(intensityZonesMap.dataType); zones.zone1Duration = object[intensityZonesMap.sampleField].Zone1Duration; zones.zone2Duration = object[intensityZonesMap.sampleField].Zone2Duration; zones.zone2LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone2LowerLimit); zones.zone3Duration = object[intensityZonesMap.sampleField].Zone3Duration; zones.zone3LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone3LowerLimit); zones.zone4Duration = object[intensityZonesMap.sampleField].Zone4Duration; zones.zone4LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone4LowerLimit); zones.zone5Duration = object[intensityZonesMap.sampleField].Zone5Duration; zones.zone5LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone5LowerLimit); activity.intensityZones.push(zones); switch (intensityZonesMap.dataType) { case data_heart_rate_1.DataHeartRate.type: activity.addStat(new data_heart_rate_zone_one_duration_1.DataHeartRateZoneOneDuration(zones.zone1Duration)); activity.addStat(new data_heart_rate_zone_two_duration_1.DataHeartRateZoneTwoDuration(zones.zone2Duration)); activity.addStat(new data_heart_rate_zone_three_duration_1.DataHeartRateZoneThreeDuration(zones.zone3Duration)); activity.addStat(new data_heart_rate_zone_four_duration_1.DataHeartRateZoneFourDuration(zones.zone4Duration)); activity.addStat(new data_heart_rate_zone_five_duration_1.DataHeartRateZoneFiveDuration(zones.zone5Duration)); break; case data_power_1.DataPower.type: activity.addStat(new data_power_zone_one_duration_1.DataPowerZoneOneDuration(zones.zone1Duration)); activity.addStat(new data_power_zone_two_duration_1.DataPowerZoneTwoDuration(zones.zone2Duration)); activity.addStat(new data_power_zone_three_duration_1.DataPowerZoneThreeDuration(zones.zone3Duration)); activity.addStat(new data_power_zone_four_duration_1.DataPowerZoneFourDuration(zones.zone4Duration)); activity.addStat(new data_power_zone_five_duration_1.DataPowerZoneFiveDuration(zones.zone5Duration)); break; case data_speed_1.DataSpeed.type: activity.addStat(new data_speed_zone_one_duration_1.DataSpeedZoneOneDuration(zones.zone1Duration)); activity.addStat(new data_speed_zone_two_duration_1.DataSpeedZoneTwoDuration(zones.zone2Duration)); activity.addStat(new data_speed_zone_three_duration_1.DataSpeedZoneThreeDuration(zones.zone3Duration)); activity.addStat(new data_speed_zone_four_duration_1.DataSpeedZoneFourDuration(zones.zone4Duration)); activity.addStat(new data_speed_zone_five_duration_1.DataSpeedZoneFiveDuration(zones.zone5Duration)); break; } }); }; EventImporterSuuntoJSON.getHRSamplesFromIBIData = function (activity, ibiData) { // activity.ibiData = new IBIData(ibiData); // @todo optimize // Create a second IBIData so we can have filtering on those with keeping the original var samples = []; new data_ibi_1.IBIData(ibiData) .lowLimitBPMFilter() .highLimitBPMFilter() .movingMedianFilter() .lowPassFilter() .getAsBPM() .forEach(function (value, key, map) { samples.push({ TimeISO8601: new Date(activity.startDate.getTime() + key).toISOString(), HR: value / 60 }); }); return samples; }; EventImporterSuuntoJSON.setStreamsForActivity = function (activity, samples) { exports.SuuntoSampleMapper.forEach(function (sampleMapping) { var subjectSamples = samples.filter(function (sample) { return helpers_1.isNumberOrString(sample[sampleMapping.sampleField]); }); if (subjectSamples.length) { activity.addStream(activity.createStream(sampleMapping.dataType)); subjectSamples.forEach(function (subjectSample) { activity.addDataToStream(sampleMapping.dataType, new Date(subjectSample.TimeISO8601), sampleMapping.convertSampleValue(subjectSample[sampleMapping.sampleField])); }); } }); }; EventImporterSuuntoJSON.getSettings = function (settings) { var stats = []; exports.SuuntoSettingsMapper.forEach(function (settingsMapping) { if (settingsMapping.getValue(settings) !== null && settingsMapping.getValue(settings) !== undefined) { stats.push(data_store_1.DynamicDataLoader.getDataInstanceFromDataType(settingsMapping.dataType, settingsMapping.getValue(settings))); } }); return stats; }; // @todo convert this to a mapping as well EventImporterSuuntoJSON.getStats = function (object) { var stats = []; if (helpers_1.isNumber(object.Distance)) { stats.push(new data_distance_1.DataDistance(object.Distance)); } if (helpers_1.isNumberOrString(object.AscentTime)) { stats.push(new data_ascent_time_1.DataAscentTime(object.AscentTime)); } if (helpers_1.isNumberOrString(object.DescentTime)) { stats.push(new data_descent_time_1.DataDescentTime(object.DescentTime)); } if (helpers_1.isNumberOrString(object.Ascent)) { stats.push(new data_ascent_1.DataAscent(object.Ascent)); } if (helpers_1.isNumberOrString(object.Descent)) { stats.push(new data_descent_1.DataDescent(object.Descent)); } if (helpers_1.isNumberOrString(object.StepCount)) { stats.push(new data_steps_1.DataSteps(object.StepCount)); } if (helpers_1.isNumberOrString(object.MAXVO2)) { stats.push(new data_vo2_max_1.DataVO2Max(object.MAXVO2)); } if (helpers_1.isNumberOrString(object.PoolLength)) { stats.push(new data_pool_length_1.DataPoolLength(object.PoolLength)); } if (helpers_1.isNumberOrString(object.DeviceLocation)) { stats.push(new data_device_location_1.DataDeviceLocation(object.DeviceLocation)); } if (helpers_1.isNumberOrString(object.EPOC)) { stats.push(new data_epoc_1.DataEPOC(object.EPOC)); } if (helpers_1.isNumberOrString(object.Energy)) { stats.push(new data_energy_1.DataEnergy((object.Energy * 0.239) / 1000)); } if (helpers_1.isNumberOrString(object.Feeling)) { stats.push(new data_feeling_1.DataFeeling(object.Feeling)); } if (helpers_1.isNumberOrString(object.PeakTrainingEffect)) { stats.push(new data_total_training_effect_1.DataTotalTrainingEffect(object.PeakTrainingEffect)); } if (helpers_1.isNumberOrString(object.RecoveryTime)) { stats.push(new data_recovery_time_1.DataRecoveryTime(object.RecoveryTime)); } if (helpers_1.isNumberOrString(object.MAXVO2)) { stats.push(new data_vo2_max_1.DataVO2Max(object.MAXVO2)); } var pauseDuration = 0; if (helpers_1.isNumberOrString(object.PauseDuration)) { pauseDuration = object.PauseDuration; } stats.push(new data_pause_1.DataPause(pauseDuration)); stats.push(new data_duration_1.DataDuration(object.Duration - pauseDuration)); // double case if (Array.isArray(object.Altitude)) { if (helpers_1.isNumber(object.Altitude[0].Avg)) { stats.push(new data_altitude_avg_1.DataAltitudeAvg(object.Altitude[0].Avg)); } if (helpers_1.isNumber(object.Altitude[0].Max)) { stats.push(new data_altitude_max_1.DataAltitudeMax(object.Altitude[0].Max)); } if (helpers_1.isNumber(object.Altitude[0].Min)) { stats.push(new data_altitude_min_1.DataAltitudeMin(object.Altitude[0].Min)); } } else if (object.Altitude) { if (helpers_1.isNumber(object.Altitude.Max)) { stats.push(new data_altitude_max_1.DataAltitudeMax(object.Altitude.Max)); } if (helpers_1.isNumber(object.Altitude.Min)) { stats.push(new data_altitude_min_1.DataAltitudeMin(object.Altitude.Min)); } } if (Array.isArray(object.HR)) { if (helpers_1.isNumber(object.HR[0].Avg)) { stats.push(new data_heart_rate_avg_1.DataHeartRateAvg(object.HR[0].Avg * 60)); } if (helpers_1.isNumber(object.HR[0].Max)) { stats.push(new data_heart_rate_max_1.DataHeartRateMax(object.HR[0].Max * 60)); } if (helpers_1.isNumber(object.HR[0].Min)) { stats.push(new data_heart_rate_min_1.DataHeartRateMin(object.HR[0].Min * 60)); } } if (Array.isArray(object.Cadence)) { if (helpers_1.isNumber(object.Cadence[0].Avg)) { stats.push(new data_cadence_avg_1.DataCadenceAvg(object.Cadence[0].Avg * 60)); } if (helpers_1.isNumber(object.Cadence[0].Max)) { stats.push(new data_cadence_max_1.DataCadenceMax(object.Cadence[0].Max * 60)); } if (helpers_1.isNumber(object.Cadence[0].Min)) { stats.push(new data_cadence_min_1.DataCadenceMin(object.Cadence[0].Min * 60)); } } if (Array.isArray(object.Power)) { if (helpers_1.isNumber(object.Power[0].Avg)) { stats.push(new data_power_avg_1.DataPowerAvg(object.Power[0].Avg)); } if (helpers_1.isNumber(object.Power[0].Max)) { stats.push(new data_power_max_1.DataPowerMax(object.Power[0].Max)); } if (helpers_1.isNumber(object.Power[0].Min)) { stats.push(new data_power_min_1.DataPowerMin(object.Power[0].Min)); } } if (Array.isArray(object.Speed)) { if (helpers_1.isNumber(object.Speed[0].Avg)) { stats.push(new data_speed_avg_1.DataSpeedAvg(object.Speed[0].Avg)); stats.push(new data_pace_avg_1.DataPaceAvg(helpers_1.convertSpeedToPace(object.Speed[0].Avg))); } if (helpers_1.isNumber(object.Speed[0].Max)) { stats.push(new data_speed_max_1.DataSpeedMax(object.Speed[0].Max)); stats.push(new data_pace_max_1.DataPaceMax(helpers_1.convertSpeedToPace(object.Speed[0].Max))); } if (helpers_1.isNumber(object.Speed[0].Min)) { stats.push(new data_speed_min_1.DataSpeedMin(object.Speed[0].Min)); stats.push(new data_pace_min_1.DataPaceMin(helpers_1.convertSpeedToPace(object.Speed[0].Min))); } } if (Array.isArray(object.Temperature)) { if (helpers_1.isNumber(object.Temperature[0].Avg)) { stats.push(new data_temperature_avg_1.DataTemperatureAvg(object.Temperature[0].Avg - 273.15)); } if (helpers_1.isNumber(object.Temperature[0].Max)) { stats.push(new data_temperature_max_1.DataTemperatureMax(object.Temperature[0].Max - 273.15)); } if (object.Temperature[0].Min !== null) { stats.push(new data_temperature_min_1.DataTemperatureMin(object.Temperature[0].Min - 273.15)); } } if (object.hasOwnProperty('VerticalSpeed')) { // Double action here if (Array.isArray(object.VerticalSpeed)) { if (helpers_1.isNumber(object.VerticalSpeed[0].Avg)) { stats.push(new data_vertical_speed_avg_1.DataVerticalSpeedAvg(object.VerticalSpeed[0].Avg)); } if (helpers_1.isNumber(object.VerticalSpeed[0].Max)) { stats.push(new data_vertical_speed_max_1.DataVerticalSpeedMax(object.VerticalSpeed[0].Max)); } if (helpers_1.isNumber(object.VerticalSpeed[0].Min)) { stats.push(new data_vertical_speed_min_1.DataVerticalSpeedMin(object.VerticalSpeed[0].Min)); } } else { if (helpers_1.isNumber(object.VerticalSpeed)) { stats.push(new data_vertical_speed_avg_1.DataVerticalSpeedAvg(object.VerticalSpeed)); } } } return stats; }; return EventImporterSuuntoJSON; }()); exports.EventImporterSuuntoJSON = EventImporterSuuntoJSON; exports.SuuntoSettingsMapper = [ { dataType: data_alti_baro_profile_1.DataAltiBaroProfile.type, getValue: function (settings) { return settings['AltiBaroProfile']; } }, { dataType: data_auto_lap_distance_1.DataAutoLapDistance.type, getValue: function (settings) { if (!settings['AutoLap']) { return null; } return settings['AutoLap']['Distance']; } }, { dataType: data_auto_lap_duration_1.DataAutoLapDuration.type, getValue: function (settings) { if (!settings['AutoLap']) { return null; } return settings['AutoLap']['Duration']; } }, { dataType: data_auto_pause_used_1.DataAutoPauseUsed.type, getValue: function (settings) { if (!settings['AutoPause']) { return null; } return settings['AutoPause']['Enabled']; } }, { dataType: data_bike_pod_used_1.DataBikePodUsed.type, getValue: function (settings) { return settings['BikePodUsed']; } }, { dataType: data_enabled_navigation_systems_1.DataEnabledNavigationSystems.type, getValue: function (settings) { return settings['EnabledNavigationSystems']; } }, { dataType: data_foot_pod_used_1.DataFootPodUsed.type, getValue: function (settings) { return settings['FootPodUsed']; } }, // { // dataType: DataFusedAltitude.type, // getValue: (settings: any) => { // return settings['FusedAltiUsed']; // }, // }, { dataType: data_heart_rate_used_1.DataHeartRateUsed.type, getValue: function (settings) { return settings['HrUsed']; } }, { dataType: data_power_pod_used_1.DataPowerPodUsed.type, getValue: function (settings) { return settings['PowerPodUsed']; } } ]; exports.SuuntoIntensityZonesMapper = [ { dataType: data_heart_rate_1.DataHeartRate.type, sampleField: 'HrZones', convertSampleValue: function (value) { return Number(value * 60); } }, { dataType: data_power_1.DataPower.type, sampleField: 'PowerZones', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_speed_1.DataSpeed.type, sampleField: 'SpeedZones', convertSampleValue: function (value) { return Number(value); } } ]; exports.SuuntoSampleMapper = [ { dataType: data_latitude_degrees_1.DataLatitudeDegrees.type, sampleField: 'Latitude', convertSampleValue: function (value) { return Number(value * (180 / Math.PI)); } }, { dataType: data_longitude_degrees_1.DataLongitudeDegrees.type, sampleField: 'Longitude', convertSampleValue: function (value) { return Number(value * (180 / Math.PI)); } }, { dataType: data_heart_rate_1.DataHeartRate.type, sampleField: 'HR', convertSampleValue: function (value) { return Number(value * 60); } }, { dataType: data_distance_1.DataDistance.type, sampleField: 'Distance', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_absolute_pressure_1.DataAbsolutePressure.type, sampleField: 'AbsPressure', convertSampleValue: function (value) { return Number(value / 100); } }, { dataType: data_sea_level_pressure_1.DataSeaLevelPressure.type, sampleField: 'SeaLevelPressure', convertSampleValue: function (value) { return Number(value / 100); } }, { dataType: data_altitude_gps_1.DataGPSAltitude.type, sampleField: 'GPSAltitude', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_altitude_1.DataAltitude.type, sampleField: 'Altitude', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_cadence_1.DataCadence.type, sampleField: 'Cadence', convertSampleValue: function (value) { return Number(value * 60); } }, { dataType: data_power_1.DataPower.type, sampleField: 'Power', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_speed_1.DataSpeed.type, sampleField: 'Speed', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_temperature_1.DataTemperature.type, sampleField: 'Temperature', convertSampleValue: function (value) { return Number(value - 273.15); } }, { dataType: data_vertical_speed_1.DataVerticalSpeed.type, sampleField: 'VerticalSpeed', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_ehpe_1.DataEHPE.type, sampleField: 'EHPE', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_evpe_1.DataEVPE.type, sampleField: 'EVPE', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_number_of_satellites_1.DataNumberOfSatellites.type, sampleField: 'NumberOfSatellites', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_satellite_5_best_snr_1.DataSatellite5BestSNR.type, sampleField: 'Satellite5BestSNR', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_battery_charge_1.DataBatteryCharge.type, sampleField: 'BatteryCharge', convertSampleValue: function (value) { return Number(value * 100); } }, { dataType: data_battery_current_1.DataBatteryCurrent.type, sampleField: 'BatteryCurrent', convertSampleValue: function (value) { return Number(value); } }, { dataType: data_battery_voltage_1.DataBatteryVoltage.type, sampleField: 'BatteryVoltage', convertSampleValue: function (value) { return Number(value); } } ];