From 91d91ebd0804c5f4aabbe890958659202d1e2c10 Mon Sep 17 00:00:00 2001 From: Timothy Yin Date: Mon, 16 Mar 2026 01:46:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(main):=20=E8=87=AA=E5=8A=A8=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=85=85=E7=94=B5=E7=82=B9=E6=A0=87=E8=AF=86=E7=AC=A6?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96WiFi=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hardware/firmware/src/main.cpp | 39 ++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/hardware/firmware/src/main.cpp b/hardware/firmware/src/main.cpp index 684af38..c3cfcd9 100644 --- a/hardware/firmware/src/main.cpp +++ b/hardware/firmware/src/main.cpp @@ -144,6 +144,10 @@ void setup() snprintf(cpSerial, sizeof(cpSerial), "%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + // Auto-generate Charge Point Identifier based on MAC (e.g. HLCP_A1B2C3) + snprintf(cp_identifier, sizeof(cp_identifier), "HLCP_%s", cpSerial + 6); + // reset LED leds[0] = Rgb{0, 0, 0}; leds.show(); @@ -165,11 +169,12 @@ void setup() Preferences preferences; preferences.begin("ocpp-config", false); String b = preferences.getString("backend", CFG_OCPP_BACKEND); - String i = preferences.getString("identifier", CFG_CP_IDENTIFIER); - String a = preferences.getString("auth_key", ""); + String a = preferences.getString("auth_key", CFG_AUTHORIZATIONKEY ? CFG_AUTHORIZATIONKEY : ""); + + Serial.printf("\n[OCPP] Loaded Backend URL: %s\n", b.c_str()); + Serial.printf("[OCPP] Loaded Auth Key length: %d\n", a.length()); strncpy(ocpp_backend, b.c_str(), sizeof(ocpp_backend)); - strncpy(cp_identifier, i.c_str(), sizeof(cp_identifier)); strncpy(auth_key, a.c_str(), sizeof(auth_key)); WiFiManager wm; @@ -177,12 +182,11 @@ void setup() wm.setSaveParamsCallback(saveConfigCallback); wm.setParamsPage(true); - WiFiManagerParameter custom_ocpp_backend("backend", "OCPP Backend URL", ocpp_backend, 128); - WiFiManagerParameter custom_cp_identifier("identifier", "Charge Point ID", cp_identifier, 64); - WiFiManagerParameter custom_auth_key("auth_key", "Auth Key (leave blank if none)", auth_key, 64); + // Use autocomplete=off to prevent browsers from autofilling old URLs after a reset + WiFiManagerParameter custom_ocpp_backend("backend", "OCPP Backend URL", ocpp_backend, 128, "autocomplete=\"off\""); + WiFiManagerParameter custom_auth_key("auth_key", "Auth Key (leave blank if none)", auth_key, 64, "autocomplete=\"off\""); wm.addParameter(&custom_ocpp_backend); - wm.addParameter(&custom_cp_identifier); wm.addParameter(&custom_auth_key); const char *customHeadElement = R"rawliteral( @@ -326,16 +330,14 @@ void setup() )rawliteral"; wm.setCustomHeadElement(customHeadElement); - bool autoConnectRet = wm.autoConnect((String("HLCP_") + String(cpSerial).substring(String(cpSerial).length() - 6)).c_str(), cpSerial); + bool autoConnectRet = wm.autoConnect(cp_identifier, cpSerial); if (shouldSaveConfig) { strncpy(ocpp_backend, custom_ocpp_backend.getValue(), sizeof(ocpp_backend)); - strncpy(cp_identifier, custom_cp_identifier.getValue(), sizeof(cp_identifier)); strncpy(auth_key, custom_auth_key.getValue(), sizeof(auth_key)); preferences.putString("backend", ocpp_backend); - preferences.putString("identifier", cp_identifier); preferences.putString("auth_key", auth_key); Serial.println("Saved new OCPP config to Preferences"); } @@ -406,18 +408,27 @@ void loop() { Serial.println("BOOT button held for > 7s! Clearing WiFi and OCPP settings, then restarting..."); - // Clear WiFi + // Clear WiFi completely + WiFi.disconnect(true, true); WiFiManager wm; wm.resetSettings(); - // Clear Preferences + // Clear Preferences explicitely Preferences preferences; preferences.begin("ocpp-config", false); + preferences.remove("backend"); + preferences.remove("auth_key"); preferences.clear(); preferences.end(); + Serial.println("NVS ocpp-config cleared."); - // Give time for serial to print - delay(500); + // Clear MicroOcpp FS configs (this removes MO's cached URL) + auto fs = MicroOcpp::makeDefaultFilesystemAdapter(MicroOcpp::FilesystemOpt::Use_Mount_FormatOnFail); + fs->remove(MO_WSCONN_FN); + Serial.println("MicroOcpp config cache cleared."); + + // Give time for serial to print and NVS to sync + delay(1000); ESP.restart(); } else if (held_time >= 3000)