@sports-alliance/sports-lib 7.0.8 → 7.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/lib/esm/index.js +12034 -152
  2. package/package.json +2 -2
  3. package/lib/esm/activities/activity-parsing-options.js +0 -19
  4. package/lib/esm/activities/activity.interface.js +0 -1
  5. package/lib/esm/activities/activity.js +0 -281
  6. package/lib/esm/activities/activity.json.interface.js +0 -1
  7. package/lib/esm/activities/activity.spec.js +0 -348
  8. package/lib/esm/activities/activity.types.js +0 -1046
  9. package/lib/esm/activities/activityt-types.spec.js +0 -16
  10. package/lib/esm/activities/devices/device.interface.js +0 -1
  11. package/lib/esm/activities/devices/device.js +0 -26
  12. package/lib/esm/activities/devices/device.json.interface.js +0 -1
  13. package/lib/esm/constants/constants.js +0 -8
  14. package/lib/esm/creators/creator.interface.js +0 -1
  15. package/lib/esm/creators/creator.js +0 -37
  16. package/lib/esm/creators/creator.json.interface.js +0 -1
  17. package/lib/esm/creators/creator.spec.js +0 -25
  18. package/lib/esm/data/data-active-lap.js +0 -4
  19. package/lib/esm/data/data-active-lengths.js +0 -4
  20. package/lib/esm/data/data-aerobic-training-effect.js +0 -8
  21. package/lib/esm/data/data-anaerobic-training-effect.js +0 -8
  22. package/lib/esm/data/data-stance-time-balance-left.js +0 -4
  23. package/lib/esm/data/data-stance-time-balance-right.js +0 -4
  24. package/lib/esm/data/data-stance-time-balance.js +0 -3
  25. package/lib/esm/data/data-store.spec.js +0 -78
  26. package/lib/esm/data/data-total-cycles.js +0 -4
  27. package/lib/esm/data/data.absolute-pressure.js +0 -5
  28. package/lib/esm/data/data.accumulated-power.js +0 -8
  29. package/lib/esm/data/data.activity-types.js +0 -7
  30. package/lib/esm/data/data.air-power-avg.js +0 -4
  31. package/lib/esm/data/data.air-power-max.js +0 -4
  32. package/lib/esm/data/data.air-power-min.js +0 -4
  33. package/lib/esm/data/data.air-power.js +0 -8
  34. package/lib/esm/data/data.alti-baro-profile.js +0 -4
  35. package/lib/esm/data/data.altitude-avg.js +0 -4
  36. package/lib/esm/data/data.altitude-gps.js +0 -5
  37. package/lib/esm/data/data.altitude-max.js +0 -4
  38. package/lib/esm/data/data.altitude-min.js +0 -4
  39. package/lib/esm/data/data.altitude-smooth.js +0 -4
  40. package/lib/esm/data/data.altitude.js +0 -8
  41. package/lib/esm/data/data.array.js +0 -13
  42. package/lib/esm/data/data.ascent-time.js +0 -4
  43. package/lib/esm/data/data.ascent.js +0 -4
  44. package/lib/esm/data/data.auto-lap-distance.js +0 -5
  45. package/lib/esm/data/data.auto-lap-duration.js +0 -4
  46. package/lib/esm/data/data.auto-lap-used.js +0 -7
  47. package/lib/esm/data/data.auto-pause-used.js +0 -7
  48. package/lib/esm/data/data.avg-stride-length.js +0 -4
  49. package/lib/esm/data/data.balance.js +0 -6
  50. package/lib/esm/data/data.bare.js +0 -4
  51. package/lib/esm/data/data.battery-charge.js +0 -8
  52. package/lib/esm/data/data.battery-consumption.js +0 -8
  53. package/lib/esm/data/data.battery-current.js +0 -8
  54. package/lib/esm/data/data.battery-life-estimation.js +0 -4
  55. package/lib/esm/data/data.battery-voltage.js +0 -8
  56. package/lib/esm/data/data.bike-pod-used.js +0 -7
  57. package/lib/esm/data/data.boolean.js +0 -9
  58. package/lib/esm/data/data.cadence-avg.js +0 -4
  59. package/lib/esm/data/data.cadence-max.js +0 -4
  60. package/lib/esm/data/data.cadence-min.js +0 -4
  61. package/lib/esm/data/data.cadence.js +0 -8
  62. package/lib/esm/data/data.cycling-dynamics.js +0 -3
  63. package/lib/esm/data/data.cycling-position.js +0 -37
  64. package/lib/esm/data/data.cycling-seated-time.js +0 -5
  65. package/lib/esm/data/data.cycling-standing-time.js +0 -5
  66. package/lib/esm/data/data.descent-time.js +0 -4
  67. package/lib/esm/data/data.descent.js +0 -4
  68. package/lib/esm/data/data.description.js +0 -4
  69. package/lib/esm/data/data.device-location.js +0 -4
  70. package/lib/esm/data/data.device-names.js +0 -7
  71. package/lib/esm/data/data.distance.js +0 -15
  72. package/lib/esm/data/data.duration.js +0 -56
  73. package/lib/esm/data/data.ehpe.js +0 -5
  74. package/lib/esm/data/data.enabled-navigation-systems.js +0 -4
  75. package/lib/esm/data/data.end-altitude.js +0 -4
  76. package/lib/esm/data/data.end-position.js +0 -4
  77. package/lib/esm/data/data.energy.js +0 -8
  78. package/lib/esm/data/data.epoc.js +0 -5
  79. package/lib/esm/data/data.event.js +0 -3
  80. package/lib/esm/data/data.evpe.js +0 -4
  81. package/lib/esm/data/data.feeling.js +0 -15
  82. package/lib/esm/data/data.foot-pod-used.js +0 -7
  83. package/lib/esm/data/data.form-power.js +0 -4
  84. package/lib/esm/data/data.fused-altitude.js +0 -7
  85. package/lib/esm/data/data.fused-location.js +0 -7
  86. package/lib/esm/data/data.gnss-distance.js +0 -4
  87. package/lib/esm/data/data.grade-adjusted-pace-avg.js +0 -15
  88. package/lib/esm/data/data.grade-adjusted-pace-max.js +0 -15
  89. package/lib/esm/data/data.grade-adjusted-pace-min.js +0 -15
  90. package/lib/esm/data/data.grade-adjusted-pace.js +0 -25
  91. package/lib/esm/data/data.grade-adjusted-speed-avg.js +0 -46
  92. package/lib/esm/data/data.grade-adjusted-speed-max.js +0 -46
  93. package/lib/esm/data/data.grade-adjusted-speed-min.js +0 -46
  94. package/lib/esm/data/data.grade-adjusted-speed.js +0 -78
  95. package/lib/esm/data/data.grade-smooth.js +0 -7
  96. package/lib/esm/data/data.grade.js +0 -7
  97. package/lib/esm/data/data.ground-time.js +0 -8
  98. package/lib/esm/data/data.heart-rate-avg.js +0 -4
  99. package/lib/esm/data/data.heart-rate-max.js +0 -4
  100. package/lib/esm/data/data.heart-rate-min.js +0 -4
  101. package/lib/esm/data/data.heart-rate-used.js +0 -7
  102. package/lib/esm/data/data.heart-rate-zone-five-duration.js +0 -4
  103. package/lib/esm/data/data.heart-rate-zone-four-duration.js +0 -4
  104. package/lib/esm/data/data.heart-rate-zone-one-duration.js +0 -4
  105. package/lib/esm/data/data.heart-rate-zone-three-duration.js +0 -4
  106. package/lib/esm/data/data.heart-rate-zone-two-duration.js +0 -4
  107. package/lib/esm/data/data.heart-rate.js +0 -8
  108. package/lib/esm/data/data.ibi.js +0 -8
  109. package/lib/esm/data/data.interface.js +0 -5
  110. package/lib/esm/data/data.js +0 -62
  111. package/lib/esm/data/data.json.interface.js +0 -1
  112. package/lib/esm/data/data.latitude-degrees.js +0 -5
  113. package/lib/esm/data/data.left-balance.js +0 -4
  114. package/lib/esm/data/data.leg-stiffness.js +0 -16
  115. package/lib/esm/data/data.longitude-degrees.js +0 -5
  116. package/lib/esm/data/data.moving-time.js +0 -4
  117. package/lib/esm/data/data.number-of-satellites.js +0 -7
  118. package/lib/esm/data/data.number-of.samples.js +0 -4
  119. package/lib/esm/data/data.number.js +0 -13
  120. package/lib/esm/data/data.pace-avg.js +0 -8
  121. package/lib/esm/data/data.pace-max.js +0 -8
  122. package/lib/esm/data/data.pace-min.js +0 -8
  123. package/lib/esm/data/data.pace.js +0 -46
  124. package/lib/esm/data/data.pause.js +0 -4
  125. package/lib/esm/data/data.peak-epoc.js +0 -7
  126. package/lib/esm/data/data.peak-training-effect.js +0 -4
  127. package/lib/esm/data/data.percent.js +0 -4
  128. package/lib/esm/data/data.pool-length.js +0 -5
  129. package/lib/esm/data/data.position.interface.js +0 -1
  130. package/lib/esm/data/data.position.js +0 -18
  131. package/lib/esm/data/data.power-avg.js +0 -4
  132. package/lib/esm/data/data.power-down.js +0 -4
  133. package/lib/esm/data/data.power-intensity-factor.js +0 -5
  134. package/lib/esm/data/data.power-left.js +0 -4
  135. package/lib/esm/data/data.power-max.js +0 -4
  136. package/lib/esm/data/data.power-min.js +0 -4
  137. package/lib/esm/data/data.power-normalized.js +0 -4
  138. package/lib/esm/data/data.power-pedal-smoothness-left.js +0 -4
  139. package/lib/esm/data/data.power-pedal-smoothness-right.js +0 -4
  140. package/lib/esm/data/data.power-pod-used.js +0 -7
  141. package/lib/esm/data/data.power-right.js +0 -4
  142. package/lib/esm/data/data.power-torque-effectiveness-left.js +0 -4
  143. package/lib/esm/data/data.power-torque-effectiveness-right.js +0 -4
  144. package/lib/esm/data/data.power-training-stress-score.js +0 -5
  145. package/lib/esm/data/data.power-up.js +0 -4
  146. package/lib/esm/data/data.power-work.js +0 -5
  147. package/lib/esm/data/data.power-zone-five-duration.js +0 -4
  148. package/lib/esm/data/data.power-zone-four-duration.js +0 -4
  149. package/lib/esm/data/data.power-zone-one-duration.js +0 -4
  150. package/lib/esm/data/data.power-zone-three-duration.js +0 -4
  151. package/lib/esm/data/data.power-zone-two-duration.js +0 -4
  152. package/lib/esm/data/data.power.js +0 -8
  153. package/lib/esm/data/data.recovery-time.js +0 -7
  154. package/lib/esm/data/data.rider-position-change-event.js +0 -8
  155. package/lib/esm/data/data.right-balance.js +0 -4
  156. package/lib/esm/data/data.rpe.js +0 -23
  157. package/lib/esm/data/data.satellite-5-best-snr.js +0 -4
  158. package/lib/esm/data/data.sea-level-pressure.js +0 -5
  159. package/lib/esm/data/data.spec.js +0 -25
  160. package/lib/esm/data/data.speed-avg.js +0 -46
  161. package/lib/esm/data/data.speed-max.js +0 -46
  162. package/lib/esm/data/data.speed-min.js +0 -46
  163. package/lib/esm/data/data.speed-zone-five-duration.js +0 -4
  164. package/lib/esm/data/data.speed-zone-four-duration.js +0 -4
  165. package/lib/esm/data/data.speed-zone-one-duration.js +0 -4
  166. package/lib/esm/data/data.speed-zone-three-duration.js +0 -4
  167. package/lib/esm/data/data.speed-zone-two-duration.js +0 -4
  168. package/lib/esm/data/data.speed.js +0 -88
  169. package/lib/esm/data/data.sport-profile-name.js +0 -4
  170. package/lib/esm/data/data.stance-time.js +0 -5
  171. package/lib/esm/data/data.start-altitude.js +0 -4
  172. package/lib/esm/data/data.start-event.js +0 -4
  173. package/lib/esm/data/data.start-position.js +0 -4
  174. package/lib/esm/data/data.step-length.js +0 -4
  175. package/lib/esm/data/data.steps-old.js +0 -4
  176. package/lib/esm/data/data.steps.js +0 -4
  177. package/lib/esm/data/data.stop-all-event.js +0 -4
  178. package/lib/esm/data/data.stop-event.js +0 -4
  179. package/lib/esm/data/data.store.export.spec.js +0 -66
  180. package/lib/esm/data/data.store.js +0 -1213
  181. package/lib/esm/data/data.string.js +0 -13
  182. package/lib/esm/data/data.stryd-altitude.js +0 -4
  183. package/lib/esm/data/data.stryd-distance.js +0 -4
  184. package/lib/esm/data/data.stryd-speed.js +0 -4
  185. package/lib/esm/data/data.swim-pace-avg.js +0 -8
  186. package/lib/esm/data/data.swim-pace-max.js +0 -8
  187. package/lib/esm/data/data.swim-pace-min.js +0 -8
  188. package/lib/esm/data/data.swim-pace.js +0 -19
  189. package/lib/esm/data/data.swolf-25m.js +0 -4
  190. package/lib/esm/data/data.swolf-50m.js +0 -4
  191. package/lib/esm/data/data.target-distance.js +0 -4
  192. package/lib/esm/data/data.target-heart-rate-zone.js +0 -4
  193. package/lib/esm/data/data.target-power-zone.js +0 -4
  194. package/lib/esm/data/data.target-speed-zone.js +0 -4
  195. package/lib/esm/data/data.target-time.js +0 -4
  196. package/lib/esm/data/data.temperature-avg.js +0 -4
  197. package/lib/esm/data/data.temperature-max.js +0 -4
  198. package/lib/esm/data/data.temperature-min.js +0 -4
  199. package/lib/esm/data/data.temperature.js +0 -8
  200. package/lib/esm/data/data.time.js +0 -6
  201. package/lib/esm/data/data.timer-time.js +0 -4
  202. package/lib/esm/data/data.vertical-oscillation.js +0 -5
  203. package/lib/esm/data/data.vertical-ratio.js +0 -5
  204. package/lib/esm/data/data.vertical-speed-avg.js +0 -53
  205. package/lib/esm/data/data.vertical-speed-max.js +0 -53
  206. package/lib/esm/data/data.vertical-speed-min.js +0 -53
  207. package/lib/esm/data/data.vertical-speed.js +0 -103
  208. package/lib/esm/data/data.vo2-max.js +0 -7
  209. package/lib/esm/data/ibi/data.ibi.filters.js +0 -52
  210. package/lib/esm/data/ibi/data.ibi.js +0 -98
  211. package/lib/esm/data/ibi/data.ibi.spec.js +0 -66
  212. package/lib/esm/duration/duration.class.abstract.js +0 -36
  213. package/lib/esm/duration/duration.class.interface.js +0 -1
  214. package/lib/esm/errors/duration-exceeded-event-lib.error.js +0 -9
  215. package/lib/esm/errors/empty-event-sports-libs.error.js +0 -9
  216. package/lib/esm/errors/event-lib.error.js +0 -8
  217. package/lib/esm/errors/lib.error.js +0 -6
  218. package/lib/esm/errors/parsing-event-lib.error.js +0 -9
  219. package/lib/esm/events/adapters/exporters/exporter.gpx.js +0 -75
  220. package/lib/esm/events/adapters/exporters/exporter.interface.js +0 -1
  221. package/lib/esm/events/adapters/exporters/exporter.json.js +0 -20
  222. package/lib/esm/events/adapters/file-type.enum.js +0 -7
  223. package/lib/esm/events/adapters/importers/fit/importer.fit.ant-plus.device.names.js +0 -25
  224. package/lib/esm/events/adapters/importers/fit/importer.fit.coros.device.names.js +0 -5
  225. package/lib/esm/events/adapters/importers/fit/importer.fit.development.device.names.js +0 -4
  226. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.device.names.js +0 -462
  227. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.data.js +0 -877
  228. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.js +0 -106
  229. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.spec.js +0 -32
  230. package/lib/esm/events/adapters/importers/fit/importer.fit.hammerhead.device.names.js +0 -4
  231. package/lib/esm/events/adapters/importers/fit/importer.fit.integration.spec.js +0 -44
  232. package/lib/esm/events/adapters/importers/fit/importer.fit.js +0 -978
  233. package/lib/esm/events/adapters/importers/fit/importer.fit.lezyne.device.names.js +0 -3
  234. package/lib/esm/events/adapters/importers/fit/importer.fit.magellan.device.names.js +0 -5
  235. package/lib/esm/events/adapters/importers/fit/importer.fit.mapper.js +0 -231
  236. package/lib/esm/events/adapters/importers/fit/importer.fit.saris.device.names.js +0 -3
  237. package/lib/esm/events/adapters/importers/fit/importer.fit.spec.js +0 -326
  238. package/lib/esm/events/adapters/importers/fit/importer.fit.srm.device.names.js +0 -7
  239. package/lib/esm/events/adapters/importers/fit/importer.fit.suunto.device.names.js +0 -16
  240. package/lib/esm/events/adapters/importers/fit/importer.fit.wahoo.device.names.js +0 -10
  241. package/lib/esm/events/adapters/importers/gpx/gx-parser.js +0 -36
  242. package/lib/esm/events/adapters/importers/gpx/importer.gpx.integration.spec.js +0 -44
  243. package/lib/esm/events/adapters/importers/gpx/importer.gpx.js +0 -102
  244. package/lib/esm/events/adapters/importers/gpx/importer.gpx.mapper.js +0 -142
  245. package/lib/esm/events/adapters/importers/gpx/importer.gpx.spec.js +0 -71
  246. package/lib/esm/events/adapters/importers/json/importer.json.js +0 -160
  247. package/lib/esm/events/adapters/importers/sample-info.interface.js +0 -1
  248. package/lib/esm/events/adapters/importers/suunto/importer.suunto.activity.ids.js +0 -85
  249. package/lib/esm/events/adapters/importers/suunto/importer.suunto.device.names.js +0 -26
  250. package/lib/esm/events/adapters/importers/suunto/importer.suunto.integration.spec.js +0 -44
  251. package/lib/esm/events/adapters/importers/suunto/importer.suunto.json.js +0 -717
  252. package/lib/esm/events/adapters/importers/suunto/importer.suunto.sml.js +0 -125
  253. package/lib/esm/events/adapters/importers/tcx/importer.tcx.integration.spec.js +0 -46
  254. package/lib/esm/events/adapters/importers/tcx/importer.tcx.js +0 -442
  255. package/lib/esm/events/adapters/importers/tcx/importer.tcx.mapper.js +0 -91
  256. package/lib/esm/events/adapters/importers/tcx/utils.tcx.js +0 -36
  257. package/lib/esm/events/event.interface.js +0 -1
  258. package/lib/esm/events/event.js +0 -123
  259. package/lib/esm/events/event.json.interface.js +0 -1
  260. package/lib/esm/events/event.spec.js +0 -51
  261. package/lib/esm/events/utilities/activity.utilities.js +0 -1841
  262. package/lib/esm/events/utilities/activity.utilities.spec.js +0 -373
  263. package/lib/esm/events/utilities/event.utilities.js +0 -57
  264. package/lib/esm/events/utilities/grade-calculator/grade-calculator.js +0 -121
  265. package/lib/esm/events/utilities/grade-calculator/grade-calculator.spec.js +0 -93
  266. package/lib/esm/events/utilities/grade-calculator/low-pass-filter.js +0 -86
  267. package/lib/esm/events/utilities/helpers.js +0 -162
  268. package/lib/esm/geodesy/adapters/adapter.interface.js +0 -1
  269. package/lib/esm/geodesy/adapters/geolib.adapter.js +0 -28
  270. package/lib/esm/id/id.abstract.class.js +0 -9
  271. package/lib/esm/id/id.class.interface.js +0 -1
  272. package/lib/esm/id/id.class.spec.js +0 -13
  273. package/lib/esm/intensity-zones/intensity-zones.interface.js +0 -1
  274. package/lib/esm/intensity-zones/intensity-zones.js +0 -29
  275. package/lib/esm/intensity-zones/intensity-zones.json.interface.js +0 -1
  276. package/lib/esm/intensity-zones/intensity-zones.spec.js +0 -30
  277. package/lib/esm/laps/lap.interface.js +0 -1
  278. package/lib/esm/laps/lap.js +0 -29
  279. package/lib/esm/laps/lap.json.interface.js +0 -1
  280. package/lib/esm/laps/lap.types.js +0 -52
  281. package/lib/esm/meta-data/event-meta-data.interface.js +0 -6
  282. package/lib/esm/meta-data/meta-data.js +0 -57
  283. package/lib/esm/meta-data/meta-data.json.interface.js +0 -1
  284. package/lib/esm/privacy/privacy.class.interface.js +0 -5
  285. package/lib/esm/serializable/serializable.class.interface.js +0 -1
  286. package/lib/esm/service-tokens/oauth1-service-token.interface.js +0 -1
  287. package/lib/esm/service-tokens/oauth2-service-token.interface.js +0 -1
  288. package/lib/esm/specs/activities-parsing.integration.spec.js +0 -1847
  289. package/lib/esm/specs/activity-duration-stream.integration.spec.js +0 -57
  290. package/lib/esm/specs/fixtures/streams/strava/rides/3171472783.json +0 -52534
  291. package/lib/esm/specs/fixtures/streams/strava/rides/3171487458.json +0 -78818
  292. package/lib/esm/specs/fixtures/streams/strava/rides/343080886.json +0 -105090
  293. package/lib/esm/specs/fixtures/streams/strava/rides/5910143591.json +0 -110711
  294. package/lib/esm/specs/fixtures/streams/strava/runs/2451375851.json +0 -74846
  295. package/lib/esm/specs/fixtures/streams/strava/runs/2709634581.json +0 -66817
  296. package/lib/esm/specs/fixtures/streams/strava/runs/3156040843.json +0 -17594
  297. package/lib/esm/specs/fixtures/streams/strava/runs/3182900697.json +0 -17322
  298. package/lib/esm/specs/fixtures/streams/strava/runs/3183465494.json +0 -20463
  299. package/lib/esm/specs/fixtures/streams/strava/runs/3183490558.json +0 -58202
  300. package/lib/esm/specs/spec-utils.js +0 -159
  301. package/lib/esm/specs/strava-streams-compliance.spec.js +0 -951
  302. package/lib/esm/stats/stats.class.abstract.js +0 -32
  303. package/lib/esm/stats/stats.class.interface.js +0 -1
  304. package/lib/esm/stats/stats.json.interface.js +0 -1
  305. package/lib/esm/streams/compressed.stream.interface.js +0 -12
  306. package/lib/esm/streams/ibi-stream.js +0 -43
  307. package/lib/esm/streams/low-pass.stream.filter.js +0 -9
  308. package/lib/esm/streams/stream.filter.interface.js +0 -1
  309. package/lib/esm/streams/stream.interface.js +0 -1
  310. package/lib/esm/streams/stream.js +0 -72
  311. package/lib/esm/streams/stream.spec.js +0 -168
  312. package/lib/esm/tiles/tile.settings.interface.js +0 -41
  313. package/lib/esm/users/settings/dashboard/user.dashboard.settings.interface.js +0 -13
  314. package/lib/esm/users/settings/user.app.settings.interface.js +0 -5
  315. package/lib/esm/users/settings/user.chart.settings.interface.js +0 -23
  316. package/lib/esm/users/settings/user.map.settings.interface.js +0 -22
  317. package/lib/esm/users/settings/user.my-tracks.settings.interface.js +0 -1
  318. package/lib/esm/users/settings/user.settings.interface.js +0 -1
  319. package/lib/esm/users/settings/user.stats-settings.interface.js +0 -1
  320. package/lib/esm/users/settings/user.summaries.settings.interface.js +0 -1
  321. package/lib/esm/users/settings/user.unit.settings.interface.js +0 -73
  322. package/lib/esm/users/user.account.privileges.interface.js +0 -1
  323. package/lib/esm/users/user.export-to-csv.settings.interface.js +0 -1
  324. package/lib/esm/users/user.interface.js +0 -1
  325. package/lib/esm/users/user.js +0 -38
  326. package/lib/esm/users/user.service.meta.interface.js +0 -1
