Files
xiaozhi-esp32/main/boards/m5stack-cardputer-adv/wifi_config_ui.h
tkpdx01 6074fdeb71 feat(cardputer-adv): add TCA8418 keyboard and WiFi config UI (#1929)
Add full keyboard support and keyboard-based WiFi configuration for
M5Stack Cardputer Adv:

- TCA8418 I2C keyboard driver with 56-key matrix, interrupt-driven
  key events, and debounce handling
- Keyboard WiFi config UI: scan/select/input SSID and password
  directly on the device without needing a phone
- Volume control (up/down arrows) and brightness control (left/right)
  via keyboard with fine-step adjustment near bounds
- Enter key to toggle chat state
- Display offset and backlight fixes for ST7789V2
- README with flash parameters and hardware specs

Co-authored-by: bot <bot@localhost>
2026-04-14 17:02:00 +08:00

134 lines
3.9 KiB
C++

#ifndef WIFI_CONFIG_UI_H
#define WIFI_CONFIG_UI_H
#include "tca8418_keyboard.h"
#include "display/lcd_display.h"
#include <string>
#include <vector>
#include <functional>
// WiFi scan result structure
struct WifiScanResult {
std::string ssid;
int8_t rssi;
bool is_encrypted;
};
// WiFi configuration UI state machine
enum class WifiConfigState {
Scanning, // Scanning for WiFi networks
SelectWifi, // Selecting from WiFi list
InputPassword, // Entering password for selected WiFi
InputSsid, // Manual SSID input
InputManualPwd, // Manual password input (after SSID)
SavedList, // Viewing saved WiFi list
Connecting, // Connecting to WiFi
Success, // Connection successful
Failed // Connection failed
};
// Result of WiFi configuration
enum class WifiConfigResult {
None, // Still in progress
Connected, // Successfully connected
Cancelled // User cancelled
};
class WifiConfigUI {
public:
using ConnectCallback = std::function<void(const std::string& ssid, const std::string& password)>;
WifiConfigUI(LcdDisplay* display);
~WifiConfigUI();
// Start the WiFi configuration UI
void Start();
// Start directly with saved WiFi list
void StartWithSavedList();
// Handle keyboard events, returns result
WifiConfigResult HandleKeyEvent(const KeyEvent& event);
// Set callback for when connection should be attempted
void SetConnectCallback(ConnectCallback callback) { connect_callback_ = callback; }
// Notify connection result
void OnConnectResult(bool success);
// Check if UI is active
bool IsActive() const { return is_active_; }
// Update cursor blink state (call periodically from main loop)
void UpdateCursor();
private:
LcdDisplay* display_;
WifiConfigState state_;
bool is_active_;
ConnectCallback connect_callback_;
// WiFi scan results
std::vector<WifiScanResult> scan_results_;
int selected_index_;
int scroll_offset_;
// Saved WiFi list
std::vector<std::pair<std::string, std::string>> saved_wifi_list_;
int saved_selected_index_;
int saved_scroll_offset_;
// Input buffers
std::string input_ssid_;
std::string input_password_;
std::string selected_ssid_;
bool input_focus_on_password_; // For manual input: true = password field, false = ssid field
// Cursor blinking
bool cursor_visible_;
uint32_t last_cursor_toggle_;
static constexpr uint32_t CURSOR_BLINK_MS = 500;
// Display constants
static constexpr int MAX_VISIBLE_ITEMS = 4;
static constexpr int MAX_INPUT_LENGTH = 64;
// State handlers
void StartScanning();
void ShowScanResults();
void ShowPasswordInput();
void ShowManualInput();
void ShowSavedList();
void ShowConnecting();
void ShowSuccess();
void ShowFailed();
// Redraw functions (don't reset state/input)
void RedrawPasswordInput();
void RedrawManualInput();
// Input handlers
void HandleScanningKey(const KeyEvent& event);
void HandleSelectWifiKey(const KeyEvent& event);
void HandlePasswordInputKey(const KeyEvent& event);
void HandleManualInputKey(const KeyEvent& event);
void HandleSavedListKey(const KeyEvent& event);
void HandleConnectingKey(const KeyEvent& event);
void HandleResultKey(const KeyEvent& event);
// Helper functions
void DrawHeader(const char* title);
void DrawFooter(const char* hint);
void DrawInputField(const char* label, const std::string& value, bool is_password, bool is_active);
void DrawWifiList(const std::vector<WifiScanResult>& list, int selected, int scroll_offset);
void DrawSavedWifiList();
std::string GetSignalBars(int8_t rssi);
void LoadSavedWifiList();
void SaveWifiCredentials(const std::string& ssid, const std::string& password);
void DeleteSavedWifi(int index);
void DoWifiScan();
void AttemptConnection();
};
#endif // WIFI_CONFIG_UI_H