#include <Streaming.h>
#include "Button.hpp"
#include "led.hpp"
#include "lauflicht.hpp"

//
// Konstanten
//
constexpr byte potiPin   {A0}; 
constexpr byte buttonPin {3};

//
// Globale Variablen
//
Print &cout = Serial;  // c++ cout style
ButtonSL switchButton {buttonPin};

Led led1;             // On Board LED   (kein Lauflicht)
Led led2 {12};        // Led an Pin 12 (kein Lauflicht)
//Objekttyp      {Pinnummer}
Led ledArray[] { {2}, {4}, {6}, {8} };        // 4 LED Objekte für Lauflicht in Array zusammenfassen
Lauflicht runningLight{ledArray, switchButton, potiPin};  // Lauflicht Objekt anlegen, Konstruktor-Template (lauflicht.hpp) ermittelt die Anzahl der Arrayelemente zur Compilezeit

//
// Main Programm
//
void setup() {
  Serial.begin(115200);
  uint8_t arrayGroesse = sizeof(ledArray);
  uint8_t arrayElemente = arrayGroesse / sizeof(Led);
  cout << F("Led-Array gesamt: ") << arrayGroesse 
       << F(" Byte\nLed-Objekte: ") << arrayElemente 
       << F("\nLed-Objektgroesse (Daten): ") << (arrayGroesse / arrayElemente) << " Byte" 
       << endl;
       
  // Einzelne LEDs für Blinken initialisieren
  led1.begin(BlinkStatus::on);       // LED1 leuchtet sofort nach dem Programmstart
  
  // Default Blinkstatus für den Start ist BlinkStatus::OFF und muss nicht angegeben werden.
  led2.begin();                      // LED2 leuchtet erst nach 2,5 Sekunden zum Ersten mal
  runningLight.begin();              // LEDs für Lauflicht initialisieren.
}

void loop() {
  led1(2000);         // Onboard LED alle zwei Sekunden blinken lassen
  led2(2500);         // LED 2 an Pin 12 alle 2,5 Sekunden blinken lassen
  runningLight.run(); // Lauflicht steuern.
}