A RPi Pico powered Lightning Detector
at main 87 lines 2.4 kB view raw
1mod mdns; 2mod noise; 3mod rpc; 4mod sntp; 5 6use embassy_futures::select::{select, select3}; 7use embassy_net::{ 8 tcp::TcpSocket, 9 udp::{PacketMetadata, UdpSocket}, 10}; 11use embassy_time::Duration; 12use sachy_fmt::unwrap; 13use sachy_mdns::{ 14 GROUP_ADDR_V4, 15 service::{MdnsService, Service}, 16}; 17 18use crate::{ 19 constants::{HOST_NAME, HOST_PORT}, 20 net::noise::NOISE_PROTO, 21 rtc::GlobalRtc, 22 updates::UpdateConnection, 23 utils::try_static_buffer_with, 24}; 25 26#[embassy_executor::task] 27pub async fn udp_stack(stack: embassy_net::Stack<'static>, rtc: GlobalRtc<'static>) { 28 let rx_meta = unwrap!(try_static_buffer_with(16, || PacketMetadata::EMPTY)); 29 let tx_meta = unwrap!(try_static_buffer_with(16, || PacketMetadata::EMPTY)); 30 let rx_buffer = unwrap!(try_static_buffer_with(4096, Default::default)); 31 let tx_buffer = unwrap!(try_static_buffer_with(4096, Default::default)); 32 33 let mut udp = UdpSocket::new(stack, rx_meta, rx_buffer, tx_meta, tx_buffer); 34 35 stack.wait_config_up().await; 36 37 unwrap!(stack.join_multicast_group(GROUP_ADDR_V4)); 38 39 let mut service = MdnsService::new(Service::new( 40 "_picostrike._tcp.local", 41 HOST_NAME, 42 HOST_NAME, 43 stack 44 .config_v4() 45 .map(|config| config.address.address().into()), 46 HOST_PORT, 47 [NOISE_PROTO], 48 )); 49 50 loop { 51 stack.wait_config_up().await; 52 53 if !rtc.is_ready().await { 54 sntp::sntp_loop(&mut udp, stack, rtc).await; 55 } 56 57 select3( 58 stack.wait_link_down(), 59 mdns::mdns_loop(&mut service, &mut udp), 60 rtc.wait_for_reset(), 61 ) 62 .await; 63 64 udp.close(); 65 } 66} 67 68#[embassy_executor::task] 69pub async fn tcp_stack(stack: embassy_net::Stack<'static>) { 70 let rx_buffer = unwrap!(try_static_buffer_with(4096, Default::default)); 71 let tx_buffer = unwrap!(try_static_buffer_with(4096, Default::default)); 72 let mut tcp = TcpSocket::new(stack, rx_buffer, tx_buffer); 73 let net_data = UpdateConnection::get_receiver(); 74 75 tcp.set_keep_alive(Some(Duration::from_secs(1))); 76 tcp.set_timeout(Some(Duration::from_secs(10))); 77 78 loop { 79 stack.wait_config_up().await; 80 81 select(stack.wait_link_down(), rpc::rpc_loop(&mut tcp, &net_data)).await; 82 83 net_data.clear(); 84 85 UpdateConnection::disconnect(); 86 } 87}