use std::fmt;
use std::ops::{Deref, DerefMut};
use crate::platform::traits::*;
use crate::platform::Device;
use crate::units::{ElectricPotential, Energy, Power, Ratio, ThermodynamicTemperature, Time};
use crate::{State, Technology};
pub struct Battery(Device)
where
Device: BatteryDevice;
impl Battery {
pub fn state_of_charge(&self) -> Ratio {
self.0.state_of_charge()
}
pub fn energy(&self) -> Energy {
self.0.energy()
}
pub fn energy_full(&self) -> Energy {
self.0.energy_full()
}
pub fn energy_full_design(&self) -> Energy {
self.0.energy_full_design()
}
pub fn energy_rate(&self) -> Power {
self.0.energy_rate()
}
pub fn voltage(&self) -> ElectricPotential {
self.0.voltage()
}
pub fn state_of_health(&self) -> Ratio {
self.0.state_of_health()
}
pub fn state(&self) -> State {
self.0.state()
}
pub fn technology(&self) -> Technology {
self.0.technology()
}
pub fn temperature(&self) -> Option<ThermodynamicTemperature> {
self.0.temperature()
}
pub fn cycle_count(&self) -> Option<u32> {
self.0.cycle_count()
}
pub fn vendor(&self) -> Option<&str> {
self.0.vendor()
}
pub fn model(&self) -> Option<&str> {
self.0.model()
}
pub fn serial_number(&self) -> Option<&str> {
self.0.serial_number()
}
pub fn time_to_full(&self) -> Option<Time> {
self.0.time_to_full()
}
pub fn time_to_empty(&self) -> Option<Time> {
self.0.time_to_empty()
}
}
impl fmt::Debug for Battery {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Battery")
.field("impl", &self.0)
.field("vendor", &self.vendor())
.field("model", &self.model())
.field("serial_number", &self.serial_number())
.field("technology", &self.technology())
.field("state", &self.state())
.field("capacity", &self.state_of_health())
.field("temperature", &self.temperature())
.field("percentage", &self.state_of_charge())
.field("cycle_count", &self.cycle_count())
.field("energy", &self.energy())
.field("energy_full", &self.energy_full())
.field("energy_full_design", &self.energy_full_design())
.field("energy_rate", &self.energy_rate())
.field("voltage", &self.voltage())
.field("time_to_full", &self.time_to_full())
.field("time_to_empty", &self.time_to_empty())
.finish()
}
}
impl From<Device> for Battery {
fn from(device: Device) -> Battery {
Battery(device)
}
}
impl Deref for Battery {
type Target = Device;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for Battery {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}