New module assignment: Module 0 : WiFi error indicator (showWifiError) - 'W' / blank Module 1-3 : laser time in full minutes, 3-digit right-aligned Module 4 : MQTT error indicator (showMqttError) - 'M' / blank Module 5-7 : countdown seconds / idle / status, 3-digit right-aligned Changes in display_manager.h: - Update zone layout comments - showLaserTime: integer minutes only, writes modules 1-3 (module 0 untouched) - showCountdown: writes modules 5-7 only (module 4 untouched) - showIdle: ' --' on modules 5-7 - showStatus: 3-char string on modules 5-7 - Add showWifiError(bool): module 0 - Add showMqttError(bool): module 4 Changes in display_manager.cpp: - Add BMP_M character bitmap - Add 'M' case in charBitmap() - Rewrite showLaserTime() - round to int, 3 chars, modules 1-3 - Rewrite showCountdown() - 3 chars, modules 5-7 - Rewrite showIdle() - ' --' on modules 5-7 - Rewrite showStatus() - 3 chars, modules 5-7 - Add showWifiError() / showMqttError() implementations - Update printToSerial() log output Changes in test_sketch: - 9 test steps covering all new methods incl. combination test - Tested on hardware: all steps passed
118 lines
4.1 KiB
C++
118 lines
4.1 KiB
C++
#pragma once
|
||
|
||
// =============================================================================
|
||
// display_manager.h – Dot-Matrix-Display Ausgabe (8× GYMAX7219, 4×2 Layout)
|
||
// Projekt: MQTT-Display LaserCutter
|
||
//
|
||
// Implementierung mit rohem MD_MAX72XX (kein MD_Parola), damit die physische
|
||
// 90°-CW Verdrehung der Module per Software (rotateCCW) zuverlässig kompensiert
|
||
// werden kann – ohne dass MD_Parola Zonenlogik interferiert.
|
||
//
|
||
// Modul-Aufteilung (oben links = Index 0):
|
||
// Modul 0 : WiFi-Fehler-Indikator (showWifiError)
|
||
// Modul 1–3 (oben) : Laserzeit in ganzen Minuten, 3 Stellen rechtsbündig
|
||
// Modul 4 : MQTT-Fehler-Indikator (showMqttError)
|
||
// Modul 5–7 (unten) : Countdown-Sekunden, 3 Stellen rechtsbündig / showIdle
|
||
//
|
||
// Verwendung:
|
||
// display.begin(); // einmalig in setup()
|
||
// display.showLaserTime(42.5f); // Modul 1-3
|
||
// display.showCountdown(18); // Modul 5-7
|
||
// display.showIdle(); // Modul 5-7
|
||
// display.showWifiError(true); // Modul 0
|
||
// display.showMqttError(true); // Modul 4
|
||
// display.update(); // in loop() aufrufen (Pflicht)
|
||
// =============================================================================
|
||
|
||
#include <Arduino.h>
|
||
#include <MD_MAX72xx.h>
|
||
#include <SPI.h>
|
||
#include "config.h"
|
||
|
||
// ---------------------------------------------------------------------------
|
||
// Maximale Textlänge je Zone (= Anzahl Module pro Zone)
|
||
// ---------------------------------------------------------------------------
|
||
#define DISP_CHARS_PER_ZONE DISPLAY_MODULES_PER_ZONE // 4
|
||
|
||
class DisplayManager {
|
||
public:
|
||
DisplayManager();
|
||
|
||
// Initialisierung (einmalig in setup())
|
||
void begin();
|
||
|
||
// Helligkeit setzen 0–15
|
||
void setBrightness(uint8_t level);
|
||
|
||
// ---- Anzeige-Methoden ---------------------------------------------------
|
||
|
||
// Modul 1–3 (oben): Laserzeit in ganzen Minuten, 3 Stellen rechtsbündig
|
||
// 0–9 → " x" z.B. " 7"
|
||
// 10–99 → " xx" z.B. " 42"
|
||
// 100–999 → "xxx" z.B. "123"
|
||
// ≥ 1000 → "!!!" (Überlauf, wird laut Anforderung nie erreicht)
|
||
// Modul 0 bleibt unberührt.
|
||
void showLaserTime(float minutes);
|
||
|
||
// Modul 5–7 (unten): Countdown-Sekunden, 3 Stellen rechtsbündig
|
||
// 0–9 → " x"
|
||
// 10–99 → " xx"
|
||
// 100–999 → "xxx"
|
||
// ≥ 1000 → "!!!"
|
||
// Modul 4 bleibt unberührt.
|
||
void showCountdown(int seconds);
|
||
|
||
// Modul 5–7 (unten): Leerlauf-Anzeige (" --")
|
||
// Modul 4 bleibt unberührt.
|
||
void showIdle();
|
||
|
||
// Modul 5–7 (unten): Statustext (max. 3 Zeichen, wird abgeschnitten / aufgefüllt)
|
||
// Modul 4 bleibt unberührt.
|
||
void showStatus(const char* msg);
|
||
|
||
// Modul 0 (oben links): WiFi-Fehler-Indikator
|
||
// error=true → 'W' Symbol
|
||
// error=false → leer
|
||
void showWifiError(bool error);
|
||
|
||
// Modul 4 (unten links): MQTT-Fehler-Indikator
|
||
// error=true → 'M' Symbol
|
||
// error=false → leer
|
||
void showMqttError(bool error);
|
||
|
||
// Beide Zonen löschen
|
||
void clear();
|
||
|
||
// Muss in loop() aufgerufen werden (reserviert für zukünftige Scroll-Animation)
|
||
void update() {}
|
||
|
||
// Alle LEDs ein / aus (Testfunktion)
|
||
void allLedsOn();
|
||
void allLedsOff();
|
||
|
||
// Debug-Ausgabe auf Serial
|
||
void printToSerial() const;
|
||
|
||
private:
|
||
MD_MAX72XX _mx;
|
||
|
||
// Schreibt genau DISP_CHARS_PER_ZONE Zeichen auf eine Zone
|
||
// zone 0 → Module 0..3 (oben)
|
||
// zone 1 → Module 4..7 (unten)
|
||
// str muss exakt DISP_CHARS_PER_ZONE Zeichen enthalten (kein Null-Terminator nötig)
|
||
void writeZone(uint8_t zone, const char* str);
|
||
|
||
// Schreibt ein Zeichen auf ein einzelnes Modul
|
||
void writeChar(uint8_t moduleIdx, char c);
|
||
|
||
// 90° CCW Rotation – kompensiert physische 90° CW Verdrehung der Module
|
||
static void rotateCCW(const uint8_t src[8], uint8_t dst[8]);
|
||
|
||
// Gibt Zeiger auf 8-Byte-Bitmap für ASCII-Zeichen zurück
|
||
// Unterstützt: '0'–'9', ' ', '-', '.', '!', 'E', 'r', 'o', 'n', 'A', 'P'
|
||
static const uint8_t* charBitmap(char c);
|
||
};
|
||
|
||
// Globale Instanz
|
||
extern DisplayManager display;
|