Generate <Ramp> tags in ZWO

- When range-interval at start: generate <Warmup>
- When range-interval at end: generate <Cooldown>
- Otherwise use <Ramp>
This commit is contained in:
Rene Saarsoo 2021-03-21 15:04:18 +02:00
parent cec3c57477
commit 6bbdea1908
5 changed files with 71 additions and 5 deletions

View File

@ -117,7 +117,6 @@ console.log(stats(workout));
- More restricted syntax for text (with quotes) - More restricted syntax for text (with quotes)
- Concatenate similar intervals - Concatenate similar intervals
- Distinguish between terrain-sensitive and insensitive free-ride. - Distinguish between terrain-sensitive and insensitive free-ride.
- Use `<Ramp>` in addition to `<Warmup>` and `<Cooldown>`
[zwift]: https://zwift.com/ [zwift]: https://zwift.com/
[zwofactory]: https://zwofactory.com/ [zwofactory]: https://zwofactory.com/

14
examples/ramps.txt Normal file
View File

@ -0,0 +1,14 @@
Name: Ramps
Author: R.Saarsoo
Description:
Various kinds of ramp intervals.
Ramp: 5:00 40%..75%
Ramp: 10:00 80%..90%
Ramp: 10:00 90%..80%
Warmup: 10:00 80%..90%
Cooldown: 10:00 90%..80%
Ramp: 5:00 75%..40%

View File

@ -11,7 +11,7 @@ const generateTextEvents = (comments: Comment[]): xml.XmlObject[] => {
}; };
const generateRangeInterval = ( const generateRangeInterval = (
tagName: "Warmup" | "Cooldown", tagName: "Warmup" | "Cooldown" | "Ramp",
{ duration, intensity, cadence, comments }: Interval, { duration, intensity, cadence, comments }: Interval,
): xml.XmlObject => { ): xml.XmlObject => {
return { return {
@ -79,16 +79,22 @@ const generateRepeatInterval = (repInterval: RepeatedInterval): xml.XmlObject =>
}; };
}; };
const generateInterval = (interval: Interval | RepeatedInterval): xml.XmlObject => { const generateInterval = (
interval: Interval | RepeatedInterval,
index: number,
allIntervals: (Interval | RepeatedInterval)[],
): xml.XmlObject => {
if (interval.type === "repeat") { if (interval.type === "repeat") {
return generateRepeatInterval(interval); return generateRepeatInterval(interval);
} }
const { intensity } = interval; const { intensity } = interval;
if (intensity.start < intensity.end) { if (index === 0 && intensity.start < intensity.end) {
return generateRangeInterval("Warmup", interval); return generateRangeInterval("Warmup", interval);
} else if (intensity.start > intensity.end) { } else if (index === allIntervals.length - 1 && intensity.start > intensity.end) {
return generateRangeInterval("Cooldown", interval); return generateRangeInterval("Cooldown", interval);
} else if (intensity.start !== intensity.end) {
return generateRangeInterval("Ramp", interval);
} else if (intensity.zone === "free") { } else if (intensity.zone === "free") {
return generateFreeRideInterval(interval); return generateFreeRideInterval(interval);
} else { } else {

View File

@ -226,6 +226,31 @@ The workouts are alphabetically ordered from easiest to hardest, so enjoy the mi
</workout_file>" </workout_file>"
`; `;
exports[`Generate ZWO examples/ramps.txt 1`] = `
"<workout_file>
<name>Ramps</name>
<author>R.Saarsoo</author>
<description>Various kinds of ramp intervals.</description>
<tags>
</tags>
<sportType>bike</sportType>
<workout>
<Warmup Duration=\\"300\\" PowerLow=\\"0.4\\" PowerHigh=\\"0.75\\">
</Warmup>
<Ramp Duration=\\"600\\" PowerLow=\\"0.8\\" PowerHigh=\\"0.9\\">
</Ramp>
<Ramp Duration=\\"600\\" PowerLow=\\"0.9\\" PowerHigh=\\"0.8\\">
</Ramp>
<Ramp Duration=\\"600\\" PowerLow=\\"0.8\\" PowerHigh=\\"0.9\\">
</Ramp>
<Ramp Duration=\\"600\\" PowerLow=\\"0.9\\" PowerHigh=\\"0.8\\">
</Ramp>
<Cooldown Duration=\\"300\\" PowerLow=\\"0.75\\" PowerHigh=\\"0.4\\">
</Cooldown>
</workout>
</workout_file>"
`;
exports[`Generate ZWO examples/threshold-pushing.txt 1`] = ` exports[`Generate ZWO examples/threshold-pushing.txt 1`] = `
"<workout_file> "<workout_file>
<name>Threshold pushing</name> <name>Threshold pushing</name>
@ -338,6 +363,27 @@ Zone Distribution:
" "
`; `;
exports[`Generate stats examples/ramps.txt 1`] = `
"
Total duration: 50 minutes
Average intensity: 80%
Normalized intensity: 82%
TSS: 56
XP: 300
Zone Distribution:
6 min - Z1: Recovery
4 min - Z2: Endurance
40 min - Z3: Tempo
0 min - Z4: Threshold
0 min - Z5: VO2 Max
0 min - Z6: Anaerobic
0 min - Freeride
"
`;
exports[`Generate stats examples/threshold-pushing.txt 1`] = ` exports[`Generate stats examples/threshold-pushing.txt 1`] = `
" "
Total duration: 79 minutes Total duration: 79 minutes

View File

@ -12,6 +12,7 @@ const filenames = [
"examples/ftp-test.txt", "examples/ftp-test.txt",
"examples/halvfems.txt", "examples/halvfems.txt",
"examples/threshold-pushing.txt", "examples/threshold-pushing.txt",
"examples/ramps.txt",
]; ];
describe("Generate ZWO", () => { describe("Generate ZWO", () => {