ccs: pl: get settings
This commit is contained in:
parent
b28f39667d
commit
7508459414
2 changed files with 225 additions and 4 deletions
|
@ -47,6 +47,7 @@ impl ControllerState {
|
||||||
#[derive(serde::Serialize, Clone)]
|
#[derive(serde::Serialize, Clone)]
|
||||||
#[serde(tag = "model")]
|
#[serde(tag = "model")]
|
||||||
pub enum ControllerSettings {
|
pub enum ControllerSettings {
|
||||||
|
Pl(pl::PlSettings),
|
||||||
Tristar(tristar::TristarSettings),
|
Tristar(tristar::TristarSettings),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +129,7 @@ impl Controller {
|
||||||
if self.needs_new_settings() {
|
if self.needs_new_settings() {
|
||||||
match self.inner.get_settings().await {
|
match self.inner.get_settings().await {
|
||||||
Ok(s) => {
|
Ok(s) => {
|
||||||
*self.data.write_settings().await = s;
|
*self.data.write_settings().await = Some(s);
|
||||||
self.settings_last_read = Some(std::time::Instant::now());
|
self.settings_last_read = Some(std::time::Instant::now());
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -211,12 +212,15 @@ impl ControllerInner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_settings(&mut self) -> eyre::Result<Option<ControllerSettings>> {
|
pub async fn get_settings(&mut self) -> eyre::Result<ControllerSettings> {
|
||||||
match self {
|
match self {
|
||||||
ControllerInner::Pl(_) => Ok(None),
|
ControllerInner::Pl(pl) => {
|
||||||
|
let settings = pl.read_settings().await?;
|
||||||
|
Ok(ControllerSettings::Pl(settings))
|
||||||
|
}
|
||||||
ControllerInner::Tristar(tristar) => {
|
ControllerInner::Tristar(tristar) => {
|
||||||
let settings = tristar.read_settings().await?;
|
let settings = tristar.read_settings().await?;
|
||||||
Ok(Some(ControllerSettings::Tristar(settings)))
|
Ok(ControllerSettings::Tristar(settings))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,48 @@ fn set_regulator_gauges(state: RegulatorState, label: &str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct PlSettings {
|
||||||
|
load_disconnect_voltage: f64,
|
||||||
|
load_reconnect_voltage: f64,
|
||||||
|
delay_before_disconnect_minutes: u8,
|
||||||
|
days_between_boost: u8,
|
||||||
|
absorption_time: u8,
|
||||||
|
hysteresis: u8,
|
||||||
|
boost_return_voltage: f64,
|
||||||
|
charge_current_limit: u8,
|
||||||
|
battery_2_regulation_voltage: f64,
|
||||||
|
days_between_equalization: u8,
|
||||||
|
equalization_length: u8,
|
||||||
|
absorption_voltage: f64,
|
||||||
|
equalization_voltage: f64,
|
||||||
|
float_voltage: f64,
|
||||||
|
boost_voltage: f64,
|
||||||
|
program: Program,
|
||||||
|
system_voltage: SystemVoltage,
|
||||||
|
battery_capacity_ah: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub enum Program {
|
||||||
|
Prog0,
|
||||||
|
Prog1,
|
||||||
|
Prog2,
|
||||||
|
Prog3,
|
||||||
|
Prog4,
|
||||||
|
Unknown,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub enum SystemVoltage {
|
||||||
|
V12,
|
||||||
|
V24,
|
||||||
|
V32,
|
||||||
|
V36,
|
||||||
|
V48,
|
||||||
|
Unknown,
|
||||||
|
}
|
||||||
|
|
||||||
#[expect(dead_code, reason = "writing settings is not yet implemented")]
|
#[expect(dead_code, reason = "writing settings is not yet implemented")]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub enum PliRequest {
|
pub enum PliRequest {
|
||||||
|
@ -186,6 +228,75 @@ impl Pli {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn read_settings(&mut self) -> eyre::Result<PlSettings> {
|
||||||
|
let load_disconnect_voltage =
|
||||||
|
f64::from(self.read_eeprom(PlEepromAddress::LOff).await?) * (4. / 10.);
|
||||||
|
let load_reconnect_voltage =
|
||||||
|
f64::from(self.read_eeprom(PlEepromAddress::LOn).await?) * (4. / 10.);
|
||||||
|
let delay_before_disconnect_minutes = self.read_eeprom(PlEepromAddress::LDel).await?;
|
||||||
|
let days_between_boost = self.read_eeprom(PlEepromAddress::BstFreq).await?;
|
||||||
|
let absorption_time = self.read_eeprom(PlEepromAddress::ATim).await?;
|
||||||
|
let hysteresis = self.read_eeprom(PlEepromAddress::Hyst).await?;
|
||||||
|
let boost_return_voltage =
|
||||||
|
f64::from(self.read_eeprom(PlEepromAddress::BRet).await?) * (4. / 10.);
|
||||||
|
let charge_current_limit = self.read_eeprom(PlEepromAddress::CurLim).await?;
|
||||||
|
let battery_2_regulation_voltage =
|
||||||
|
f64::from(self.read_eeprom(PlEepromAddress::Bat2).await?) * (4. / 10.);
|
||||||
|
let days_between_equalization = self.read_eeprom(PlEepromAddress::EqFreq).await?;
|
||||||
|
let equalization_length = self.read_eeprom(PlEepromAddress::ETim).await?;
|
||||||
|
let absorption_voltage =
|
||||||
|
f64::from(self.read_eeprom(PlEepromAddress::AbsV).await?) * (4. / 10.);
|
||||||
|
let equalization_voltage =
|
||||||
|
f64::from(self.read_eeprom(PlEepromAddress::EMax).await?) * (4. / 10.);
|
||||||
|
let float_voltage = f64::from(self.read_eeprom(PlEepromAddress::FltV).await?) * (4. / 10.);
|
||||||
|
let boost_voltage = f64::from(self.read_eeprom(PlEepromAddress::BMax).await?) * (4. / 10.);
|
||||||
|
let volt = self.read_eeprom(PlEepromAddress::Volt).await?;
|
||||||
|
let program = match volt >> 4 {
|
||||||
|
0 => Program::Prog0,
|
||||||
|
1 => Program::Prog1,
|
||||||
|
2 => Program::Prog2,
|
||||||
|
3 => Program::Prog3,
|
||||||
|
4 => Program::Prog4,
|
||||||
|
_ => Program::Unknown,
|
||||||
|
};
|
||||||
|
let system_voltage = match volt & 0xF {
|
||||||
|
0 => SystemVoltage::V12,
|
||||||
|
1 => SystemVoltage::V24,
|
||||||
|
2 => SystemVoltage::V32,
|
||||||
|
3 => SystemVoltage::V36,
|
||||||
|
4 => SystemVoltage::V48,
|
||||||
|
_ => SystemVoltage::Unknown,
|
||||||
|
};
|
||||||
|
let battery_cap = usize::from(self.read_eeprom(PlEepromAddress::BCap).await?);
|
||||||
|
|
||||||
|
let battery_capacity_ah = if battery_cap > 50 {
|
||||||
|
(50 * 20) + ((battery_cap - 50) * 100)
|
||||||
|
} else {
|
||||||
|
battery_cap * 20
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(PlSettings {
|
||||||
|
load_disconnect_voltage,
|
||||||
|
load_reconnect_voltage,
|
||||||
|
delay_before_disconnect_minutes,
|
||||||
|
days_between_boost,
|
||||||
|
absorption_time,
|
||||||
|
hysteresis,
|
||||||
|
boost_return_voltage,
|
||||||
|
charge_current_limit,
|
||||||
|
battery_2_regulation_voltage,
|
||||||
|
days_between_equalization,
|
||||||
|
equalization_length,
|
||||||
|
absorption_voltage,
|
||||||
|
equalization_voltage,
|
||||||
|
float_voltage,
|
||||||
|
boost_voltage,
|
||||||
|
program,
|
||||||
|
system_voltage,
|
||||||
|
battery_capacity_ah,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
async fn read_state(&mut self) -> eyre::Result<PlState> {
|
async fn read_state(&mut self) -> eyre::Result<PlState> {
|
||||||
// let int_charge_acc_low = self.read_ram(PlRamAddress::Ciacc1).await?;
|
// let int_charge_acc_low = self.read_ram(PlRamAddress::Ciacc1).await?;
|
||||||
// let int_charge_acc = self.read_ram(PlRamAddress::Ciacc2).await?;
|
// let int_charge_acc = self.read_ram(PlRamAddress::Ciacc2).await?;
|
||||||
|
@ -449,6 +560,112 @@ impl From<PlRamAddress> for u8 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
enum PlEepromAddress {
|
||||||
|
// calibration
|
||||||
|
BCals,
|
||||||
|
BCal12,
|
||||||
|
BCal24,
|
||||||
|
BCal48,
|
||||||
|
ChargeOffset,
|
||||||
|
ChargeGain,
|
||||||
|
LoadOffset,
|
||||||
|
LoadGain,
|
||||||
|
BatTmpOffset,
|
||||||
|
BatTmpGain,
|
||||||
|
SolarOffset,
|
||||||
|
SolarGain,
|
||||||
|
BatsenOffset,
|
||||||
|
BatsenGain,
|
||||||
|
|
||||||
|
// settings
|
||||||
|
GOn,
|
||||||
|
GOff,
|
||||||
|
GDel,
|
||||||
|
GExF,
|
||||||
|
GRun,
|
||||||
|
LOff,
|
||||||
|
LOn,
|
||||||
|
LDel,
|
||||||
|
ASet,
|
||||||
|
BstFreq,
|
||||||
|
ATim,
|
||||||
|
Hyst,
|
||||||
|
BRet,
|
||||||
|
CurLim,
|
||||||
|
Bat2,
|
||||||
|
ESet1,
|
||||||
|
ESet2,
|
||||||
|
ESet3,
|
||||||
|
EqFreq,
|
||||||
|
ETim,
|
||||||
|
AbsV,
|
||||||
|
EMax,
|
||||||
|
FltV,
|
||||||
|
BMax,
|
||||||
|
LGSet,
|
||||||
|
PwmE,
|
||||||
|
SStop,
|
||||||
|
EtMod,
|
||||||
|
GMod,
|
||||||
|
Volt,
|
||||||
|
BCap,
|
||||||
|
HistoryDataPtr,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<PlEepromAddress> for u8 {
|
||||||
|
fn from(value: PlEepromAddress) -> Self {
|
||||||
|
match value {
|
||||||
|
PlEepromAddress::BCals => 0x00,
|
||||||
|
PlEepromAddress::BCal12 => 0x01,
|
||||||
|
PlEepromAddress::BCal24 => 0x02,
|
||||||
|
PlEepromAddress::BCal48 => 0x03,
|
||||||
|
PlEepromAddress::ChargeOffset => 0x04,
|
||||||
|
PlEepromAddress::ChargeGain => 0x05,
|
||||||
|
PlEepromAddress::LoadOffset => 0x06,
|
||||||
|
PlEepromAddress::LoadGain => 0x07,
|
||||||
|
PlEepromAddress::BatTmpOffset => 0x08,
|
||||||
|
PlEepromAddress::BatTmpGain => 0x09,
|
||||||
|
PlEepromAddress::SolarOffset => 0x0A,
|
||||||
|
PlEepromAddress::SolarGain => 0x0B,
|
||||||
|
PlEepromAddress::BatsenOffset => 0x0C,
|
||||||
|
PlEepromAddress::BatsenGain => 0x0D,
|
||||||
|
PlEepromAddress::GOn => 0x0E,
|
||||||
|
PlEepromAddress::GOff => 0x0F,
|
||||||
|
PlEepromAddress::GDel => 0x10,
|
||||||
|
PlEepromAddress::GExF => 0x11,
|
||||||
|
PlEepromAddress::GRun => 0x12,
|
||||||
|
PlEepromAddress::LOff => 0x13,
|
||||||
|
PlEepromAddress::LOn => 0x14,
|
||||||
|
PlEepromAddress::LDel => 0x15,
|
||||||
|
PlEepromAddress::ASet => 0x16,
|
||||||
|
PlEepromAddress::BstFreq => 0x17,
|
||||||
|
PlEepromAddress::ATim => 0x18,
|
||||||
|
PlEepromAddress::Hyst => 0x19,
|
||||||
|
PlEepromAddress::BRet => 0x1A,
|
||||||
|
PlEepromAddress::CurLim => 0x1B,
|
||||||
|
PlEepromAddress::Bat2 => 0x1C,
|
||||||
|
PlEepromAddress::ESet1 => 0x1D,
|
||||||
|
PlEepromAddress::ESet2 => 0x1E,
|
||||||
|
PlEepromAddress::ESet3 => 0x1F,
|
||||||
|
PlEepromAddress::EqFreq => 0x20,
|
||||||
|
PlEepromAddress::ETim => 0x21,
|
||||||
|
PlEepromAddress::AbsV => 0x22,
|
||||||
|
PlEepromAddress::EMax => 0x23,
|
||||||
|
PlEepromAddress::FltV => 0x24,
|
||||||
|
PlEepromAddress::BMax => 0x25,
|
||||||
|
PlEepromAddress::LGSet => 0x26,
|
||||||
|
PlEepromAddress::PwmE => 0x27,
|
||||||
|
PlEepromAddress::SStop => 0x28,
|
||||||
|
PlEepromAddress::EtMod => 0x29,
|
||||||
|
PlEepromAddress::GMod => 0x2A,
|
||||||
|
PlEepromAddress::Volt => 0x2B,
|
||||||
|
PlEepromAddress::BCap => 0x2c,
|
||||||
|
PlEepromAddress::HistoryDataPtr => 0x2d,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const fn command(operation: u8, address: u8, data: u8) -> [u8; 4] {
|
const fn command(operation: u8, address: u8, data: u8) -> [u8; 4] {
|
||||||
[operation, address, data, !operation]
|
[operation, address, data, !operation]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue