@@ -75,30 +75,8 @@ export function createFITRecorder (config) {
7575 }
7676
7777 function setIntervalParameters ( intervalParameters ) {
78- if ( intervalParameters === undefined || intervalParameters . length === 0 ) { return }
79-
80- let i = 0
81- while ( i < intervalParameters . length ) {
82- sessionData . workoutplan [ i ] = { intervalnumber : i }
83- switch ( true ) {
84- case ( intervalParameters [ i ] . targetDistance > 0 ) :
85- // A target distance is set
86- sessionData . workoutplan [ i ] . type = 'distance'
87- sessionData . workoutplan [ i ] . targetTime = 0
88- sessionData . workoutplan [ i ] . targetDistance = intervalParameters [ i ] . targetDistance
89- break
90- case ( intervalParameters [ i ] . targetTime > 0 ) :
91- // A target time is set
92- sessionData . workoutplan [ i ] . type = 'time'
93- sessionData . workoutplan [ i ] . targetTime = intervalParameters [ i ] . targetTime
94- sessionData . workoutplan [ i ] . targetDistance = 0
95- break
96- default :
97- sessionData . workoutplan [ i ] . type = 'open'
98- sessionData . workoutplan [ i ] . targetTime = 0
99- sessionData . workoutplan [ i ] . targetDistance = 0
100- }
101- i ++
78+ if ( intervalParameters !== undefined && intervalParameters . length > 0 ) {
79+ sessionData . workoutplan = intervalParameters
10280 }
10381 }
10482
@@ -131,8 +109,10 @@ export function createFITRecorder (config) {
131109 break
132110 case ( metrics . metricsContext . isPauseEnd ) :
133111 // The session is resumed, so it was a pause instead of a stop
112+ const startTime = sessionData . lap [ lapnumber ] . endTime
113+ const workoutStepNo = sessionData . lap [ lapnumber ] . strokes [ sessionData . lap [ lapnumber ] . strokes . length - 1 ] . workoutStepNumber
134114 lapnumber ++
135- addRestLap ( lapnumber , metrics , sessionData . lap [ lapnumber - 1 ] . endTime , currentTime )
115+ addRestLap ( lapnumber , metrics , startTime , currentTime , workoutStepNo )
136116 lapnumber ++
137117 startLap ( lapnumber , metrics , currentTime )
138118 addMetricsToStrokesArray ( metrics )
@@ -210,11 +190,10 @@ export function createFITRecorder (config) {
210190 lapHeartrateSeries . reset ( )
211191 }
212192
213- function addRestLap ( lapnumber , metrics , startTime , endTime ) {
193+ function addRestLap ( lapnumber , metrics , startTime , endTime , workoutStepNo ) {
214194 sessionData . lap [ lapnumber ] = { startTime }
215195 sessionData . lap [ lapnumber ] . intensity = 'rest'
216- // ToDo: look the situation where the Workout forces rest period (future functionality), and thus the workoutStepNumber should change based on the current and previous lap (should work automatically???)
217- sessionData . lap [ lapnumber ] . workoutStepNumber = metrics . workoutStepNumber
196+ sessionData . lap [ lapnumber ] . workoutStepNumber = workoutStepNo
218197 sessionData . lap [ lapnumber ] . lapNumber = lapnumber + 1
219198 sessionData . lap [ lapnumber ] . endTime = endTime
220199 }
@@ -557,55 +536,43 @@ export function createFITRecorder (config) {
557536
558537 let i = 0
559538 while ( i < workout . workoutplan . length ) {
560- switch ( workout . workoutplan [ i ] . type ) {
561- case ( 'distance' ) :
539+ switch ( true ) {
540+ case ( workout . workoutplan [ i ] . type === 'distance' && workout . workoutplan [ i ] . targetDistance > 0 ) :
562541 // A target distance is set
563- writer . writeMessage (
564- 'workout_step' ,
565- {
566- message_index : i ,
567- duration_type : 'distance' ,
568- duration_value : workout . workoutplan [ i ] . targetDistance ,
569- intensity : 'active'
570- } ,
571- null ,
572- true
573- )
542+ createWorkoutStep ( writer , i , 'distance' , workout . workoutplan [ i ] . targetDistance , 'active' )
574543 break
575- case ( 'time' ) :
544+ case ( workout . workoutplan [ i ] . type === 'time' && workout . workoutplan [ i ] . targetTime > 0 ) :
576545 // A target time is set
577- writer . writeMessage (
578- 'workout_step' ,
579- {
580- message_index : i ,
581- duration_type : 'time' ,
582- duration_value : workout . workoutplan [ i ] . targetTime ,
583- intensity : 'active'
584- } ,
585- null ,
586- true
587- )
546+ createWorkoutStep ( writer , i , 'time' , workout . workoutplan [ i ] . targetTime , 'active' )
588547 break
589- case ( 'open' ) :
548+ case ( workout . workoutplan [ i ] . type === 'rest' && workout . workoutplan [ i ] . targetTime > 0 ) :
590549 // A target time is set
591- writer . writeMessage (
592- 'workout_step' ,
593- {
594- message_index : i ,
595- duration_type : 'open' ,
596- intensity : 'active'
597- } ,
598- null ,
599- true
600- )
550+ createWorkoutStep ( writer , i , 'time' , workout . workoutplan [ i ] . targetTime , 'rest' )
551+ break
552+ case ( workout . workoutplan [ i ] . type === 'justrow' ) :
553+ createWorkoutStep ( writer , i , 'open' , 0 , 'active' )
601554 break
602555 default :
603- // Nothing to do here
556+ // Nothing to do here, ignore malformed data
604557 }
605558 i ++
606559 }
607560 }
608561
562+ async function createWorkoutStep ( writer , stepNumber , durationType , durationValue , intensityValue ) {
563+ writer . writeMessage (
564+ 'workout_step' ,
565+ {
566+ message_index : stepNumber ,
567+ duration_type : durationType ,
568+ ...( durationValue > 0 ? { duration_value : durationValue } : { } ) ,
569+ intensity : intensityValue
570+ } ,
571+ null ,
572+ true
573+ )
574+ }
575+
609576 async function createFile ( content , filename , compress = false ) {
610577 if ( compress ) {
611578 const gzipContent = await gzip ( content )
0 commit comments