uds_rs/uds/
clear_diagnostic_information.rs

1//! # Implementation of ClearDTCInformation 0x14 service
2//!
3//! This module provides following methods for UdsClient:
4//!
5//! [UdsClient::clear_diagnostic_information]
6//!
7use 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}