blob: 3226461a207166409da997527f7cfed27b10f6b0 [file] [log] [blame]
Adam Snaider43516782023-06-26 15:14:18 -07001use aos_configuration as config;
2use aos_events_event_loop_runtime::{EventLoopRuntime, Sender, Watcher};
3use aos_events_shm_event_loop::ShmEventLoop;
4use core::cell::Cell;
Adam Snaider43516782023-06-26 15:14:18 -07005use core::time::Duration;
6use futures::never::Never;
7use std::path::Path;
8
9use ping_rust_fbs::aos::examples as ping;
10use pong_rust_fbs::aos::examples as pong;
11
12fn main() {
13 aos_init::init();
14 let config = config::read_config_from(Path::new("pingpong_config.json")).unwrap();
15 let ping = PingTask::new();
16 ShmEventLoop::new(&config).run_with(|runtime| {
Adam Snaiderde51c672023-09-28 21:55:43 -070017 runtime.spawn(ping.tasks(runtime));
Adam Snaider43516782023-06-26 15:14:18 -070018 });
19}
20
21#[derive(Debug)]
22struct PingTask {
23 counter: Cell<i32>,
24}
25
26impl PingTask {
27 pub fn new() -> Self {
28 Self {
29 counter: Cell::new(0),
30 }
31 }
32
33 /// Returns a future with all the tasks for the ping process
Adam Snaiderde51c672023-09-28 21:55:43 -070034 pub async fn tasks(&self, event_loop: &EventLoopRuntime<'_>) -> Never {
35 futures::join!(self.ping(event_loop), self.handle_pong(event_loop));
36 unreachable!("Let's hope `never_type` gets stabilized soon :)");
Adam Snaider43516782023-06-26 15:14:18 -070037 }
38
Adam Snaiderde51c672023-09-28 21:55:43 -070039 async fn ping(&self, event_loop: &EventLoopRuntime<'_>) -> Never {
Adam Snaider43516782023-06-26 15:14:18 -070040 // The sender is used to send messages back to the pong channel.
41 let mut ping_sender: Sender<ping::Ping> = event_loop.make_sender("/test").unwrap();
Adam Snaider43516782023-06-26 15:14:18 -070042 let mut interval = event_loop.add_interval(Duration::from_secs(1));
43
Adam Snaiderde51c672023-09-28 21:55:43 -070044 event_loop.on_run().await;
45 loop {
46 interval.tick().await;
47 self.counter.set(self.counter.get() + 1);
48 let mut builder = ping_sender.make_builder();
49 let mut ping = ping::PingBuilder::new(builder.fbb());
50 let iter = self.counter.get();
51 ping.add_value(iter);
52 ping.add_send_time(event_loop.monotonic_now().into());
53 let ping = ping.finish();
54 builder.send(ping).expect("Can't send ping");
Adam Snaider43516782023-06-26 15:14:18 -070055 }
56 }
57
Adam Snaiderde51c672023-09-28 21:55:43 -070058 async fn handle_pong(&self, event_loop: &EventLoopRuntime<'_>) -> Never {
Adam Snaider43516782023-06-26 15:14:18 -070059 // The watcher gives us incoming ping messages.
60 let mut pong_watcher: Watcher<pong::Pong> = event_loop.make_watcher("/test").unwrap();
Adam Snaider43516782023-06-26 15:14:18 -070061
Adam Snaiderde51c672023-09-28 21:55:43 -070062 event_loop.on_run().await;
63 loop {
64 let pong = dbg!(pong_watcher.next().await);
65 assert_eq!(
66 pong.message().unwrap().value(),
67 self.counter.get(),
68 "Missed a reply"
69 );
Adam Snaider43516782023-06-26 15:14:18 -070070 }
71 }
72}