Skip to main content

mock_server/
mock_server.rs

1//! Minimal XVC server with a loopback backend: it echoes TDI back as TDO and
2//! accepts (but ignores) TCK changes. It talks the protocol without any
3//! hardware, which is handy for trying out a client.
4//!
5//! Start it, then connect an XVC client in another terminal:
6//!
7//! ```sh
8//! cargo run --example mock_server
9//! # elsewhere:
10//! cargo run -p xvc-client --example sample_client -- 127.0.0.1:2542
11//! ```
12
13use std::convert::Infallible;
14use std::net::{IpAddr, Ipv4Addr, SocketAddr};
15
16use xvc_server::XvcServer;
17use xvc_server::server::{Config, Server};
18
19/// Loopback backend: report the requested TCK unchanged and set TDO = TDI.
20struct Loopback;
21
22impl XvcServer for Loopback {
23    type Err = Infallible;
24
25    fn set_tck(&self, period_ns: u32) -> Result<u32, Self::Err> {
26        Ok(period_ns)
27    }
28
29    fn shift(
30        &self,
31        _num_bits: u32,
32        _tms: &[u8],
33        tdi: &[u8],
34        tdo: &mut [u8],
35    ) -> Result<(), Self::Err> {
36        tdo.copy_from_slice(tdi);
37        Ok(())
38    }
39}
40
41#[tokio::main]
42async fn main() -> Result<(), Box<dyn std::error::Error>> {
43    let server = Server::new(Loopback, Config::default());
44    let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 2542);
45    println!("XVC loopback server listening on {addr}");
46    server.listen(addr).await?;
47    Ok(())
48}