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