///|
/// Calculate morning trends and baseline parameters for a history of measurements.
pub fn calculate_morning_trends(
history : Array[MorningMeasurement],
window_size : Int,
config : HrvConfig,
) -> Array[MorningTrend] {
let n = history.length()
let trends = []
for i in 0.. upper {
"High"
} else {
"Normal"
}
// Calculate recovery score out of 100
let recovery_score = if today_rmssd < lower {
let ratio = today_rmssd / lower
let score = 80.0 * ratio
if score < 0.0 {
0.0
} else {
score
}
} else if today_rmssd > upper {
// High RMSSD can indicate good recovery or parasympathetic hyperactivity/fatigue
// We scale down slightly if it goes way above the upper limit
let excess = today_rmssd - upper
let score = 100.0 - excess / upper * 30.0
if score < 70.0 {
70.0
} else {
score
}
} else {
// Normal range maps to 80.0 - 100.0
let range_width = upper - lower
if range_width > 0.0 {
80.0 + (today_rmssd - lower) / range_width * 20.0
} else {
90.0
}
}
trends.push({
date: today.date,
today_rmssd,
rmssd_rolling_avg: rolling_avg,
rmssd_rolling_sd: rolling_sd,
rmssd_normal_range_lower: lower,
rmssd_normal_range_upper: upper,
rmssd_status: status,
recovery_score,
})
}
trends
}