master
1use log::error;
2use sysinfo::{Components, System};
3
4#[repr(C)]
5#[derive(Debug)]
6pub enum SensorError {
7 Success = 0,
8 NoComponents = 1,
9 NoTemperature = 2,
10}
11
12#[repr(C)]
13pub struct SensorResult {
14 pub temperature: f32,
15 pub error: SensorError,
16}
17
18#[no_mangle]
19pub extern "C" fn sensors() -> SensorResult {
20 let mut system = System::new_all();
21 system.refresh_all();
22 let components = Components::new_with_refreshed_list();
23
24 if let Some(component) = (&components).into_iter().next() {
25 if let Some(temp) = component.temperature() {
26 SensorResult {
27 temperature: temp,
28 error: SensorError::Success,
29 }
30 } else {
31 error!("Unknown temperature: {}", component.label());
32 SensorResult {
33 temperature: 0.0,
34 error: SensorError::NoTemperature,
35 }
36 }
37 } else {
38 error!("No components found");
39 SensorResult {
40 temperature: 0.0,
41 error: SensorError::NoComponents,
42 }
43 }
44}
45
46#[cfg(test)]
47pub mod test {
48 use super::*;
49
50 #[test]
51 fn simulated_main_function() {
52 let result = sensors();
53
54 match result.error {
55 SensorError::Success => {
56 println!("Temperature reading successful: {} °C", result.temperature);
57 assert!(result.temperature >= 0.0); // Basic sanity check
58 }
59 SensorError::NoComponents => {
60 println!("No components found");
61 assert_eq!(result.temperature, 0.0);
62 }
63 SensorError::NoTemperature => {
64 println!("No temperature reading available");
65 assert_eq!(result.temperature, 0.0);
66 }
67 }
68
69 // Ensure we got some kind of valid result
70 assert!(matches!(
71 result.error,
72 SensorError::Success | SensorError::NoComponents | SensorError::NoTemperature
73 ));
74 }
75}