/*Programm to control a trafic light
  Autor: Scheibl Lukas
  Date: 22.04.24
*/


//variables with t are for the trafic light
//variables with p are for the pedestrial light

//colors of the trafic lights
int colort = 0;
int colorp = 0;

//pins trafic light
#define PINGT 10
#define PINYT 9
#define PINRT 8

//pins pedestrial light
#define PINGP 12
#define PINRP 11

//pin pedestrian button
#define PININ 13

//colors
#define OFF 0
#define RED 1
#define YELLOW 2
#define GREEN 3
#define GREENBLINK 4
#define YELLOWBLINK 5

//blink variables
#define myTimeout 1000
long myTimerp = 0;
long myTimert = 0;
int ledStategp = LOW;
int ledStategt = LOW;
int ledStateyt = LOW;

bool buttonState = 0;



void setup() {
  //input
  pinMode(PININ, INPUT_PULLUP);

  //output
  pinMode(PINGT, OUTPUT);
  pinMode(PINYT, OUTPUT);
  pinMode(PINRT, OUTPUT);
  pinMode(PINGP, OUTPUT);
  pinMode(PINRP, OUTPUT);

  Serial.begin(9600);
}

void loop() {


  controlButton();

  
  setTraficlight(GREENBLINK);
  ctrlTraficlight();

  setPedestrianlight(GREENBLINK);
  ctrlPedestrianlight();

}

int getButtonstate(){
  return buttonState;
}

void resetButtonstate(){//sets Buttonstate LOW
  buttonState = LOW;
}

void controlButton(){//sets Buttonstate HIGH
  bool button = 0;

  button = readButton();

  if (button == HIGH){
    buttonState = HIGH;
  }

}

int readButton(){//returns Buttonstate
  bool buttonstate;

  buttonstate = !digitalRead(PININ);

  return buttonstate;
}

void setPedestrianlight(int color){
  colorp = color;
}

void setTraficlight(int color){
  colort = color;
}

void ctrlTraficlight(){//controls Traficlight

  if(colort == GREENBLINK){
    //blink
    if (millis() > myTimeout + myTimert ) {
      
      myTimert = millis();
      
      if(ledStategt==LOW) ledStategt = HIGH;
      else ledStategt = LOW;
    }

    if(ledStategt == HIGH) colort = GREEN;
    else colort = OFF;
  }

  if(colort == YELLOWBLINK){
    //blink
    if (millis() > myTimeout + myTimert ) {
      
      myTimert = millis();
      
      if(ledStategt==LOW) ledStategt = HIGH;
      else ledStategt = LOW;
    }

    if(ledStategt == HIGH) colort = YELLOW;
    else colort = OFF;
  }

  setTraficlightcolor();
}

void ctrlPedestrianlight(){//controls Pedestrianlight

  if(colorp == GREENBLINK){
    //blink
    if (millis() > myTimeout + myTimerp ) {
      
      myTimerp = millis();
      
      if(ledStategp==LOW) ledStategp = HIGH;
      else ledStategp = LOW;
    }

    if(ledStategp == HIGH) colorp = GREEN;
    else colorp = OFF;
  }

  setPedestrianlightcolor();
}

void setTraficlightcolor(){ //Output Traficlight

  if(colort == OFF){
    digitalWrite(PINGT, LOW);
    digitalWrite(PINYT, LOW);
    digitalWrite(PINRT, LOW);
  }

  else if(colort == RED){
    digitalWrite(PINGT, LOW);
    digitalWrite(PINYT, LOW);
    digitalWrite(PINRT, HIGH);
  }

  else if(colort == YELLOW){
    digitalWrite(PINGT, LOW);
    digitalWrite(PINYT, HIGH);
    digitalWrite(PINRT, LOW);
  }

  else if(colort == GREEN){
    digitalWrite(PINGT, HIGH);
    digitalWrite(PINYT, LOW);
    digitalWrite(PINRT, LOW);
  }

  else{
    digitalWrite(PINGT, LOW);
    digitalWrite(PINYT, LOW);
    digitalWrite(PINRT, LOW);

    Serial.print(colort);
    Serial.println("EROR Traficlight");
  }
}

void setPedestrianlightcolor(){//Output Pedestrianlight

  if(colorp == OFF){
    digitalWrite(PINGP, LOW);
    digitalWrite(PINRP, LOW);
  }
  
  else if(colorp == RED){
    digitalWrite(PINGP, LOW);
    digitalWrite(PINRP, HIGH);
  }

  else if(colorp == GREEN){
    digitalWrite(PINGP, HIGH);
    digitalWrite(PINRP, LOW);
  }

  else{
    digitalWrite(PINGP, LOW);
    digitalWrite(PINRP, LOW);

    Serial.print(colorp);
    Serial.println("ERROR Pedestrianlight");
  }
}

$abcdeabcde151015202530354045505560fghijfghij