ccs: pl: properly parse errors

This commit is contained in:
Alex Janka 2025-01-13 11:32:15 +11:00
parent 12bc89ede6
commit 8b2ef6513f
3 changed files with 70 additions and 19 deletions
Cargo.lock
charge-controller-supervisor
Cargo.toml
src/controller

19
Cargo.lock generated
View file

@ -255,6 +255,7 @@ dependencies = [
"rocket", "rocket",
"serde", "serde",
"serde_json", "serde_json",
"thiserror 2.0.11",
"tokio", "tokio",
"tokio-modbus", "tokio-modbus",
"tokio-serial", "tokio-serial",
@ -1592,7 +1593,7 @@ dependencies = [
"rustc-hash", "rustc-hash",
"rustls", "rustls",
"socket2", "socket2",
"thiserror 2.0.9", "thiserror 2.0.11",
"tokio", "tokio",
"tracing", "tracing",
] ]
@ -1611,7 +1612,7 @@ dependencies = [
"rustls", "rustls",
"rustls-pki-types", "rustls-pki-types",
"slab", "slab",
"thiserror 2.0.9", "thiserror 2.0.11",
"tinyvec", "tinyvec",
"tracing", "tracing",
"web-time", "web-time",
@ -2223,7 +2224,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"serialport", "serialport",
"thiserror 2.0.9", "thiserror 2.0.11",
"tokio", "tokio",
"tokio-modbus", "tokio-modbus",
"tokio-serial", "tokio-serial",
@ -2240,11 +2241,11 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.9" version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
dependencies = [ dependencies = [
"thiserror-impl 2.0.9", "thiserror-impl 2.0.11",
] ]
[[package]] [[package]]
@ -2260,9 +2261,9 @@ dependencies = [
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.9" version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -2377,7 +2378,7 @@ dependencies = [
"futures-util", "futures-util",
"log", "log",
"smallvec", "smallvec",
"thiserror 2.0.9", "thiserror 2.0.11",
"tokio", "tokio",
"tokio-util", "tokio-util",
] ]

View file

@ -26,6 +26,7 @@ prometheus = "0.13.4"
rocket = { version = "0.5.1", features = ["json"] } rocket = { version = "0.5.1", features = ["json"] }
serde = { version = "1.0.216", features = ["derive"] } serde = { version = "1.0.216", features = ["derive"] }
serde_json = "1.0.134" serde_json = "1.0.134"
thiserror = "2.0.11"
tokio = { version = "1.42.0", features = ["full"] } tokio = { version = "1.42.0", features = ["full"] }
tokio-modbus = "0.16.1" tokio-modbus = "0.16.1"
tokio-serial = "5.4.4" tokio-serial = "5.4.4"

View file

@ -298,11 +298,10 @@ impl Pli {
T: Into<u8>, T: Into<u8>,
{ {
self.send_command(command(20, address.into(), 0)).await?; self.send_command(command(20, address.into(), 0)).await?;
let buf = self.receive::<1>().await?; let response = self.get_response().await?;
if buf[0] == 200 { match response {
Ok(self.receive::<1>().await?[0]) Ok(()) => Ok(self.receive::<1>().await?[0]),
} else { Err(e) => Err(e.into()),
Err(eyre::eyre!("read error: result is {}", buf[0]))
} }
} }
@ -320,11 +319,61 @@ impl Pli {
T: Into<u8>, T: Into<u8>,
{ {
self.send_command(command(72, address.into(), 0)).await?; self.send_command(command(72, address.into(), 0)).await?;
let buf = self.receive::<1>().await?;
if buf[0] == 200 { let response = self.get_response().await?;
Ok(self.receive::<1>().await?[0]) match response {
} else { Ok(()) => Ok(self.receive::<1>().await?[0]),
Err(eyre::eyre!("read error: result is {}", buf[0])) Err(e) => Err(e.into()),
}
}
async fn get_response(&mut self) -> eyre::Result<Result<(), PlError>> {
let res = self.receive::<1>().await?[0];
Ok(PlError::parse(res))
}
}
#[derive(thiserror::Error, Debug)]
enum PlError {
#[error("No comms or corrupt comms")]
NoComms,
#[error("Loopback response code")]
Loopback,
#[error("Timeout error")]
Timeout,
#[error("Checksum error in PLI receive data.")]
Checksum,
#[error("Command received by PLI is not recognised.")]
CommandNotRecognised,
#[error("Unused - or could be returning PL40 version!")]
Unused1,
#[error("Processor did not receive a reply to request.")]
NoReply,
#[error("Error in reply from PL.")]
ErrorFromPl,
#[error("<not used> #2")]
Unused2,
#[error("<not used> #3")]
Unused3,
#[error("Unknown: {0:#X?}")]
Unknown(u8),
}
impl PlError {
const fn parse(value: u8) -> Result<(), Self> {
match value {
200 => Ok(()),
5 => Err(Self::NoComms),
128 => Err(Self::Loopback),
129 => Err(Self::Timeout),
130 => Err(Self::Checksum),
131 => Err(Self::CommandNotRecognised),
132 => Err(Self::Unused1),
133 => Err(Self::NoReply),
134 => Err(Self::ErrorFromPl),
135 => Err(Self::Unused2),
136 => Err(Self::Unused3),
v => Err(Self::Unknown(v)),
} }
} }
} }