Commit Graph

18 Commits

Author SHA1 Message Date
MaPaLo76
c4d03bf1b7 fix(stability): Heap-Leak durch String/JsonDocument-Objekte behoben
- web_server.cpp: static String _logBuf -> char[6001] im BSS-Segment
  Jeder LOG_I/E/D-Aufruf loeste String-Reallokation aus (~280 Bytes/min Drift)
  Fix: memmove-basierter Ring-Puffer, kein malloc/free mehr
- mqtt_client.cpp: JsonDocument in publishHeartbeat() und _doPublishSession()
  durch snprintf-JSON ersetzt (kein ArduinoJson-Heap-Pool alle 60 s)
- config.h: LOG-Puffer von 200 auf 320 Bytes erhoeht (Truncation fix)
- platformio.ini: CORE_DEBUG_LEVEL wieder auf 1 (war 3 fuer Heap-Diagnose)
2026-03-01 12:11:00 +01:00
MaPaLo76
c40668f216 feat(FR-007): session_id in MQTT Session-Payload; Reset bei reset/reset_session; Version 1.2.0 2026-03-01 00:04:17 +01:00
MaPaLo76
abde7fb154 fix: showIdle() zeigt AUS statt -- bei Laser aus; BMP_S Shape korrigiert; Version 1.1.3 2026-02-28 23:09:41 +01:00
MaPaLo76
4a7801e2a8 fix(display): showSessionRing 1-basiert (1..60), kein Flash bei Session-Start 2026-02-28 22:38:59 +01:00
MaPaLo76
a7c6edb458 fix(mqtt): MQTT-Task auf Core 0 auslagern - TLS-Blocking behebt WDT-Crash und Display-Freeze
- WiFiClientSecure/mbedtls ausschliesslich auf Core 0 initialisiert und verwendet
  (Cross-Core-Heap-Korruption durch mbedtls vermieden)
- xTaskCreatePinnedToCore('mqtt_task', Core 0, 16 KB Stack)
- begin() startet nur Task, kein Netzwerk-Zugriff auf Core 1
- mqttClient.loop() in main.cpp ist No-Op
- publishSession() von Core 1 via volatile-Flags an Core-0-Task uebergeben
- Version: 1.1.0 -> 1.1.1
2026-02-28 18:07:27 +01:00
MaPaLo76
4dd4ce0620 feat(FR-002): Web Console via HTTP-Polling (/log + /log-data) -- v1.1.0
- Ring-Buffer _logBuf in web_server.cpp: webLogForward() schreibt auf Core 1
- GET /log-data liefert Puffer als Plain-Text (kein WebSocket, kein Core-Konflikt)
- Browser pollt alle 2 s, Auto-Scroll, dunkles Terminal-Theme
- LOG_I/LOG_E/LOG_D: Timestamp (HH:MM:SS nach NTP, sonst +Xs), webLogForward()
- Alle Serial.* in laser_tracker.cpp, mqtt_client.cpp, web_server.cpp auf LOG_I/LOG_E
- main.cpp: esp_reset_reason() beim Booten loggen (POWER_ON / WATCHDOG / PANIC...)
- telnet_logger.h entfernt (war nur noch Deprecated-Stub)
- Feature-Requests.md: FR-002 abgeschlossen
2026-02-28 17:24:56 +01:00
MaPaLo76
a97fa0c111 fix(mqtt): session_sum Binaerzahl-Bug behoben
- String(int, 2) interpretiert 2. Argument als Basis (binaer), nicht Dezimalstellen
  Beispiel: 18 Min -> '10010' (binaer)
- Fix: direkter int-Wert als JSON-Integer (kein serialized/String noetig)
- platformio.ini: Version 1.0.1 -> 1.0.2
- Feature-Requests.md: FR-004 dokumentiert und abgeschlossen
2026-02-27 21:18:02 +01:00
MaPaLo76
3a310828b6 fix(ntp): Zeitzone CET/CEST + Lokalzeit im MQTT-Payload
- wifi_connector.cpp: configTime(0,0) -> configTzTime(CET-1CEST,M3.5.0,M10.5.0/3)
  Automatische Sommer-/Winterzeitumschaltung fuer Deutschland
- mqtt_client.cpp: gmtime() -> localtime(), Z-Suffix entfernt
  session_start_time zeigt Lokalzeit (CET/CEST)
- platformio.ini: Version 1.0.0 -> 1.0.1 (Patch)
- README.md: session_start_time Dokumentation aktualisiert
- Feature-Requests.md: FR-003 abgeschlossen
2026-02-26 22:45:53 +01:00
MaPaLo76
75f5b7a576 feat(web,mqtt): Firmware-Version auf Webseite und MQTT-Status
- platformio.ini: -DFIRMWARE_VERSION='1.0.0' als build_flag (Single Source of Truth)
- config.h: #ifndef FIRMWARE_VERSION Fallback fuer Arduino IDE
- web_server.cpp: config.h eingebunden; Firmware-Zeile in Statustabelle (/);
  Footer 'v1.0.0 (Feb 26 2026)' auf /config
- mqtt_client.cpp: firmware_version im lasercutter/status Payload;
  buf von 160 auf 220 Bytes vergroessert
