summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClement Tsang <34804052+ClementTsang@users.noreply.github.com>2024-01-04 20:33:25 -0500
committerClement Tsang <34804052+ClementTsang@users.noreply.github.com>2024-01-04 20:33:25 -0500
commit87ca73a2fd3b5fc0e1eff98d7ad11fa4889eac4a (patch)
tree0e11a9e382934fc1a9e948c75a81bf084f31ffe5
parent0c161ae77e92580541ae19e3bd4363216be5b5e8 (diff)
add better enum for states
-rw-r--r--src/data_collection/nvidia.rs4
-rw-r--r--src/data_collection/temperature.rs10
-rw-r--r--src/data_collection/temperature/linux.rs32
-rw-r--r--src/data_collection/temperature/sysinfo.rs8
-rw-r--r--src/data_conversion.rs14
-rw-r--r--src/widgets/temperature_table.rs38
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(),
}
}
}