You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.3 KiB
70 lines
2.3 KiB
using Dto.Tiny;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace HeartTrackAPI.Controllers;
|
|
|
|
[ApiController]
|
|
[ApiVersion("1.0")]
|
|
[Route("api/[controller]")]
|
|
public class AnalysisController : ControllerBase
|
|
{
|
|
private readonly List<HeartRateZone> _heartRateZones = new()
|
|
{
|
|
new() { Name = "Repos", MinHeartRate = 0, MaxHeartRate = 60 },
|
|
new() { Name = "Aérobie légère", MinHeartRate = 61, MaxHeartRate = 90 },
|
|
new() { Name = "Aérobie", MinHeartRate = 91, MaxHeartRate = 140 },
|
|
new() { Name = "Anaérobie", MinHeartRate = 141, MaxHeartRate = 180 },
|
|
new() { Name = "VO2 Max", MinHeartRate = 181, MaxHeartRate = 220 }
|
|
};
|
|
|
|
[HttpGet("heart-rate/zones")]
|
|
public IActionResult GetHeartRateZones()
|
|
{
|
|
var heartRates = GetMockHeartRateData();
|
|
var results = _heartRateZones.Select(zone => new HeartRateZoneResult
|
|
{
|
|
Zone = zone.Name,
|
|
TimeSpent = CalculateTimeInZone(zone, heartRates)
|
|
}).ToList();
|
|
return Ok(results);
|
|
}
|
|
|
|
private TimeSpan CalculateTimeInZone(HeartRateZone zone, List<HeartRateTinyDto> heartRates)
|
|
{
|
|
var secondsInZone =
|
|
heartRates.Count(hr => hr.HeartRate >= zone.MinHeartRate && hr.HeartRate <= zone.MaxHeartRate);
|
|
return TimeSpan.FromSeconds(secondsInZone);
|
|
}
|
|
|
|
private List<HeartRateTinyDto> GetMockHeartRateData()
|
|
{
|
|
var random = new Random();
|
|
return Enumerable.Range(1, 3600)
|
|
.Select(_ => new HeartRateTinyDto
|
|
{
|
|
HeartRate = random.Next(60, 220),
|
|
Timestamp = new DateTime(2021, 1, 1).AddSeconds(random.Next(3600)),
|
|
Latitude = random.NextDouble() * 180 - 90,
|
|
Longitude = random.NextDouble() * 360 - 180,
|
|
Altitude = random.NextDouble() * 1000,
|
|
Cadence = random.Next(60, 120),
|
|
Distance = random.NextDouble() * 100,
|
|
Speed = random.NextDouble() * 30,
|
|
Power = random.Next(0, 500),
|
|
Temperature = random.NextDouble() * 30
|
|
}).ToList();
|
|
}
|
|
}
|
|
|
|
public class HeartRateZoneResult
|
|
{
|
|
public string Zone { get; set; }
|
|
public TimeSpan TimeSpent { get; set; }
|
|
}
|
|
|
|
internal class HeartRateZone
|
|
{
|
|
public string Name { get; set; }
|
|
public int MinHeartRate { get; set; }
|
|
public int MaxHeartRate { get; set; }
|
|
} |