From ffa51f996c90b5187d9cac24581cbf0b0e6e8202 Mon Sep 17 00:00:00 2001 From: Rui Xu Date: Tue, 16 Jun 2026 15:16:19 +0800 Subject: [PATCH] feat(wifi): add settings Wi-Fi provisioning Summary: - add a HAL Wi-Fi controller for STA, setup AP, and Badge AP coordination - add Settings > Device > Wi-Fi with connection/config AP status - add a centered Wi-Fi indicator to the status bar Rationale: - keep Wi-Fi ownership centralized so Settings and Badge AP do not race over esp_wifi state - keep LVGL updates on the UI polling path instead of Wi-Fi event callbacks Tests: - git diff --check upstream/main..HEAD - idf.py reconfigure - idf.py build Co-authored-by: Codex --- main/apps/app_setup/app_setup.cpp | 5 + main/apps/app_setup/workers/device.cpp | 185 +++++++++ main/apps/app_setup/workers/workers.h | 17 + main/apps/common/status_bar/status_bar.cpp | 56 ++- main/hal/hal.cpp | 2 + main/hal/hal.h | 31 ++ main/hal/hal_badge.cpp | 2 + main/hal/hal_network.cpp | 437 +++++++++++++++++++++ main/hal/utils/config_ap/config_ap.cpp | 22 +- 9 files changed, 744 insertions(+), 13 deletions(-) create mode 100644 main/hal/hal_network.cpp diff --git a/main/apps/app_setup/app_setup.cpp b/main/apps/app_setup/app_setup.cpp index 28c98af5..133f28ae 100644 --- a/main/apps/app_setup/app_setup.cpp +++ b/main/apps/app_setup/app_setup.cpp @@ -55,6 +55,11 @@ void AppSetup::onOpen() _destroy_menu = true; _worker = std::make_unique(); }}, + {"Wi-Fi", + [&]() { + _destroy_menu = true; + _worker = std::make_unique(); + }}, }, }, { diff --git a/main/apps/app_setup/workers/device.cpp b/main/apps/app_setup/workers/device.cpp index 0a7a9119..0ada1a5b 100644 --- a/main/apps/app_setup/workers/device.cpp +++ b/main/apps/app_setup/workers/device.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include using namespace smooth_ui_toolkit::lvgl_cpp; @@ -228,6 +229,160 @@ class ButtonWorker::ButtonConfigView { bool _save_requested = false; }; +class WifiWorker::WifiConfigView { +public: + explicit WifiConfigView(const Hal::WifiStatus& initialStatus) + { + _panel = std::make_unique(lv_screen_active()); + _panel->align(LV_ALIGN_CENTER, 0, 0); + _panel->setSize(466, 466); + _panel->setRadius(0); + _panel->setBorderWidth(0); + _panel->setPaddingAll(0); + _panel->setBgColor(lv_color_hex(0x000000)); + _panel->setBgOpa(LV_OPA_COVER); + _panel->removeFlag(LV_OBJ_FLAG_SCROLLABLE); + + _title_label = std::make_unique