Skip to content

Commit 1d5a78f

Browse files
authored
Merge pull request #76 from TreshLaps/feature/bislett_intervals
Feature/bislett intervals
2 parents cd7729a + c1c1257 commit 1d5a78f

File tree

10 files changed

+532
-402
lines changed

10 files changed

+532
-402
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
using Activities.Strava.Endpoints.Models;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
6+
namespace Activities.Strava.Activities;
7+
8+
public static class BislettService
9+
{
10+
// Update when logic is modified to trigger recalculation.
11+
private const string Version = "2022-11-30";
12+
private const int BislettLap = 546;
13+
14+
public static bool TryAdjustBislettLaps(this DetailedActivity activity)
15+
{
16+
if (activity._BislettVersion == Version)
17+
{
18+
return false;
19+
}
20+
21+
activity._BislettVersion = Version;
22+
23+
var intervalLaps = activity.Laps?.Where(lap => lap.IsInterval).ToList() ?? new List<Lap>();
24+
var distanceFactors = new List<double>();
25+
26+
if (intervalLaps.Any(lap => lap.TotalElevationGain > 0))
27+
{
28+
return true;
29+
}
30+
31+
foreach (var lap in intervalLaps)
32+
{
33+
var laps = lap.Distance / BislettLap;
34+
var distanceFactor = laps % 1;
35+
36+
if (distanceFactor > 0.5)
37+
{
38+
distanceFactor = 1.0 - distanceFactor;
39+
}
40+
41+
distanceFactor = distanceFactor / Math.Round(laps);
42+
distanceFactors.Add(distanceFactor);
43+
}
44+
45+
if (!distanceFactors.Any())
46+
{
47+
return true;
48+
}
49+
50+
var name = activity.Name;
51+
var averageFactor = distanceFactors.Average();
52+
var maxFactor = distanceFactors.Max();
53+
54+
// Is Bislett lap
55+
if (maxFactor < 0.1 && averageFactor < 0.08)
56+
{
57+
activity.IsBislettInterval = true;
58+
59+
foreach (var lap in intervalLaps)
60+
{
61+
var laps = lap.Distance / BislettLap;
62+
63+
lap.OriginalDistance = lap.Distance;
64+
lap.OriginalAverageSpeed = lap.AverageSpeed;
65+
66+
lap.Distance = BislettLap * Math.Round(laps);
67+
lap.AverageSpeed = lap.Distance / lap.ElapsedTime;
68+
}
69+
}
70+
else if (activity.IsBislettInterval)
71+
{
72+
activity.IsBislettInterval = false;
73+
74+
foreach (var lap in intervalLaps)
75+
{
76+
if (lap.OriginalDistance > 0)
77+
{
78+
lap.Distance = lap.OriginalDistance;
79+
}
80+
81+
if (lap.OriginalAverageSpeed > 0)
82+
{
83+
lap.AverageSpeed = lap.OriginalAverageSpeed;
84+
}
85+
}
86+
}
87+
88+
return true;
89+
}
90+
}

0 commit comments

Comments
 (0)