diff --git a/Cargo.lock b/Cargo.lock index 2646de8..5370896 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -239,7 +239,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "charge-controller-supervisor" -version = "1.9.9-pre-23" +version = "1.9.9-pre-24" dependencies = [ "chrono", "clap", @@ -2203,7 +2203,7 @@ dependencies = [ [[package]] name = "tesla-charge-controller" -version = "1.9.9-pre-23" +version = "1.9.9-pre-24" dependencies = [ "chrono", "clap", diff --git a/Cargo.toml b/Cargo.toml index aa7819e..a9db690 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ default-members = ["charge-controller-supervisor"] resolver = "2" [workspace.package] -version = "1.9.9-pre-23" +version = "1.9.9-pre-24" [workspace.lints.clippy] pedantic = "warn" diff --git a/charge-controller-supervisor/src/controller/tristar.rs b/charge-controller-supervisor/src/controller/tristar.rs index ef43c46..cbbf234 100644 --- a/charge-controller-supervisor/src/controller/tristar.rs +++ b/charge-controller-supervisor/src/controller/tristar.rs @@ -106,7 +106,7 @@ impl ModbusTimeout { Ok(r??) } } -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct TristarSettings { network: Option, charge: ChargeSettings, @@ -154,7 +154,7 @@ impl NetworkSettings { } } -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct ChargeSettings { absorption_voltage: f64, float_voltage: f64, @@ -191,7 +191,7 @@ pub struct LedThresholds { yellowred_to_red: f64, } -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct ReadOnly { hourmeter: u32, charge_ah_resetable: f64, @@ -203,11 +203,18 @@ pub struct ReadOnly { va_max: f64, days_since_last_equalize: u16, battery_service_timer_days: u16, - serial: u64, + serial: Serial, model: Model, hardware_version: u16, } +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum Serial { + Valid(String), + Invalid(u64), +} + #[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub enum Model { Tristar45A, @@ -325,11 +332,20 @@ impl ChargeSettings { let s2 = get(buf, TristarEepromAddress::Eserial2)?; let s3 = get(buf, TristarEepromAddress::Eserial3)?; - let mut serial = u64::from(s0); - serial |= u64::from(s1) << 16; - serial |= u64::from(s2) << 32; - serial |= u64::from(s3) << 48; - serial + let mut serial = [0; 8]; + serial[0..2].copy_from_slice(&s0.to_le_bytes()); + serial[2..4].copy_from_slice(&s1.to_le_bytes()); + serial[4..6].copy_from_slice(&s2.to_le_bytes()); + serial[6..8].copy_from_slice(&s3.to_le_bytes()); + if let Ok(v) = std::str::from_utf8(&serial) { + Serial::Valid(v.to_string()) + } else { + let mut serial = u64::from(s0); + serial |= u64::from(s1) << 16; + serial |= u64::from(s2) << 32; + serial |= u64::from(s3) << 48; + Serial::Invalid(serial) + } }; let model = if get(buf, TristarEepromAddress::Emodel)? == 0 {