cpu-temp 0.1.0

An Intel CPU temperature monitoring library for Windows and Linux using MSR access
Documentation
#[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 })
    }

    /// 从MSR读取的偏移量计算实际温度
    pub fn calculate_temperature(&self, t_slope: f32, offset: f32) -> f32 {
        self.tj_max - (t_slope * offset)
    }

    /// 读取TjMax值从MSR
    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,
        })
    }
}