mirror of
https://github.com/esp-rs/esp-hal.git
synced 2025-10-02 14:44:42 +00:00
135 lines
3.9 KiB
Rust
135 lines
3.9 KiB
Rust
//! CSI Example
|
|
//!
|
|
//!
|
|
//! Set SSID and PASSWORD env variable before running this example.
|
|
//!
|
|
|
|
//% FEATURES: esp-wifi esp-wifi/wifi esp-wifi/utils esp-wifi/log esp-hal/unstable
|
|
//% CHIPS: esp32 esp32s2 esp32s3 esp32c2 esp32c3 esp32c6
|
|
|
|
#![no_std]
|
|
#![no_main]
|
|
|
|
extern crate alloc;
|
|
|
|
use blocking_network_stack::Stack;
|
|
use esp_alloc as _;
|
|
use esp_backtrace as _;
|
|
use esp_hal::{clock::CpuClock, entry, rng::Rng, time, timer::timg::TimerGroup};
|
|
use esp_println::println;
|
|
use esp_wifi::{
|
|
init,
|
|
wifi::{
|
|
utils::create_network_interface,
|
|
AccessPointInfo,
|
|
ClientConfiguration,
|
|
Configuration,
|
|
CsiConfig,
|
|
WifiError,
|
|
WifiStaDevice,
|
|
},
|
|
};
|
|
use smoltcp::{
|
|
iface::{SocketSet, SocketStorage},
|
|
wire::DhcpOption,
|
|
};
|
|
|
|
const SSID: &str = env!("SSID");
|
|
const PASSWORD: &str = env!("PASSWORD");
|
|
|
|
#[entry]
|
|
fn main() -> ! {
|
|
esp_println::logger::init_logger_from_env();
|
|
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
|
|
let peripherals = esp_hal::init(config);
|
|
|
|
esp_alloc::heap_allocator!(72 * 1024);
|
|
|
|
let mut rng = Rng::new(peripherals.RNG);
|
|
|
|
let timg0 = TimerGroup::new(peripherals.TIMG0);
|
|
let init = init(timg0.timer0, rng.clone(), peripherals.RADIO_CLK).unwrap();
|
|
|
|
let mut wifi = peripherals.WIFI;
|
|
let (iface, device, mut controller) =
|
|
create_network_interface(&init, &mut wifi, WifiStaDevice).unwrap();
|
|
|
|
let mut socket_set_entries: [SocketStorage; 3] = Default::default();
|
|
let mut socket_set = SocketSet::new(&mut socket_set_entries[..]);
|
|
let mut dhcp_socket = smoltcp::socket::dhcpv4::Socket::new();
|
|
// we can set a hostname here (or add other DHCP options)
|
|
dhcp_socket.set_outgoing_options(&[DhcpOption {
|
|
kind: 12,
|
|
data: b"esp-wifi",
|
|
}]);
|
|
socket_set.add(dhcp_socket);
|
|
|
|
let now = || time::now().duration_since_epoch().to_millis();
|
|
let stack = Stack::new(iface, device, socket_set, now, rng.random());
|
|
|
|
let client_config = Configuration::Client(ClientConfiguration {
|
|
ssid: SSID.try_into().unwrap(),
|
|
password: PASSWORD.try_into().unwrap(),
|
|
..Default::default()
|
|
});
|
|
let res = controller.set_configuration(&client_config);
|
|
println!("wifi_set_configuration returned {:?}", res);
|
|
|
|
controller.start().unwrap();
|
|
println!("is wifi started: {:?}", controller.is_started());
|
|
|
|
let csi = CsiConfig::default();
|
|
controller
|
|
.set_csi(csi, |data: esp_wifi::wifi::wifi_csi_info_t| {
|
|
let rx_ctrl = data.rx_ctrl;
|
|
// Signed bitfields are broken in rust-bingen, see https://github.com/esp-rs/esp-wifi-sys/issues/482
|
|
let rssi = if rx_ctrl.rssi() > 127 {
|
|
rx_ctrl.rssi() - 256
|
|
} else {
|
|
rx_ctrl.rssi()
|
|
};
|
|
println!("rssi: {:?} rate: {}", rssi, rx_ctrl.rate());
|
|
})
|
|
.unwrap();
|
|
|
|
println!("Waiting for CSI data...");
|
|
println!("Start Wifi Scan");
|
|
let res: Result<(heapless::Vec<AccessPointInfo, 10>, usize), WifiError> = controller.scan_n();
|
|
if let Ok((res, _count)) = res {
|
|
for ap in res {
|
|
println!("{:?}", ap);
|
|
}
|
|
}
|
|
|
|
println!("{:?}", controller.capabilities());
|
|
println!("wifi_connect {:?}", controller.connect());
|
|
|
|
// wait to get connected
|
|
println!("Wait to get connected");
|
|
loop {
|
|
match controller.is_connected() {
|
|
Ok(true) => break,
|
|
Ok(false) => {}
|
|
Err(err) => {
|
|
println!("{:?}", err);
|
|
loop {}
|
|
}
|
|
}
|
|
}
|
|
println!("{:?}", controller.is_connected());
|
|
|
|
// wait for getting an ip address
|
|
println!("Wait to get an ip address");
|
|
loop {
|
|
stack.work();
|
|
|
|
if stack.is_iface_up() {
|
|
println!("got ip {:?}", stack.get_ip_info());
|
|
break;
|
|
}
|
|
}
|
|
|
|
println!("Start busy loop on main");
|
|
loop {}
|
|
}
|