@sports-alliance/sports-lib 7.0.7 → 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 (336) hide show
  1. package/.editorconfig +14 -0
  2. package/.eslintignore +4 -0
  3. package/.eslintrc.js +9 -0
  4. package/.prettierignore +25 -0
  5. package/.prettierrc.json +12 -0
  6. package/CODE_OF_CONDUCT.md +76 -0
  7. package/jest.config.js +23 -0
  8. package/lib/esm/index.js +12034 -152
  9. package/package.json +3 -2
  10. package/tsconfig.cjs.json +7 -0
  11. package/tsconfig.esm.json +8 -0
  12. package/tsconfig.lib.json +8 -0
  13. package/lib/esm/activities/activity-parsing-options.js +0 -19
  14. package/lib/esm/activities/activity.interface.js +0 -1
  15. package/lib/esm/activities/activity.js +0 -281
  16. package/lib/esm/activities/activity.json.interface.js +0 -1
  17. package/lib/esm/activities/activity.spec.js +0 -348
  18. package/lib/esm/activities/activity.types.js +0 -1046
  19. package/lib/esm/activities/activityt-types.spec.js +0 -16
  20. package/lib/esm/activities/devices/device.interface.js +0 -1
  21. package/lib/esm/activities/devices/device.js +0 -26
  22. package/lib/esm/activities/devices/device.json.interface.js +0 -1
  23. package/lib/esm/constants/constants.js +0 -8
  24. package/lib/esm/creators/creator.interface.js +0 -1
  25. package/lib/esm/creators/creator.js +0 -37
  26. package/lib/esm/creators/creator.json.interface.js +0 -1
  27. package/lib/esm/creators/creator.spec.js +0 -25
  28. package/lib/esm/data/data-active-lap.js +0 -4
  29. package/lib/esm/data/data-active-lengths.js +0 -4
  30. package/lib/esm/data/data-aerobic-training-effect.js +0 -8
  31. package/lib/esm/data/data-anaerobic-training-effect.js +0 -8
  32. package/lib/esm/data/data-stance-time-balance-left.js +0 -4
  33. package/lib/esm/data/data-stance-time-balance-right.js +0 -4
  34. package/lib/esm/data/data-stance-time-balance.js +0 -3
  35. package/lib/esm/data/data-store.spec.js +0 -78
  36. package/lib/esm/data/data-total-cycles.js +0 -4
  37. package/lib/esm/data/data.absolute-pressure.js +0 -5
  38. package/lib/esm/data/data.accumulated-power.js +0 -8
  39. package/lib/esm/data/data.activity-types.js +0 -7
  40. package/lib/esm/data/data.air-power-avg.js +0 -4
  41. package/lib/esm/data/data.air-power-max.js +0 -4
  42. package/lib/esm/data/data.air-power-min.js +0 -4
  43. package/lib/esm/data/data.air-power.js +0 -8
  44. package/lib/esm/data/data.alti-baro-profile.js +0 -4
  45. package/lib/esm/data/data.altitude-avg.js +0 -4
  46. package/lib/esm/data/data.altitude-gps.js +0 -5
  47. package/lib/esm/data/data.altitude-max.js +0 -4
  48. package/lib/esm/data/data.altitude-min.js +0 -4
  49. package/lib/esm/data/data.altitude-smooth.js +0 -4
  50. package/lib/esm/data/data.altitude.js +0 -8
  51. package/lib/esm/data/data.array.js +0 -13
  52. package/lib/esm/data/data.ascent-time.js +0 -4
  53. package/lib/esm/data/data.ascent.js +0 -4
  54. package/lib/esm/data/data.auto-lap-distance.js +0 -5
  55. package/lib/esm/data/data.auto-lap-duration.js +0 -4
  56. package/lib/esm/data/data.auto-lap-used.js +0 -7
  57. package/lib/esm/data/data.auto-pause-used.js +0 -7
  58. package/lib/esm/data/data.avg-stride-length.js +0 -4
  59. package/lib/esm/data/data.balance.js +0 -6
  60. package/lib/esm/data/data.bare.js +0 -4
  61. package/lib/esm/data/data.battery-charge.js +0 -8
  62. package/lib/esm/data/data.battery-consumption.js +0 -8
  63. package/lib/esm/data/data.battery-current.js +0 -8
  64. package/lib/esm/data/data.battery-life-estimation.js +0 -4
  65. package/lib/esm/data/data.battery-voltage.js +0 -8
  66. package/lib/esm/data/data.bike-pod-used.js +0 -7
  67. package/lib/esm/data/data.boolean.js +0 -9
  68. package/lib/esm/data/data.cadence-avg.js +0 -4
  69. package/lib/esm/data/data.cadence-max.js +0 -4
  70. package/lib/esm/data/data.cadence-min.js +0 -4
  71. package/lib/esm/data/data.cadence.js +0 -8
  72. package/lib/esm/data/data.cycling-dynamics.js +0 -3
  73. package/lib/esm/data/data.cycling-position.js +0 -37
  74. package/lib/esm/data/data.cycling-seated-time.js +0 -5
  75. package/lib/esm/data/data.cycling-standing-time.js +0 -5
  76. package/lib/esm/data/data.descent-time.js +0 -4
  77. package/lib/esm/data/data.descent.js +0 -4
  78. package/lib/esm/data/data.description.js +0 -4
  79. package/lib/esm/data/data.device-location.js +0 -4
  80. package/lib/esm/data/data.device-names.js +0 -7
  81. package/lib/esm/data/data.distance.js +0 -15
  82. package/lib/esm/data/data.duration.js +0 -56
  83. package/lib/esm/data/data.ehpe.js +0 -5
  84. package/lib/esm/data/data.enabled-navigation-systems.js +0 -4
  85. package/lib/esm/data/data.end-altitude.js +0 -4
  86. package/lib/esm/data/data.end-position.js +0 -4
  87. package/lib/esm/data/data.energy.js +0 -8
  88. package/lib/esm/data/data.epoc.js +0 -5
  89. package/lib/esm/data/data.event.js +0 -3
  90. package/lib/esm/data/data.evpe.js +0 -4
  91. package/lib/esm/data/data.feeling.js +0 -15
  92. package/lib/esm/data/data.foot-pod-used.js +0 -7
  93. package/lib/esm/data/data.form-power.js +0 -4
  94. package/lib/esm/data/data.fused-altitude.js +0 -7
  95. package/lib/esm/data/data.fused-location.js +0 -7
  96. package/lib/esm/data/data.gnss-distance.js +0 -4
  97. package/lib/esm/data/data.grade-adjusted-pace-avg.js +0 -15
  98. package/lib/esm/data/data.grade-adjusted-pace-max.js +0 -15
  99. package/lib/esm/data/data.grade-adjusted-pace-min.js +0 -15
  100. package/lib/esm/data/data.grade-adjusted-pace.js +0 -25
  101. package/lib/esm/data/data.grade-adjusted-speed-avg.js +0 -46
  102. package/lib/esm/data/data.grade-adjusted-speed-max.js +0 -46
  103. package/lib/esm/data/data.grade-adjusted-speed-min.js +0 -46
  104. package/lib/esm/data/data.grade-adjusted-speed.js +0 -78
  105. package/lib/esm/data/data.grade-smooth.js +0 -7
  106. package/lib/esm/data/data.grade.js +0 -7
  107. package/lib/esm/data/data.ground-time.js +0 -8
  108. package/lib/esm/data/data.heart-rate-avg.js +0 -4
  109. package/lib/esm/data/data.heart-rate-max.js +0 -4
  110. package/lib/esm/data/data.heart-rate-min.js +0 -4
  111. package/lib/esm/data/data.heart-rate-used.js +0 -7
  112. package/lib/esm/data/data.heart-rate-zone-five-duration.js +0 -4
  113. package/lib/esm/data/data.heart-rate-zone-four-duration.js +0 -4
  114. package/lib/esm/data/data.heart-rate-zone-one-duration.js +0 -4
  115. package/lib/esm/data/data.heart-rate-zone-three-duration.js +0 -4
  116. package/lib/esm/data/data.heart-rate-zone-two-duration.js +0 -4
  117. package/lib/esm/data/data.heart-rate.js +0 -8
  118. package/lib/esm/data/data.ibi.js +0 -8
  119. package/lib/esm/data/data.interface.js +0 -5
  120. package/lib/esm/data/data.js +0 -62
  121. package/lib/esm/data/data.json.interface.js +0 -1
  122. package/lib/esm/data/data.latitude-degrees.js +0 -5
  123. package/lib/esm/data/data.left-balance.js +0 -4
  124. package/lib/esm/data/data.leg-stiffness.js +0 -16
  125. package/lib/esm/data/data.longitude-degrees.js +0 -5
  126. package/lib/esm/data/data.moving-time.js +0 -4
  127. package/lib/esm/data/data.number-of-satellites.js +0 -7
  128. package/lib/esm/data/data.number-of.samples.js +0 -4
  129. package/lib/esm/data/data.number.js +0 -13
  130. package/lib/esm/data/data.pace-avg.js +0 -8
  131. package/lib/esm/data/data.pace-max.js +0 -8
  132. package/lib/esm/data/data.pace-min.js +0 -8
  133. package/lib/esm/data/data.pace.js +0 -46
  134. package/lib/esm/data/data.pause.js +0 -4
  135. package/lib/esm/data/data.peak-epoc.js +0 -7
  136. package/lib/esm/data/data.peak-training-effect.js +0 -4
  137. package/lib/esm/data/data.percent.js +0 -4
  138. package/lib/esm/data/data.pool-length.js +0 -5
  139. package/lib/esm/data/data.position.interface.js +0 -1
  140. package/lib/esm/data/data.position.js +0 -18
  141. package/lib/esm/data/data.power-avg.js +0 -4
  142. package/lib/esm/data/data.power-down.js +0 -4
  143. package/lib/esm/data/data.power-intensity-factor.js +0 -5
  144. package/lib/esm/data/data.power-left.js +0 -4
  145. package/lib/esm/data/data.power-max.js +0 -4
  146. package/lib/esm/data/data.power-min.js +0 -4
  147. package/lib/esm/data/data.power-normalized.js +0 -4
  148. package/lib/esm/data/data.power-pedal-smoothness-left.js +0 -4
  149. package/lib/esm/data/data.power-pedal-smoothness-right.js +0 -4
  150. package/lib/esm/data/data.power-pod-used.js +0 -7
  151. package/lib/esm/data/data.power-right.js +0 -4
  152. package/lib/esm/data/data.power-torque-effectiveness-left.js +0 -4
  153. package/lib/esm/data/data.power-torque-effectiveness-right.js +0 -4
  154. package/lib/esm/data/data.power-training-stress-score.js +0 -5
  155. package/lib/esm/data/data.power-up.js +0 -4
  156. package/lib/esm/data/data.power-work.js +0 -5
  157. package/lib/esm/data/data.power-zone-five-duration.js +0 -4
  158. package/lib/esm/data/data.power-zone-four-duration.js +0 -4
  159. package/lib/esm/data/data.power-zone-one-duration.js +0 -4
  160. package/lib/esm/data/data.power-zone-three-duration.js +0 -4
  161. package/lib/esm/data/data.power-zone-two-duration.js +0 -4
  162. package/lib/esm/data/data.power.js +0 -8
  163. package/lib/esm/data/data.recovery-time.js +0 -7
  164. package/lib/esm/data/data.rider-position-change-event.js +0 -8
  165. package/lib/esm/data/data.right-balance.js +0 -4
  166. package/lib/esm/data/data.rpe.js +0 -23
  167. package/lib/esm/data/data.satellite-5-best-snr.js +0 -4
  168. package/lib/esm/data/data.sea-level-pressure.js +0 -5
  169. package/lib/esm/data/data.spec.js +0 -25
  170. package/lib/esm/data/data.speed-avg.js +0 -46
  171. package/lib/esm/data/data.speed-max.js +0 -46
  172. package/lib/esm/data/data.speed-min.js +0 -46
  173. package/lib/esm/data/data.speed-zone-five-duration.js +0 -4
  174. package/lib/esm/data/data.speed-zone-four-duration.js +0 -4
  175. package/lib/esm/data/data.speed-zone-one-duration.js +0 -4
  176. package/lib/esm/data/data.speed-zone-three-duration.js +0 -4
  177. package/lib/esm/data/data.speed-zone-two-duration.js +0 -4
  178. package/lib/esm/data/data.speed.js +0 -88
  179. package/lib/esm/data/data.sport-profile-name.js +0 -4
  180. package/lib/esm/data/data.stance-time.js +0 -5
  181. package/lib/esm/data/data.start-altitude.js +0 -4
  182. package/lib/esm/data/data.start-event.js +0 -4
  183. package/lib/esm/data/data.start-position.js +0 -4
  184. package/lib/esm/data/data.step-length.js +0 -4
  185. package/lib/esm/data/data.steps-old.js +0 -4
  186. package/lib/esm/data/data.steps.js +0 -4
  187. package/lib/esm/data/data.stop-all-event.js +0 -4
  188. package/lib/esm/data/data.stop-event.js +0 -4
  189. package/lib/esm/data/data.store.export.spec.js +0 -66
  190. package/lib/esm/data/data.store.js +0 -1213
  191. package/lib/esm/data/data.string.js +0 -13
  192. package/lib/esm/data/data.stryd-altitude.js +0 -4
  193. package/lib/esm/data/data.stryd-distance.js +0 -4
  194. package/lib/esm/data/data.stryd-speed.js +0 -4
  195. package/lib/esm/data/data.swim-pace-avg.js +0 -8
  196. package/lib/esm/data/data.swim-pace-max.js +0 -8
  197. package/lib/esm/data/data.swim-pace-min.js +0 -8
  198. package/lib/esm/data/data.swim-pace.js +0 -19
  199. package/lib/esm/data/data.swolf-25m.js +0 -4
  200. package/lib/esm/data/data.swolf-50m.js +0 -4
  201. package/lib/esm/data/data.target-distance.js +0 -4
  202. package/lib/esm/data/data.target-heart-rate-zone.js +0 -4
  203. package/lib/esm/data/data.target-power-zone.js +0 -4
  204. package/lib/esm/data/data.target-speed-zone.js +0 -4
  205. package/lib/esm/data/data.target-time.js +0 -4
  206. package/lib/esm/data/data.temperature-avg.js +0 -4
  207. package/lib/esm/data/data.temperature-max.js +0 -4
  208. package/lib/esm/data/data.temperature-min.js +0 -4
  209. package/lib/esm/data/data.temperature.js +0 -8
  210. package/lib/esm/data/data.time.js +0 -6
  211. package/lib/esm/data/data.timer-time.js +0 -4
  212. package/lib/esm/data/data.vertical-oscillation.js +0 -5
  213. package/lib/esm/data/data.vertical-ratio.js +0 -5
  214. package/lib/esm/data/data.vertical-speed-avg.js +0 -53
  215. package/lib/esm/data/data.vertical-speed-max.js +0 -53
  216. package/lib/esm/data/data.vertical-speed-min.js +0 -53
  217. package/lib/esm/data/data.vertical-speed.js +0 -103
  218. package/lib/esm/data/data.vo2-max.js +0 -7
  219. package/lib/esm/data/ibi/data.ibi.filters.js +0 -52
  220. package/lib/esm/data/ibi/data.ibi.js +0 -98
  221. package/lib/esm/data/ibi/data.ibi.spec.js +0 -66
  222. package/lib/esm/duration/duration.class.abstract.js +0 -36
  223. package/lib/esm/duration/duration.class.interface.js +0 -1
  224. package/lib/esm/errors/duration-exceeded-event-lib.error.js +0 -9
  225. package/lib/esm/errors/empty-event-sports-libs.error.js +0 -9
  226. package/lib/esm/errors/event-lib.error.js +0 -8
  227. package/lib/esm/errors/lib.error.js +0 -6
  228. package/lib/esm/errors/parsing-event-lib.error.js +0 -9
  229. package/lib/esm/events/adapters/exporters/exporter.gpx.js +0 -75
  230. package/lib/esm/events/adapters/exporters/exporter.interface.js +0 -1
  231. package/lib/esm/events/adapters/exporters/exporter.json.js +0 -20
  232. package/lib/esm/events/adapters/file-type.enum.js +0 -7
  233. package/lib/esm/events/adapters/importers/fit/importer.fit.ant-plus.device.names.js +0 -25
  234. package/lib/esm/events/adapters/importers/fit/importer.fit.coros.device.names.js +0 -5
  235. package/lib/esm/events/adapters/importers/fit/importer.fit.development.device.names.js +0 -4
  236. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.device.names.js +0 -462
  237. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.data.js +0 -877
  238. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.js +0 -106
  239. package/lib/esm/events/adapters/importers/fit/importer.fit.garmin.profile.mapper.spec.js +0 -32
  240. package/lib/esm/events/adapters/importers/fit/importer.fit.hammerhead.device.names.js +0 -4
  241. package/lib/esm/events/adapters/importers/fit/importer.fit.integration.spec.js +0 -44
  242. package/lib/esm/events/adapters/importers/fit/importer.fit.js +0 -978
  243. package/lib/esm/events/adapters/importers/fit/importer.fit.lezyne.device.names.js +0 -3
  244. package/lib/esm/events/adapters/importers/fit/importer.fit.magellan.device.names.js +0 -5
  245. package/lib/esm/events/adapters/importers/fit/importer.fit.mapper.js +0 -231
  246. package/lib/esm/events/adapters/importers/fit/importer.fit.saris.device.names.js +0 -3
  247. package/lib/esm/events/adapters/importers/fit/importer.fit.spec.js +0 -326
  248. package/lib/esm/events/adapters/importers/fit/importer.fit.srm.device.names.js +0 -7
  249. package/lib/esm/events/adapters/importers/fit/importer.fit.suunto.device.names.js +0 -16
  250. package/lib/esm/events/adapters/importers/fit/importer.fit.wahoo.device.names.js +0 -10
  251. package/lib/esm/events/adapters/importers/gpx/gx-parser.js +0 -36
  252. package/lib/esm/events/adapters/importers/gpx/importer.gpx.integration.spec.js +0 -44
  253. package/lib/esm/events/adapters/importers/gpx/importer.gpx.js +0 -102
  254. package/lib/esm/events/adapters/importers/gpx/importer.gpx.mapper.js +0 -142
  255. package/lib/esm/events/adapters/importers/gpx/importer.gpx.spec.js +0 -71
  256. package/lib/esm/events/adapters/importers/json/importer.json.js +0 -160
  257. package/lib/esm/events/adapters/importers/sample-info.interface.js +0 -1
  258. package/lib/esm/events/adapters/importers/suunto/importer.suunto.activity.ids.js +0 -85
  259. package/lib/esm/events/adapters/importers/suunto/importer.suunto.device.names.js +0 -26
  260. package/lib/esm/events/adapters/importers/suunto/importer.suunto.integration.spec.js +0 -44
  261. package/lib/esm/events/adapters/importers/suunto/importer.suunto.json.js +0 -717
  262. package/lib/esm/events/adapters/importers/suunto/importer.suunto.sml.js +0 -125
  263. package/lib/esm/events/adapters/importers/tcx/importer.tcx.integration.spec.js +0 -46
  264. package/lib/esm/events/adapters/importers/tcx/importer.tcx.js +0 -442
  265. package/lib/esm/events/adapters/importers/tcx/importer.tcx.mapper.js +0 -91
  266. package/lib/esm/events/adapters/importers/tcx/utils.tcx.js +0 -36
  267. package/lib/esm/events/event.interface.js +0 -1
  268. package/lib/esm/events/event.js +0 -123
  269. package/lib/esm/events/event.json.interface.js +0 -1
  270. package/lib/esm/events/event.spec.js +0 -51
  271. package/lib/esm/events/utilities/activity.utilities.js +0 -1841
  272. package/lib/esm/events/utilities/activity.utilities.spec.js +0 -373
  273. package/lib/esm/events/utilities/event.utilities.js +0 -57
  274. package/lib/esm/events/utilities/grade-calculator/grade-calculator.js +0 -121
  275. package/lib/esm/events/utilities/grade-calculator/grade-calculator.spec.js +0 -93
  276. package/lib/esm/events/utilities/grade-calculator/low-pass-filter.js +0 -86
  277. package/lib/esm/events/utilities/helpers.js +0 -162
  278. package/lib/esm/geodesy/adapters/adapter.interface.js +0 -1
  279. package/lib/esm/geodesy/adapters/geolib.adapter.js +0 -28
  280. package/lib/esm/id/id.abstract.class.js +0 -9
  281. package/lib/esm/id/id.class.interface.js +0 -1
  282. package/lib/esm/id/id.class.spec.js +0 -13
  283. package/lib/esm/intensity-zones/intensity-zones.interface.js +0 -1
  284. package/lib/esm/intensity-zones/intensity-zones.js +0 -29
  285. package/lib/esm/intensity-zones/intensity-zones.json.interface.js +0 -1
  286. package/lib/esm/intensity-zones/intensity-zones.spec.js +0 -30
  287. package/lib/esm/laps/lap.interface.js +0 -1
  288. package/lib/esm/laps/lap.js +0 -29
  289. package/lib/esm/laps/lap.json.interface.js +0 -1
  290. package/lib/esm/laps/lap.types.js +0 -52
  291. package/lib/esm/meta-data/event-meta-data.interface.js +0 -6
  292. package/lib/esm/meta-data/meta-data.js +0 -57
  293. package/lib/esm/meta-data/meta-data.json.interface.js +0 -1
  294. package/lib/esm/privacy/privacy.class.interface.js +0 -5
  295. package/lib/esm/serializable/serializable.class.interface.js +0 -1
  296. package/lib/esm/service-tokens/oauth1-service-token.interface.js +0 -1
  297. package/lib/esm/service-tokens/oauth2-service-token.interface.js +0 -1
  298. package/lib/esm/specs/activities-parsing.integration.spec.js +0 -1847
  299. package/lib/esm/specs/activity-duration-stream.integration.spec.js +0 -57
  300. package/lib/esm/specs/fixtures/streams/strava/rides/3171472783.json +0 -52534
  301. package/lib/esm/specs/fixtures/streams/strava/rides/3171487458.json +0 -78818
  302. package/lib/esm/specs/fixtures/streams/strava/rides/343080886.json +0 -105090
  303. package/lib/esm/specs/fixtures/streams/strava/rides/5910143591.json +0 -110711
  304. package/lib/esm/specs/fixtures/streams/strava/runs/2451375851.json +0 -74846
  305. package/lib/esm/specs/fixtures/streams/strava/runs/2709634581.json +0 -66817
  306. package/lib/esm/specs/fixtures/streams/strava/runs/3156040843.json +0 -17594
  307. package/lib/esm/specs/fixtures/streams/strava/runs/3182900697.json +0 -17322
  308. package/lib/esm/specs/fixtures/streams/strava/runs/3183465494.json +0 -20463
  309. package/lib/esm/specs/fixtures/streams/strava/runs/3183490558.json +0 -58202
  310. package/lib/esm/specs/spec-utils.js +0 -159
  311. package/lib/esm/specs/strava-streams-compliance.spec.js +0 -951
  312. package/lib/esm/stats/stats.class.abstract.js +0 -32
  313. package/lib/esm/stats/stats.class.interface.js +0 -1
  314. package/lib/esm/stats/stats.json.interface.js +0 -1
  315. package/lib/esm/streams/compressed.stream.interface.js +0 -12
  316. package/lib/esm/streams/ibi-stream.js +0 -43
  317. package/lib/esm/streams/low-pass.stream.filter.js +0 -9
  318. package/lib/esm/streams/stream.filter.interface.js +0 -1
  319. package/lib/esm/streams/stream.interface.js +0 -1
  320. package/lib/esm/streams/stream.js +0 -72
  321. package/lib/esm/streams/stream.spec.js +0 -168
  322. package/lib/esm/tiles/tile.settings.interface.js +0 -41
  323. package/lib/esm/users/settings/dashboard/user.dashboard.settings.interface.js +0 -13
  324. package/lib/esm/users/settings/user.app.settings.interface.js +0 -5
  325. package/lib/esm/users/settings/user.chart.settings.interface.js +0 -23
  326. package/lib/esm/users/settings/user.map.settings.interface.js +0 -22
  327. package/lib/esm/users/settings/user.my-tracks.settings.interface.js +0 -1
  328. package/lib/esm/users/settings/user.settings.interface.js +0 -1
  329. package/lib/esm/users/settings/user.stats-settings.interface.js +0 -1
  330. package/lib/esm/users/settings/user.summaries.settings.interface.js +0 -1
  331. package/lib/esm/users/settings/user.unit.settings.interface.js +0 -73
  332. package/lib/esm/users/user.account.privileges.interface.js +0 -1
  333. package/lib/esm/users/user.export-to-csv.settings.interface.js +0 -1
  334. package/lib/esm/users/user.interface.js +0 -1
  335. package/lib/esm/users/user.js +0 -38
  336. 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
- ];