roblib_client/
lib.rs

1pub mod logger;
2pub mod transports;
3
4pub use anyhow::Result;
5pub use roblib;
6
7#[cfg(feature = "async")]
8pub use tokio::main;
9#[cfg(feature = "async")]
10pub mod async_robot;
11#[cfg(feature = "async")]
12pub use async_robot::RobotAsync;
13
14#[cfg(feature = "camloc")]
15mod camloc;
16#[cfg(feature = "gpio")]
17mod gpio;
18#[cfg(feature = "roland")]
19mod roland;
20
21use roblib::{cmd, event::Event, RoblibBuiltin};
22use std::time::{Duration, Instant};
23use transports::{Subscribable, Transport};
24
25pub struct Robot<T> {
26    pub transport: T,
27}
28
29impl<T: Transport> Robot<T> {
30    pub fn new(transport: T) -> Self {
31        Self { transport }
32    }
33
34    pub fn measure_latency(&self) -> Result<Duration> {
35        let start = Instant::now();
36        let _ = self.transport.cmd(cmd::GetUptime)?;
37        Ok(Instant::now() - start)
38    }
39    pub fn get_server_uptime(&self) -> Result<Duration> {
40        self.transport.cmd(cmd::GetUptime)
41    }
42}
43impl<T: Subscribable> Robot<T> {
44    pub fn subscribe<E: Event>(
45        &self,
46        ev: E,
47        handler: impl FnMut(E::Item) -> Result<()> + Send + Sync + 'static,
48    ) -> Result<()> {
49        self.transport.subscribe(ev, handler)
50    }
51    pub fn unsubscribe<E: Event>(&self, ev: E) -> Result<()> {
52        self.transport.unsubscribe(ev)
53    }
54}
55
56impl<T: Transport> RoblibBuiltin for Robot<T> {
57    fn nop(&self) -> anyhow::Result<()> {
58        self.transport.cmd(cmd::Nop)
59    }
60
61    fn get_uptime(&self) -> anyhow::Result<Duration> {
62        self.transport.cmd(cmd::GetUptime)
63    }
64
65    fn abort(&self) -> anyhow::Result<()> {
66        self.transport.cmd(cmd::Abort)
67    }
68}