i2c: Change error code to option<I2cError> to prevent usage on success
diff --git a/services/i2c/api/src/protocol.rs b/services/i2c/api/src/protocol.rs index 1cfdbb3..c699692 100644 --- a/services/i2c/api/src/protocol.rs +++ b/services/i2c/api/src/protocol.rs
@@ -312,8 +312,12 @@ self.status == 0 } - pub fn error_code(&self) -> I2cError { - I2cError::from(self.status) + pub fn error_code(&self) -> Option<I2cError> { + if self.is_success() { + None + } else { + Some(I2cError::from(self.status)) + } } pub fn payload_length(&self) -> usize { @@ -361,7 +365,7 @@ let err = I2cResponseHeader::error(I2cError::AddressNack); let err = I2cResponseHeader::ref_from_bytes(err.as_bytes()).unwrap(); assert!(!err.is_success()); - assert_eq!(err.error_code(), I2cError::AddressNack); + assert_eq!(err.error_code(), Some(I2cError::AddressNack)); assert_eq!(err.payload_length(), 0); } @@ -430,6 +434,6 @@ let nd = I2cResponseHeader::error(I2cError::NoData); let nd = I2cResponseHeader::ref_from_bytes(nd.as_bytes()).unwrap(); assert!(!nd.is_success()); - assert_eq!(nd.error_code(), I2cError::NoData); + assert_eq!(nd.error_code(), Some(I2cError::NoData)); } }
diff --git a/services/i2c/client/src/lib.rs b/services/i2c/client/src/lib.rs index 39532a5..9b4cd2e 100644 --- a/services/i2c/client/src/lib.rs +++ b/services/i2c/client/src/lib.rs
@@ -137,7 +137,7 @@ return Err(ClientError::InvalidResponse); }; if !rhdr.is_success() { - return Err(ClientError::ServerError(rhdr.error_code())); + return Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError))); } let n = rhdr.payload_length(); if resp_len < I2cResponseHeader::SIZE + n { @@ -236,7 +236,7 @@ return Err(ClientError::InvalidResponse); }; if !rhdr.is_success() { - return Err(ClientError::ServerError(rhdr.error_code())); + return Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError))); } let payload_len = rhdr.payload_length(); @@ -308,7 +308,7 @@ if rhdr.is_success() { Ok(()) } else { - Err(ClientError::ServerError(rhdr.error_code())) + Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError))) } } @@ -382,7 +382,7 @@ return Err(ClientError::InvalidResponse); }; if !rhdr.is_success() { - return Err(ClientError::ServerError(rhdr.error_code())); + return Err(ClientError::ServerError(rhdr.error_code().unwrap_or(I2cError::InternalError))); } let payload_len = rhdr.payload_length();
diff --git a/services/i2c/server-runtime/src/lib.rs b/services/i2c/server-runtime/src/lib.rs index a8ced56..3052cae 100644 --- a/services/i2c/server-runtime/src/lib.rs +++ b/services/i2c/server-runtime/src/lib.rs
@@ -211,11 +211,13 @@ .ok() { use i2c_api::I2cError; - match rhdr.error_code() { - I2cError::Bus | I2cError::ArbitrationLoss | I2cError::Timeout => { - let _ = bus.driver.recover_bus(); + if let Some(code) = rhdr.error_code() { + match code { + I2cError::Bus | I2cError::ArbitrationLoss | I2cError::Timeout => { + let _ = bus.driver.recover_bus(); + } + _ => {} } - _ => {} } } }
diff --git a/services/i2c/server/src/lib.rs b/services/i2c/server/src/lib.rs index b354a23..45e1ace 100644 --- a/services/i2c/server/src/lib.rs +++ b/services/i2c/server/src/lib.rs
@@ -293,7 +293,7 @@ zerocopy::Ref::<_, I2cResponseHeader>::from_bytes(&resp[..I2cResponseHeader::SIZE]) .unwrap(); assert!(!rh.is_success()); - assert_eq!(rh.error_code(), I2cError::AddressNack); + assert_eq!(rh.error_code(), Some(I2cError::AddressNack)); } #[test] @@ -305,6 +305,6 @@ let rh = zerocopy::Ref::<_, I2cResponseHeader>::from_bytes(&resp[..I2cResponseHeader::SIZE]) .unwrap(); - assert_eq!(rh.error_code(), I2cError::InvalidOperation); + assert_eq!(rh.error_code(), Some(I2cError::InvalidOperation)); } }
diff --git a/services/i2c/server/src/slave.rs b/services/i2c/server/src/slave.rs index d306f26..ea92458 100644 --- a/services/i2c/server/src/slave.rs +++ b/services/i2c/server/src/slave.rs
@@ -134,7 +134,7 @@ let n = dispatch_slave(&mut s, &req(I2cOp::SlaveReceive, 0), &mut r); let h = zerocopy::Ref::<_, I2cResponseHeader>::from_bytes(&r[..I2cResponseHeader::SIZE]) .unwrap(); - assert_eq!(h.error_code(), I2cError::InvalidOperation); + assert_eq!(h.error_code(), Some(I2cError::InvalidOperation)); let _ = n; // Too-short request: rejected, no panic.