use crate::cpu::{AppCPUUtilization, CPUUtilization, ProcessCPUUtilization};
use sysinfo::System;
pub trait CPUEnergy {
fn get_power(&self) -> f64;
}
pub trait GPUEnergy {
fn get_power(&self) -> f64;
}
pub trait PlatformEnergy {
fn name(&self) -> String {
let name = System::name().unwrap_or_else(|| "Unknown OS".to_string());
let version = System::os_version().unwrap_or_default();
if version.is_empty() {
name
} else {
format!("{name} {version}")
}
}
fn cpu(&self) -> Box<dyn CPUEnergy>;
fn gpu(&self) -> Box<dyn GPUEnergy>;
fn cpu_usage(&self) -> Box<dyn CPUUtilization>;
fn process_cpu_usage(&self) -> Option<Box<dyn ProcessCPUUtilization>> {
None
}
fn app_cpu_usage(
&self,
_refresh_interval: std::time::Duration,
) -> Option<Box<dyn AppCPUUtilization>> {
None
}
fn process_energy(
&self,
process_utilization: f64,
cpu_power: f64,
cpu_utilization: f64,
) -> f64 {
if cpu_utilization < 0.01 {
return 0.0;
}
let attributed = 100.0 * ((process_utilization * cpu_power) / cpu_utilization);
attributed.clamp(0.0, cpu_power)
}
fn app_energy(&self, app_utilization: f64, cpu_power: f64, cpu_utilization: f64) -> f64 {
if cpu_utilization < 0.01 {
return 0.0;
}
let attributed = 100.0 * ((app_utilization * cpu_power) / cpu_utilization);
attributed.clamp(0.0, cpu_power)
}
}