#[cfg(target_os = "windows")]
use crate::msr::intel_msr::IntelMsr;
#[derive(Debug, Clone)]
pub struct CoreTemperature {
pub tj_max: f32,
pub offset: f32,
pub temperature: f32,
}
#[derive(Debug, Clone)]
pub struct PackageTemperature {
pub tj_max: f32,
pub offset: f32,
pub temperature: f32,
}
#[cfg(target_os = "windows")]
pub struct TemperatureSensor {
pub tj_max: f32,
}
#[cfg(target_os = "windows")]
impl TemperatureSensor {
pub fn new(msr: &mut IntelMsr) -> anyhow::Result<Self> {
let tj_max = msr.read_temperature_target()?.temperature_target() as f32;
Ok(TemperatureSensor { tj_max })
}
pub fn calculate_temperature(&self, t_slope: f32, offset: f32) -> f32 {
self.tj_max - (t_slope * offset)
}
pub fn read_tj_max_from_msr(&self, msr: &mut IntelMsr) -> anyhow::Result<f32> {
let tj_max = msr.read_temperature_target()?.temperature_target() as f32;
Ok(tj_max)
}
pub fn read_core_temperature(&self, msr: &mut IntelMsr) -> anyhow::Result<CoreTemperature> {
let status = msr.read_therm_status()?;
let temp_offset = if status.reading_valid() {
status.digital_readout() as f32
} else {
anyhow::bail!("got invalid reading from msr")
};
let temperature = self.calculate_temperature(status.resolution() as f32, temp_offset);
Ok(CoreTemperature {
tj_max: self.tj_max,
offset: temp_offset,
temperature,
})
}
pub fn read_package_temperature(
&self,
msr: &mut IntelMsr,
) -> anyhow::Result<PackageTemperature> {
let status = msr.read_package_therm_status()?;
let temp_offset = status.pkg_digital_readout() as f32;
let temperature = self.calculate_temperature(1.0, temp_offset);
Ok(PackageTemperature {
tj_max: self.tj_max,
offset: temp_offset,
temperature,
})
}
}