ads_client/
ads_read_state.rs

1use 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    /// Submit an asynchronous [ADS Read State](https://infosys.beckhoff.com/content/1033/tc3_ads_intro/115878923.html) request.
35    /// 
36    /// 
37    /// # Example
38    ///
39    /// ```rust
40    /// use ads_client::{ClientBuilder, Result};
41    /// #[tokio::main]
42    /// async fn main() -> Result<()> {
43    ///
44    ///    let ads_client = ClientBuilder::new("5.80.201.232.1.1", 10000).build().await?;
45    ///
46    ///    match ads_client.read_state().await {
47    ///        Ok(state) => println!("State: {:?}", state),
48    ///        Err(err) => println!("Error: {}", err.to_string())
49    ///    }
50    ///    Ok(())
51    ///}
52    /// ```
53    /// Checkout the examples [read_state](https://github.com/hANSIc99/ads_client/blob/main/examples/read_state.rs) 
54    /// and [read_state_async](https://github.com/hANSIc99/ads_client/blob/main/examples/read_state_async.rs).
55    pub async fn read_state(&self) -> Result<StateInfo> {
56        // Prepare read state request
57        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        // Create handle
63        self.register_command_handle(invoke_id, AdsCommand::ReadState);
64
65        // Launch the CommandManager future
66        let cmd_man_future = self.create_cmd_man_future(invoke_id);
67
68        // Launch socket future
69        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}