Skip to main content

esp_now_peripheral_no_stats/
esp_now_peripheral_no_stats.rs

1#![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
29// This creates a default app-descriptor required by the esp-idf bootloader.
30// For more information see: <https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/app_image_format.html#application-description>
31esp_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    // generator version: 1.1.0
61
62    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    // for inspiration have a look at the examples at https://github.com/esp-rs/esp-hal/tree/esp-hal-v~1.0/examples
116}