battery temp

This commit is contained in:
Alex Janka 2024-01-15 09:31:56 +11:00
parent 66b15fc46e
commit 9e3821ec29
3 changed files with 27 additions and 24 deletions

View file

@ -5,6 +5,7 @@ pub const BATTERY_VOLTAGE: &str = "battery_voltage";
pub const TARGET_VOLTAGE: &str = "target_voltage"; pub const TARGET_VOLTAGE: &str = "target_voltage";
pub const INPUT_CURRENT: &str = "input_current"; pub const INPUT_CURRENT: &str = "input_current";
pub const CHARGE_STATE: &str = "charge_state"; pub const CHARGE_STATE: &str = "charge_state";
pub const BATTERY_TEMP: &str = "battery_temp";
pub const PL_DUTY_CYCLE: &str = "pl_duty_cycle"; pub const PL_DUTY_CYCLE: &str = "pl_duty_cycle";
pub const PL_LOAD_CURRENT: &str = "pl_internal_load_current"; pub const PL_LOAD_CURRENT: &str = "pl_internal_load_current";

View file

@ -1,4 +1,4 @@
use metrics::describe_gauge; use metrics::{describe_gauge, Unit};
mod gauge_names; mod gauge_names;
pub mod pl; pub mod pl;
@ -8,10 +8,11 @@ pub fn register_metrics() {
describe_gauge!(gauge_names::TARGET_VOLTAGE, "Target voltage"); describe_gauge!(gauge_names::TARGET_VOLTAGE, "Target voltage");
describe_gauge!(gauge_names::INPUT_CURRENT, "Internal charge current"); describe_gauge!(gauge_names::INPUT_CURRENT, "Internal charge current");
describe_gauge!(gauge_names::CHARGE_STATE, "Regulator state"); describe_gauge!(gauge_names::CHARGE_STATE, "Regulator state");
describe_gauge!(gauge_names::BATTERY_TEMP, "Battery temperature");
register_pl_metrics(); register_pl_metrics();
} }
fn register_pl_metrics() { fn register_pl_metrics() {
describe_gauge!(gauge_names::PL_DUTY_CYCLE, "Duty cycle"); describe_gauge!(gauge_names::PL_DUTY_CYCLE, Unit::Percent, "Duty cycle");
describe_gauge!(gauge_names::PL_LOAD_CURRENT, "Internal load current"); describe_gauge!(gauge_names::PL_LOAD_CURRENT, "Internal load current");
} }

View file

