#include <Streaming.h>
#include "LedArray.hpp"

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

//
// Globale Variablen
//
Print &cout = Serial; // c++ style cout

Led leds[2] { Led{}, Led{} };
Led rLeds[] { Led{2}, Led{3}, Led{4}, Led{5}, Led{6} };
Led lLeds[] { Led{7}, Led{8}, Led{9}, Led{10}, Led{11} }; 
LedArray redLEDGroup {rLeds,500};
LedArray greenLEDGroup  {lLeds,500};  

//
// Main Programm
//
void setup() {
  Serial.begin(115200);
  uint8_t arrayGroesse = sizeof(rLeds);
  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
  leds[0].begin();
  // Default Blinkstatus für den Start ist LightStatus::OFF und muss nicht angegeben werden.
  leds[1].begin(A1);       // LED2 leuchtet erst nach 2,5 Sekunden zum Ersten mal
  redLEDGroup.begin();    // LEDs für Lauflicht initialisieren.
  greenLEDGroup.begin();    // LEDs für Lauflicht initialisieren.
  redLEDGroup.reverseSweep(true);

  redLEDGroup.setBits(15);
  greenLEDGroup.setIterations(5);
  redLEDGroup.setIterations(5);

  delay(5000);
}

void loop() {
  static uint32_t timeStamp; 

  leds[0](2000);         // Onboard LED alle zwei Sekunden blinken lassen
  leds[1](2500);         // LED 2 an Pin 12 alle 2,5 Sekunden blinken lassen
  redLEDGroup.doSweep(); // Lauflicht steuern.
  greenLEDGroup.doSweep(); // Lauflicht steuern.

  if (redLEDGroup.iterationsDone() && greenLEDGroup.iterationsDone() ) {
    if (millis() - timeStamp >= 5000) {
      greenLEDGroup.setIterations(5);
      redLEDGroup.setIterations(5);
    }
  } else {
    timeStamp = millis();
  }  
}