Commit 0fc7b49

Karn Wong <[email protected]>
2025-07-28 05:36:22
fix(getSensors): use rust module for better hardware compatibility
1 parent 24f5229
Changed files (3)
internal
lib
internal/get/sensors.go
@@ -8,29 +8,22 @@ package get
 import "C"
 import (
 	"fmt"
+
 	"github.com/kahnwong/swissknife/configs/color"
 	"github.com/rs/zerolog/log"
-	"github.com/shirou/gopsutil/v4/sensors"
 )
 
 func Sensors() {
-	fmt.Println(float32(C.sensors()))
-
-	//str1 := C.CString("world")
-	//defer C.free(unsafe.Pointer(str1))
-	//C.hello(str1)
+	result := C.sensors()
 
-	s, err := sensors.SensorsTemperatures()
-	if err != nil {
-		log.Fatal().Msg("Failed to get sensors info")
+	switch result.error {
+	case C.SENSOR_SUCCESS:
+		fmt.Printf("%s: %.2f\n", color.Green("Temperature"), float64(result.temperature))
+	case C.SENSOR_NO_COMPONENTS:
+		log.Fatal().Msg("No components found")
+	case C.SENSOR_NO_TEMPERATURE:
+		log.Fatal().Msg("No temperature reading available")
+	default:
+		log.Fatal().Msg("Unknown error occurred")
 	}
-
-	var temperature float64
-	for _, sensor := range s {
-		if temperature < sensor.Temperature {
-			temperature = sensor.Temperature
-		}
-	}
-
-	fmt.Printf("%s: %.2f\n", color.Green("Temperature"), temperature)
 }
lib/system/src/lib.rs
@@ -4,32 +4,75 @@ extern crate sysinfo;
 use log::error;
 use sysinfo::{Components, System};
 
+#[repr(C)]
+#[derive(Debug)]
+pub enum SensorError {
+    Success = 0,
+    NoComponents = 1,
+    NoTemperature = 2,
+}
+
+#[repr(C)]
+pub struct SensorResult {
+    pub temperature: f32,
+    pub error: SensorError,
+}
 
 #[no_mangle]
-pub extern "C" fn sensors() -> f32 {
+pub extern "C" fn sensors() -> SensorResult {
     let mut system = System::new_all();
     system.refresh_all();
     let components = Components::new_with_refreshed_list();
 
-    let mut output: f32 = 0.0;
     if let Some(component) = (&components).into_iter().next() {
-        if let Some(temperature) = component.temperature() {
-            output = temperature;
+        if let Some(temp) = component.temperature() {
+            SensorResult {
+                temperature: temp,
+                error: SensorError::Success,
+            }
         } else {
-            error!("Unknown temperature: {}", component.label())
+            error!("Unknown temperature: {}", component.label());
+            SensorResult {
+                temperature: 0.0,
+                error: SensorError::NoTemperature,
+            }
+        }
+    } else {
+        error!("No components found");
+        SensorResult {
+            temperature: 0.0,
+            error: SensorError::NoComponents,
         }
     }
-
-    output
 }
 
-
 #[cfg(test)]
 pub mod test {
     use super::*;
 
     #[test]
     fn simulated_main_function() {
-        sensors();
+        let result = sensors();
+
+        match result.error {
+            SensorError::Success => {
+                println!("Temperature reading successful: {} °C", result.temperature);
+                assert!(result.temperature >= 0.0); // Basic sanity check
+            }
+            SensorError::NoComponents => {
+                println!("No components found");
+                assert_eq!(result.temperature, 0.0);
+            }
+            SensorError::NoTemperature => {
+                println!("No temperature reading available");
+                assert_eq!(result.temperature, 0.0);
+            }
+        }
+
+        // Ensure we got some kind of valid result
+        assert!(matches!(
+            result.error,
+            SensorError::Success | SensorError::NoComponents | SensorError::NoTemperature
+        ));
     }
 }
lib/system.h
@@ -1,1 +1,12 @@
-float sensors(void);
+enum SensorError {
+    SENSOR_SUCCESS = 0,
+    SENSOR_NO_COMPONENTS = 1,
+    SENSOR_NO_TEMPERATURE = 2
+};
+
+struct SensorResult {
+    float temperature;
+    enum SensorError error;
+};
+
+struct SensorResult sensors(void);