@ -16,37 +16,26 @@ use super::gauge_names;
pub struct Pli { pub struct Pli {
pub state: Arc<RwLock<PlState>>, pub state: Arc<RwLock<PlState>>,
port: Box<dyn SerialPort>, port: Box<dyn SerialPort>,
voltage_gauge: Gauge, battery_voltage: Gauge,
target_voltage_gauge: Gauge, target_voltage: Gauge,
duty_cycle: Gauge, duty_cycle: Gauge,
internal_charge_current: Gauge, internal_charge_current: Gauge,
internal_load_current: Gauge, internal_load_current: Gauge,
battery_temp: Gauge,
regulator_gauges: RegulatorGauges, regulator_gauges: RegulatorGauges,
} }
#[derive(Debug, Clone, Copy, Serialize, Deserialize)] #[derive(Debug, Clone, Copy, Serialize, Deserialize, Default)]
pub struct PlState { pub struct PlState {
pub battery_voltage: f64, pub battery_voltage: f64,
pub target_voltage: f64, pub target_voltage: f64,
pub duty_cycle: f64, pub duty_cycle: f64,
pub internal_charge_current: f64, pub internal_charge_current: f64,
pub internal_load_current: f64, pub internal_load_current: f64,
pub battery_temp: f64,
pub regulator_state: RegulatorState, pub regulator_state: RegulatorState,
} }
impl Default for PlState {
fn default() -> Self {
Self {
battery_voltage: Default::default(),
target_voltage: Default::default(),
duty_cycle: Default::default(),
internal_charge_current: Default::default(),
internal_load_current: Default::default(),
regulator_state: RegulatorState::Absorption,
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)] #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum RegulatorState { pub enum RegulatorState {
Boost, Boost,
@ -67,6 +56,12 @@ impl From<u8> for RegulatorState {
} }
} }
impl Default for RegulatorState {
fn default() -> Self {
Self::Absorption
}
}
struct RegulatorGauges { struct RegulatorGauges {
boost: Gauge, boost: Gauge,
equalise: Gauge, equalise: Gauge,
@ -162,33 +157,36 @@ impl Pli {
Label::new(gauge_names::PL_LABEL, serial_port), Label::new(gauge_names::PL_LABEL, serial_port),
]; ];
let voltage_gauge = gauge!(gauge_names::BATTERY_VOLTAGE, device_labels.clone()); let battery_voltage = gauge!(gauge_names::BATTERY_VOLTAGE, device_labels.clone());
let target_voltage_gauge = gauge!(gauge_names::TARGET_VOLTAGE, device_labels.clone()); let target_voltage = gauge!(gauge_names::TARGET_VOLTAGE, device_labels.clone());
let duty_cycle = gauge!(gauge_names::PL_DUTY_CYCLE, device_labels.clone()); let duty_cycle = gauge!(gauge_names::PL_DUTY_CYCLE, device_labels.clone());
let internal_charge_current = gauge!(gauge_names::INPUT_CURRENT, device_labels.clone()); let internal_charge_current = gauge!(gauge_names::INPUT_CURRENT, device_labels.clone());
let internal_load_current = gauge!(gauge_names::PL_LOAD_CURRENT, device_labels.clone()); let internal_load_current = gauge!(gauge_names::PL_LOAD_CURRENT, device_labels.clone());
let battery_temp = gauge!(gauge_names::BATTERY_TEMP, device_labels.clone());
Ok(Self { Ok(Self {
state: Arc::new(RwLock::new(Default::default())), state: Arc::new(RwLock::new(Default::default())),
port, port,
voltage_gauge, battery_voltage,
target_voltage_gauge, target_voltage,
duty_cycle, duty_cycle,
internal_charge_current, internal_charge_current,
internal_load_current, internal_load_current,
battery_temp,
regulator_gauges: RegulatorGauges::new(device_labels), regulator_gauges: RegulatorGauges::new(device_labels),
}) })
} }
pub fn refresh(&mut self) { pub fn refresh(&mut self) {
if let Some(new_state) = self.read_state().some_or_print() { if let Some(new_state) = self.read_state().some_or_print() {
self.voltage_gauge.set(new_state.battery_voltage); self.battery_voltage.set(new_state.battery_voltage);
self.target_voltage_gauge.set(new_state.target_voltage); self.target_voltage.set(new_state.target_voltage);
self.duty_cycle.set(new_state.duty_cycle); self.duty_cycle.set(new_state.duty_cycle);
self.internal_charge_current self.internal_charge_current
.set(new_state.internal_charge_current); .set(new_state.internal_charge_current);
self.internal_load_current self.internal_load_current
.set(new_state.internal_load_current); .set(new_state.internal_load_current);
self.battery_temp.set(new_state.battery_temp);
self.regulator_gauges.set(&new_state.regulator_state); self.regulator_gauges.set(&new_state.regulator_state);
*self.state.write().expect("PLI state handler panicked!!") = new_state; *self.state.write().expect("PLI state handler panicked!!") = new_state;
@ -221,6 +219,7 @@ impl Pli {
duty_cycle: (self.read_ram(PlRamAddress::Dutycyc)? as f64) / 255., duty_cycle: (self.read_ram(PlRamAddress::Dutycyc)? as f64) / 255.,
internal_charge_current: (self.read_ram(PlRamAddress::Cint)? as f64) * (4. / 10.), internal_charge_current: (self.read_ram(PlRamAddress::Cint)? as f64) * (4. / 10.),
internal_load_current: (self.read_ram(PlRamAddress::Lint)? as f64) * (4. / 10.), internal_load_current: (self.read_ram(PlRamAddress::Lint)? as f64) * (4. / 10.),
battery_temp: self.read_ram(PlRamAddress::Battemp)? as f64,
regulator_state: self.read_ram(PlRamAddress::Rstate)?.into(), regulator_state: self.read_ram(PlRamAddress::Rstate)?.into(),
}) })
} }
@ -266,6 +265,7 @@ impl Pli {
enum PlRamAddress { enum PlRamAddress {
Dutycyc, Dutycyc,
Batv, Batv,
Battemp,
Rstate, Rstate,
Vreg, Vreg,
Cint, Cint,
@ -277,6 +277,7 @@ impl From<PlRamAddress> for u8 {
match value { match value {
PlRamAddress::Dutycyc => 39, PlRamAddress::Dutycyc => 39,
PlRamAddress::Batv => 50, PlRamAddress::Batv => 50,
PlRamAddress::Battemp => 52,
PlRamAddress::Rstate => 101, PlRamAddress::Rstate => 101,
PlRamAddress::Vreg => 105, PlRamAddress::Vreg => 105,
PlRamAddress::Cint => 213, PlRamAddress::Cint => 213,