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

View file

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

View file

@ -298,11 +298,10 @@ impl Pli {
T: Into<u8>,
{
self.send_command(command(20, address.into(), 0)).await?;
let buf = self.receive::<1>().await?;
if buf[0] == 200 {
Ok(self.receive::<1>().await?[0])
} else {
Err(eyre::eyre!("read error: result is {}", buf[0]))
let response = self.get_response().await?;
match response {
Ok(()) => Ok(self.receive::<1>().await?[0]),
Err(e) => Err(e.into()),
}
}
@ -320,11 +319,61 @@ impl Pli {
T: Into<u8>,
{
self.send_command(command(72, address.into(), 0)).await?;
let buf = self.receive::<1>().await?;
if buf[0] == 200 {
Ok(self.receive::<1>().await?[0])
} else {
Err(eyre::eyre!("read error: result is {}", buf[0]))
let response = self.get_response().await?;
match response {
Ok(()) => Ok(self.receive::<1>().await?[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)),
}
}
}