uds_rs/uds/
clear_diagnostic_information.rs1use crate::uds::uds_definitions::SEND_RECEIVE_SID_OFFSET;
8use crate::uds::{EcuResponseResult, UdsClient, UdsError, UdsResponse};
9use log::error;
10
11const CLEAR_DIAGNOSTIC_INFORMATION_SID: u8 = 0x14;
12
13impl UdsClient {
14 pub async fn clear_diagnostic_information(&self, group_of_dtc: u32) -> EcuResponseResult {
15 let request = compose_clear_diagnostic_information_request(group_of_dtc);
16 let raw_response = self.send_and_receive(&request).await?;
17 let response = parse_clear_diagnostic_information_response(&raw_response);
18 response
19 }
20}
21
22fn compose_clear_diagnostic_information_request(group_of_dtc: u32) -> Vec<u8> {
23 vec![
24 CLEAR_DIAGNOSTIC_INFORMATION_SID,
25 (group_of_dtc >> 16) as u8,
26 (group_of_dtc >> 8) as u8,
27 group_of_dtc as u8,
28 ]
29}
30
31fn parse_clear_diagnostic_information_response(raw_response: &[u8]) -> EcuResponseResult {
32 let mut response_iter = raw_response.iter();
33 let sid = *response_iter.next().ok_or(UdsError::ResponseEmpty)?;
34 if sid != CLEAR_DIAGNOSTIC_INFORMATION_SID + SEND_RECEIVE_SID_OFFSET {
35 error!("Raw response: {:x?}", raw_response);
36 return Err(UdsError::SidMismatch {
37 expected: CLEAR_DIAGNOSTIC_INFORMATION_SID + SEND_RECEIVE_SID_OFFSET,
38 received: sid,
39 raw_message: raw_response.to_vec(),
40 });
41 }
42 let result = UdsResponse::ClearDiagnosticInformation;
43 Ok(result)
44}