tasks: wifi: tweak the hardware config for more reliability where possible

This commit is contained in:
2026-03-09 10:24:15 +01:00
parent 9ecfd11982
commit 74d753e0b3
2 changed files with 48 additions and 45 deletions

View File

@@ -1,7 +1,7 @@
use alloc::string::ToString;
use alloc::string::{String, ToString};
use embassy_sync::channel::DynamicSender;
use embassy_sync::pubsub::DynSubscriber;
use embassy_time::{Duration, Instant, WithTimeout};
use embassy_time::{Duration, Instant, Timer, WithTimeout};
use esp_hal::rng::Rng;
use esp_radio::wifi::{ClientConfig, ScanConfig, WifiController, WifiDevice, WifiEvent};
use log::*;
@@ -23,52 +23,46 @@ pub async fn net_task(mut runner: embassy_net::Runner<'static, WifiDevice<'stati
runner.run().await
}
pub fn config_for_network(name: &str) -> Option<ClientConfig> {
Some(match name {
"The Frequency" => Some(ClientConfig::default().with_password("thepasswordkenneth".to_string())),
"The Frozen Throne" => Some(ClientConfig::default().with_password("IronEmpress420".to_string())),
_ => None
}?.with_ssid(name.to_string()))
}
#[embassy_executor::task]
pub async fn wifi_connect_task(mut wifi: WifiController<'static>, stack: Stack<'static>, motion: DynamicSender<'static, Measurement>) {
wifi.set_config(&esp_radio::wifi::ModeConfig::Client(
ClientConfig::default()
.with_ssid("The Frequency".to_string())
.with_auth_method(esp_radio::wifi::AuthMethod::Wpa2Personal)
.with_password("thepasswordkenneth".to_string())
)).unwrap();
pub async fn wifi_connect_task(mut wifi: WifiController<'static>, motion: DynamicSender<'static, Measurement>) {
wifi.set_mode(esp_radio::wifi::WifiMode::Sta).unwrap();
wifi.set_power_saving(esp_radio::wifi::PowerSaveMode::Maximum).unwrap();
wifi.start_async().with_timeout(Duration::from_secs(30)).await.unwrap().unwrap();
Timer::after_secs(2).await;
// TODO: need a way to stop wifi after, say, 30 seconds of being unable to connect, or the system goes to sleep
loop {
Backoff::from_secs(3).forever().attempt(async || {
info!("Connecting to wifi...");
wifi.start_async().await.unwrap();
motion.send(Measurement::SensorHardwareStatus(SensorSource::Wifi, crate::events::SensorState::AcquiringFix)).await;
let networks = wifi.scan_with_config_async(ScanConfig::default().with_show_hidden(true)).await.unwrap();
for network in networks {
info!("wifi: {} @ {}db", network.ssid, network.signal_strength);
}
match wifi.connect_async().await {
Ok(_) => Ok(()),
Err(e) => {
error!("Unable to connect to wifi: {e:?}");
wifi.stop_async().await.unwrap();
Err(())
info!("Connecting to wifi...");
motion.send(Measurement::SensorHardwareStatus(SensorSource::Wifi, crate::events::SensorState::AcquiringFix)).await;
let networks = wifi.scan_with_config_async(ScanConfig::default()).await.unwrap();
for network in networks {
info!("wifi: {} @ {}db", network.ssid, network.signal_strength);
if let Some(cfg) = config_for_network(&network.ssid) {
wifi.set_config(&esp_radio::wifi::ModeConfig::Client(cfg)).unwrap();
if wifi.connect_async().await.is_err() {
error!("Unable to connect to wifi {network:?}");
}
break;
}
}).await.unwrap();
info!("Waiting for DHCP...");
motion.send(Measurement::SensorHardwareStatus(SensorSource::Wifi, SensorState::Degraded)).await;
if stack.wait_config_up().with_timeout(Duration::from_secs(5)).await.is_ok() {
info!("Online!");
motion.send(Measurement::SensorHardwareStatus(SensorSource::Wifi, SensorState::Online)).await;
let ip_cfg = stack.config_v4().unwrap();
info!("ip={ip_cfg:?}");
wifi.wait_for_event(WifiEvent::ApStaDisconnected).await;
info!("Wifi disconnected!");
} else {
warn!("DHCP timed out after 5 seconds. Disconnecting wifi");
wifi.disconnect_async().await.unwrap();
}
warn!("Stopping wifi device");
wifi.stop_async().await.unwrap();
motion.send(Measurement::SensorHardwareStatus(SensorSource::Wifi, SensorState::Offline)).await;
if wifi.is_connected().unwrap() {
info!("Wifi is online!");
motion.send(Measurement::SensorHardwareStatus(SensorSource::Wifi, crate::events::SensorState::Online)).await;
wifi.wait_for_event(WifiEvent::StaDisconnected).await;
error!("Wifi disconnected");
} else {
info!("Wifi is offline.");
motion.send(Measurement::SensorHardwareStatus(SensorSource::Wifi, crate::events::SensorState::Offline)).await;
Timer::after_secs(30).await;
}
}
}