// SignalLed.h

#ifndef _SIGNALLED_h
#define _SIGNALLED_h

#include "Arduino.h"
#include <Adafruit_NeoPixel.h>


// Packed format is always RGB, regardless of LED strand color order.
#define SIGNALLEDCOLOR( r,  g,  b) (((uint32_t)r << 16) | ((uint32_t)g << 8) | b)

enum class SignalLedColors : uint32_t {
  // Zustände
  connectingOff = SIGNALLEDCOLOR(255, 255, 255), // weiß, kein WiFi, Relais aus
  connectingOn =  SIGNALLEDCOLOR(255, 255,   0), // gelb, kein WiFi, Relais an
  apOff =         SIGNALLEDCOLOR(255,   0, 255), // magenta: Accesspoint, Relais aus
  apOn =          SIGNALLEDCOLOR(  0,   0, 255), // blau, Accesspoint, Relais ein
  wifiOff =       SIGNALLEDCOLOR(255,   0,   0), // rot, mit WLAN verbunden, Relais aus
  wifiOn =        SIGNALLEDCOLOR(  0, 255,   0), // grün, mit WLAN verbunden, Relais ein
  error =         SIGNALLEDCOLOR(255, 128, 255), // voilett, Fehler, volle Helligkeit
  OtaStart =      SIGNALLEDCOLOR(  0, 255, 255), // cyan
  OtaEnd   =      SIGNALLEDCOLOR(255, 255, 255), // weiß
  OtaError =      SIGNALLEDCOLOR(255, 128, 255), // voilett

  // Reguläre Farben
  off   = SIGNALLEDCOLOR(  0,   0,   0),
  green = SIGNALLEDCOLOR(  0, 255,   0),
  blue  = SIGNALLEDCOLOR(  0,   0, 255),
  red   = SIGNALLEDCOLOR(255,   0,   0),
  black = SIGNALLEDCOLOR(  0,   0,   0)
};

// Klasse zur Ansteuerung der Singal-LEDS
class SignalLedClass {
protected:
  // Constructor: number of LEDs, pin number, LED type
  Adafruit_NeoPixel _Neo;    // Instanz des Adafruit_NeoPixel
  uint32_t _FlashInterval = 5000;  // Millisekunden zwischen zwei Blitzen
  uint32_t _FlashDuration = 100;   // Millisekunden Blitzdauer
  uint8_t  _FlashBrightness = 128; // Helligkeit des Flash
  uint32_t _LastAction;            // Zeitpunkt des Beginns des Blitzen bzw. der Zeit zwischen den Blitzen
  uint8_t  _Brightness = 64;       // Helligkeit 0..255
  SignalLedColors _Color;    // aktuelle Farbe
  bool _IsFlashing = false;  // true, wenn gerade volle Helligkeit (Blitz)
public:
  SignalLedClass(uint8_t p) : _Neo(1, p) {} // 1 WS2812 an Pin 'p'

  void begin(uint8_t br = 64, uint8_t flashBr = 128, uint32_t duration = 100, uint32_t interval = 5000);
  void setColor(SignalLedColors c);
  void config(uint8_t br, uint8_t flash, uint32_t duration, uint32_t interval);
  void handle(); // Erledigt das Blitzen
  void signalError ();
  void setBrightness(uint8_t br); 
};

extern SignalLedClass SignalLed;

#endif