- Feature-Requests.md: FR-001 dokumentiert
2026-02-26 21:53:05 +01:00
MaPaLo76
6bef93210e feat(ota): ArduinoOTA integration + platformio.ini refactor
- ArduinoOTA in web_server.cpp integriert (Hostname: lasercutter-display)
- WebServerManager::loop() hinzugefuegt -> ArduinoOTA.handle()
- webServer.loop() in main.cpp aufgerufen
- platformio.ini: gemeinsamer [env]-Basisblock (lib_deps einmalig)
- Neues env az-delivery-devkit-v4-ota (espota, upload_flags --auth Anleitung)
- Neues env az-delivery-devkit-v4-ota-http (ElegantOTA HTTP Fallback)
- upload_ota.py: HTTP-Multipart-Upload Script fuer ElegantOTA
- README.md: Abschnitt Via WiFi (OTA) mit Passwort-Anleitung
- Implementation-Plan.md: Task 9.9 dokumentiert
2026-02-26 21:35:55 +01:00
MaPaLo76
16838fa265 feat(web): Phase 7 WebServer (ESPAsyncWebServer, Config, Reset, ElegantOTA) 2026-02-22 20:43:08 +01:00
MaPaLo76
71ef2c7ad0 feat(mqtt): Phase 6 - MqttClient implementiert (PubSubClient, publishSession, Heartbeat, Reset-Subscribe) 2026-02-22 19:36:29 +01:00
MaPaLo76
3827342c0c feat(laser): implement LaserTracker with debounce, gratis time and NVS save
- Add include/laser_tracker.h: LaserTracker class declaration
  - Software debounce (LASER_DEBOUNCE_MS = 50ms from config.h)
  - Polarity-aware GPIO read (LOW_ACTIVE / HIGH_ACTIVE from settings)
  - Session lifecycle: onSessionStart / onSessionEnd
  - Gratis time countdown, net seconds accumulation
  - Getters: isActive, getTotalMinutes, getSessionSeconds,
    getCountdownRemaining, getLastSessionSeconds, resetTotal

- Add src/laser_tracker.cpp: full implementation
  - readRaw() applies signal polarity
  - loop() handles debounce state machine and edge detection
  - onSessionEnd() saves updated totalMinutes to NVS
  - getTotalMinutes() returns live value (base + current net session)

- Add test_sketches/test_laser_tracker.cpp: interactive test sketch
  - Button on GPIO 4 simulates laser signal
  - BOOT button (GPIO 0, 3s hold) resets total
  - Display: modules 1-3 = total minutes, modules 5-7 = countdown/net

- Add test-laser-tracker env to platformio.ini
- Update src/main.cpp: integrate laserTracker.begin/loop + live display
- Update Implementation-Plan.md: mark Phase 5 tasks 5.1-5.6 complete
2026-02-22 14:30:14 +01:00
MaPaLo76
4349b37f05 feat(display): implement DisplayManager with raw MD_MAX72XX
- Add include/display_manager.h: DisplayManager class declaration
  - Two-zone layout: Zone 0 (top, laser time), Zone 1 (bottom, countdown/status)
  - showLaserTime(), showCountdown(), showIdle(), showStatus(), setBrightness()
  - rotateCCW() bitmap transformation for 90 deg physical module rotation
  - charBitmap() for 17-character set (0-9, space, dash, dot, special chars)

- Add src/display_manager.cpp: full implementation
  - Double-init pattern for SPI power stability
  - showLaserTime() format: <10 -> ' x.x', <100 -> 'xx.x', <1000 -> ' xxx', else 'xxxx'
  - showCountdown() right-aligned 4-char format
  - All methods use writeZone() -> writeChar() -> rotateCCW() -> MD_MAX72XX

- Add test_sketches/test_display_manager.cpp: 6-step verification test
  - allLedsOn/Off, showLaserTime (12 boundary values), showCountdown 5->0
  - showIdle, showStatus (Err/AP/WiFi/oF), live simulation loop

- Update platformio.ini: add test-display-mgr environment
- Update src/main.cpp: integrate display.begin/showIdle/update
- Update Implementation-Plan.md: mark Phase 4 tasks 4.1-4.3 complete

Tested on hardware: all 6 test steps passed
2026-02-22 14:00:54 +01:00
MaPaLo76
c63cace1ae feat(wifi): implement WiFiManager connection handling
- include/wifi_connector.h: WifiConnector class with WifiStatus enum,
  onStatusChange callback, begin/loop/reset methods
- src/wifi_connector.cpp: autoConnect with AP timeout and restart,
  reconnect logic on connection loss, printToSerial diagnostics
- src/main.cpp: call wifiConnector.begin() and loop()
- test_sketches/test_wifi.cpp: first-connect via captive portal,
  auto-reconnect after reboot, BOOT-button (3s) resets credentials
- platformio.ini: add test-wifi environment
- Implementation-Plan.md: mark tasks 3.1-3.3 complete
2026-02-22 13:50:07 +01:00
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
MaPaLo76
6ac33f459d feat(phase1): complete hardware setup, display and button test sketches
- platformio.ini: add all 8 libraries via Git URLs, add test-display and
  test-button environments, reduce SPI clock to 1 MHz for stability
- include/config.h: add pin definitions, DISPLAY_HW_TYPE=GENERIC_HW,
  MQTT topics, NVS keys and logging macros
- src/main.cpp: add minimal startup skeleton with config.h include
- test_sketches/test_display.cpp: diagnostic sketch showing 0-based module
  index; GENERIC_HW verified with 90 deg CCW software rotation
- test_sketches/test_button.cpp: GPIO INPUT_PULLUP test; LOW_ACTIVE confirmed
- test_sketches/README.md: add wiring tables, flash commands, results table
- README.md: update HW type to GENERIC_HW, add power supply note (0.5A /
  2.5W measured, external 5V PSU required), add Conventional Commits section
- Implementation-Plan.md: mark tasks 1.1-1.5 as complete

BREAKING CHANGE: none
2026-02-22 13:20:52 +01:00
MaPaLo76
5a3a4e40bd Initial Version of README.md 2026-02-22 10:34:37 +01:00