ESP32: сохранить до 8 Wi-Fi сетей и ускорить burn

This commit is contained in:
AidarKC
2026-06-10 13:24:50 +04:00
parent 9ca469a075
commit f095182673
6 changed files with 191 additions and 26 deletions
@@ -27,6 +27,7 @@
#define SWIPE_THRESHOLD 48
#define TAP_CANCEL_THRESHOLD 18
#define MAX_SCAN_RESULTS 8
#define MAX_SAVED_WIFI_NETWORKS 8
#define WIFI_CONNECT_TIMEOUT_MS 12000
#define WIFI_RECONNECT_FAST_MS 10000
#define WIFI_RECONNECT_SLOW_MS 30000
@@ -144,6 +145,8 @@ static uint32_t gLastHandledTouchSequence = 0;
static String gWifiSavedSsid;
static String gWifiSavedPassword;
static String gWifiSelectedSsid;
static String gKnownWifiSsids[MAX_SAVED_WIFI_NETWORKS];
static String gKnownWifiPasswords[MAX_SAVED_WIFI_NETWORKS];
static String gWifiStatusMessage = "No Wi-Fi configured";
static String gScanResults[MAX_SCAN_RESULTS];
static int gScanResultCount = 0;
@@ -182,6 +185,10 @@ static void handleSwipe(SwipeDirection swipe);
static void loadPrefs();
static void saveWifiPrefs();
static void clearWifiPrefs();
static void clearSavedWifiList();
static int findKnownWifiIndex(const String &ssid);
static String savedPasswordForSsid(const String &ssid);
static void upsertKnownWifi(const String &ssid, const String &password);
static void saveServerPrefs();
static void saveAccountPrefs();
static void beginSavedWifi();
@@ -334,10 +341,86 @@ static void showMessageAt(const String &text, lv_coord_t y) {
lv_obj_align(label, LV_ALIGN_TOP_MID, 0, y);
}
static void clearSavedWifiList() {
for (int i = 0; i < MAX_SAVED_WIFI_NETWORKS; ++i) {
gKnownWifiSsids[i] = "";
gKnownWifiPasswords[i] = "";
}
}
static int findKnownWifiIndex(const String &ssid) {
if (ssid.isEmpty()) {
return -1;
}
for (int i = 0; i < MAX_SAVED_WIFI_NETWORKS; ++i) {
if (gKnownWifiSsids[i] == ssid) {
return i;
}
}
return -1;
}
static String savedPasswordForSsid(const String &ssid) {
int index = findKnownWifiIndex(ssid);
return index >= 0 ? gKnownWifiPasswords[index] : "";
}
static String splitFixedWidth(const String &value, size_t chunkSize) {
if (chunkSize == 0 || value.isEmpty()) {
return value;
}
String out;
for (size_t i = 0; i < value.length(); ++i) {
if (i > 0 && (i % chunkSize) == 0) {
out += '\n';
}
out += value.charAt(i);
}
return out;
}
static void upsertKnownWifi(const String &ssid, const String &password) {
if (ssid.isEmpty()) {
return;
}
int existing = findKnownWifiIndex(ssid);
if (existing >= 0) {
gKnownWifiPasswords[existing] = password;
return;
}
for (int i = 0; i < MAX_SAVED_WIFI_NETWORKS; ++i) {
if (gKnownWifiSsids[i].isEmpty()) {
gKnownWifiSsids[i] = ssid;
gKnownWifiPasswords[i] = password;
return;
}
}
for (int i = 0; i < MAX_SAVED_WIFI_NETWORKS - 1; ++i) {
gKnownWifiSsids[i] = gKnownWifiSsids[i + 1];
gKnownWifiPasswords[i] = gKnownWifiPasswords[i + 1];
}
gKnownWifiSsids[MAX_SAVED_WIFI_NETWORKS - 1] = ssid;
gKnownWifiPasswords[MAX_SAVED_WIFI_NETWORKS - 1] = password;
}
static void loadPrefs() {
clearSavedWifiList();
gWifiSavedSsid = gPrefs.getString("wifi_ssid", "");
gWifiSavedPassword = gPrefs.getString("wifi_pass", "");
gWifiKnownGood = gPrefs.getBool("wifi_known_good", false);
for (int i = 0; i < MAX_SAVED_WIFI_NETWORKS; ++i) {
String ssidKey = String("wifi_ssid_") + i;
String passKey = String("wifi_pass_") + i;
gKnownWifiSsids[i] = gPrefs.getString(ssidKey.c_str(), "");
gKnownWifiPasswords[i] = gPrefs.getString(passKey.c_str(), "");
}
if (!gWifiSavedSsid.isEmpty() && findKnownWifiIndex(gWifiSavedSsid) < 0) {
upsertKnownWifi(gWifiSavedSsid, gWifiSavedPassword);
}
gSolanaRpcUrl = gPrefs.getString("solana_rpc", "https://api.devnet.solana.com");
gShineServerUrl = gPrefs.getString("shine_server", "https://shineup.me");
gLoginValue = gPrefs.getString("login", "");
@@ -358,6 +441,17 @@ static void saveWifiPrefs() {
gPrefs.putString("wifi_ssid", gWifiSavedSsid);
gPrefs.putString("wifi_pass", gWifiSavedPassword);
gPrefs.putBool("wifi_known_good", gWifiKnownGood);
for (int i = 0; i < MAX_SAVED_WIFI_NETWORKS; ++i) {
String ssidKey = String("wifi_ssid_") + i;
String passKey = String("wifi_pass_") + i;
if (gKnownWifiSsids[i].isEmpty()) {
gPrefs.remove(ssidKey.c_str());
gPrefs.remove(passKey.c_str());
} else {
gPrefs.putString(ssidKey.c_str(), gKnownWifiSsids[i]);
gPrefs.putString(passKey.c_str(), gKnownWifiPasswords[i]);
}
}
}
static void saveServerPrefs() {
@@ -382,6 +476,7 @@ static void clearWifiPrefs() {
gWifiSavedSsid = "";
gWifiSavedPassword = "";
gWifiSelectedSsid = "";
clearSavedWifiList();
gWifiKnownGood = false;
gWifiReconnectEnabled = false;
gWifiDisconnectedSinceMs = 0;
@@ -418,7 +513,13 @@ static String wifiSavedLabel() {
if (gWifiSavedSsid.isEmpty()) {
return "Saved: none";
}
return String("Saved: ") + gWifiSavedSsid;
int knownCount = 0;
for (int i = 0; i < MAX_SAVED_WIFI_NETWORKS; ++i) {
if (!gKnownWifiSsids[i].isEmpty()) {
knownCount++;
}
}
return String("Saved: ") + gWifiSavedSsid + " (" + knownCount + ")";
}
static String wifiHomeSummary() {
@@ -652,6 +753,7 @@ static bool connectWifiNow(const String &ssid, const String &password) {
if (WiFi.status() == WL_CONNECTED) {
gWifiSavedSsid = ssid;
gWifiSavedPassword = password;
upsertKnownWifi(ssid, password);
gWifiKnownGood = true;
gWifiReconnectEnabled = true;
gWifiDisconnectedSinceMs = 0;
@@ -830,7 +932,7 @@ static void networkSelectCb(lv_event_t *event) {
SCREEN_WIFI,
"ENTER PASSWORD",
String("SSID: ") + gWifiSelectedSsid,
"",
savedPasswordForSsid(gWifiSelectedSsid),
true);
}
@@ -1276,12 +1378,13 @@ static void drawSecretShowScreen() {
if (gSecretConfigured) {
showMessageAt("Current secret in base58:", 56);
lv_obj_t *label = lv_label_create(gRoot);
lv_label_set_text(label, gSecretBase58.c_str());
String secretLines = splitFixedWidth(gSecretBase58, 10);
lv_label_set_text(label, secretLines.c_str());
lv_obj_set_width(label, 420);
lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP);
lv_obj_set_style_text_font(label, &lv_font_montserrat_16, 0);
lv_obj_set_style_text_font(label, &lv_font_montserrat_20, 0);
lv_obj_set_style_text_color(label, lv_color_hex(0xD9E1EA), 0);
lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 112);
lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 102);
} else {
showMessageAt("Secret not set", 96);
}