1use crate::protos::power_supply_properties::power_supply_properties;
10use crate::protos::power_supply_properties::PowerSupplyProperties;
11use crate::BatteryData;
12use crate::BatteryStatus;
13use crate::PowerData;
14
15pub const POWER_INTERFACE_NAME: &str = "org.chromium.PowerManager";
17pub const POWER_OBJECT_PATH: &str = "/org/chromium/PowerManager";
19
20pub mod client;
21pub mod monitor;
22
23impl From<PowerSupplyProperties> for PowerData {
24 fn from(props: PowerSupplyProperties) -> Self {
25 let ac_online = if props.has_external_power() {
26 props.external_power() != power_supply_properties::ExternalPower::DISCONNECTED
27 } else {
28 false
29 };
30
31 let battery = if props.has_battery_state()
32 && props.battery_state() != power_supply_properties::BatteryState::NOT_PRESENT
33 {
34 let status = match props.battery_state() {
35 power_supply_properties::BatteryState::FULL => BatteryStatus::NotCharging,
36 power_supply_properties::BatteryState::CHARGING => BatteryStatus::Charging,
37 power_supply_properties::BatteryState::DISCHARGING => BatteryStatus::Discharging,
38 _ => BatteryStatus::Unknown,
39 };
40
41 let percent = std::cmp::min(100, props.battery_percent().round() as u32);
42 let voltage = (props.battery_voltage() * 1_000_000f64).round() as u32;
44 let current = (props.battery_current() * 1_000_000f64).round() as u32;
46 let charge_counter = (props.battery_charge() * 1_000_000f64).round() as u32;
48 let charge_full = (props.battery_charge_full() * 1_000_000f64).round() as u32;
49
50 Some(BatteryData {
51 status,
52 percent,
53 voltage,
54 current,
55 charge_counter,
56 charge_full,
57 })
58 } else {
59 None
60 };
61
62 Self { ac_online, battery }
63 }
64}