use super::{is_wmi_not_found_error, TemperatureResult};
use serde::Deserialize;
use wmi::WMIConnection;
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct ThermalZoneTemperature {
current_temperature: Option<u32>, }
pub struct AcpiThermalSource {
}
impl Default for AcpiThermalSource {
fn default() -> Self {
Self::new()
}
}
impl AcpiThermalSource {
pub fn new() -> Self {
Self {}
}
pub fn get_temperature(&self, wmi_conn: Option<&WMIConnection>) -> TemperatureResult {
let conn = match wmi_conn {
Some(c) => c,
None => return TemperatureResult::Error,
};
let results: Result<Vec<ThermalZoneTemperature>, _> =
conn.raw_query("SELECT CurrentTemperature FROM MSAcpi_ThermalZoneTemperature");
match results {
Ok(zones) => {
if zones.is_empty() {
return TemperatureResult::NoValidReading;
}
for zone in zones {
if let Some(temp_tenths_kelvin) = zone.current_temperature {
let celsius = (temp_tenths_kelvin as f64 / 10.0) - 273.15;
if celsius > 0.0 && celsius < 150.0 {
return TemperatureResult::Success(celsius.round() as u32);
}
}
}
TemperatureResult::NoValidReading
}
Err(e) => {
if is_wmi_not_found_error(&e) {
TemperatureResult::NotFound
} else {
TemperatureResult::Error
}
}
}
}
}