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}