1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2024 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker //! Bindings for the ChromeOS `powerd` D-Bus API. 6*bb4ee6a4SAndroid Build Coastguard Worker //! 7*bb4ee6a4SAndroid Build Coastguard Worker //! <https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/power_manager/README.md> 8*bb4ee6a4SAndroid Build Coastguard Worker 9*bb4ee6a4SAndroid Build Coastguard Worker use crate::protos::power_supply_properties::power_supply_properties; 10*bb4ee6a4SAndroid Build Coastguard Worker use crate::protos::power_supply_properties::PowerSupplyProperties; 11*bb4ee6a4SAndroid Build Coastguard Worker use crate::BatteryData; 12*bb4ee6a4SAndroid Build Coastguard Worker use crate::BatteryStatus; 13*bb4ee6a4SAndroid Build Coastguard Worker use crate::PowerData; 14*bb4ee6a4SAndroid Build Coastguard Worker 15*bb4ee6a4SAndroid Build Coastguard Worker // Interface name from power_manager/dbus_bindings/org.chromium.PowerManager.xml. 16*bb4ee6a4SAndroid Build Coastguard Worker pub const POWER_INTERFACE_NAME: &str = "org.chromium.PowerManager"; 17*bb4ee6a4SAndroid Build Coastguard Worker // Object path from power_manager/dbus_bindings/org.chromium.PowerManager.xml. 18*bb4ee6a4SAndroid Build Coastguard Worker pub const POWER_OBJECT_PATH: &str = "/org/chromium/PowerManager"; 19*bb4ee6a4SAndroid Build Coastguard Worker 20*bb4ee6a4SAndroid Build Coastguard Worker pub mod client; 21*bb4ee6a4SAndroid Build Coastguard Worker pub mod monitor; 22*bb4ee6a4SAndroid Build Coastguard Worker 23*bb4ee6a4SAndroid Build Coastguard Worker impl From<PowerSupplyProperties> for PowerData { from(props: PowerSupplyProperties) -> Self24*bb4ee6a4SAndroid Build Coastguard Worker fn from(props: PowerSupplyProperties) -> Self { 25*bb4ee6a4SAndroid Build Coastguard Worker let ac_online = if props.has_external_power() { 26*bb4ee6a4SAndroid Build Coastguard Worker props.external_power() != power_supply_properties::ExternalPower::DISCONNECTED 27*bb4ee6a4SAndroid Build Coastguard Worker } else { 28*bb4ee6a4SAndroid Build Coastguard Worker false 29*bb4ee6a4SAndroid Build Coastguard Worker }; 30*bb4ee6a4SAndroid Build Coastguard Worker 31*bb4ee6a4SAndroid Build Coastguard Worker let battery = if props.has_battery_state() 32*bb4ee6a4SAndroid Build Coastguard Worker && props.battery_state() != power_supply_properties::BatteryState::NOT_PRESENT 33*bb4ee6a4SAndroid Build Coastguard Worker { 34*bb4ee6a4SAndroid Build Coastguard Worker let status = match props.battery_state() { 35*bb4ee6a4SAndroid Build Coastguard Worker power_supply_properties::BatteryState::FULL => BatteryStatus::NotCharging, 36*bb4ee6a4SAndroid Build Coastguard Worker power_supply_properties::BatteryState::CHARGING => BatteryStatus::Charging, 37*bb4ee6a4SAndroid Build Coastguard Worker power_supply_properties::BatteryState::DISCHARGING => BatteryStatus::Discharging, 38*bb4ee6a4SAndroid Build Coastguard Worker _ => BatteryStatus::Unknown, 39*bb4ee6a4SAndroid Build Coastguard Worker }; 40*bb4ee6a4SAndroid Build Coastguard Worker 41*bb4ee6a4SAndroid Build Coastguard Worker let percent = std::cmp::min(100, props.battery_percent().round() as u32); 42*bb4ee6a4SAndroid Build Coastguard Worker // Convert from volts to microvolts. 43*bb4ee6a4SAndroid Build Coastguard Worker let voltage = (props.battery_voltage() * 1_000_000f64).round() as u32; 44*bb4ee6a4SAndroid Build Coastguard Worker // Convert from amps to microamps. 45*bb4ee6a4SAndroid Build Coastguard Worker let current = (props.battery_current() * 1_000_000f64).round() as u32; 46*bb4ee6a4SAndroid Build Coastguard Worker // Convert from ampere-hours to micro ampere-hours. 47*bb4ee6a4SAndroid Build Coastguard Worker let charge_counter = (props.battery_charge() * 1_000_000f64).round() as u32; 48*bb4ee6a4SAndroid Build Coastguard Worker let charge_full = (props.battery_charge_full() * 1_000_000f64).round() as u32; 49*bb4ee6a4SAndroid Build Coastguard Worker 50*bb4ee6a4SAndroid Build Coastguard Worker Some(BatteryData { 51*bb4ee6a4SAndroid Build Coastguard Worker status, 52*bb4ee6a4SAndroid Build Coastguard Worker percent, 53*bb4ee6a4SAndroid Build Coastguard Worker voltage, 54*bb4ee6a4SAndroid Build Coastguard Worker current, 55*bb4ee6a4SAndroid Build Coastguard Worker charge_counter, 56*bb4ee6a4SAndroid Build Coastguard Worker charge_full, 57*bb4ee6a4SAndroid Build Coastguard Worker }) 58*bb4ee6a4SAndroid Build Coastguard Worker } else { 59*bb4ee6a4SAndroid Build Coastguard Worker None 60*bb4ee6a4SAndroid Build Coastguard Worker }; 61*bb4ee6a4SAndroid Build Coastguard Worker 62*bb4ee6a4SAndroid Build Coastguard Worker Self { ac_online, battery } 63*bb4ee6a4SAndroid Build Coastguard Worker } 64*bb4ee6a4SAndroid Build Coastguard Worker } 65