diff --git a/src/error.rs b/src/error.rs index fe69c1f..ae95000 100644 --- a/src/error.rs +++ b/src/error.rs @@ -40,4 +40,6 @@ pub enum Error { InvalidDtcFormatIdentifier(u8), #[error("Reserved for legislative use: {0} ({1})")] ReservedForLegislativeUse(String, u8), + #[error("UDS service not implemented: {0:?}")] + ServiceNotImplemented(crate::UdsServiceType), } diff --git a/src/request.rs b/src/request.rs index 1e632a4..da6d9c3 100644 --- a/src/request.rs +++ b/src/request.rs @@ -269,6 +269,7 @@ impl WireFormat for Request { /// Some services allow for custom byte arrays at the end of the request /// It is important that only the request data is passed to this function /// or the deserialization could read unexpected data + #[allow(clippy::too_many_lines)] fn decode(reader: &mut R) -> Result, Error> { let service = UdsServiceType::service_from_request_byte(reader.read_u8()?); Ok(Some(match service { @@ -309,22 +310,80 @@ impl WireFormat for Request { UdsServiceType::WriteDataByIdentifier => Self::WriteDataByIdentifier( WriteDataByIdentifierRequest::decode_single_value(reader)?, ), - UdsServiceType::Authentication => todo!(), - UdsServiceType::AccessTimingParameters => todo!(), - UdsServiceType::SecuredDataTransmission => todo!(), - UdsServiceType::ResponseOnEvent => todo!(), - UdsServiceType::LinkControl => todo!(), - UdsServiceType::ReadMemoryByAddress => todo!(), - UdsServiceType::ReadScalingDataByIdentifier => todo!(), - UdsServiceType::ReadDataByIdentifierPeriodic => todo!(), - UdsServiceType::DynamicallyDefinedDataIdentifier => todo!(), - UdsServiceType::WriteMemoryByAddress => todo!(), - UdsServiceType::ClearDiagnosticInfo => todo!(), - UdsServiceType::InputOutputControlByIdentifier => todo!(), - UdsServiceType::RequestUpload => todo!(), - UdsServiceType::RequestFileTransfer => todo!(), - UdsServiceType::NegativeResponse => todo!(), - UdsServiceType::UnsupportedDiagnosticService => todo!(), + UdsServiceType::Authentication => { + return Err(Error::ServiceNotImplemented(UdsServiceType::Authentication)); + } + UdsServiceType::AccessTimingParameters => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::AccessTimingParameters, + )); + } + UdsServiceType::SecuredDataTransmission => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::SecuredDataTransmission, + )); + } + UdsServiceType::ResponseOnEvent => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ResponseOnEvent, + )); + } + UdsServiceType::LinkControl => { + return Err(Error::ServiceNotImplemented(UdsServiceType::LinkControl)); + } + UdsServiceType::ReadMemoryByAddress => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadMemoryByAddress, + )); + } + UdsServiceType::ReadScalingDataByIdentifier => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadScalingDataByIdentifier, + )); + } + UdsServiceType::ReadDataByIdentifierPeriodic => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadDataByIdentifierPeriodic, + )); + } + UdsServiceType::DynamicallyDefinedDataIdentifier => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::DynamicallyDefinedDataIdentifier, + )); + } + UdsServiceType::WriteMemoryByAddress => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::WriteMemoryByAddress, + )); + } + UdsServiceType::ClearDiagnosticInfo => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ClearDiagnosticInfo, + )); + } + UdsServiceType::InputOutputControlByIdentifier => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::InputOutputControlByIdentifier, + )); + } + UdsServiceType::RequestUpload => { + return Err(Error::ServiceNotImplemented(UdsServiceType::RequestUpload)); + } + UdsServiceType::RequestFileTransfer => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::RequestFileTransfer, + )); + } + UdsServiceType::NegativeResponse => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::NegativeResponse, + )); + } + UdsServiceType::UnsupportedDiagnosticService => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::UnsupportedDiagnosticService, + )); + } })) } diff --git a/src/response.rs b/src/response.rs index 1c7402f..fdeeca2 100644 --- a/src/response.rs +++ b/src/response.rs @@ -160,6 +160,7 @@ impl Response { } impl WireFormat for Response { + #[allow(clippy::too_many_lines)] fn decode(reader: &mut T) -> Result, Error> { let service = UdsServiceType::response_from_byte(reader.read_u8()?); Ok(Some(match service { @@ -203,23 +204,73 @@ impl WireFormat for Response { UdsServiceType::WriteDataByIdentifier => Self::WriteDataByIdentifier( WriteDataByIdentifierResponse::decode_single_value(reader)?, ), - UdsServiceType::Authentication => todo!(), - UdsServiceType::AccessTimingParameters => todo!(), - UdsServiceType::SecuredDataTransmission => todo!(), - UdsServiceType::ResponseOnEvent => todo!(), - UdsServiceType::LinkControl => todo!(), - UdsServiceType::ReadMemoryByAddress => todo!(), - UdsServiceType::ReadScalingDataByIdentifier => todo!(), - UdsServiceType::ReadDataByIdentifierPeriodic => todo!(), - UdsServiceType::DynamicallyDefinedDataIdentifier => todo!(), - UdsServiceType::WriteMemoryByAddress => todo!(), - UdsServiceType::ClearDiagnosticInfo => todo!(), - UdsServiceType::InputOutputControlByIdentifier => todo!(), - UdsServiceType::RequestUpload => todo!(), + UdsServiceType::Authentication => { + return Err(Error::ServiceNotImplemented(UdsServiceType::Authentication)); + } + UdsServiceType::AccessTimingParameters => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::AccessTimingParameters, + )); + } + UdsServiceType::SecuredDataTransmission => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::SecuredDataTransmission, + )); + } + UdsServiceType::ResponseOnEvent => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ResponseOnEvent, + )); + } + UdsServiceType::LinkControl => { + return Err(Error::ServiceNotImplemented(UdsServiceType::LinkControl)); + } + UdsServiceType::ReadMemoryByAddress => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadMemoryByAddress, + )); + } + UdsServiceType::ReadScalingDataByIdentifier => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadScalingDataByIdentifier, + )); + } + UdsServiceType::ReadDataByIdentifierPeriodic => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ReadDataByIdentifierPeriodic, + )); + } + UdsServiceType::DynamicallyDefinedDataIdentifier => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::DynamicallyDefinedDataIdentifier, + )); + } + UdsServiceType::WriteMemoryByAddress => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::WriteMemoryByAddress, + )); + } + UdsServiceType::ClearDiagnosticInfo => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::ClearDiagnosticInfo, + )); + } + UdsServiceType::InputOutputControlByIdentifier => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::InputOutputControlByIdentifier, + )); + } + UdsServiceType::RequestUpload => { + return Err(Error::ServiceNotImplemented(UdsServiceType::RequestUpload)); + } UdsServiceType::TransferData => { Self::TransferData(TransferDataResponse::decode_single_value(reader)?) } - UdsServiceType::UnsupportedDiagnosticService => todo!(), + UdsServiceType::UnsupportedDiagnosticService => { + return Err(Error::ServiceNotImplemented( + UdsServiceType::UnsupportedDiagnosticService, + )); + } })) }