Support for wifi, including Wokwi simulated wifi

This commit is contained in:
2026-07-27 19:10:53 +02:00
parent 6201fcaab1
commit 95a0c0fe63
5 changed files with 2021 additions and 105 deletions
+92 -10
View File
@@ -7,6 +7,8 @@
)]
#![deny(clippy::large_stack_frames)]
use embassy_executor::Spawner;
use embassy_time::Timer;
use display_interface_spi::SPIInterface;
use embedded_graphics::Drawable;
use embedded_graphics::mono_font::MonoTextStyle;
@@ -22,13 +24,11 @@ use esp_hal::delay::Delay;
use esp_hal::gpio::Level;
use esp_hal::gpio::Output;
use esp_hal::gpio::OutputConfig;
use esp_hal::main;
use esp_hal::spi::{
Mode,
master::{Config, Spi},
};
use esp_hal::time::Rate;
use esp_hal::time::{Duration, Instant};
use esp_hal::timer::timg::TimerGroup;
use ili9341::Ili9341;
use ili9341::Orientation;
@@ -46,15 +46,96 @@ extern crate alloc;
// For more information see: <https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/app_image_format.html#application-description>
esp_bootloader_esp_idf::esp_app_desc!();
#[cfg(not(feature = "wokwi"))]
async fn setup_wifi(
wifi: esp_hal::peripherals::WIFI<'static>,
flash: esp_hal::peripherals::FLASH<'static>,
spawner: &Spawner,
) {
let nvs = esp_hal_wifimanager::Nvs::new(0x9000, 0x6000, flash).unwrap();
let mut wm_settings = esp_hal_wifimanager::WmSettings::default();
wm_settings.ssid.clear();
_ = core::fmt::write(
&mut wm_settings.ssid,
format_args!("CreatureDex-{:X}", esp_hal_wifimanager::get_efuse_mac()),
);
wm_settings.wifi_conn_timeout = 30000;
wm_settings.esp_reset_timeout = Some(300000); // 5min
let wifi_res = esp_hal_wifimanager::init_wm(
wm_settings,
spawner,
Some(&nvs),
wifi,
None,
)
.await;
log::info!("wifi_res: {wifi_res:?}");
}
#[cfg(feature = "wokwi")]
async fn setup_wifi(
wifi: esp_hal::peripherals::WIFI<'static>,
flash: esp_hal::peripherals::FLASH<'static>,
spawner: &Spawner,
) {
log::info!("Wokwi mode active: pre-seeding WiFi Manager with Wokwi credentials");
// Preload connection data so init_wm can connect immediately without AP setup.
let nvs = match esp_hal_wifimanager::Nvs::new(0x9000, 0x6000, flash) {
Ok(nvs) => nvs,
Err(e) => {
log::error!("Failed to initialize NVS for Wokwi: {e:?}");
return;
}
};
if let Err(e) = nvs
.set(
esp_hal_wifimanager::WIFI_NVS_KEY,
"{\"ssid\":\"Wokwi-GUEST\",\"psk\":\"\",\"data\":{}}",
)
.await
{
log::error!("Failed to store Wokwi WiFi config in NVS: {e:?}");
return;
}
let mut wm_settings = esp_hal_wifimanager::WmSettings::default();
// Wokwi simulation uses a default open network called "Wokwi-GUEST"
wm_settings.ssid.clear();
_ = core::fmt::write(&mut wm_settings.ssid, format_args!("Wokwi-GUEST"));
wm_settings.wifi_conn_timeout = 30000;
// Initialize Wi-Fi connection through WiFi Manager using the pre-seeded NVS data.
let wifi_res = esp_hal_wifimanager::init_wm(
wm_settings,
spawner,
Some(&nvs),
wifi,
None,
)
.await;
log::info!("Wokwi wifi_res: {wifi_res:?}");
}
#[allow(
clippy::large_stack_frames,
reason = "it's not unusual to allocate larger buffers etc. in main"
)]
#[main]
fn main() -> ! {
#[esp_rtos::main]
async fn main(spawner: Spawner) {
// generator version: 1.3.0
// generator parameters: --chip esp32s3 -o esp32s3-wroom-1-octal-psram -o unstable-hal -o alloc -o wifi -o log -o wokwi -o neovim -o vscode -o esp
esp_println::logger::init_logger_from_env();
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
@@ -85,9 +166,7 @@ fn main() -> ! {
let sw_interrupt =
esp_hal::interrupt::software::SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
esp_rtos::start(timg0.timer0, sw_interrupt.software_interrupt0);
let (mut _wifi_controller, _interfaces) =
esp_radio::wifi::new(peripherals.WIFI, Default::default())
.expect("Failed to initialize Wi-Fi controller");
let spi_bus = Spi::new(
peripherals.SPI2,
@@ -124,10 +203,13 @@ fn main() -> ! {
.draw(&mut display)
.unwrap();
setup_wifi(peripherals.WIFI, peripherals.FLASH, &spawner).await;
log::info!("Setup complete, entering main loop");
loop {
info!("Hello world!");
let delay_start = Instant::now();
while delay_start.elapsed() < Duration::from_millis(500) {}
Timer::after_millis(500).await;
}
// for inspiration have a look at the examples at https://github.com/esp-rs/esp-hal/tree/esp-hal-v1.1.0/examples