@@ -1,717 +0,0 @@
1
- import { Event } from '../../../event';
2
- import { Activity } from '../../../../activities/activity';
3
- import { Creator } from '../../../../creators/creator';
4
- import { Lap } from '../../../../laps/lap';
5
- import { DataAltitude } from '../../../../data/data.altitude';
6
- import { DataCadence } from '../../../../data/data.cadence';
7
- import { DataHeartRate } from '../../../../data/data.heart-rate';
8
- import { DataSpeed } from '../../../../data/data.speed';
9
- import { DataVerticalSpeed } from '../../../../data/data.vertical-speed';
10
- import { DataTemperature } from '../../../../data/data.temperature';
11
- import { DataSeaLevelPressure } from '../../../../data/data.sea-level-pressure';
12
- import { DataLatitudeDegrees } from '../../../../data/data.latitude-degrees';
13
- import { DataLongitudeDegrees } from '../../../../data/data.longitude-degrees';
14
- import { DataPower } from '../../../../data/data.power';
15
- import { DataGPSAltitude } from '../../../../data/data.altitude-gps';
16
- import { DataAbsolutePressure } from '../../../../data/data.absolute-pressure';
17
- import { DataEHPE } from '../../../../data/data.ehpe';
18
- import { DataEVPE } from '../../../../data/data.evpe';
19
- import { DataNumberOfSatellites } from '../../../../data/data.number-of-satellites';
20
- import { DataSatellite5BestSNR } from '../../../../data/data.satellite-5-best-snr';
21
- import { IntensityZones } from '../../../../intensity-zones/intensity-zones';
22
- import { IBIData } from '../../../../data/ibi/data.ibi';
23
- import { ImporterSuuntoActivityIds } from './importer.suunto.activity.ids';
24
- import { ImporterSuuntoDeviceNames } from './importer.suunto.device.names';
25
- import { DataDuration } from '../../../../data/data.duration';
26
- import { DataAltitudeMax } from '../../../../data/data.altitude-max';
27
- import { DataDistance } from '../../../../data/data.distance';
28
- import { DataAscentTime } from '../../../../data/data.ascent-time';
29
- import { DataDescentTime } from '../../../../data/data.descent-time';
30
- import { DataDescent } from '../../../../data/data.descent';
31
- import { DataAscent } from '../../../../data/data.ascent';
32
- import { DataEPOC } from '../../../../data/data.epoc';
33
- import { DataEnergy } from '../../../../data/data.energy';
34
- import { DataFeeling } from '../../../../data/data.feeling';
35
- import { DataRecoveryTime } from '../../../../data/data.recovery-time';
36
- import { DataVO2Max } from '../../../../data/data.vo2-max';
37
- import { DataPause } from '../../../../data/data.pause';
38
- import { DataHeartRateAvg } from '../../../../data/data.heart-rate-avg';
39
- import { DataHeartRateMax } from '../../../../data/data.heart-rate-max';
40
- import { DataHeartRateMin } from '../../../../data/data.heart-rate-min';
41
- import { DataCadenceAvg } from '../../../../data/data.cadence-avg';
42
- import { DataCadenceMax } from '../../../../data/data.cadence-max';
43
- import { DataCadenceMin } from '../../../../data/data.cadence-min';
44
- import { DataPowerAvg } from '../../../../data/data.power-avg';
45
- import { DataPowerMax } from '../../../../data/data.power-max';
46
- import { DataPowerMin } from '../../../../data/data.power-min';
47
- import { DataSpeedAvg } from '../../../../data/data.speed-avg';
48
- import { DataSpeedMax } from '../../../../data/data.speed-max';
49
- import { DataSpeedMin } from '../../../../data/data.speed-min';
50
- import { DataTemperatureAvg } from '../../../../data/data.temperature-avg';
51
- import { DataTemperatureMax } from '../../../../data/data.temperature-max';
52
- import { DataTemperatureMin } from '../../../../data/data.temperature-min';
53
- import { DataVerticalSpeedAvg } from '../../../../data/data.vertical-speed-avg';
54
- import { DataVerticalSpeedMax } from '../../../../data/data.vertical-speed-max';
55
- import { DataVerticalSpeedMin } from '../../../../data/data.vertical-speed-min';
56
- import { DataAltitudeAvg } from '../../../../data/data.altitude-avg';
57
- import { DataAltitudeMin } from '../../../../data/data.altitude-min';
58
- import { DataFusedLocation } from '../../../../data/data.fused-location';
59
- import { ActivityTypes } from '../../../../activities/activity.types';
60
- import { LapTypes } from '../../../../laps/lap.types';
61
- import { DataPaceAvg } from '../../../../data/data.pace-avg';
62
- import { DataPaceMax } from '../../../../data/data.pace-max';
63
- import { DataPaceMin } from '../../../../data/data.pace-min';
64
- import { DataFusedAltitude } from '../../../../data/data.fused-altitude';
65
- import { DataBatteryCharge } from '../../../../data/data.battery-charge';
66
- import { DataBatteryCurrent } from '../../../../data/data.battery-current';
67
- import { DataBatteryVoltage } from '../../../../data/data.battery-voltage';
68
- import { convertSpeedToPace, isNumber, isNumberOrString } from '../../../utilities/helpers';
69
- import { EventUtilities } from '../../../utilities/event.utilities';
70
- import { DataAltiBaroProfile } from '../../../../data/data.alti-baro-profile';
71
- import { DataAutoLapDistance } from '../../../../data/data.auto-lap-distance';
72
- import { DataAutoLapDuration } from '../../../../data/data.auto-lap-duration';
73
- import { DataAutoPauseUsed } from '../../../../data/data.auto-pause-used';
74
- import { DataBikePodUsed } from '../../../../data/data.bike-pod-used';
75
- import { DataEnabledNavigationSystems } from '../../../../data/data.enabled-navigation-systems';
76
- import { DataFootPodUsed } from '../../../../data/data.foot-pod-used';
77
- import { DataHeartRateUsed } from '../../../../data/data.heart-rate-used';
78
- import { DataPowerPodUsed } from '../../../../data/data.power-pod-used';
79
- import { DynamicDataLoader } from '../../../../data/data.store';
80
- import { IBIStream } from '../../../../streams/ibi-stream';
81
- import { DataSteps } from '../../../../data/data.steps';
82
- import { DataPoolLength } from '../../../../data/data.pool-length';
83
- import { DataDeviceLocation } from '../../../../data/data.device-location';
84
- import { DataAerobicTrainingEffect } from '../../../../data/data-aerobic-training-effect';
85
- import { DataHeartRateZoneOneDuration } from '../../../../data/data.heart-rate-zone-one-duration';
86
- import { DataHeartRateZoneTwoDuration } from '../../../../data/data.heart-rate-zone-two-duration';
87
- import { DataHeartRateZoneThreeDuration } from '../../../../data/data.heart-rate-zone-three-duration';
88
- import { DataHeartRateZoneFourDuration } from '../../../../data/data.heart-rate-zone-four-duration';
89
- import { DataHeartRateZoneFiveDuration } from '../../../../data/data.heart-rate-zone-five-duration';
90
- import { DataPowerZoneOneDuration } from '../../../../data/data.power-zone-one-duration';
91
- import { DataPowerZoneTwoDuration } from '../../../../data/data.power-zone-two-duration';
92
- import { DataPowerZoneThreeDuration } from '../../../../data/data.power-zone-three-duration';
93
- import { DataPowerZoneFourDuration } from '../../../../data/data.power-zone-four-duration';
94
- import { DataPowerZoneFiveDuration } from '../../../../data/data.power-zone-five-duration';
95
- import { DataSpeedZoneOneDuration } from '../../../../data/data.speed-zone-one-duration';
96
- import { DataSpeedZoneTwoDuration } from '../../../../data/data.speed-zone-two-duration';
97
- import { DataSpeedZoneThreeDuration } from '../../../../data/data.speed-zone-three-duration';
98
- import { DataSpeedZoneFourDuration } from '../../../../data/data.speed-zone-four-duration';
99
- import { DataSpeedZoneFiveDuration } from '../../../../data/data.speed-zone-five-duration';
100
- import { FileType } from '../../file-type.enum';
101
- import { ActivityParsingOptions } from '../../../../activities/activity-parsing-options';
102
- export class EventImporterSuuntoJSON {
103
- static getFromJSONString(jsonString, options = ActivityParsingOptions.DEFAULT) {
104
- return new Promise((resolve, reject) => {
105
- const eventJSONObject = JSON.parse(jsonString);
106
- // debugger;
107
- // Create a creator and pass it to all activities (later)
108
- const creator = new Creator(ImporterSuuntoDeviceNames[eventJSONObject.DeviceLog.Device.Name] || // Try to get a listed name
109
- eventJSONObject.DeviceLog.Device.Name // If not fallback to typed
110
- );
111
- creator.serialNumber = eventJSONObject.DeviceLog.Device.SerialNumber;
112
- creator.hwInfo = eventJSONObject.DeviceLog.Device.Info.HW;
113
- creator.swInfo = eventJSONObject.DeviceLog.Device.Info.SW;
114
- // Go over the samples and get the ones with activity start times
115
- const activityStartEventSamples = eventJSONObject.DeviceLog.Samples.filter((sample) => {
116
- return sample.Events && sample.Events[0] && sample.Events[0].Activity;
117
- });
118
- // Check if there is a Fused Altitude event
119
- const fusedAltitudeEventSamples = eventJSONObject.DeviceLog.Samples.filter((sample) => {
120
- return sample.Events && sample.Events[0] && sample.Events[0].Altitude;
121
- });
122
- // Get the lap start events
123
- const lapEventSamples = eventJSONObject.DeviceLog.Samples.filter((sample) => {
124
- return (sample.Events &&
125
- sample.Events[0] &&
126
- sample.Events[0].Lap &&
127
- sample.Events[0].Lap.Type !== 'Start' &&
128
- sample.Events[0].Lap.Type !== 'Stop');
129
- });
130
- // Get the stop event
131
- const stopEventSample = eventJSONObject.DeviceLog.Samples.find((sample) => {
132
- return sample.Events && sample.Events[0] && sample.Events[0].Lap && sample.Events[0].Lap.Type === 'Stop';
133
- });
134
- // Add the stop event to the laps since it's also a lap stop event
135
- if (stopEventSample) {
136
- lapEventSamples.push(stopEventSample);
137
- }
138
- // Get the activity windows
139
- const activityWindows = eventJSONObject.DeviceLog.Windows
140
- ? eventJSONObject.DeviceLog.Windows.filter((windowObj) => {
141
- return windowObj.Window.Type === 'Activity';
142
- }).map((activityWindow) => activityWindow.Window)
143
- : [];
144
- // Get the lap windows
145
- const lapWindows = eventJSONObject.DeviceLog.Windows
146
- ? eventJSONObject.DeviceLog.Windows.filter((windowObj) => {
147
- return windowObj.Window.Type === 'Lap' || windowObj.Window.Type === 'Autolap';
148
- }).map((lapWindow) => lapWindow.Window)
149
- : [];
150
- // Create the activities
151
- const activities = activityStartEventSamples.map((activityStartEventSample, index) => {
152
- const activity = new Activity(new Date(activityStartEventSample.TimeISO8601), activityStartEventSamples.length - 1 === index
153
- ? new Date(stopEventSample ? stopEventSample.TimeISO8601 : (eventJSONObject.DeviceLog.Header.TimeISO8601 || eventJSONObject.DeviceLog.Header.DateTime))
154
- : new Date(activityStartEventSamples[index + 1].TimeISO8601), ActivityTypes[(ImporterSuuntoActivityIds[activityStartEventSample.Events[0].Activity.ActivityType])], creator, options);
155
- // 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
156
- // Create the stats these are a 1:1 ref arrays
157
- if (activityWindows[index]) {
158
- this.getStats(activityWindows[index]).forEach(stat => {
159
- activity.addStat(stat);
160
- });
161
- }
162
- // Add the pause from end date minurs start date and removing the duration as widows do not contain the pause time
163
- if (!activity.getDuration()) {
164
- activity.setDuration(new DataDuration((activity.endDate.getTime() - activity.startDate.getTime()) / 1000));
165
- }
166
- activity.setPause(new DataPause((activity.endDate.getTime() - activity.startDate.getTime()) / 1000 - activity.getDuration().getValue()));
167
- // Set the zones for the activity @todo fix
168
- this.setIntensityZones(activity, eventJSONObject.DeviceLog.Header);
169
- // Add the fused altitude event
170
- if (fusedAltitudeEventSamples.length) {
171
- activity.addStat(new DataFusedAltitude(true));
172
- }
173
- return activity;
174
- });
175
- // If nothing found
176
- if (!activities.length) {
177
- activities.push(new Activity(new Date(eventJSONObject.DeviceLog.Header.DateTime), new Date(new Date(eventJSONObject.DeviceLog.Header.DateTime).getTime() +
178
- eventJSONObject.DeviceLog.Header.Duration * 1000), ActivityTypes.unknown, creator, options));
179
- }
180
- // set the start dates of all lap types to the start of the first activity
181
- const lapStartDatesByType = lapEventSamples.reduce((lapStartDatesByTypeObject, lapEventSample, index) => {
182
- // If its a stop event then set the start date to the previous
183
- if (lapEventSample.Events[0].Lap.Type === 'Stop' && lapEventSamples.length > 1) {
184
- lapStartDatesByTypeObject[lapEventSample.Events[0].Lap.Type] = new Date(lapEventSamples[index - 1].TimeISO8601);
185
- return lapStartDatesByTypeObject;
186
- }
187
- lapStartDatesByTypeObject[lapEventSample.Events[0].Lap.Type] = activities[0].startDate;
188
- return lapStartDatesByTypeObject;
189
- }, {});
190
- const laps = lapEventSamples.reduce((lapArray, lapEventSample, lapIndex) => {
191
- // if there is only one lap then skip it's the whole activity
192
- if (lapEventSamples.length === 1) {
193
- return lapArray;
194
- }
195
- // Set the end date
196
- const lapEndDate = new Date(lapEventSample.TimeISO8601);
197
- // Set the start date.
198
- // Set it for the next run
199
- const lap = new Lap(lapStartDatesByType[lapEventSample.Events[0].Lap.Type], lapEndDate, lapIndex + 1, LapTypes[lapEventSample.Events[0].Lap.Type]);
200
- lapStartDatesByType[lapEventSample.Events[0].Lap.Type] = lapEndDate;
201
- if (lapWindows[lapIndex]) {
202
- this.getStats(lapWindows[lapIndex]).forEach(stat => {
203
- lap.addStat(stat);
204
- });
205
- }
206
- // Add the pause from end date minurs start date and removing the duration as widows do not contain the pause time
207
- if (!lap.getDuration()) {
208
- lap.setDuration(new DataDuration((lap.endDate.getTime() - lap.startDate.getTime()) / 1000));
209
- }
210
- lap.setPause(new DataPause((lap.endDate.getTime() - lap.startDate.getTime()) / 1000 - lap.getDuration().getValue()));
211
- lapArray.push(lap);
212
- return lapArray;
213
- }, []);
214
- // Add the laps to the belonging activity. If a lap starts or stops at the activity date delta then it belong to the acitvity
215
- // @todo move laps to event so we don't have cross border laps to acivities and decouple them
216
- activities.forEach((activity) => {
217
- laps
218
- .filter((lap) => {
219
- // If the lap start belongs to the activity
220
- if (lap.startDate <= activity.endDate && lap.startDate >= activity.startDate) {
221
- return true;
222
- }
223
- // if the lap end belongs also...
224
- if (lap.endDate >= activity.startDate && lap.endDate <= activity.endDate) {
225
- return true;
226
- }
227
- return false;
228
- })
229
- .forEach((activityLap) => {
230
- activity.addLap(activityLap);
231
- });
232
- });
233
- // Add the samples that belong to the activity and the ibi data.
234
- activities.forEach((activity) => {
235
- // Get the samples that belong to this activity
236
- const activitySamples = eventJSONObject.DeviceLog.Samples.filter((sample) => new Date(sample.TimeISO8601) >= activity.startDate && new Date(sample.TimeISO8601) <= activity.endDate);
237
- // debugger;
238
- // Check if there is fused Location
239
- activity.addStat(new DataFusedLocation(false));
240
- activity.addStat(new DataFusedLocation(activitySamples.filter((sample) => this.hasFusedLocData(sample)).length > 0));
241
- // Should filter on type and create the samples
242
- this.setStreamsForActivity(activity, activitySamples);
243
- });
244
- // Add the ibiData
245
- if (eventJSONObject.DeviceLog['R-R'] && eventJSONObject.DeviceLog['R-R'].Data) {
246
- // prepare the data array per activity removing the offset
247
- activities.forEach((activity) => {
248
- let timeSum = 0;
249
- const ibiData = eventJSONObject.DeviceLog['R-R'].Data.filter((ibi) => {
250
- timeSum += ibi;
251
- const ibiDataDate = new Date(activities[0].startDate.getTime() + timeSum);
252
- return ibiDataDate >= activity.startDate && ibiDataDate <= activity.endDate;
253
- });
254
- // set the HR
255
- // @todo perhaps create new 'types'
256
- const existingHRStream = activity.getAllStreams().find(stream => stream.type === DataHeartRate.type);
257
- if (existingHRStream) {
258
- activity.removeStream(existingHRStream);
259
- }
260
- this.setStreamsForActivity(activity, this.getHRSamplesFromIBIData(activity, ibiData));
261
- activity.addStream(new IBIStream(ibiData));
262
- });
263
- }
264
- // Create an event
265
- // @todo check if start and end date can derive from the json
266
- const event = new Event('', activities[0].startDate, activities[activities.length - 1].endDate, FileType.SUUNTO);
267
- activities.forEach(activity => event.addActivity(activity));
268
- // Populate the event stats from the Header Object // @todo maybe remove
269
- this.getStats(eventJSONObject.DeviceLog.Header).forEach(stat => {
270
- event.addStat(stat);
271
- });
272
- // Get the settings and add it to all activities as it's logical
273
- if (eventJSONObject.DeviceLog.Header.Settings) {
274
- this.getSettings(eventJSONObject.DeviceLog.Header.Settings).forEach(stat => {
275
- event.getActivities().forEach(activity => activity.addStat(stat));
276
- });
277
- }
278
- if (activities.length === 1) {
279
- const stats = this.getStats(eventJSONObject.DeviceLog.Header).filter(stat => stat instanceof DataSteps ||
280
- stat instanceof DataVO2Max ||
281
- stat instanceof DataDeviceLocation ||
282
- stat instanceof DataPoolLength);
283
- stats.forEach(stat => activities[0].addStat(stat));
284
- }
285
- // @todo see how we can have those event stats persisted as the below generation wipes those off.
286
- // Generate stats
287
- EventUtilities.generateStatsForAll(event);
288
- resolve(event);
289
- });
290
- }
291
- static hasFusedLocData(sample) {
292
- return !!sample.Inertial || !!sample.GpsRef;
293
- }
294
- static setIntensityZones(activity, object) {
295
- SuuntoIntensityZonesMapper.forEach(intensityZonesMap => {
296
- if (!object[intensityZonesMap.sampleField]) {
297
- return;
298
- }
299
- const zones = new IntensityZones(intensityZonesMap.dataType);
300
- zones.zone1Duration = object[intensityZonesMap.sampleField].Zone1Duration;
301
- zones.zone2Duration = object[intensityZonesMap.sampleField].Zone2Duration;
302
- zones.zone2LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone2LowerLimit);
303
- zones.zone3Duration = object[intensityZonesMap.sampleField].Zone3Duration;
304
- zones.zone3LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone3LowerLimit);
305
- zones.zone4Duration = object[intensityZonesMap.sampleField].Zone4Duration;
306
- zones.zone4LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone4LowerLimit);
307
- zones.zone5Duration = object[intensityZonesMap.sampleField].Zone5Duration;
308
- zones.zone5LowerLimit = intensityZonesMap.convertSampleValue(object[intensityZonesMap.sampleField].Zone5LowerLimit);
309
- activity.intensityZones.push(zones);
310
- switch (intensityZonesMap.dataType) {
311
- case DataHeartRate.type:
312
- activity.addStat(new DataHeartRateZoneOneDuration(zones.zone1Duration));
313
- activity.addStat(new DataHeartRateZoneTwoDuration(zones.zone2Duration));
314
- activity.addStat(new DataHeartRateZoneThreeDuration(zones.zone3Duration));
315
- activity.addStat(new DataHeartRateZoneFourDuration(zones.zone4Duration));
316
- activity.addStat(new DataHeartRateZoneFiveDuration(zones.zone5Duration));
317
- break;
318
- case DataPower.type:
319
- activity.addStat(new DataPowerZoneOneDuration(zones.zone1Duration));
320
- activity.addStat(new DataPowerZoneTwoDuration(zones.zone2Duration));
321
- activity.addStat(new DataPowerZoneThreeDuration(zones.zone3Duration));
322
- activity.addStat(new DataPowerZoneFourDuration(zones.zone4Duration));
323
- activity.addStat(new DataPowerZoneFiveDuration(zones.zone5Duration));
324
- break;
325
- case DataSpeed.type:
326
- activity.addStat(new DataSpeedZoneOneDuration(zones.zone1Duration));
327
- activity.addStat(new DataSpeedZoneTwoDuration(zones.zone2Duration));
328
- activity.addStat(new DataSpeedZoneThreeDuration(zones.zone3Duration));
329
- activity.addStat(new DataSpeedZoneFourDuration(zones.zone4Duration));
330
- activity.addStat(new DataSpeedZoneFiveDuration(zones.zone5Duration));
331
- break;
332
- }
333
- });
334
- }
335
- static getHRSamplesFromIBIData(activity, ibiData) {
336
- // activity.ibiData = new IBIData(ibiData);
337
- // @todo optimize
338
- // Create a second IBIData so we can have filtering on those with keeping the original
339
- const samples = [];
340
- new IBIData(ibiData)
341
- .lowLimitBPMFilter()
342
- .highLimitBPMFilter()
343
- .movingMedianFilter()
344
- .lowPassFilter()
345
- .getAsBPM()
346
- .forEach((value, key, map) => {
347
- samples.push({
348
- TimeISO8601: new Date(activity.startDate.getTime() + key).toISOString(),
349
- HR: value / 60
350
- });
351
- });
352
- return samples;
353
- }
354
- static setStreamsForActivity(activity, samples) {
355
- SuuntoSampleMapper.forEach(sampleMapping => {
356
- const subjectSamples = samples.filter(sample => isNumberOrString(sample[sampleMapping.sampleField]));
357
- if (subjectSamples.length) {
358
- activity.addStream(activity.createStream(sampleMapping.dataType));
359
- subjectSamples.forEach(subjectSample => {
360
- activity.addDataToStream(sampleMapping.dataType, new Date(subjectSample.TimeISO8601), sampleMapping.convertSampleValue(subjectSample[sampleMapping.sampleField]));
361
- });
362
- }
363
- });
364
- }
365
- static getSettings(settings) {
366
- const stats = [];
367
- SuuntoSettingsMapper.forEach(settingsMapping => {
368
- if (settingsMapping.getValue(settings) !== null && settingsMapping.getValue(settings) !== undefined) {
369
- stats.push(DynamicDataLoader.getDataInstanceFromDataType(settingsMapping.dataType, settingsMapping.getValue(settings)));
370
- }
371
- });
372
- return stats;
373
- }
374
- // @todo convert this to a mapping as well
375
- static getStats(object) {
376
- const stats = [];
377
- if (isNumber(object.Distance)) {
378
- stats.push(new DataDistance(object.Distance));
379
- }
380
- if (isNumberOrString(object.AscentTime)) {
381
- stats.push(new DataAscentTime(object.AscentTime));
382
- }
383
- if (isNumberOrString(object.DescentTime)) {
384
- stats.push(new DataDescentTime(object.DescentTime));
385
- }
386
- if (isNumberOrString(object.Ascent)) {
387
- stats.push(new DataAscent(object.Ascent));
388
- }
389
- if (isNumberOrString(object.Descent)) {
390
- stats.push(new DataDescent(object.Descent));
391
- }
392
- if (isNumberOrString(object.StepCount)) {
393
- stats.push(new DataSteps(object.StepCount));
394
- }
395
- if (isNumberOrString(object.MAXVO2)) {
396
- stats.push(new DataVO2Max(object.MAXVO2));
397
- }
398
- if (isNumberOrString(object.PoolLength)) {
399
- stats.push(new DataPoolLength(object.PoolLength));
400
- }
401
- if (isNumberOrString(object.DeviceLocation)) {
402
- stats.push(new DataDeviceLocation(object.DeviceLocation));
403
- }
404
- if (isNumberOrString(object.EPOC)) {
405
- stats.push(new DataEPOC(object.EPOC));
406
- }
407
- if (isNumberOrString(object.Energy)) {
408
- stats.push(new DataEnergy((object.Energy * 0.239) / 1000));
409
- }
410
- if (isNumberOrString(object.Feeling)) {
411
- stats.push(new DataFeeling(object.Feeling));
412
- }
413
- if (isNumberOrString(object.PeakTrainingEffect)) {
414
- stats.push(new DataAerobicTrainingEffect(object.PeakTrainingEffect));
415
- }
416
- if (isNumberOrString(object.RecoveryTime)) {
417
- stats.push(new DataRecoveryTime(object.RecoveryTime));
418
- }
419
- if (isNumberOrString(object.MAXVO2)) {
420
- stats.push(new DataVO2Max(object.MAXVO2));
421
- }
422
- let pauseDuration = 0;
423
- if (isNumberOrString(object.PauseDuration)) {
424
- pauseDuration = object.PauseDuration;
425
- }
426
- stats.push(new DataPause(pauseDuration));
427
- stats.push(new DataDuration(object.Duration - pauseDuration));
428
- // double case
429
- if (Array.isArray(object.Altitude)) {
430
- if (isNumber(object.Altitude[0].Avg)) {
431
- stats.push(new DataAltitudeAvg(object.Altitude[0].Avg));
432
- }
433
- if (isNumber(object.Altitude[0].Max)) {
434
- stats.push(new DataAltitudeMax(object.Altitude[0].Max));
435
- }
436
- if (isNumber(object.Altitude[0].Min)) {
437
- stats.push(new DataAltitudeMin(object.Altitude[0].Min));
438
- }
439
- }
440
- else if (object.Altitude) {
441
- if (isNumber(object.Altitude.Max)) {
442
- stats.push(new DataAltitudeMax(object.Altitude.Max));
443
- }
444
- if (isNumber(object.Altitude.Min)) {
445
- stats.push(new DataAltitudeMin(object.Altitude.Min));
446
- }
447
- }
448
- if (Array.isArray(object.HR)) {
449
- if (isNumber(object.HR[0].Avg)) {
450
- stats.push(new DataHeartRateAvg(object.HR[0].Avg * 60));
451
- }
452
- if (isNumber(object.HR[0].Max)) {
453
- stats.push(new DataHeartRateMax(object.HR[0].Max * 60));
454
- }
455
- if (isNumber(object.HR[0].Min)) {
456
- stats.push(new DataHeartRateMin(object.HR[0].Min * 60));
457
- }
458
- }
459
- if (Array.isArray(object.Cadence)) {
460
- if (isNumber(object.Cadence[0].Avg)) {
461
- stats.push(new DataCadenceAvg(object.Cadence[0].Avg * 60));
462
- }
463
- if (isNumber(object.Cadence[0].Max)) {
464
- stats.push(new DataCadenceMax(object.Cadence[0].Max * 60));
465
- }
466
- if (isNumber(object.Cadence[0].Min)) {
467
- stats.push(new DataCadenceMin(object.Cadence[0].Min * 60));
468
- }
469
- }
470
- if (Array.isArray(object.Power)) {
471
- if (isNumber(object.Power[0].Avg)) {
472
- stats.push(new DataPowerAvg(object.Power[0].Avg));
473
- }
474
- if (isNumber(object.Power[0].Max)) {
475
- stats.push(new DataPowerMax(object.Power[0].Max));
476
- }
477
- if (isNumber(object.Power[0].Min)) {
478
- stats.push(new DataPowerMin(object.Power[0].Min));
479
- }
480
- }
481
- if (Array.isArray(object.Speed)) {
482
- if (isNumber(object.Speed[0].Avg)) {
483
- stats.push(new DataSpeedAvg(object.Speed[0].Avg));
484
- stats.push(new DataPaceAvg(convertSpeedToPace(object.Speed[0].Avg)));
485
- }
486
- if (isNumber(object.Speed[0].Max)) {
487
- stats.push(new DataSpeedMax(object.Speed[0].Max));
488
- stats.push(new DataPaceMax(convertSpeedToPace(object.Speed[0].Max)));
489
- }
490
- if (isNumber(object.Speed[0].Min)) {
491
- stats.push(new DataSpeedMin(object.Speed[0].Min));
492
- stats.push(new DataPaceMin(convertSpeedToPace(object.Speed[0].Min)));
493
- }
494
- }
495
- if (Array.isArray(object.Temperature)) {
496
- if (isNumber(object.Temperature[0].Avg)) {
497
- stats.push(new DataTemperatureAvg(object.Temperature[0].Avg - 273.15));
498
- }
499
- if (isNumber(object.Temperature[0].Max)) {
500
- stats.push(new DataTemperatureMax(object.Temperature[0].Max - 273.15));
501
- }
502
- if (object.Temperature[0].Min !== null) {
503
- stats.push(new DataTemperatureMin(object.Temperature[0].Min - 273.15));
504
- }
505
- }
506
- if (object.hasOwnProperty('VerticalSpeed')) {
507
- // Double action here
508
- if (Array.isArray(object.VerticalSpeed)) {
509
- if (isNumber(object.VerticalSpeed[0].Avg)) {
510
- stats.push(new DataVerticalSpeedAvg(object.VerticalSpeed[0].Avg));
511
- }
512
- if (isNumber(object.VerticalSpeed[0].Max)) {
513
- stats.push(new DataVerticalSpeedMax(object.VerticalSpeed[0].Max));
514
- }
515
- if (isNumber(object.VerticalSpeed[0].Min)) {
516
- stats.push(new DataVerticalSpeedMin(object.VerticalSpeed[0].Min));
517
- }
518
- }
519
- else {
520
- if (isNumber(object.VerticalSpeed)) {
521
- stats.push(new DataVerticalSpeedAvg(object.VerticalSpeed));
522
- }
523
- }
524
- }
525
- return stats;
526
- }
527
- }
528
- export const SuuntoSettingsMapper = [
529
- {
530
- dataType: DataAltiBaroProfile.type,
531
- getValue: (settings) => {
532
- return settings['AltiBaroProfile'];
533
- }
534
- },
535
- {
536
- dataType: DataAutoLapDistance.type,
537
- getValue: (settings) => {
538
- if (!settings['AutoLap']) {
539
- return null;
540
- }
541
- return settings['AutoLap']['Distance'];
542
- }
543
- },
544
- {
545
- dataType: DataAutoLapDuration.type,
546
- getValue: (settings) => {
547
- if (!settings['AutoLap']) {
548
- return null;
549
- }
550
- return settings['AutoLap']['Duration'];
551
- }
552
- },
553
- {
554
- dataType: DataAutoPauseUsed.type,
555
- getValue: (settings) => {
556
- if (!settings['AutoPause']) {
557
- return null;
558
- }
559
- return settings['AutoPause']['Enabled'];
560
- }
561
- },
562
- {
563
- dataType: DataBikePodUsed.type,
564
- getValue: (settings) => {
565
- return settings['BikePodUsed'];
566
- }
567
- },
568
- {
569
- dataType: DataEnabledNavigationSystems.type,
570
- getValue: (settings) => {
571
- return settings['EnabledNavigationSystems'];
572
- }
573
- },
574
- {
575
- dataType: DataFootPodUsed.type,
576
- getValue: (settings) => {
577
- return settings['FootPodUsed'];
578
- }
579
- },
580
- // {
581
- // dataType: DataFusedAltitude.type,
582
- // getValue: (settings: any) => {
583
- // return settings['FusedAltiUsed'];
584
- // },
585
- // },
586
- {
587
- dataType: DataHeartRateUsed.type,
588
- getValue: (settings) => {
589
- return settings['HrUsed'];
590
- }
591
- },
592
- {
593
- dataType: DataPowerPodUsed.type,
594
- getValue: (settings) => {
595
- return settings['PowerPodUsed'];
596
- }
597
- }
598
- ];
599
- export const SuuntoIntensityZonesMapper = [
600
- {
601
- dataType: DataHeartRate.type,
602
- sampleField: 'HrZones',
603
- convertSampleValue: (value) => Number(value * 60)
604
- },
605
- {
606
- dataType: DataPower.type,
607
- sampleField: 'PowerZones',
608
- convertSampleValue: (value) => Number(value)
609
- },
610
- {
611
- dataType: DataSpeed.type,
612
- sampleField: 'SpeedZones',
613
- convertSampleValue: (value) => Number(value)
614
- }
615
- ];
616
- export const SuuntoSampleMapper = [
617
- {
618
- dataType: DataLatitudeDegrees.type,
619
- sampleField: 'Latitude',
620
- convertSampleValue: (value) => Number(value * (180 / Math.PI))
621
- },
622
- {
623
- dataType: DataLongitudeDegrees.type,
624
- sampleField: 'Longitude',
625
- convertSampleValue: (value) => Number(value * (180 / Math.PI))
626
- },
627
- {
628
- dataType: DataHeartRate.type,
629
- sampleField: 'HR',
630
- convertSampleValue: (value) => Number(value * 60)
631
- },
632
- {
633
- dataType: DataDistance.type,
634
- sampleField: 'Distance',
635
- convertSampleValue: (value) => Number(value)
636
- },
637
- {
638
- dataType: DataAbsolutePressure.type,
639
- sampleField: 'AbsPressure',
640
- convertSampleValue: (value) => Number(value / 100)
641
- },
642
- {
643
- dataType: DataSeaLevelPressure.type,
644
- sampleField: 'SeaLevelPressure',
645
- convertSampleValue: (value) => Number(value / 100)
646
- },
647
- {
648
- dataType: DataGPSAltitude.type,
649
- sampleField: 'GPSAltitude',
650
- convertSampleValue: (value) => Number(value)
651
- },
652
- {
653
- dataType: DataAltitude.type,
654
- sampleField: 'Altitude',
655
- convertSampleValue: (value) => Number(value)
656
- },
657
- {
658
- dataType: DataCadence.type,
659
- sampleField: 'Cadence',
660
- convertSampleValue: (value) => Number(value * 60)
661
- },
662
- {
663
- dataType: DataPower.type,
664
- sampleField: 'Power',
665
- convertSampleValue: (value) => Number(value)
666
- },
667
- {
668
- dataType: DataSpeed.type,
669
- sampleField: 'Speed',
670
- convertSampleValue: (value) => Number(value)
671
- },
672
- {
673
- dataType: DataTemperature.type,
674
- sampleField: 'Temperature',
675
- convertSampleValue: (value) => Number(value - 273.15)
676
- },
677
- {
678
- dataType: DataVerticalSpeed.type,
679
- sampleField: 'VerticalSpeed',
680
- convertSampleValue: (value) => Number(value)
681
- },
682
- {
683
- dataType: DataEHPE.type,
684
- sampleField: 'EHPE',
685
- convertSampleValue: (value) => Number(value)
686
- },
687
- {
688
- dataType: DataEVPE.type,
689
- sampleField: 'EVPE',
690
- convertSampleValue: (value) => Number(value)
691
- },
692
- {
693
- dataType: DataNumberOfSatellites.type,
694
- sampleField: 'NumberOfSatellites',
695
- convertSampleValue: (value) => Number(value)
696
- },
697
- {
698
- dataType: DataSatellite5BestSNR.type,
699
- sampleField: 'Satellite5BestSNR',
700
- convertSampleValue: (value) => Number(value)
701
- },
702
- {
703
- dataType: DataBatteryCharge.type,
704
- sampleField: 'BatteryCharge',
705
- convertSampleValue: (value) => Number(value * 100)
706
- },
707
- {
708
- dataType: DataBatteryCurrent.type,
709
- sampleField: 'BatteryCurrent',
710
- convertSampleValue: (value) => Number(value)
711
- },
712
- {
713
- dataType: DataBatteryVoltage.type,
714
- sampleField: 'BatteryVoltage',
715
- convertSampleValue: (value) => Number(value)
716
- }
717
- ];