expose internal charge/load current

This commit is contained in:
Alex Janka 2024-01-10 16:27:02 +11:00
parent 892da9adbd
commit d0801b2896

View file

@ -8,6 +8,8 @@ pub struct Pli {
port: Box<dyn SerialPort>, port: Box<dyn SerialPort>,
voltage_gauge: Gauge, voltage_gauge: Gauge,
duty_cycle: Gauge, duty_cycle: Gauge,
internal_charge_current: Gauge,
internal_load_current: Gauge,
} }
impl Pli { impl Pli {
@ -20,21 +22,35 @@ impl Pli {
let voltage_gauge = gauge!("pl_battery_voltage"); let voltage_gauge = gauge!("pl_battery_voltage");
describe_gauge!("pl_duty_cycle", "Duty cycle"); describe_gauge!("pl_duty_cycle", "Duty cycle");
let duty_cycle = gauge!("pl_duty_cycle"); let duty_cycle = gauge!("pl_duty_cycle");
describe_gauge!("pl_internal_charge_current", "Internal charge current");
let internal_charge_current = gauge!("pl_internal_charge_current");
describe_gauge!("pl_internal_load_current", "Internal load current");
let internal_load_current = gauge!("pl_internal_load_current");
Ok(Self { Ok(Self {
port, port,
voltage_gauge, voltage_gauge,
duty_cycle, duty_cycle,
internal_charge_current,
internal_load_current,
}) })
} }
pub fn refresh(&mut self) { pub fn refresh(&mut self) {
if let Ok(batv) = self.read_ram(50) { if let Ok(batv) = self.read_ram(PlRamAddress::Batv) {
self.voltage_gauge.set((batv as f64) * (4. / 10.)); self.voltage_gauge.set((batv as f64) * (4. / 10.));
} }
if let Ok(duty_cycle) = self.read_ram(39) { if let Ok(duty_cycle) = self.read_ram(PlRamAddress::Dutycyc) {
self.duty_cycle.set((duty_cycle as f64) / 255.); self.duty_cycle.set((duty_cycle as f64) / 255.);
} }
if let Ok(internal_charge_current) = self.read_ram(PlRamAddress::Cint) {
self.internal_charge_current
.set((internal_charge_current as f64) * (4. / 10.));
}
if let Ok(internal_load_current) = self.read_ram(PlRamAddress::Lint) {
self.internal_load_current
.set((internal_load_current as f64) * (4. / 10.));
}
} }
fn send_command(&mut self, req: [u8; 4]) { fn send_command(&mut self, req: [u8; 4]) {
@ -52,14 +68,32 @@ impl Pli {
buf buf
} }
fn read_ram(&mut self, address: u8) -> anyhow::Result<u8> { fn read_ram(&mut self, address: PlRamAddress) -> anyhow::Result<u8> {
self.send_command(command(20, address, 0)); self.send_command(command(20, address.into(), 0));
let buf: [u8; 2] = self.receive(); let buf: [u8; 2] = self.receive();
if buf[0] == 200 { Some(buf[1]) } else { None } if buf[0] == 200 { Some(buf[1]) } else { None }
.context(format!("Error from PLI: {}", buf[0])) .context(format!("Error from PLI: {}", buf[0]))
} }
} }
enum PlRamAddress {
Dutycyc,
Batv,
Cint,
Lint,
}
impl From<PlRamAddress> for u8 {
fn from(value: PlRamAddress) -> Self {
match value {
PlRamAddress::Dutycyc => 39,
PlRamAddress::Batv => 50,
PlRamAddress::Cint => 213,
PlRamAddress::Lint => 217,
}
}
}
fn command(operation: u8, address: u8, data: u8) -> [u8; 4] { fn command(operation: u8, address: u8, data: u8) -> [u8; 4] {
[operation, address, data, !operation] [operation, address, data, !operation]
} }