cpu_temp/temperature/
sensor.rs1#[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 pub fn calculate_temperature(&self, t_slope: f32, offset: f32) -> f32 {
32 self.tj_max - (t_slope * offset)
33 }
34
35 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 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 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}