use alloc::vec; use embassy_net::udp::UdpSocket; use embassy_time::{Timer, WithTimeout}; use sachy_fmt::unwrap; use sachy_mdns::{GROUP_SOCK_V4, MDNS_PORT, service::MdnsService, state::MdnsAction}; pub async fn mdns_loop<'device>(service: &mut MdnsService, udp: &mut UdpSocket<'device>) { unwrap!(udp.bind(MDNS_PORT)); let mut send_buf = vec![0u8; 2048]; loop { if let Some(bytes) = match service.next_action() { MdnsAction::Announce => service.send_announcement(&mut send_buf), MdnsAction::ListenFor { timeout } => udp .recv_from_with(|buf, _from| service.listen_for_queries(buf, &mut send_buf)) .with_timeout(timeout) .await .ok() .flatten(), MdnsAction::WaitFor { duration } => { Timer::after(duration).await; None } } { if udp.send_to(bytes, GROUP_SOCK_V4).await.is_ok() { udp.flush().await; } else { break; } } } }