Wi-Fi module
The wifi.rs code is the same as in the ‘Access Website’ chapter of the Wi-Fi section. I recommend referring to it for more details.
#![allow(unused)]
fn main() {
use crate::mk_static;
use embassy_executor::Spawner;
use embassy_net::{DhcpConfig, Runner, Stack, StackResources};
use embassy_time::{Duration, Timer};
use esp_hal::rng::Rng;
use esp_println as _;
use esp_println::println;
use esp_radio::wifi::{
ClientConfig, ModeConfig, ScanConfig, WifiController, WifiDevice, WifiEvent, WifiStaState,
};
const SSID: &str = env!("SSID");
const PASSWORD: &str = env!("PASSWORD");
#[embassy_executor::task]
async fn connection(mut controller: WifiController<'static>) {
println!("start connection task");
println!("Device capabilities: {:?}", controller.capabilities());
loop {
match esp_radio::wifi::sta_state() {
WifiStaState::Connected => {
// wait until we're no longer connected
controller.wait_for_event(WifiEvent::StaDisconnected).await;
Timer::after(Duration::from_millis(5000)).await
}
_ => {}
}
if !matches!(controller.is_started(), Ok(true)) {
let client_config = ModeConfig::Client(
ClientConfig::default()
.with_ssid(SSID.into())
.with_password(PASSWORD.into()),
);
controller.set_config(&client_config).unwrap();
println!("Starting wifi");
controller.start_async().await.unwrap();
println!("Wifi started!");
println!("Scan");
let scan_config = ScanConfig::default().with_max(10);
let result = controller
.scan_with_config_async(scan_config)
.await
.unwrap();
for ap in result {
println!("{:?}", ap);
}
}
println!("About to connect...");
match controller.connect_async().await {
Ok(_) => println!("Wifi connected!"),
Err(e) => {
println!("Failed to connect to wifi: {:?}", e);
Timer::after(Duration::from_millis(5000)).await
}
}
}
}
#[embassy_executor::task]
async fn net_task(mut runner: Runner<'static, WifiDevice<'static>>) {
runner.run().await
}
pub async fn start_wifi(
radio_init: &'static esp_radio::Controller<'static>,
wifi: esp_hal::peripherals::WIFI<'static>,
rng: Rng,
spawner: &Spawner,
) -> Stack<'static> {
let (wifi_controller, interfaces) = esp_radio::wifi::new(radio_init, wifi, Default::default())
.expect("Failed to initialize Wi-Fi controller");
let wifi_interface = interfaces.sta;
let net_seed = rng.random() as u64 | ((rng.random() as u64) << 32);
let dhcp_config = DhcpConfig::default();
let net_config = embassy_net::Config::dhcpv4(dhcp_config);
// Init network stack
let (stack, runner) = embassy_net::new(
wifi_interface,
net_config,
mk_static!(StackResources<3>, StackResources::<3>::new()),
net_seed,
);
spawner.spawn(connection(wifi_controller)).ok();
spawner.spawn(net_task(runner)).ok();
wait_for_connection(stack).await;
stack
}
async fn wait_for_connection(stack: Stack<'_>) {
println!("Waiting for link to be up");
loop {
if stack.is_link_up() {
break;
}
Timer::after(Duration::from_millis(500)).await;
}
println!("Waiting to get IP address...");
loop {
if let Some(config) = stack.config_v4() {
println!("Got IP: {}", config.address);
break;
}
Timer::after(Duration::from_millis(500)).await;
}
}
}