MQTT-Display-LaserCutter/test_sketches/test_nvs.cpp
MaPaLo76 68c3ce54b3 feat(settings): implement NVS persistence via Preferences
- 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
2026-02-22 13:35:44 +01:00

146 lines
5.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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()
}