diff options
author | Clement Tsang <34804052+ClementTsang@users.noreply.github.com> | 2024-01-04 20:33:25 -0500 |
---|---|---|
committer | Clement Tsang <34804052+ClementTsang@users.noreply.github.com> | 2024-01-04 20:33:25 -0500 |
commit | 87ca73a2fd3b5fc0e1eff98d7ad11fa4889eac4a (patch) | |
tree | 0e11a9e382934fc1a9e948c75a81bf084f31ffe5 | |
parent | 0c161ae77e92580541ae19e3bd4363216be5b5e8 (diff) |
add better enum for states
-rw-r--r-- | src/data_collection/nvidia.rs | 4 | ||||
-rw-r--r-- | src/data_collection/temperature.rs | 10 | ||||
-rw-r--r-- | src/data_collection/temperature/linux.rs | 32 | ||||
-rw-r--r-- | src/data_collection/temperature/sysinfo.rs | 8 | ||||
-rw-r--r-- | src/data_conversion.rs | 14 | ||||
-rw-r--r-- | src/widgets/temperature_table.rs | 38 |
6 files changed, 89 insertions, 17 deletions
diff --git a/src/data_collection/nvidia.rs b/src/data_collection/nvidia.rs index f4e6aeec..d463d2c4 100644 --- a/src/data_collection/nvidia.rs +++ b/src/data_collection/nvidia.rs @@ -13,6 +13,8 @@ use crate::{ }, }; +use super::temperature::TemperatureReading; + pub static NVML_DATA: OnceLock<Result<Nvml, NvmlError>> = OnceLock::new(); pub struct GpusData { @@ -57,7 +59,7 @@ pub fn get_nvidia_vecs( temp_vec.push(TempHarvest { name: name.clone(), - temperature: Some(temperature), + temperature: TemperatureReading::Value(temperature), }); } } diff --git a/src/data_collection/temperature.rs b/src/data_collection/temperature.rs index db490027..2726ab65 100644 --- a/src/data_collection/temperature.rs +++ b/src/data_collection/temperature.rs @@ -16,9 +16,17 @@ cfg_if::cfg_if! { use crate::app::filter::Filter; #[derive(Default, Debug, Clone)] +pub enum TemperatureReading { + Value(f32), + #[default] + Unavailable, + Off, +} + +#[derive(Default, Debug, Clone)] pub struct TempHarvest { pub name: String, - pub temperature: Option<f32>, + pub temperature: TemperatureReading, } #[derive(Clone, Debug, Copy, PartialEq, Eq, Default)] diff --git a/src/data_collection/temperature/linux.rs b/src/data_collection/temperature/linux.rs index 50b858d1..3e370717 100644 --- a/src/data_collection/temperature/linux.rs +++ b/src/data_collection/temperature/linux.rs @@ -3,16 +3,36 @@ use std::{ fs, path::{Path, PathBuf}, + sync::OnceLock, + time::Instant, }; use anyhow::Result; use hashbrown::{HashMap, HashSet}; +use humantime::Duration; -use super::{is_temp_filtered, TempHarvest, TemperatureType}; +use super::{is_temp_filtered, TempHarvest, TemperatureReading, TemperatureType}; use crate::{app::filter::Filter, utils::error::BottomError}; const EMPTY_NAME: &str = "Unknown"; +/// Holds some data about the power states of certain devices. +struct PowerStateInfo { + autosuspend: Option<Duration>, + last_read: Instant, +} + +impl PowerStateInfo { + fn new(autosuspend: Option<Duration>) -> Self { + Self { + autosuspend, + last_read: Instant::now(), + } + } +} + +static POWER_STATE_MAP: OnceLock<HashMap<String, PowerStateInfo>> = OnceLock::new(); + /// Returned results from grabbing hwmon/coretemp temperature sensor values/names. struct HwmonResults { temperatures: Vec<TempHarvest>, @@ -241,7 +261,7 @@ fn hwmon_temperatures(temp_type: &TemperatureType, filter: &Option<Filter>) -> H let name = finalize_name(None, None, &sensor_name, &mut seen_names); temperatures.push(TempHarvest { name, - temperature: None, + temperature: TemperatureReading::Off, }); continue; @@ -321,7 +341,9 @@ fn hwmon_temperatures(temp_type: &TemperatureType, filter: &Option<Filter>) -> H if let Ok(temp_celsius) = parse_temp(&temp_path) { temperatures.push(TempHarvest { name, - temperature: Some(temp_type.convert_temp_unit(temp_celsius)), + temperature: TemperatureReading::Value( + temp_type.convert_temp_unit(temp_celsius), + ), }); } } @@ -373,7 +395,9 @@ fn add_thermal_zone_temperatures( temperatures.push(TempHarvest { name, - temperature: Some(temp_type.convert_temp_unit(temp_celsius)), + temperature: TemperatureReading::Value( + temp_type.convert_temp_unit(temp_celsius), + ), }); } } diff --git a/src/data_collection/temperature/sysinfo.rs b/src/data_collection/temperature/sysinfo.rs index 9a2ea403..9ea86fd0 100644 --- a/src/data_collection/temperature/sysinfo.rs +++ b/src/data_collection/temperature/sysinfo.rs @@ -2,7 +2,7 @@ use anyhow::Result; -use super::{is_temp_filtered, TempHarvest, TemperatureType}; +use super::{is_temp_filtered, TempHarvest, TemperatureReading, TemperatureType}; use crate::app::filter::Filter; pub fn get_temperature_data( @@ -19,7 +19,9 @@ pub fn get_temperature_data( if is_temp_filtered(filter, &name) { temperature_vec.push(TempHarvest { name, - temperature: Some(temp_type.convert_temp_unit(component.temperature())), + temperature: TemperatureReading::Value( + temp_type.convert_temp_unit(component.temperature()), + ), }); } } @@ -36,7 +38,7 @@ pub fn get_temperature_data( if let Some(temp) = temp.as_temperature() { temperature_vec.push(TempHarvest { name, - temperature: Some(match temp_type { + temperature: TemperatureReading::Value(match temp_type { TemperatureType::Celsius => temp.celsius(), TemperatureType::Kelvin => temp.kelvin(), TemperatureType::Fahrenheit => temp.fahrenheit(), diff --git a/src/data_conversion.rs b/src/data_conversion.rs index 0d1c4604..f4115719 100644 --- a/src/data_conversion.rs +++ b/src/data_conversion.rs @@ -8,9 +8,13 @@ use kstring::KString; use crate::{ app::{data_farmer::DataCollection, AxisScaling}, canvas::components::time_chart::Point, - data_collection::{cpu::CpuDataType, memory::MemHarvest, temperature::TemperatureType}, + data_collection::{ + cpu::CpuDataType, + memory::MemHarvest, + temperature::{TemperatureReading, TemperatureType}, + }, utils::{data_prefixes::*, data_units::DataUnit, general::*}, - widgets::{DiskWidgetData, TempWidgetData}, + widgets::{DiskWidgetData, TempWidgetData, TempWidgetReading}, }; #[derive(Debug, Default)] @@ -130,7 +134,11 @@ impl ConvertedData { data.temp_harvest.iter().for_each(|temp_harvest| { self.temp_data.push(TempWidgetData { sensor: KString::from_ref(&temp_harvest.name), - temperature_value: temp_harvest.temperature.map(|temp| temp.ceil() as u64), + temperature_value: match temp_harvest.temperature { + TemperatureReading::Value(val) => TempWidgetReading::Value(val.ceil() as u32), + TemperatureReading::Unavailable => TempWidgetReading::Unavailable, + TemperatureReading::Off => TempWidgetReading::Off, + }, temperature_type, }); }); diff --git a/src/widgets/temperature_table.rs b/src/widgets/temperature_table.rs index c7d19702..adf76c7f 100644 --- a/src/widgets/temperature_table.rs +++ b/src/widgets/temperature_table.rs @@ -1,4 +1,7 @@ -use std::{borrow::Cow, cmp::max}; +use std::{ + borrow::Cow, + cmp::{max, Ordering}, +}; use concat_string::concat_string; use kstring::KString; @@ -17,10 +20,34 @@ use crate::{ utils::general::{sort_partial_fn, truncate_to_text}, }; +#[derive(Default, Debug, Clone, Copy, PartialEq)] +pub enum TempWidgetReading { + Value(u32), + #[default] + Unavailable, + Off, +} + +impl PartialOrd for TempWidgetReading { + fn partial_cmp(&self, other: &Self) -> Option<Ordering> { + match (self, other) { + (TempWidgetReading::Value(a), TempWidgetReading::Value(b)) => a.partial_cmp(b), + (TempWidgetReading::Value(_), _) => Some(Ordering::Greater), + (_, TempWidgetReading::Value(_)) => Some(Ordering::Less), + (TempWidgetReading::Unavailable, TempWidgetReading::Unavailable) => { + Some(Ordering::Equal) + } + (TempWidgetReading::Unavailable, TempWidgetReading::Off) => Some(Ordering::Greater), + (TempWidgetReading::Off, TempWidgetReading::Unavailable) => Some(Ordering::Less), + (TempWidgetReading::Off, TempWidgetReading::Off) => Some(Ordering::Equal), + } + } +} + #[derive(Clone, Debug)] pub struct TempWidgetData { pub sensor: KString, - pub temperature_value: Option<u64>, + pub temperature_value: TempWidgetReading, pub temperature_type: TemperatureType, } @@ -41,15 +68,16 @@ impl ColumnHeader for TempWidgetColumn { impl TempWidgetData { pub fn temperature(&self) -> KString { match self.temperature_value { - Some(temp_val) => { + TempWidgetReading::Value(val) => { let temp_type = match self.temperature_type { TemperatureType::Celsius => "°C", TemperatureType::Kelvin => "K", TemperatureType::Fahrenheit => "°F", }; - concat_string!(temp_val.to_string(), temp_type).into() + concat_string!(val.to_string(), temp_type).into() } - None => "N/A".to_string().into(), + TempWidgetReading::Unavailable => "N/A".to_string().into(), + TempWidgetReading::Off => "Off".to_string().into(), } } } |