lots of stuff, don't truly remember
This commit is contained in:
@@ -29,17 +29,23 @@ func EncodeFITWorkout(w *workout.Workout, userFTP int) ([]byte, error) {
|
||||
wktFile.FileId.
|
||||
SetType(typedef.FileWorkout).
|
||||
SetManufacturer(typedef.ManufacturerDevelopment).
|
||||
SetProduct(1).
|
||||
SetTimeCreated(time.Now())
|
||||
SetProduct(0).
|
||||
SetTimeCreated(time.Now()).
|
||||
SetSerialNumber(uint32(time.Now().Unix()))
|
||||
|
||||
name := w.WorkoutData.Name
|
||||
if name == "" {
|
||||
name = w.Title
|
||||
}
|
||||
// Truncate name if too long (FIT spec supports up to 50 chars)
|
||||
if len(name) > 50 {
|
||||
name = name[:50]
|
||||
}
|
||||
|
||||
wktFile.Workout = mesgdef.NewWorkout(nil).
|
||||
SetWktName(name).
|
||||
SetSport(typedef.SportCycling).
|
||||
SetSubSport(typedef.SubSportGeneric).
|
||||
SetNumValidSteps(uint16(len(w.WorkoutData.Segments)))
|
||||
|
||||
steps := make([]*mesgdef.WorkoutStep, 0, len(w.WorkoutData.Segments))
|
||||
@@ -95,11 +101,20 @@ func segmentToFITStep(seg workout.WorkoutSegment, index uint16, userFTP int) *me
|
||||
case "freeride":
|
||||
step.SetIntensity(typedef.IntensityActive)
|
||||
step.SetTargetType(typedef.WktStepTargetOpen)
|
||||
step.SetTargetValue(0)
|
||||
step.SetWktStepName("Free Ride")
|
||||
|
||||
case "rest":
|
||||
step.SetIntensity(typedef.IntensityRest)
|
||||
step.SetTargetType(typedef.WktStepTargetOpen)
|
||||
step.SetTargetValue(0)
|
||||
step.SetWktStepName("Rest")
|
||||
|
||||
default:
|
||||
step.SetIntensity(typedef.IntensityActive)
|
||||
step.SetTargetType(typedef.WktStepTargetOpen)
|
||||
step.SetTargetValue(0)
|
||||
step.SetWktStepName("Active")
|
||||
}
|
||||
|
||||
return step
|
||||
@@ -110,6 +125,7 @@ func segmentToFITStep(seg workout.WorkoutSegment, index uint16, userFTP int) *me
|
||||
func setPowerTarget(step *mesgdef.WorkoutStep, seg workout.WorkoutSegment, userFTP int) {
|
||||
if seg.PowerLow == 0 && seg.PowerHigh == 0 && seg.Power == 0 {
|
||||
step.SetTargetType(typedef.WktStepTargetOpen)
|
||||
step.SetTargetValue(0)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -117,13 +133,34 @@ func setPowerTarget(step *mesgdef.WorkoutStep, seg workout.WorkoutSegment, userF
|
||||
step.SetTargetValue(0) // 0 = custom range
|
||||
|
||||
if seg.PowerLow != 0 || seg.PowerHigh != 0 {
|
||||
low := uint32(float64(userFTP)*seg.PowerLow) + 1000
|
||||
high := uint32(float64(userFTP)*seg.PowerHigh) + 1000
|
||||
step.SetCustomTargetValueLow(low)
|
||||
step.SetCustomTargetValueHigh(high)
|
||||
lowWatts := uint32(float64(userFTP) * seg.PowerLow)
|
||||
highWatts := uint32(float64(userFTP) * seg.PowerHigh)
|
||||
|
||||
// Ensure we have a valid range (low < high)
|
||||
if lowWatts == highWatts {
|
||||
// Add a small tolerance range (±5W) around the target
|
||||
if lowWatts < 5 {
|
||||
lowWatts = 1
|
||||
highWatts = lowWatts + 5
|
||||
} else {
|
||||
lowWatts = lowWatts - 5
|
||||
highWatts = highWatts + 5
|
||||
}
|
||||
}
|
||||
|
||||
step.SetCustomTargetValueLow(lowWatts + 1000)
|
||||
step.SetCustomTargetValueHigh(highWatts + 1000)
|
||||
} else if seg.Power != 0 {
|
||||
watts := uint32(float64(userFTP) * seg.Power)
|
||||
step.SetCustomTargetValueLow(watts - 10 + 1000)
|
||||
// Ensure low value doesn't go below 1000 (minimum is 1 watt)
|
||||
lowOffset := uint32(10)
|
||||
if watts < 10 {
|
||||
lowOffset = watts - 1
|
||||
if lowOffset == 0 {
|
||||
lowOffset = 0
|
||||
}
|
||||
}
|
||||
step.SetCustomTargetValueLow(watts - lowOffset + 1000)
|
||||
step.SetCustomTargetValueHigh(watts + 10 + 1000)
|
||||
}
|
||||
}
|
||||
@@ -132,6 +169,7 @@ func setPowerTarget(step *mesgdef.WorkoutStep, seg workout.WorkoutSegment, userF
|
||||
func setPowerTargetSteady(step *mesgdef.WorkoutStep, seg workout.WorkoutSegment, userFTP int) {
|
||||
if seg.Power == 0 {
|
||||
step.SetTargetType(typedef.WktStepTargetOpen)
|
||||
step.SetTargetValue(0)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -139,6 +177,14 @@ func setPowerTargetSteady(step *mesgdef.WorkoutStep, seg workout.WorkoutSegment,
|
||||
step.SetTargetValue(0)
|
||||
|
||||
watts := uint32(float64(userFTP) * seg.Power)
|
||||
step.SetCustomTargetValueLow(watts - 10 + 1000)
|
||||
// Ensure low value doesn't go below 1000 (minimum is 1 watt)
|
||||
lowOffset := uint32(10)
|
||||
if watts < 10 {
|
||||
lowOffset = watts - 1
|
||||
if lowOffset == 0 {
|
||||
lowOffset = 0
|
||||
}
|
||||
}
|
||||
step.SetCustomTargetValueLow(watts - lowOffset + 1000)
|
||||
step.SetCustomTargetValueHigh(watts + 10 + 1000)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user