esp_now_peripheral_no_stats/
esp_now_peripheral_no_stats.rs1#![no_std]
2#![no_main]
3
4use embassy_executor::Spawner;
5use embassy_futures::join::join;
6use embassy_time::{with_timeout, Duration, Instant, Timer};
7use esp_csi_rs::logging::logging::LogMode;
8use esp_csi_rs::{
9 config::CsiConfig, logging::logging::init_logger, CSINode, CollectionMode, EspNowConfig,
10 PeripheralOpMode,
11};
12use esp_csi_rs::{
13 CSINodeClient, CSINodeHardware, log_ln,
14};
15use esp_hal::clock::CpuClock;
16use esp_hal::timer::timg::TimerGroup;
17use esp_println::println;
18use esp_radio::{
19 wifi::{ClientConfig, Interfaces, WifiController},
20 Controller,
21};
22use {esp_backtrace as _, esp_println as _};
23
24extern crate alloc;
25
26static WIFI_CONTROLLER: static_cell::StaticCell<WifiController<'static>> =
27 static_cell::StaticCell::new();
28
29esp_bootloader_esp_idf::esp_app_desc!();
32
33#[allow(
34 clippy::large_stack_frames,
35 reason = "it's not unusual to allocate larger buffers etc. in main"
36)]
37
38macro_rules! mk_static {
39 ($t:ty,$val:expr) => {{
40 static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new();
41 #[deny(unused_attributes)]
42 let x = STATIC_CELL.uninit().write(($val));
43 x
44 }};
45}
46
47async fn node_task(client: &mut CSINodeClient) {
48 with_timeout(Duration::from_secs(1000), async {
49 loop {
50 Timer::after_secs(1).await;
51 }
52 })
53 .await
54 .unwrap_err();
55 client.send_stop().await;
56}
57
58#[esp_rtos::main]
59async fn main(spawner: Spawner) -> ! {
60 let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
63 let peripherals = esp_hal::init(config);
64 init_logger(spawner, LogMode::Text);
65
66 esp_alloc::heap_allocator!(#[esp_hal::ram(reclaimed)] size: 61440);
67
68 let timg0 = TimerGroup::new(peripherals.TIMG0);
69 #[cfg(any(feature = "esp32c6", feature = "esp32c3"))]
70 {
71 let sw_interrupt =
72 esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
73 esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0);
74 }
75 #[cfg(not(any(feature = "esp32c6", feature = "esp32c3")))]
76 esp_rtos::start(timg0.timer0);
77
78 log_ln!("Embassy initialized!");
79 log_ln!("Starting EspNow Peripheral Node");
80
81 let radio_init = mk_static!(
82 Controller<'static>,
83 esp_radio::init().expect("Failed to initialize Wi-Fi/BLE controller")
84 );
85
86 let mut config_radio = esp_radio::wifi::Config::default();
87 config_radio = config_radio.with_power_save_mode(esp_radio::wifi::PowerSaveMode::None);
88 let (wifi_controller, mut interfaces) =
89 esp_radio::wifi::new(radio_init, peripherals.WIFI, config_radio)
90 .expect("Failed to initialize Wi-Fi controller");
91
92 let controller = WIFI_CONTROLLER.init(wifi_controller);
93
94 let mut node_handle = CSINodeClient::new();
95 let csi_hardware = CSINodeHardware::new(&mut interfaces, controller);
96 let mut node = CSINode::new(
97 esp_csi_rs::Node::Peripheral(esp_csi_rs::PeripheralOpMode::EspNow(
98 (EspNowConfig::default()),
99 )),
100 CollectionMode::Listener,
101 Some(CsiConfig::default()),
102 Some(10000),
103 csi_hardware,
104 );
105 node.set_protocol(esp_radio::wifi::Protocol::P802D11LR);
106 node.set_rate(esp_radio::esp_now::WifiPhyRate::RateMcs0Lgi);
107
108 join(node.run(), node_task(&mut node_handle)).await;
109
110 loop {
111 log_ln!("Hello world!");
112 Timer::after(Duration::from_secs(1)).await;
113 }
114
115 }