master
1use battery;
2use log::error;
3
4#[repr(C)]
5#[derive(Debug)]
6pub enum BatteryError {
7 Success = 0,
8 NoBattery = 1,
9 NoCycleCount = 2,
10 ManagerError = 3,
11}
12
13#[repr(C)]
14pub struct BatteryResult {
15 pub cycle_count: u32,
16 pub error: BatteryError,
17}
18
19#[no_mangle]
20pub extern "C" fn battery_cycle_count() -> BatteryResult {
21 match battery::Manager::new() {
22 Ok(manager) => {
23 match manager.batteries() {
24 Ok(batteries) => {
25 // Get the first battery if available
26 if let Some(battery) = batteries.into_iter().next() {
27 match battery {
28 Ok(bat) => {
29 match bat.cycle_count() {
30 Some(count) => BatteryResult {
31 cycle_count: count,
32 error: BatteryError::Success,
33 },
34 None => {
35 error!("No cycle count available");
36 BatteryResult {
37 cycle_count: 0,
38 error: BatteryError::NoCycleCount,
39 }
40 }
41 }
42 }
43 Err(e) => {
44 error!("Battery error: {}", e);
45 BatteryResult {
46 cycle_count: 0,
47 error: BatteryError::NoBattery,
48 }
49 }
50 }
51 } else {
52 error!("No batteries found");
53 BatteryResult {
54 cycle_count: 0,
55 error: BatteryError::NoBattery,
56 }
57 }
58 }
59 Err(e) => {
60 error!("Failed to get batteries: {}", e);
61 BatteryResult {
62 cycle_count: 0,
63 error: BatteryError::ManagerError,
64 }
65 }
66 }
67 }
68 Err(e) => {
69 error!("Failed to create battery manager: {}", e);
70 BatteryResult {
71 cycle_count: 0,
72 error: BatteryError::ManagerError,
73 }
74 }
75 }
76}
77
78#[cfg(test)]
79mod test {
80 use super::*;
81
82 #[test]
83 fn test_battery_cycle_count() {
84 let result = battery_cycle_count();
85
86 match result.error {
87 BatteryError::Success => {
88 println!("Battery cycle count: {}", result.cycle_count);
89 assert!(result.cycle_count >= 1);
90 }
91 BatteryError::NoBattery => {
92 println!("No battery found");
93 assert_eq!(result.cycle_count, 0);
94 }
95 BatteryError::NoCycleCount => {
96 println!("No cycle count available");
97 assert_eq!(result.cycle_count, 0);
98 }
99 BatteryError::ManagerError => {
100 println!("Battery manager error");
101 assert_eq!(result.cycle_count, 0);
102 }
103 }
104
105 assert!(matches!(
106 result.error,
107 BatteryError::Success
108 | BatteryError::NoBattery
109 | BatteryError::NoCycleCount
110 | BatteryError::ManagerError
111 ));
112 }
113}