Something went wrong. Try again.
A RPi Pico powered Lightning Detector
Something went wrong. Try again.
2.6 kB · 94 lines
Rust
at main
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495mod crypto;mod mdns;mod rpc;mod sntp;
use embassy_futures::select::{select, select3};use embassy_net::{ tcp::TcpSocket, udp::{PacketMetadata, UdpSocket},};use embassy_time::Duration;use sachy_fmt::unwrap;use sachy_mdns::{ GROUP_ADDR_V4, service::{MdnsService, Service},};
use crate::{ constants::{HOST_NAME, HOST_PORT}, rtc::GlobalRtc, updates::UpdateConnection, utils::{try_box_future_within, try_static_buffer_with},};
#[embassy_executor::task]pub async fn udp_stack(stack: embassy_net::Stack<'static>, rtc: GlobalRtc<'static>) { let rx_meta = unwrap!(try_static_buffer_with(16, || PacketMetadata::EMPTY)); let tx_meta = unwrap!(try_static_buffer_with(16, || PacketMetadata::EMPTY)); let rx_buffer = unwrap!(try_static_buffer_with(4096, Default::default)); let tx_buffer = unwrap!(try_static_buffer_with(4096, Default::default));
let mut udp = UdpSocket::new(stack, rx_meta, rx_buffer, tx_meta, tx_buffer);
stack.wait_config_up().await;
unwrap!(stack.join_multicast_group(GROUP_ADDR_V4));
let mut service = MdnsService::new(Service::new( "_picostrike._tcp.local", HOST_NAME, HOST_NAME, stack .config_v4() .map(|config| config.address.address().into()), HOST_PORT, [], ));
loop { stack.wait_config_up().await;
if !rtc.is_ready().await { sntp::sntp_loop(&mut udp, stack, rtc).await; }
select3( stack.wait_link_down(), mdns::mdns_loop(&mut service, &mut udp), rtc.wait_for_reset(), ) .await;
udp.close(); }}
#[embassy_executor::task]pub async fn tcp_stack(stack: embassy_net::Stack<'static>) { let rx_buffer = unwrap!(try_static_buffer_with(8192, Default::default)); let tx_buffer = unwrap!(try_static_buffer_with(8192, Default::default)); let rpc_buffer = unwrap!(try_static_buffer_with(8192, Default::default));
let mut tcp = TcpSocket::new(stack, rx_buffer, tx_buffer);
tcp.set_keep_alive(Some(Duration::from_secs(1))); tcp.set_timeout(Some(Duration::from_secs(10)));
loop { stack.wait_config_up().await;
let link_down = async { stack.wait_link_down().await; UpdateConnection::get_receiver().clear(); UpdateConnection::disconnect(); };
let rpc_fut = unwrap!( try_box_future_within(|| select(link_down, rpc::rpc_loop(&mut tcp, rpc_buffer))), "Failed to alloc RPC LOOP" );
rpc_fut.await; }}