extern crate ads_proto;
use ads_proto::ads_services::system_services::GET_SYMHANDLE_BY_NAME;
use ads_proto::error::AdsError;
use ads_proto::proto::ams_address::*;
use ads_proto::proto::ams_header::{AmsHeader, AmsTcpHeader};
use ads_proto::proto::proto_traits::*;
use ads_proto::proto::request::*;
use ads_proto::proto::response::*;
use ads_proto::proto::state_flags::StateFlags;
use anyhow;
use std::result::Result;
use std::str::FromStr;
fn main() -> Result<(), anyhow::Error> {
let targed_ams_address = match AmsAddress::from_str("192.168.1.2.1.1:851") {
Ok(a) => a,
Err(e) => panic!("{}", e),
};
let source_ams_address = AmsAddress::new(AmsNetId::from([192, 168, 1, 3, 1, 1]), 851);
let state_flags = StateFlags::req_default();
let invoke_id = 123321;
let var_name = "Main.SomeVar";
let request = Request::ReadWrite(ReadWriteRequest::new(
GET_SYMHANDLE_BY_NAME.index_group,
GET_SYMHANDLE_BY_NAME.index_offset_start,
var_name.len() as u32,
var_name.as_bytes().to_vec(),
));
let ams_tcp_header = AmsTcpHeader::from(AmsHeader::new(
targed_ams_address,
source_ams_address,
state_flags,
invoke_id,
request,
));
let mut buffer: Vec<u8> = Vec::new();
ams_tcp_header.write_to(&mut buffer)?;
let mut recv_ams_tcp_header = AmsTcpHeader::read_from(&mut buffer.as_slice())?;
let request = recv_ams_tcp_header.ams_header.request()?;
let mut send_back_buffer: Vec<u8> = Vec::new();
match request {
Request::Invalid(_) => println!("Invalid request received!"),
Request::Read(r) => println!("Read request received:\n{:?}", r),
Request::ReadDeviceInfo(r) => println!("Read device info request received:\n{:?}", r),
Request::ReadState(r) => println!("Read state request received:\n{:?}", r),
Request::ReadWrite(r) => {
println!("Read writerequest received:\n{:?}", r);
let var_name = String::from_utf8(r.data)?;
match var_name.as_str() {
"Main.SomeVar" => {
let var_handle: u32 = 123;
let response = Response::ReadWrite(ReadWriteResponse::new(
AdsError::ErrNoError,
var_handle.to_le_bytes().to_vec(),
));
recv_ams_tcp_header
.ams_header
.update_command(response, StateFlags::resp_default())?; recv_ams_tcp_header.ams_header.swap_address();
recv_ams_tcp_header.write_to(&mut send_back_buffer)?;
}
_ => println!("Unknown var name"),
}
}
Request::Write(r) => println!("Write request received:\n{:?}", r),
Request::WriteControl(r) => println!("Write control request received:\n{:?}", r),
Request::AddDeviceNotification(r) => {
println!("Add device notification request received:\n{:?}", r)
}
Request::DeleteDeviceNotification(r) => {
println!("Delete device notification request received:\n{:?}", r)
}
Request::DeviceNotification(r) => println!("Device notification received:\n{:?}", r),
}
let mut resp_ams_tcp_header = AmsTcpHeader::read_from(&mut send_back_buffer.as_slice())?;
let response: ReadWriteResponse = resp_ams_tcp_header.ams_header.response()?.try_into()?;
let handle = u32::from_le_bytes(response.data.try_into().expect("Failed to convert to u32"));
println!(
"Received handle for var Main.SomeVar... Handle is: {:?}",
handle
);
Ok(())
}