xref: /aosp_15_r20/external/crosvm/power_monitor/src/powerd.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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