- include/settings.h: Settings struct + SettingsManager class with begin/load/save/reset and atomic save methods per value - src/settings.cpp: input validation, clamping, default fallbacks; password masked in printToSerial() - src/main.cpp: call settings.begin() and printToSerial() on startup - test_sketches/test_nvs.cpp: two-phase NVS persistence test; write known values, reboot, verify all 7 values survive (PASS) - platformio.ini: add test-nvs environment with settings.cpp in filter - Implementation-Plan.md: mark tasks 1.4 and 2.1/2.2 complete
146 lines
5.6 KiB
C++
146 lines
5.6 KiB
C++
/**
|
||
* 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 <Arduino.h>
|
||
#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()
|
||
}
|