blob: d9673fad849153de32b0a77769a77d0d490642e6 [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;
Adam Snaider48a62f32023-10-02 15:49:23 -07004use aos_init::WithCppFlags;
5use clap::{CommandFactory, Parser};
Adam Snaider43516782023-06-26 15:14:18 -07006use core::cell::Cell;
Adam Snaider43516782023-06-26 15:14:18 -07007use core::time::Duration;
8use futures::never::Never;
Adam Snaidera3317c82023-10-02 16:02:36 -07009use std::borrow::Borrow;
Adam Snaider43516782023-06-26 15:14:18 -070010use std::path::Path;
11
12use ping_rust_fbs::aos::examples as ping;
13use pong_rust_fbs::aos::examples as pong;
14
Adam Snaider48a62f32023-10-02 15:49:23 -070015/// Ping portion of a ping/pong system.
16#[derive(Parser, Debug)]
17#[command(name = "ping")]
18struct App {
19 /// Time to sleep between pings.
20 #[arg(long, default_value_t = 10000, value_name = "MICROS")]
21 sleep: u64,
22}
23
Adam Snaider43516782023-06-26 15:14:18 -070024fn main() {
Adam Snaider48a62f32023-10-02 15:49:23 -070025 let app = App::parse_with_cpp_flags();
Adam Snaider43516782023-06-26 15:14:18 -070026 aos_init::init();
27 let config = config::read_config_from(Path::new("pingpong_config.json")).unwrap();
28 let ping = PingTask::new();
29 ShmEventLoop::new(&config).run_with(|runtime| {
Adam Snaidera3317c82023-10-02 16:02:36 -070030 runtime.set_realtime_priority(5);
Adam Snaidere4367cb2023-10-20 15:14:31 -040031 runtime.spawn(ping.tasks(*runtime, app.sleep));
Adam Snaider43516782023-06-26 15:14:18 -070032 });
33}
34
35#[derive(Debug)]
36struct PingTask {
37 counter: Cell<i32>,
38}
39
40impl PingTask {
41 pub fn new() -> Self {
42 Self {
43 counter: Cell::new(0),
44 }
45 }
46
47 /// Returns a future with all the tasks for the ping process
Adam Snaidere4367cb2023-10-20 15:14:31 -040048 pub async fn tasks(&self, event_loop: EventLoopRuntime<'_>, sleep: u64) -> Never {
49 futures::join!(self.ping(&event_loop, sleep), self.handle_pong(&event_loop));
Adam Snaiderde51c672023-09-28 21:55:43 -070050 unreachable!("Let's hope `never_type` gets stabilized soon :)");
Adam Snaider43516782023-06-26 15:14:18 -070051 }
52
Adam Snaidera3317c82023-10-02 16:02:36 -070053 pub async fn ping(&self, event_loop: &EventLoopRuntime<'_>, sleep: u64) -> Never {
Adam Snaider43516782023-06-26 15:14:18 -070054 // The sender is used to send messages back to the pong channel.
55 let mut ping_sender: Sender<ping::Ping> = event_loop.make_sender("/test").unwrap();
Adam Snaider48a62f32023-10-02 15:49:23 -070056 let mut interval = event_loop.add_interval(Duration::from_micros(sleep));
Adam Snaider43516782023-06-26 15:14:18 -070057
Adam Snaidera3317c82023-10-02 16:02:36 -070058 let on_run = event_loop.on_run();
59 on_run.borrow().await;
60
Adam Snaiderde51c672023-09-28 21:55:43 -070061 loop {
62 interval.tick().await;
63 self.counter.set(self.counter.get() + 1);
64 let mut builder = ping_sender.make_builder();
65 let mut ping = ping::PingBuilder::new(builder.fbb());
66 let iter = self.counter.get();
67 ping.add_value(iter);
68 ping.add_send_time(event_loop.monotonic_now().into());
69 let ping = ping.finish();
70 builder.send(ping).expect("Can't send ping");
Adam Snaider43516782023-06-26 15:14:18 -070071 }
72 }
73
Adam Snaidera3317c82023-10-02 16:02:36 -070074 pub async fn handle_pong(&self, event_loop: &EventLoopRuntime<'_>) -> Never {
Adam Snaider43516782023-06-26 15:14:18 -070075 // The watcher gives us incoming ping messages.
76 let mut pong_watcher: Watcher<pong::Pong> = event_loop.make_watcher("/test").unwrap();
Adam Snaider43516782023-06-26 15:14:18 -070077
Adam Snaidera3317c82023-10-02 16:02:36 -070078 let on_run = event_loop.on_run();
79 on_run.borrow().await;
Adam Snaiderde51c672023-09-28 21:55:43 -070080 loop {
Adam Snaidera3317c82023-10-02 16:02:36 -070081 let pong = pong_watcher.next().await;
Adam Snaiderde51c672023-09-28 21:55:43 -070082 assert_eq!(
83 pong.message().unwrap().value(),
84 self.counter.get(),
85 "Missed a reply"
86 );
Adam Snaider43516782023-06-26 15:14:18 -070087 }
88 }
89}