blob: 34da238fc8e77e6a9f2062bc1e9cb08d8e1d0e66 [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::Parser;
Adam Snaider43516782023-06-26 15:14:18 -07006use futures::never::Never;
Adam Snaidera3317c82023-10-02 16:02:36 -07007use std::{borrow::Borrow, path::Path};
Adam Snaider43516782023-06-26 15:14:18 -07008
9use ping_rust_fbs::aos::examples as ping;
10use pong_rust_fbs::aos::examples as pong;
11
Adam Snaider48a62f32023-10-02 15:49:23 -070012/// Pong portion of a ping/pong system.
13#[derive(Parser, Debug)]
14#[command(name = "pong")]
15struct App {}
16
Adam Snaider43516782023-06-26 15:14:18 -070017fn main() {
Adam Snaider48a62f32023-10-02 15:49:23 -070018 let _app = App::parse_with_cpp_flags();
Adam Snaider43516782023-06-26 15:14:18 -070019 aos_init::init();
20 let config = config::read_config_from(Path::new("pingpong_config.json")).unwrap();
21 ShmEventLoop::new(&config).run_with(|runtime| {
Adam Snaidere4367cb2023-10-20 15:14:31 -040022 let task = pong(*runtime);
Adam Snaidera3317c82023-10-02 16:02:36 -070023 runtime.set_realtime_priority(5);
Adam Snaider43516782023-06-26 15:14:18 -070024 runtime.spawn(task);
25 });
26}
27
28/// Responds to ping messages with an equivalent pong.
Adam Snaidere4367cb2023-10-20 15:14:31 -040029async fn pong(event_loop: EventLoopRuntime<'_>) -> Never {
Adam Snaider43516782023-06-26 15:14:18 -070030 // The watcher gives us incoming ping messages.
31 let mut ping_watcher: Watcher<ping::Ping> = event_loop.make_watcher("/test").unwrap();
32
33 // The sender is used to send messages back to the pong channel.
34 let mut pong_sender: Sender<pong::Pong> = event_loop.make_sender("/test").unwrap();
Adam Snaider43516782023-06-26 15:14:18 -070035
Adam Snaidera3317c82023-10-02 16:02:36 -070036 let on_run = event_loop.on_run();
37 on_run.borrow().await;
Adam Snaiderde51c672023-09-28 21:55:43 -070038 loop {
39 let ping = dbg!(ping_watcher.next().await);
Adam Snaider43516782023-06-26 15:14:18 -070040
Adam Snaiderde51c672023-09-28 21:55:43 -070041 let mut builder = pong_sender.make_builder();
42 let mut pong = pong::PongBuilder::new(builder.fbb());
43 pong.add_value(ping.message().unwrap().value());
44 pong.add_initial_send_time(event_loop.monotonic_now().into());
45 let pong = pong.finish();
46 builder.send(pong).expect("Can't send pong reponse");
Adam Snaider43516782023-06-26 15:14:18 -070047 }
48}