Skip to main content

cpu_temp/temperature/
sensor.rs

1#[cfg(target_os = "windows")]
2use crate::msr::intel_msr::IntelMsr;
3
4#[derive(Debug, Clone)]
5pub struct CoreTemperature {
6    pub tj_max: f32,
7    pub offset: f32,
8    pub temperature: f32,
9}
10
11#[derive(Debug, Clone)]
12pub struct PackageTemperature {
13    pub tj_max: f32,
14    pub offset: f32,
15    pub temperature: f32,
16}
17
18#[cfg(target_os = "windows")]
19pub struct TemperatureSensor {
20    pub tj_max: f32,
21}
22
23#[cfg(target_os = "windows")]
24impl TemperatureSensor {
25    pub fn new(msr: &mut IntelMsr) -> anyhow::Result<Self> {
26        let tj_max = msr.read_temperature_target()?.temperature_target() as f32;
27        Ok(TemperatureSensor { tj_max })
28    }
29
30    /// 从MSR读取的偏移量计算实际温度
31    pub fn calculate_temperature(&self, t_slope: f32, offset: f32) -> f32 {
32        self.tj_max - (t_slope * offset)
33    }
34
35    /// 读取TjMax值从MSR
36    pub fn read_tj_max_from_msr(&self, msr: &mut IntelMsr) -> anyhow::Result<f32> {
37        let tj_max = msr.read_temperature_target()?.temperature_target() as f32;
38        Ok(tj_max)
39    }
40
41    /// 读取核心温度
42    pub fn read_core_temperature(&self, msr: &mut IntelMsr) -> anyhow::Result<CoreTemperature> {
43        let status = msr.read_therm_status()?;
44
45        let temp_offset = if status.reading_valid() {
46            status.digital_readout() as f32
47        } else {
48            anyhow::bail!("got invalid reading from msr")
49        };
50        let temperature = self.calculate_temperature(status.resolution() as f32, temp_offset);
51
52        Ok(CoreTemperature {
53            tj_max: self.tj_max,
54            offset: temp_offset,
55            temperature,
56        })
57    }
58
59    /// 读取封装温度
60    pub fn read_package_temperature(
61        &self,
62        msr: &mut IntelMsr,
63    ) -> anyhow::Result<PackageTemperature> {
64        let status = msr.read_package_therm_status()?;
65        let temp_offset = status.pkg_digital_readout() as f32;
66        let temperature = self.calculate_temperature(1.0, temp_offset);
67
68        Ok(PackageTemperature {
69            tj_max: self.tj_max,
70            offset: temp_offset,
71            temperature,
72        })
73    }
74}