#include "led.hpp"

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

//
// Globale Variablen
//
Led led1;         // On Board LED   (kein Lauflicht)
Led led2(12);     // Led an Pin 12  (kein Lauflicht)
Led led3(2);      // Lauflicht 1. LED Pin 2
Led led4(4);      // Lauflicht 2. LED Pin 4
Led led5(6);      // Lauflicht 3. LED Pin 6
Led led6(8);      // Lauflicht 4. LED Pin 8

// Achtung ! Pointer auf die Objekte. Spart Speicherplatz !
Led *ledArray[] {&led3, &led4, &led5, &led6};            // LEDs für Lauflich in Array zusammenfassen
constexpr byte LED_COUNT {sizeof(ledArray)/sizeof(Led*)};   // Größe des Arrays speichern
byte ledIndex {0};                                       // Indexvariable für Array
byte step {1};                                           // Schrittvariable für Vor- und Rücklauf des Lauflichtes

//
// Main Programm
//
void setup() {
  Serial.begin(115200);
  //Serial.println(sizeof(ledArray));
  
  // 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

  // Lauflicht-LEDs aus Array initialisieren
  // BlinkStatus::WAIT für die Loslaufsynchronisierung
  for (auto leds : ledArray) {
    leds->begin(BlinkStatus::WAIT);
  }
}

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();     // Lauflicht steuern.
}

void runningLight() {
  unsigned int speed = map(analogRead(potiPin), 0, 1023, 1000, 50);
  switch((*ledArray[ledIndex])(speed)) {
    case BlinkStatus::WAIT: 
      ledArray[ledIndex]->setStatus(BlinkStatus::ON);
      break;
    case BlinkStatus::OFF:
      ledIndex += step;
      if (ledIndex > (LED_COUNT-1)) {   // Achtung step = 0-1 wird zu 255 was aber > LED_COUNT - 1 ist
        step = step * (-1);             // Also passt das, Laufrichtung umkehren.
        ledIndex +=step;
      }  
      break;
    default:
      break;
  }
}