use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HealthStatus {
Healthy,
Degraded,
Unhealthy,
}
impl HealthStatus {
pub fn from_energy(energy: f32) -> Self {
match energy {
e if e > 0.7 => HealthStatus::Healthy,
e if e > 0.3 => HealthStatus::Degraded,
_ => HealthStatus::Unhealthy,
}
}
}
pub struct SelfDiagnostic {
pub pulse_amount: f32,
pub pulse_interval: u64,
tick_counter: u64,
}
impl Default for SelfDiagnostic {
fn default() -> Self {
Self {
pulse_amount: 0.1,
pulse_interval: 100, tick_counter: 0,
}
}
}
impl SelfDiagnostic {
pub fn new(pulse_amount: f32, pulse_interval: u64) -> Self {
Self {
pulse_amount,
pulse_interval,
tick_counter: 0,
}
}
pub fn should_pulse(&mut self) -> bool {
self.tick_counter += 1;
if self.tick_counter >= self.pulse_interval {
self.tick_counter = 0;
true
} else {
false
}
}
pub fn pulse_delta(&self) -> f32 {
self.pulse_amount
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_health_status() {
assert_eq!(HealthStatus::from_energy(1.0), HealthStatus::Healthy);
assert_eq!(HealthStatus::from_energy(0.5), HealthStatus::Degraded);
assert_eq!(HealthStatus::from_energy(0.1), HealthStatus::Unhealthy);
}
#[test]
fn test_pulse_timing() {
let mut diag = SelfDiagnostic::new(0.1, 3);
assert!(!diag.should_pulse()); assert!(!diag.should_pulse()); assert!(diag.should_pulse()); assert!(!diag.should_pulse()); }
}