Implements FR-020: Grace Time (buffer period after free time) Problem: Fan relay signal continues ~5s after laser stops, causing false billable time charges when user stops at countdown 1 second. Solution: New GRACE state between GRATIS and NET_COUNTING with configurable grace period (default 5s, range 0-30s). During grace time, display shows blinking 0 (number of blinks = remaining seconds). If laser stops during GRACE, no billable session is created. State machine: INACTIVE -> GRATIS -> GRACE -> NET_COUNTING Changes: - config.h: Add DEFAULT_GRACE_TIME_S (5), MIN/MAX constants - settings.h/cpp: Add graceTimeSeconds field, NVS persistence - laser_tracker.h/cpp: Add GRACE state, transition logic - display_manager.h/cpp: Add showGraceBlinking() with blink animation - main.cpp: Add GRACE state handling in display update loop - mqtt_client.cpp: Add grace_time_s field to session JSON - web_server.cpp: Add Grace Time input field in config page - README.md: Update documentation with GRACE state details - Feature-Requests.md: Mark FR-020 as completed (v1.6.4) Version: 1.6.4 Tested: Manual testing with logs and MQTT Explorer
80 lines
3.2 KiB
C++
80 lines
3.2 KiB
C++
#pragma once
|
||
|
||
// =============================================================================
|
||
// settings.h – NVS-Persistenz aller Konfigurationswerte
|
||
// Projekt: MQTT-Display LaserCutter
|
||
//
|
||
// Verwendung:
|
||
// settings.begin(); // einmalig in setup()
|
||
// settings.get().mqttBroker; // Wert lesen
|
||
// settings.saveTotalMinutes(x);// Einzelwert atomar schreiben
|
||
// settings.save(); // alle Werte auf einmal schreiben
|
||
// =============================================================================
|
||
|
||
#include <Arduino.h>
|
||
#include <Preferences.h>
|
||
#include "config.h"
|
||
|
||
// -----------------------------------------------------------------------------
|
||
// Settings-Struktur – alle persistierten Werte
|
||
// -----------------------------------------------------------------------------
|
||
struct Settings {
|
||
char mqttBroker[64]; // MQTT Broker IP oder Hostname
|
||
uint16_t mqttPort; // MQTT Port (Standard: 1883)
|
||
char mqttUser[32]; // MQTT Benutzername (leer = kein Auth)
|
||
char mqttPassword[32]; // MQTT Passwort
|
||
uint8_t gratisSeconds; // Gratiszeit in Sekunden (0–120)
|
||
uint8_t graceTimeSeconds; // Grace Time in Sekunden (0–30)
|
||
uint8_t signalPolarity; // SIGNAL_POL_LOW_ACTIVE oder _HIGH_ACTIVE
|
||
float totalMinutes; // akkumulierte Laserzeit in Minuten
|
||
char webUser[64]; // Webinterface Benutzername (Standard: "admin")
|
||
char webPassword[64]; // Webinterface Passwort (leer = kein Schutz)
|
||
};
|
||
|
||
// -----------------------------------------------------------------------------
|
||
// SettingsManager – lädt/speichert Konfiguration via ESP32 Preferences (NVS)
|
||
// -----------------------------------------------------------------------------
|
||
class SettingsManager {
|
||
public:
|
||
SettingsManager();
|
||
|
||
// Öffnet NVS-Namespace und lädt alle Werte (einmalig in setup() aufrufen)
|
||
void begin();
|
||
|
||
// Alle Werte aus NVS lesen (mit Defaults für fehlende Einträge + Validierung)
|
||
void load();
|
||
|
||
// Alle Werte in NVS schreiben
|
||
void save();
|
||
|
||
// NVS-Namespace löschen und Defaults wiederherstellen
|
||
void reset();
|
||
|
||
// ---- Einzelne atomare Speicheroperationen --------------------------------
|
||
// Für Werte die sich häufig ändern (z. B. totalMinutes nach jeder Session)
|
||
void saveTotalMinutes(float minutes);
|
||
void saveGratisSeconds(uint8_t seconds);
|
||
void saveGraceTimeSeconds(uint8_t seconds);
|
||
void saveSignalPolarity(uint8_t polarity);
|
||
void saveMqttConfig(const char* broker, uint16_t port,
|
||
const char* user, const char* password);
|
||
void saveWebCredentials(const char* user, const char* password);
|
||
|
||
// ---- Zugriff auf Werte --------------------------------------------------
|
||
const Settings& get() const { return _s; }
|
||
Settings& getRef() { return _s; } // für direktes Bearbeiten + save()
|
||
|
||
// Debug-Ausgabe aller Werte auf Serial
|
||
void printToSerial() const;
|
||
|
||
private:
|
||
Settings _s;
|
||
Preferences _prefs;
|
||
|
||
void applyDefaults();
|
||
void validateAndClamp(); // Ungültige Werte auf Defaults korrigieren
|
||
};
|
||
|
||
// Globale Instanz – in settings.cpp definiert, überall verwendbar
|
||
extern SettingsManager settings;
|