This commit is contained in:
Christoffer Martinsson 2025-10-12 18:39:03 +02:00
parent 0656af17f2
commit 75910610e4
3 changed files with 22 additions and 11 deletions

View File

@ -389,8 +389,8 @@ impl ServiceCollector {
Ok((parse(parts[0])?, parse(parts[1])?, parse(parts[2])?)) Ok((parse(parts[0])?, parse(parts[1])?, parse(parts[2])?))
} }
async fn get_cpu_cstate_info(&self) -> Option<String> { async fn get_cpu_cstate_info(&self) -> Option<Vec<String>> {
// Read C-state information to show actual sleep state distribution // Read C-state information to show all sleep state distributions
let mut cstate_times: Vec<(String, u64)> = Vec::new(); let mut cstate_times: Vec<(String, u64)> = Vec::new();
let mut total_time = 0u64; let mut total_time = 0u64;
@ -414,13 +414,19 @@ impl ServiceCollector {
} }
if total_time > 0 && !cstate_times.is_empty() { if total_time > 0 && !cstate_times.is_empty() {
// Find the dominant C-state (highest time) // Sort by time spent (highest first)
cstate_times.sort_by(|a, b| b.1.cmp(&a.1)); cstate_times.sort_by(|a, b| b.1.cmp(&a.1));
let dominant_state = &cstate_times[0];
let dominant_percent = (dominant_state.1 as f32 / total_time as f32) * 100.0;
// Return dominant state info // Format all C-states with percentages
return Some(format!("{}({:.1}%)", dominant_state.0, dominant_percent)); let mut result = Vec::new();
for (name, time) in cstate_times {
let percent = (time as f32 / total_time as f32) * 100.0;
if percent >= 0.1 { // Only show states with at least 0.1% time
result.push(format!("{}: {:.1}%", name, percent));
}
}
return Some(result);
} }
} }

View File

@ -61,7 +61,7 @@ pub struct ServiceSummary {
#[serde(default)] #[serde(default)]
pub cpu_load_15: f32, pub cpu_load_15: f32,
#[serde(default)] #[serde(default)]
pub cpu_cstate: Option<String>, pub cpu_cstate: Option<Vec<String>>,
#[serde(default)] #[serde(default)]
pub cpu_temp_c: Option<f32>, pub cpu_temp_c: Option<f32>,
#[serde(default)] #[serde(default)]

View File

@ -83,14 +83,19 @@ fn render_metrics(
// CPU dataset // CPU dataset
let cpu_status = status_level_from_color(cpu_icon_color); let cpu_status = status_level_from_color(cpu_icon_color);
let mut cpu_dataset = WidgetDataSet::new(vec!["CPU load".to_string(), "CPU temp".to_string(), "CPU state".to_string()], Some(WidgetStatus::new(cpu_status))); let mut cpu_dataset = WidgetDataSet::new(vec!["CPU load".to_string(), "CPU temp".to_string()], Some(WidgetStatus::new(cpu_status)));
// Get C-state descriptions
let cstate_descriptions = summary.cpu_cstate.as_ref()
.map(|states| states.clone())
.unwrap_or_else(|| vec!["No C-state data".to_string()]);
cpu_dataset.add_row( cpu_dataset.add_row(
Some(WidgetStatus::new(cpu_status)), Some(WidgetStatus::new(cpu_status)),
vec![], cstate_descriptions,
vec![ vec![
format!("{:.2}{:.2}{:.2}", summary.cpu_load_1, summary.cpu_load_5, summary.cpu_load_15), format!("{:.2}{:.2}{:.2}", summary.cpu_load_1, summary.cpu_load_5, summary.cpu_load_15),
format_optional_metric(summary.cpu_temp_c, "°C"), format_optional_metric(summary.cpu_temp_c, "°C"),
summary.cpu_cstate.clone().unwrap_or_else(|| "".to_string()),
], ],
); );