15#include "freertos/FreeRTOS.h"
16#include "freertos/task.h"
22using namespace cdc::ui;
80 "WPA2",
"WPA/WPA2",
"WPA3",
"WPA",
"Open",
"WEP"
138 uint16_t fg = inverted ? EPD_WHITE : EPD_BLACK;
139 uint16_t bg = inverted ? EPD_BLACK : EPD_WHITE;
141 gfx->fillRect(x, y + 5, 9, 7, fg);
142 gfx->drawRect(x + 2, y, 5, 6, fg);
143 gfx->fillRect(x + 3, y + 1, 3, 4, bg);
160 uint16_t index,
int x,
int y,
int w,
int h,
161 bool selected,
void* userCtx) {
165 if (!gfx)
return true;
167 gfx->setFont(
nullptr);
170 int baseline = y + 6;
174 gfx->setCursor(x + 22, baseline);
182 drawSignalBars(gfx, x + 4, baseline - 6, net ? net->rssi : -100, selected);
184 const char* ssid = item.
label ? item.
label :
"";
185 char ssidDisplay[36];
186 strncpy(ssidDisplay, ssid,
sizeof(ssidDisplay) - 1);
187 ssidDisplay[
sizeof(ssidDisplay) - 1] =
'\0';
189 gfx->setCursor(x + 22, baseline);
204 bool connected = wifi && wifi->isConnected();
206 bool hasConfig = wifiHandlers.config().valid;
210 }
else if (hasConfig) {
262 if (wifi && wifi->isConnected()) {
284 IView* view = item.getView();
299 if (!wifiHandlers.config().valid) {
305 snprintf(msg,
sizeof(msg),
"%s\n%s",
ui::tr(
"core.wifi_connecting"), wifiHandlers.config().ssid);
308 bool connected = wifiHandlers.setUserEnabled(
true);
314 if (wifi) wifi->getIpAddress(ipBuf,
sizeof(ipBuf));
315 snprintf(msg,
sizeof(msg),
"%s (IP: %s)",
ui::tr(
"core.wifi_connected"), ipBuf);
318 snprintf(msg,
sizeof(msg),
"%s: %s",
ui::tr(
"core.wifi_failed"), wifiHandlers.getLastError());
368 if (!wifi->isEnabled()) {
375 if (wifi->startScan()) {
376 uint32_t startMs = esp_timer_get_time() / 1000;
377 while (!wifi->isScanComplete()) {
378 vTaskDelay(pdMS_TO_TICKS(100));
386 if (rawResults[i].ssid[0] ==
'\0')
continue;
440 const auto* item =
reinterpret_cast<const WifiItem*
>(userData);
442 if (index == 0 || item ==
nullptr) {
443 wizard.fromScan =
false;
452 wizard.fromScan =
true;
453 strncpy(wizard.ssid, item->ssid,
sizeof(wizard.ssid) - 1);
454 wizard.security = item->security;
457 wizard.password[0] =
'\0';
500 wizard.password[0] =
'\0';
520 strncpy(wizard.password, password,
sizeof(wizard.password) - 1);
551 if (wizard.useDhcp) {
582 strncpy(wizard.staticIp, ip,
sizeof(wizard.staticIp) - 1);
597 strncpy(wizard.gateway, gateway,
sizeof(wizard.gateway) - 1);
612 strncpy(wizard.netmask, netmask,
sizeof(wizard.netmask) - 1);
640 auto append = [&](
const char* fmt, ...) {
647 size_t w =
static_cast<size_t>(written);
652 if (wifi && wifi->isConnected()) {
656 append(
"Status: %s\n\n",
ui::tr(
"core.wifi_connected"));
657 append(
"SSID: %s\n", wifi->getCurrentSsid());
659 if (wifi->getMacAddress(mac)) {
660 append(
"MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
661 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
664 if (wifi->getIpAddress(ipBuf,
sizeof(ipBuf))) {
665 append(
"IP: %s\n", ipBuf);
668 append(
"%s: %d dBm\n",
ui::tr(
"core.wifi_signal"), wifi->getRssi());
670 }
else if (wifiHandlers.config().valid) {
671 append(
"Status: %s\n\n",
ui::tr(
"core.wifi_disconnected"));
672 append(
"=== %s ===\n",
ui::tr(
"core.wifi_saved_config"));
673 append(
"SSID: %s\n", wifiHandlers.config().ssid);
674 append(
"IP: %s\n", wifiHandlers.config().useDhcp ?
"DHCP" :
"Static");
676 append(
"%s",
ui::tr(
"core.wifi_no_config"));
688 if (!wifiHandlers.config().valid && !wifiHandlers.isConnected()) {
693 bool wasConnected = wifiHandlers.isConnected();
697 if (!wifiHandlers.setUserEnabled(
true)) {
707 bool synced = wifiHandlers.syncNtp();
static ModuleRegistry & instance()
Returns the singleton module registry instance.
static constexpr uint8_t MAX_SCAN_RESULTS
static ViewStack & instance()
Returns singleton view-stack instance.
void push(IView *view, void *context=nullptr)
bool setUserEnabled(bool enabled)
Sets the user/system WiFi intent and applies it immediately.
static bool isValidIpAddress(const char *ip)
Validates dotted IPv4 address string.
void saveConfig()
Saves current wizard Wi-Fi configuration to NVS.
static WifiHandlers & instance()
Returns singleton Wi-Fi handlers instance.
void loadConfig()
Loads Wi-Fi configuration from NVS.
IWifiController * getWifiControllerInstance()
Returns the singleton Wi-Fi controller service instance.
void printText(Gdey029T94 *gfx, const char *text)
Draws CP437 text with the built-in 6x8 glyph font, byte-for-byte.
Centralized key-code constants for cdc_views.
const char * tr(const char *key)
Look up a translation by string key.
static void wifiShowIpInputField(const char *title, char *target, size_t targetSize, T9InputView::SaveCallback onComplete)
Opens generic IP-related text input step.
static void onWifiMainSelect(uint16_t index, void *userData)
Handles top-level Wi-Fi menu selection.
static ListView * s_wifiScanView
InfoView * showInfo(const char *title, const char *text, const char *hint=nullptr)
Shows a shared info view instance and pushes it onto the view stack.
static constexpr uint8_t WIFI_MENU_FIXED_COUNT
Static view pointers and wizard/scan state.
static constexpr uint32_t TOAST_DURATION_LONG_MS
static void onWifiIpModeSelect(uint16_t index, void *userData)
Handles IP mode selection.
static bool renderWifiRow(Gdey029T94 *gfx, const ListItem &item, uint16_t index, int x, int y, int w, int h, bool selected, void *userCtx)
Custom list-row renderer for Wi-Fi scan entries.
static void wifiShowAuthMenu()
Opens security/authentication selection menu.
static void wifiSetup()
Starts Wi-Fi setup wizard flow.
static ListItem s_wifiAuthItems[WIFI_AUTH_COUNT]
static ListView * s_wifiMainMenu
void showToastTask(const char *message, uint16_t durationMs=0)
Shows a task/progress toast message.
static const char * s_wifiAuthLabels[WIFI_AUTH_COUNT]
static ListItem s_wifiScanItems[WIFI_MAX_NETWORKS+1]
static constexpr uint32_t TOAST_DURATION_MEDIUM_MS
static void wifiShowPasswordInput()
Opens password input for selected network.
static constexpr size_t WIFI_DETAILS_BUF_SIZE
PSRAM-backed text buffer used for Wi-Fi details view.
static constexpr uint32_t WIFI_SCAN_TIMEOUT_MS
static ListView * s_wifiAuthMenu
static void wifiConnect()
Connects using saved Wi-Fi configuration.
static constexpr uint8_t WIFI_MAX_NETWORKS
Wi-Fi menu size limits.
static void wifiFinishSetup()
Persists wizard config and attempts connection.
static WifiItem s_wifiScanResults[WIFI_MAX_NETWORKS]
static void onWifiGatewayEntered(const char *gateway)
Validates and stores gateway input.
T9InputView * showT9Input(const char *title, const char *initialText, T9InputView::SaveCallback onSave, uint16_t maxLen=128)
Shows a shared T9 input view instance.
void showWifiMainMenu()
Shows top-level Wi-Fi menu and reloads stored configuration.
static void drawWifiLockIcon(Gdey029T94 *gfx, int x, int y, bool inverted)
Draws padlock icon for secured Wi-Fi networks.
static core::ModuleMenuItem s_wifiModuleItems[12]
static void onWifiNetmaskEntered(const char *netmask)
Validates and stores netmask input.
void drawSignalBars(Gdey029T94 *gfx, int x, int y, int8_t rssi, bool inverted)
Draws RSSI signal bars using the shared lock-screen visual style.
void showToastSuccess(const char *message, uint16_t durationMs=1500)
Shows a success toast message.
static ListItem s_wifiIpItems[WIFI_IP_COUNT]
static char s_wifiManualLabel[48]
static constexpr uint8_t WIFI_MENU_MAX_ITEMS
static void onWifiStaticIpEntered(const char *ip)
Validates and stores static IP input.
static void onWifiPasswordEntered(const char *password)
Stores entered password and continues wizard.
static ListItem s_wifiMainItems[WIFI_MENU_MAX_ITEMS]
static void wifiDisconnect()
Disconnects active Wi-Fi session.
static uint8_t s_wifiModuleCount
static uint8_t s_wifiScanCount
WifiMainMenuIdx
Fixed Wi-Fi menu and wizard index enums.
static void sortWifiScanResults()
Sorts scan results by RSSI descending.
static void onWifiAuthSelect(uint16_t index, void *userData)
Handles authentication mode selection.
static void onWifiScanSelect(uint16_t index, void *userData)
Handles scan result selection.
static char s_wifiDetailsBuf[WIFI_DETAILS_BUF_SIZE]
void showToastInfo(const char *message, uint16_t durationMs=1500)
Shows an informational toast message.
void rebuildWifiMainMenu()
Rebuilds top-level Wi-Fi menu items and dynamic module extensions.
void showToastError(const char *message, uint16_t durationMs=1500)
Shows an error toast message.
static void wifiShowDetails()
Shows Wi-Fi details/info screen.
static void wifiStartScan()
Starts network scan and opens scan result list.
static void wifiNtpSync()
Runs NTP synchronization via Wi-Fi.
static void wifiShowIpModeMenu()
Opens IP mode selection menu (DHCP/static).
static ListView * s_wifiIpMenu
One scanned Wi-Fi network entry displayed in the scan list.
hal::WifiSecurity security
void reset()
Resets Wi-Fi wizard state to defaults.