Support for wifi, including Wokwi simulated wifi
This commit is contained in:
+92
-10
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user