Skip to main content

subscribe_latest/
subscribe_latest.rs

1//! Subscribe to a parameter and await the most-recent value via
2//! [`Subscription::latest`]. Lossy by design — if multiple samples
3//! arrive between `latest().await` calls you only see the last. Use
4//! [`subscribe_stream.rs`](./subscribe_stream.rs) for lossless
5//! semantics.
6//!
7//! ```bash
8//! cargo run --example subscribe_latest -- \
9//!     wss://127.0.0.1:5568:5567 path/to/mcx.cert.crt root mypassword root/Control/dummyDouble
10//! ```
11
12use std::env;
13use std::time::Duration;
14
15use motorcortex_rust::core::{Request, Subscribe};
16use motorcortex_rust::{ConnectionOptions, Result, parse_url};
17
18#[tokio::main]
19async fn main() -> Result<()> {
20    let mut args = env::args().skip(1);
21    let url = args.next().unwrap_or_else(|| "wss://127.0.0.1:5568:5567".into());
22    let cert = args.next().unwrap_or_else(|| "tests/mcx.cert.crt".into());
23    let user = args.next().unwrap_or_else(|| "root".into());
24    let pass = args.next().unwrap_or_default();
25    let path = args
26        .next()
27        .unwrap_or_else(|| "root/Control/dummyDouble".into());
28
29    let (req_url, sub_url) = parse_url(&url)?;
30    let opts = ConnectionOptions::new(cert, 5_000, 5_000);
31    let req = Request::connect_to(&req_url, opts.clone()).await?;
32    req.login(&user, &pass).await?;
33    req.request_parameter_tree().await?;
34    let sub = Subscribe::connect_to(&sub_url, opts).await?;
35    let subscription = sub.subscribe(&req, [&path[..]], "example-latest", 100).await?;
36
37    // Sample the latest value every second for 5 seconds.
38    for _ in 0..5 {
39        let (_ts, value): (_, f64) = subscription.latest().await?;
40        println!("{path} = {value}");
41        tokio::time::sleep(Duration::from_secs(1)).await;
42    }
43
44    sub.unsubscribe(&req, subscription).await?;
45    sub.disconnect().await?;
46    req.disconnect().await?;
47    Ok(())
48}