xref: /aosp_15_r20/external/crosvm/power_monitor/src/lib.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 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 //! Power monitoring abstraction layer.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use std::error::Error;
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker use base::ReadNotifier;
10*bb4ee6a4SAndroid Build Coastguard Worker 
11*bb4ee6a4SAndroid Build Coastguard Worker pub trait PowerMonitor: ReadNotifier {
read_message(&mut self) -> std::result::Result<Option<PowerData>, Box<dyn Error>>12*bb4ee6a4SAndroid Build Coastguard Worker     fn read_message(&mut self) -> std::result::Result<Option<PowerData>, Box<dyn Error>>;
13*bb4ee6a4SAndroid Build Coastguard Worker }
14*bb4ee6a4SAndroid Build Coastguard Worker 
15*bb4ee6a4SAndroid Build Coastguard Worker pub trait PowerClient {
get_power_data(&mut self) -> std::result::Result<PowerData, Box<dyn Error>>16*bb4ee6a4SAndroid Build Coastguard Worker     fn get_power_data(&mut self) -> std::result::Result<PowerData, Box<dyn Error>>;
17*bb4ee6a4SAndroid Build Coastguard Worker }
18*bb4ee6a4SAndroid Build Coastguard Worker 
19*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug)]
20*bb4ee6a4SAndroid Build Coastguard Worker pub struct PowerData {
21*bb4ee6a4SAndroid Build Coastguard Worker     pub ac_online: bool,
22*bb4ee6a4SAndroid Build Coastguard Worker     pub battery: Option<BatteryData>,
23*bb4ee6a4SAndroid Build Coastguard Worker }
24*bb4ee6a4SAndroid Build Coastguard Worker 
25*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug)]
26*bb4ee6a4SAndroid Build Coastguard Worker pub struct BatteryData {
27*bb4ee6a4SAndroid Build Coastguard Worker     pub status: BatteryStatus,
28*bb4ee6a4SAndroid Build Coastguard Worker     pub percent: u32,
29*bb4ee6a4SAndroid Build Coastguard Worker     /// Battery voltage in microvolts.
30*bb4ee6a4SAndroid Build Coastguard Worker     pub voltage: u32,
31*bb4ee6a4SAndroid Build Coastguard Worker     /// Battery current in microamps.
32*bb4ee6a4SAndroid Build Coastguard Worker     pub current: u32,
33*bb4ee6a4SAndroid Build Coastguard Worker     /// Battery charge counter in microampere hours.
34*bb4ee6a4SAndroid Build Coastguard Worker     pub charge_counter: u32,
35*bb4ee6a4SAndroid Build Coastguard Worker     /// Battery full charge counter in microampere hours.
36*bb4ee6a4SAndroid Build Coastguard Worker     pub charge_full: u32,
37*bb4ee6a4SAndroid Build Coastguard Worker }
38*bb4ee6a4SAndroid Build Coastguard Worker 
39*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy, Debug)]
40*bb4ee6a4SAndroid Build Coastguard Worker pub enum BatteryStatus {
41*bb4ee6a4SAndroid Build Coastguard Worker     Unknown,
42*bb4ee6a4SAndroid Build Coastguard Worker     Charging,
43*bb4ee6a4SAndroid Build Coastguard Worker     Discharging,
44*bb4ee6a4SAndroid Build Coastguard Worker     NotCharging,
45*bb4ee6a4SAndroid Build Coastguard Worker }
46*bb4ee6a4SAndroid Build Coastguard Worker 
47*bb4ee6a4SAndroid Build Coastguard Worker pub trait CreatePowerMonitorFn:
48*bb4ee6a4SAndroid Build Coastguard Worker     Send + Fn() -> std::result::Result<Box<dyn PowerMonitor>, Box<dyn Error>>
49*bb4ee6a4SAndroid Build Coastguard Worker {
50*bb4ee6a4SAndroid Build Coastguard Worker }
51*bb4ee6a4SAndroid Build Coastguard Worker 
52*bb4ee6a4SAndroid Build Coastguard Worker impl<T> CreatePowerMonitorFn for T where
53*bb4ee6a4SAndroid Build Coastguard Worker     T: Send + Fn() -> std::result::Result<Box<dyn PowerMonitor>, Box<dyn Error>>
54*bb4ee6a4SAndroid Build Coastguard Worker {
55*bb4ee6a4SAndroid Build Coastguard Worker }
56*bb4ee6a4SAndroid Build Coastguard Worker 
57*bb4ee6a4SAndroid Build Coastguard Worker pub trait CreatePowerClientFn:
58*bb4ee6a4SAndroid Build Coastguard Worker     Send + Fn() -> std::result::Result<Box<dyn PowerClient>, Box<dyn Error>>
59*bb4ee6a4SAndroid Build Coastguard Worker {
60*bb4ee6a4SAndroid Build Coastguard Worker }
61*bb4ee6a4SAndroid Build Coastguard Worker 
62*bb4ee6a4SAndroid Build Coastguard Worker impl<T> CreatePowerClientFn for T where
63*bb4ee6a4SAndroid Build Coastguard Worker     T: Send + Fn() -> std::result::Result<Box<dyn PowerClient>, Box<dyn Error>>
64*bb4ee6a4SAndroid Build Coastguard Worker {
65*bb4ee6a4SAndroid Build Coastguard Worker }
66*bb4ee6a4SAndroid Build Coastguard Worker 
67*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "powerd")]
68*bb4ee6a4SAndroid Build Coastguard Worker pub mod powerd;
69*bb4ee6a4SAndroid Build Coastguard Worker 
70*bb4ee6a4SAndroid Build Coastguard Worker mod protos {
71*bb4ee6a4SAndroid Build Coastguard Worker     // ANDROID: b/259142784 - we remove protos subdir b/c cargo2android
72*bb4ee6a4SAndroid Build Coastguard Worker     include!(concat!(env!("OUT_DIR"), "/generated.rs"));
73*bb4ee6a4SAndroid Build Coastguard Worker }
74