master
1use battery;
2use log::error;
3
4#[repr(C)]
5#[derive(Debug)]
6pub enum BatteryTimeToEmptyError {
7 Success = 0,
8 NoBattery = 1,
9 NoTimeToEmpty = 2,
10 ManagerError = 3,
11}
12
13#[repr(C)]
14pub struct BatteryTimeToEmptyResult {
15 pub time_to_empty_seconds: u64,
16 pub error: BatteryTimeToEmptyError,
17}
18
19#[no_mangle]
20pub extern "C" fn battery_time_to_empty() -> BatteryTimeToEmptyResult {
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.time_to_empty() {
30 Some(time) => {
31 // Convert Time to seconds as u64
32 let seconds = time.get::<battery::units::time::second>();
33 BatteryTimeToEmptyResult {
34 time_to_empty_seconds: seconds as u64,
35 error: BatteryTimeToEmptyError::Success,
36 }
37 }
38 None => {
39 error!("No time to empty available");
40 BatteryTimeToEmptyResult {
41 time_to_empty_seconds: 0,
42 error: BatteryTimeToEmptyError::NoTimeToEmpty,
43 }
44 }
45 }
46 }
47 Err(e) => {
48 error!("Battery error: {}", e);
49 BatteryTimeToEmptyResult {
50 time_to_empty_seconds: 0,
51 error: BatteryTimeToEmptyError::NoBattery,
52 }
53 }
54 }
55 } else {
56 error!("No batteries found");
57 BatteryTimeToEmptyResult {
58 time_to_empty_seconds: 0,
59 error: BatteryTimeToEmptyError::NoBattery,
60 }
61 }
62 }
63 Err(e) => {
64 error!("Failed to get batteries: {}", e);
65 BatteryTimeToEmptyResult {
66 time_to_empty_seconds: 0,
67 error: BatteryTimeToEmptyError::ManagerError,
68 }
69 }
70 }
71 }
72 Err(e) => {
73 error!("Failed to create battery manager: {}", e);
74 BatteryTimeToEmptyResult {
75 time_to_empty_seconds: 0,
76 error: BatteryTimeToEmptyError::ManagerError,
77 }
78 }
79 }
80}
81
82#[cfg(test)]
83mod test {
84 use super::*;
85
86 #[test]
87 fn test_battery_time_to_empty() {
88 let result = battery_time_to_empty();
89
90 match result.error {
91 BatteryTimeToEmptyError::Success => {
92 println!(
93 "Battery time to empty: {} seconds",
94 result.time_to_empty_seconds
95 );
96 assert!(result.time_to_empty_seconds > 0);
97 }
98 BatteryTimeToEmptyError::NoBattery => {
99 println!("No battery found");
100 assert_eq!(result.time_to_empty_seconds, 0);
101 }
102 BatteryTimeToEmptyError::NoTimeToEmpty => {
103 println!("No time to empty available");
104 assert_eq!(result.time_to_empty_seconds, 0);
105 }
106 BatteryTimeToEmptyError::ManagerError => {
107 println!("Battery manager error");
108 assert_eq!(result.time_to_empty_seconds, 0);
109 }
110 }
111
112 assert!(matches!(
113 result.error,
114 BatteryTimeToEmptyError::Success
115 | BatteryTimeToEmptyError::NoBattery
116 | BatteryTimeToEmptyError::NoTimeToEmpty
117 | BatteryTimeToEmptyError::ManagerError
118 ));
119 }
120}