extern crate bevy_rosc;
use std::time::Duration;
use bevy::prelude::*;
use bevy::time::common_conditions::on_timer;
use bevy_rosc::OscDispatcher;
use bevy_rosc::OscMethod;
use bevy_rosc::{method_dispatcher_system, MultiAddressOscMethod, OscDispatchEvent};
use rosc::OscMessage;
use rosc::OscPacket;
fn startup(mut commands: Commands) {
println!("** Startup");
for i in 0..3 {
commands.spawn(MultiAddressOscMethod::new(vec![format!("/entity{}/time", i)]).unwrap());
}
}
fn print_received_osc_packets(
mut query: Query<&mut MultiAddressOscMethod, Changed<MultiAddressOscMethod>>,
) {
for mut osc_method in query.iter_mut() {
let new_msg = osc_method.get_message();
if let Some(msg) = new_msg {
println!(
"Method {:?} received: {:?}",
osc_method.get_addresses()[0],
msg
)
}
}
}
fn send_message(
mut disp: ResMut<OscDispatcher>,
time: Res<Time>,
event_reader: EventWriter<OscDispatchEvent>,
) {
let new_msg = OscMessage {
addr: "/entity*/time".to_string(),
args: vec![time.elapsed_secs().into()],
};
println!("Dispatching: {:?}", new_msg);
disp.dispatch(vec![OscPacket::Message(new_msg)], event_reader);
}
fn main() {
App::new()
.add_plugins(MinimalPlugins)
.insert_resource(OscDispatcher::default())
.add_event::<OscDispatchEvent>()
.add_systems(Update, method_dispatcher_system::<MultiAddressOscMethod>)
.add_systems(Startup, startup)
.add_systems(Update, print_received_osc_packets)
.add_systems(Update, send_message.run_if(on_timer(Duration::from_secs(1))))
.run();
}