ads_client/
ads_read_state.rs1use log::info;
2use crate::{AdsError, AdsErrorCode, Client, Result, AdsCommand, StateInfo, HandleData};
3
4impl Client {
5
6 fn post_read_state(rs_response : HandleData) -> Result<StateInfo> {
7
8 let payload = rs_response.payload
9 .ok_or_else(|| AdsError{n_error : AdsErrorCode::ADSERR_DEVICE_INVALIDDATA.into(), s_msg : String::from("Invalid data values.")})?;
10
11 Client::eval_ams_error(rs_response.ams_err)?;
12
13 if payload.len() != 8 {
14 return Err(AdsError{n_error : AdsErrorCode::ERR_INVALIDAMSLENGTH.into(), s_msg : String::from("Invalid AMS length") });
15 } else {
16
17 Client::eval_return_code(&payload.slice(0..4))?;
18
19 let state_info = StateInfo{
20 ads_state : u16::from_ne_bytes(payload.slice(4..6)[..].try_into().unwrap_or_default()).try_into()?,
21 device_state : u16::from_ne_bytes(payload.slice(6..8)[..].try_into().unwrap_or_default())
22 };
23
24
25 if (state_info == StateInfo::default()){
26 return Err(AdsError{n_error : AdsErrorCode::ERR_INTERNAL.into(), s_msg : String::from("Internal error - conversion of payload failed.")});
27 }
28
29 Ok(state_info)
30 }
31
32 }
33
34 pub async fn read_state(&self) -> Result<StateInfo> {
56 let invoke_id = self.create_invoke_id();
58 let ams_header = self.c_init_ams_header(invoke_id, None, AdsCommand::ReadState);
59
60 info!("Submit Read State Request: Invoke ID: {}", invoke_id);
61
62 self.register_command_handle(invoke_id, AdsCommand::ReadState);
64
65 let cmd_man_future = self.create_cmd_man_future(invoke_id);
67
68 let socket_future = self.socket_write(&ams_header);
70
71 tokio::try_join!(cmd_man_future, socket_future).and_then( | (rs_response, _) | Client::post_read_state(rs_response))
72 }
73}