From aab1a7f2a72d15017c2a570a7b18cf11a2ed1330 Mon Sep 17 00:00:00 2001 From: Alex Janka Date: Sat, 13 Jan 2024 17:06:48 +1100 Subject: [PATCH] refactor for more generic charge controller driver --- .gitignore | 1 + charge-controller-fields.xlsx | Bin 0 -> 9604 bytes src/charge_controllers/gauge_names.rs | 10 +++ src/charge_controllers/mod.rs | 17 +++++ .../pl.rs} | 63 ++++++++++++------ src/main.rs | 5 +- src/server/mod.rs | 2 +- 7 files changed, 76 insertions(+), 22 deletions(-) create mode 100644 charge-controller-fields.xlsx create mode 100644 src/charge_controllers/gauge_names.rs create mode 100644 src/charge_controllers/mod.rs rename src/{pl_interface.rs => charge_controllers/pl.rs} (80%) diff --git a/.gitignore b/.gitignore index 8a86b2f..650b814 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target /test-config .trigger +~*.xlsx diff --git a/charge-controller-fields.xlsx b/charge-controller-fields.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..65ffa50e3ea9e6507b9b62678935bc17f238ee97 GIT binary patch literal 9604 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 ZuYFNf0Rg(Y001iV@`w8EBbuLg{|6`|*A4&x literal 0 HcmV?d00001 diff --git a/src/charge_controllers/gauge_names.rs b/src/charge_controllers/gauge_names.rs new file mode 100644 index 0000000..324b209 --- /dev/null +++ b/src/charge_controllers/gauge_names.rs @@ -0,0 +1,10 @@ +pub const CHARGE_CONTROLLER_LABEL: &str = "charge_controller"; +pub const PL_LABEL: &str = "pl_device"; + +pub const BATTERY_VOLTAGE: &str = "pl_battery_voltage"; +pub const TARGET_VOLTAGE: &str = "pl_target_voltage"; +pub const INPUT_CURRENT: &str = "pl_internal_charge_current"; +pub const CHARGE_STATE: &str = "pl_regulator"; + +pub const PL_DUTY_CYCLE: &str = "pl_duty_cycle"; +pub const PL_LOAD_CURRENT: &str = "pl_internal_load_current"; diff --git a/src/charge_controllers/mod.rs b/src/charge_controllers/mod.rs new file mode 100644 index 0000000..4c710f0 --- /dev/null +++ b/src/charge_controllers/mod.rs @@ -0,0 +1,17 @@ +use metrics::describe_gauge; + +mod gauge_names; +pub mod pl; + +pub fn register_metrics() { + describe_gauge!(gauge_names::BATTERY_VOLTAGE, "Battery voltage"); + describe_gauge!(gauge_names::TARGET_VOLTAGE, "Target voltage"); + describe_gauge!(gauge_names::INPUT_CURRENT, "Internal charge current"); + describe_gauge!(gauge_names::CHARGE_STATE, "Regulator state"); + register_pl_metrics(); +} + +fn register_pl_metrics() { + describe_gauge!(gauge_names::PL_DUTY_CYCLE, "Duty cycle"); + describe_gauge!(gauge_names::PL_LOAD_CURRENT, "Internal load current"); +} diff --git a/src/pl_interface.rs b/src/charge_controllers/pl.rs similarity index 80% rename from src/pl_interface.rs rename to src/charge_controllers/pl.rs index 01ac2e1..4e21947 100644 --- a/src/pl_interface.rs +++ b/src/charge_controllers/pl.rs @@ -4,13 +4,15 @@ use std::{ time::Duration, }; -use metrics::{describe_gauge, gauge, Gauge}; +use metrics::{gauge, Gauge, Label}; use serde::{Deserialize, Serialize}; use serialport::SerialPort; use termcolor::WriteColor; use crate::errors::{PliError, PrintErrors}; +use super::gauge_names; + pub struct Pli { pub state: Arc>, port: Box, @@ -73,12 +75,35 @@ struct RegulatorGauges { } impl RegulatorGauges { - fn new() -> Self { - describe_gauge!("pl_regulator", "Regulator state"); - let boost = gauge!("pl_regulator", "state" => "boost"); - let equalise = gauge!("pl_regulator", "state" => "equalise"); - let absorption = gauge!("pl_regulator", "state" => "absorption"); - let float = gauge!("pl_regulator", "state" => "float"); + fn new(labels: Vec