use osdp::clock::SystemClock;
use osdp::command::{Command, Poll};
use osdp::driver::acu::{Acu, PdState};
use osdp::driver::pd::{Pd, PdHandler};
use osdp::reply::{Ack, Reply};
use osdp::transport::VecTransport;
struct AlwaysAck;
impl PdHandler for AlwaysAck {
fn on_command(&mut self, _command: &Command) -> Reply {
Reply::Ack(Ack)
}
}
fn main() {
let mut acu = Acu::new(VecTransport::new(), SystemClock::new());
let mut pd = Pd::new(VecTransport::new(), SystemClock::new(), 0x05, AlwaysAck);
let mut state = PdState::default();
state.mark_seen(0);
println!("loopback example: 5 POLL exchanges through a VecTransport bridge");
for round in 1..=5u32 {
let bytes = acu
.send_to(0x05, &mut state, &Command::Poll(Poll))
.expect("send");
println!(
" [{round}] ACU wrote {} bytes (sqn={})",
bytes.len(),
bytes[4] & 0x03
);
acu.transport().shuffle_to(pd.transport());
pd.poll_once().expect("pd poll");
pd.transport().shuffle_to(acu.transport());
match acu.receive(&mut state) {
Ok(Reply::Ack(_)) => println!(
" [{round}] ACU got ACK; sqn now {}",
state.next_sqn.value()
),
other => println!(" [{round}] unexpected reply {other:?}"),
}
}
}