// GameLib.cpp
#include <Arduino.h>
#include "GameLib.h"

RGBStrip::RGBStrip(byte r_pin,byte g_pin,byte b_pin){ // Initialisierung
  red_pin=r_pin;
  green_pin=g_pin;
  blue_pin=b_pin;
  pinMode(red_pin,OUTPUT);
  pinMode(green_pin,OUTPUT);
  pinMode(blue_pin,OUTPUT);
  clearLed();
}

void RGBStrip::setRGB(rgb_t l,unsigned int d){ // Verhalten einstellen
  leds = l&0b111;                              // nicht beteiligte Bits ausmaskieren
  zyklus=0;
  if (l==Off){
    myDelay=0;
  }
  else{
    myDelay=d;
    myTime=millis();
  }
}

void RGBStrip::service(){              // periodisch aufgerufen für Blinken
  if(myDelay > 0){ // soll blinken
    if (millis() - myTime > myDelay) { // schauen, ob die Zeit um ist
      myTime = millis();
      switch (zyklus){
        case 0: 
           clearLed();
           zyklus++;
           break;
        case 1: 
           setLed();
           zyklus =0;
      }
    }
  }
  else if (zyklus == 0){ // kein Blinken nur einmal setzen
    setLed();
    zyklus++;
  }
}

void RGBStrip::clearLed(){
  digitalWrite(red_pin,HIGH);
  digitalWrite(green_pin,HIGH);
  digitalWrite(blue_pin,HIGH);
}

void RGBStrip::setLed(){
  if(leds&0b100) digitalWrite(red_pin,LOW); else digitalWrite(red_pin,HIGH);
  if(leds&0b010) digitalWrite(green_pin,LOW); else digitalWrite(green_pin,HIGH);
  if(leds&0b001) digitalWrite(blue_pin,LOW); else digitalWrite(blue_pin,HIGH);
}

Blinker::Blinker(byte b_pin,byte r){ // Initialisierung
  blink_pin=b_pin;
  ruhe=r;
  pinMode(blink_pin,OUTPUT);
  digitalWrite(blink_pin,ruhe);
}

void Blinker::setBlinker(unsigned int d){ // Blinkzeit in ms
  zyklus=0;
  myDelay=d;
  myTime=millis();
  digitalWrite(blink_pin,ruhe); 
}

void Blinker::service(){ // periodisch aufgerufen
  if(myDelay > 0){ // soll blinken
    if (millis() - myTime > myDelay) { // schauen, ob die Zeit um ist
      myTime = millis();
      switch (zyklus){
        case 0: 
           digitalWrite(blink_pin,ruhe);
           zyklus++;
           break;
        case 1: 
           digitalWrite(blink_pin,!ruhe);
           zyklus =0;
      }
    }
  }
}

Zeit::Zeit(byte pin, unsigned int minZ, unsigned int maxZ){ // Zeit in Sekunden 0.255
  adPin = pin;
  minZeit = minZ;
  maxZeit = maxZ;
}

void Zeit::start(){       // Zeit starten
  start(1);
}
void Zeit::start(unsigned int n){ // n-fache Zeit
  unsigned long z = map(analogRead(adPin),0,1023,minZeit,maxZeit);
  zeitmarke = millis()+z*1000*n; // ab Zeitmarke ist Zeit um
  Serial.print(F(" Zeit gesetzt (Sekunden): "));
  Serial.println(z);
}

byte Zeit::vorbei(){ // 1 wenn Zeit vorbei ist
  return (millis()>zeitmarke);
}

void Zeit::info(){
  unsigned long z = map(analogRead(adPin),0,1023,minZeit,maxZeit);
  Serial.print(F("Min: "));
  Serial.print(minZeit);
  Serial.print(F(" Max: "));
  Serial.print(maxZeit);
  Serial.print(F(" Wert: "));
  Serial.println(z);
}

Taster::Taster(byte pin,byte aktiv){ // lowaktiv=0
  tPin=pin;
  tAktiv=aktiv;
  if(!aktiv) pinMode(pin,INPUT_PULLUP); // Pullup an
  else pinMode(pin,INPUT);
}

byte Taster::aktiv(byte dauer){ // dauer bis aktiv in 10tel Sekunden
  if(digitalRead(tPin)!=tAktiv){ // Taster nicht aktiv
    merker=0;
    return 0;
  }
  else{
    if(!merker){ // pos. Flanke
      merker = 1;
      zeitmarke=millis();
      return 0;
    }
    else{ // Taster noch aktiv Dauer checken
      return millis()-zeitmarke > dauer*100;
    }
  }
}
