add better enum for states

This commit is contained in:
Clement Tsang 2024-01-04 20:33:25 -05:00
parent 0c161ae77e
commit 87ca73a2fd
No known key found for this signature in database
GPG Key ID: B17834EA2182446B
6 changed files with 89 additions and 17 deletions

View File

@ -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),
});
}
}

View File

@ -15,10 +15,18 @@ 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)]

View File

@ -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),
),
});
}
}

View File

@ -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(),

View File

@ -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,
});
});

View File

@ -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(),
}
}
}