/** * TEST SKETCH 2.2 – NVS Persistenz-Verifizierung * * Testet ob alle Einstellungen über einen Neustart des ESP32 hinaus erhalten * bleiben. Ablauf: * * Erster Start (oder nach Reset-Taste): * 1. Bisherige NVS-Werte laden und ausgeben (Ausgangszustand) * 2. Bekannte Testwerte schreiben * 3. Direkten Round-Trip prüfen (schreiben → lesen → vergleichen) * 4. Aufforderung: "ESP32 neu starten (Reset-Taste)" * * Nach Neustart: * 5. Werte erneut laden und mit den gespeicherten Testwerten vergleichen * 6. PASS / FAIL für jeden Wert ausgeben * * Flash: pio run -e test-nvs --target upload * Monitor: pio device monitor -e test-nvs */ #include #include "settings.h" // --- Bekannte Testwerte --------------------------------------------------- static const char* TEST_BROKER = "10.0.0.42"; static const uint16_t TEST_PORT = 8883; static const char* TEST_USER = "testuser"; static const char* TEST_PASSWORD = "geheim123"; static const uint8_t TEST_GRATIS = 77; static const uint8_t TEST_POLARITY = SIGNAL_POL_HIGH_ACTIVE; static const float TEST_MINUTES = 123.45f; // Toleranz für Float-Vergleich static const float FLOAT_EPS = 0.01f; // ------------------------------------------------------------------------- static bool checkPass(const char* name, bool ok) { if (ok) Serial.printf(" [PASS] %s\n", name); else Serial.printf(" [FAIL] %s\n", name); return ok; } static void runPersistenceCheck() { const Settings& s = settings.get(); bool allPass = true; Serial.println("\n========================================"); Serial.println(" PERSISTENZ-CHECK (nach Neustart)"); Serial.println("========================================"); allPass &= checkPass("MQTT Broker", strcmp(s.mqttBroker, TEST_BROKER) == 0); allPass &= checkPass("MQTT Port", s.mqttPort == TEST_PORT); allPass &= checkPass("MQTT User", strcmp(s.mqttUser, TEST_USER) == 0); allPass &= checkPass("MQTT Password", strcmp(s.mqttPassword, TEST_PASSWORD) == 0); allPass &= checkPass("Gratiszeit", s.gratisSeconds == TEST_GRATIS); allPass &= checkPass("Signalpolaritaet", s.signalPolarity == TEST_POLARITY); allPass &= checkPass("Laserzeit (float)", fabsf(s.totalMinutes - TEST_MINUTES) < FLOAT_EPS); Serial.println("----------------------------------------"); if (allPass) Serial.println(" ERGEBNIS: ALLE TESTS BESTANDEN ✓"); else Serial.println(" ERGEBNIS: FEHLER – Werte oben pruefen!"); Serial.println("========================================\n"); } // ------------------------------------------------------------------------- static void writeTestValues() { Serial.println("\n[2] Schreibe Testwerte in NVS ..."); settings.saveMqttConfig(TEST_BROKER, TEST_PORT, TEST_USER, TEST_PASSWORD); settings.saveGratisSeconds(TEST_GRATIS); settings.saveSignalPolarity(TEST_POLARITY); settings.saveTotalMinutes(TEST_MINUTES); Serial.println(" Broker : " + String(TEST_BROKER)); Serial.printf (" Port : %d\n", TEST_PORT); Serial.println(" User : " + String(TEST_USER)); Serial.printf (" Gratis : %d s\n", TEST_GRATIS); Serial.println(" Polarit. : HIGH_ACTIVE"); Serial.printf (" Laserzeit: %.2f min\n", TEST_MINUTES); } static void roundTripCheck() { // Werte aus NVS neu laden (Preferences-Cache umgehen) settings.load(); const Settings& s = settings.get(); Serial.println("\n[3] Round-Trip-Test (schreiben → sofort lesen):"); bool ok = true; ok &= checkPass("Broker round-trip", strcmp(s.mqttBroker, TEST_BROKER) == 0); ok &= checkPass("Port round-trip", s.mqttPort == TEST_PORT); ok &= checkPass("Gratis round-trip", s.gratisSeconds == TEST_GRATIS); ok &= checkPass("Polarity round-trip", s.signalPolarity == TEST_POLARITY); ok &= checkPass("Minutes round-trip", fabsf(s.totalMinutes - TEST_MINUTES) < FLOAT_EPS); if (ok) Serial.println(" → Round-Trip OK"); } // ------------------------------------------------------------------------- // Hilfreich: erkennt ob die gespeicherten Werte bereits die Testwerte sind. // Wenn ja → war das schon ein vorheriger Testdurchlauf → Persistenz prüfen. static bool testValuesAlreadyStored() { const Settings& s = settings.get(); return strcmp(s.mqttBroker, TEST_BROKER) == 0 && s.mqttPort == TEST_PORT && s.gratisSeconds == TEST_GRATIS; } // ========================================================================= void setup() { Serial.begin(115200); delay(800); Serial.println("\n========================================"); Serial.println(" TEST 2.2 – NVS Persistenz"); Serial.println("========================================"); settings.begin(); // NVS öffnen + laden Serial.println("\n[1] Aktuell geladene Werte (vor diesem Test):"); settings.printToSerial(); if (testValuesAlreadyStored()) { // Zweiter Durchlauf nach Neustart → Persistenz prüfen runPersistenceCheck(); Serial.println("[INFO] NVS wird jetzt zurueckgesetzt (Defaults)."); settings.reset(); Serial.println("[INFO] Test abgeschlossen. Zum Wiederholen: Reset-Taste."); } else { // Erster Durchlauf → Testwerte schreiben writeTestValues(); roundTripCheck(); Serial.println("\n[4] Jetzt ESP32 neu starten (RESET-Taste oder Strom aus/ein)."); Serial.println(" Nach dem Neustart erscheint der Persistenz-Check."); } } void loop() { // nichts – alles passiert in setup() }