A RPi Pico powered Lightning Detector
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}