Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 1 | use aos_configuration as config; |
| 2 | use aos_events_event_loop_runtime::{EventLoopRuntime, Sender, Watcher}; |
| 3 | use aos_events_shm_event_loop::ShmEventLoop; |
Adam Snaider | 48a62f3 | 2023-10-02 15:49:23 -0700 | [diff] [blame] | 4 | use aos_init::WithCppFlags; |
| 5 | use clap::Parser; |
Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 6 | use futures::never::Never; |
Adam Snaider | a3317c8 | 2023-10-02 16:02:36 -0700 | [diff] [blame] | 7 | use std::{borrow::Borrow, path::Path}; |
Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 8 | |
| 9 | use ping_rust_fbs::aos::examples as ping; |
| 10 | use pong_rust_fbs::aos::examples as pong; |
| 11 | |
Adam Snaider | 48a62f3 | 2023-10-02 15:49:23 -0700 | [diff] [blame] | 12 | /// Pong portion of a ping/pong system. |
| 13 | #[derive(Parser, Debug)] |
| 14 | #[command(name = "pong")] |
| 15 | struct App {} |
| 16 | |
Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 17 | fn main() { |
Adam Snaider | 48a62f3 | 2023-10-02 15:49:23 -0700 | [diff] [blame] | 18 | let _app = App::parse_with_cpp_flags(); |
Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 19 | aos_init::init(); |
| 20 | let config = config::read_config_from(Path::new("pingpong_config.json")).unwrap(); |
| 21 | ShmEventLoop::new(&config).run_with(|runtime| { |
Adam Snaider | e4367cb | 2023-10-20 15:14:31 -0400 | [diff] [blame^] | 22 | let task = pong(*runtime); |
Adam Snaider | a3317c8 | 2023-10-02 16:02:36 -0700 | [diff] [blame] | 23 | runtime.set_realtime_priority(5); |
Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 24 | runtime.spawn(task); |
| 25 | }); |
| 26 | } |
| 27 | |
| 28 | /// Responds to ping messages with an equivalent pong. |
Adam Snaider | e4367cb | 2023-10-20 15:14:31 -0400 | [diff] [blame^] | 29 | async fn pong(event_loop: EventLoopRuntime<'_>) -> Never { |
Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 30 | // 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 Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 35 | |
Adam Snaider | a3317c8 | 2023-10-02 16:02:36 -0700 | [diff] [blame] | 36 | let on_run = event_loop.on_run(); |
| 37 | on_run.borrow().await; |
Adam Snaider | de51c67 | 2023-09-28 21:55:43 -0700 | [diff] [blame] | 38 | loop { |
| 39 | let ping = dbg!(ping_watcher.next().await); |
Adam Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 40 | |
Adam Snaider | de51c67 | 2023-09-28 21:55:43 -0700 | [diff] [blame] | 41 | 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 Snaider | 4351678 | 2023-06-26 15:14:18 -0700 | [diff] [blame] | 47 | } |
| 48 | } |