//s153122
//s148989

#include <LCD_C0220BiZ.h>
#include <LCD_kruispunt_overweg.h>
#include <ST7036.h>
#include "Servo.h"


//Pins zijn niet juist omdat we niet weten hoe deze geschakeld moesten worden
const int knop1 = 2;
const int knop2 = 0;
const int knop3 = 4;
const int knop4 = 5;
const int oranjeLED = 13;
const int rodeLED1 = 12;
const int rodeLED2 = 14;
const int slagboomLinksPIN = 27;
const int slagboomRechtsPIN = 26;
const int LCD_Resetpin = 11;
uint8_t LCD_Backlight = 20;

uint8_t LCD_rij = 2;
uint8_t LCD_kolom = 20;

ST7036 lcd = ST7036 (LCD_rij, LCD_kolom, 0X78, LCD_Backlight);

Servo slagboomLinks;
Servo slagboomRechts;

unsigned long previousMillis = 0;
bool slagboomOmlaag = false;
static bool oranjeLEDState = HIGH;
bool treinLinks = false;
bool treinRechts = false;
static int slagboomHoek = 90;
unsigned long omlaagMillis = 0;
unsigned long omhoogMillis = 0;
unsigned long roodMillis = 0;
static bool roodLEDState = LOW;
unsigned long oranjeMillis = 0;
bool oranje = true;
unsigned long LCDMillis = 0;
unsigned long delayMillis = 999999999999;


void setup() {
  // put your setup code here, to run once:
  pinMode(knop1, INPUT);
  pinMode(knop2, INPUT);
  pinMode(knop3, INPUT);
  pinMode(knop4, INPUT);
  pinMode(oranjeLED, OUTPUT);
  pinMode(rodeLED1, OUTPUT);
  pinMode(rodeLED2, OUTPUT);
  pinMode (LCD_Resetpin, OUTPUT);
  digitalWrite (LCD_Resetpin, HIGH);

  pinMode (LCD_Backlight, OUTPUT);
  digitalWrite (LCD_Backlight, HIGH);

  lcd.init();
  lcd.clear();

  slagboomLinks.attach(slagboomLinksPIN);
  slagboomRechts.attach(slagboomRechtsPIN);

  slagboomLinks.write(90);
  slagboomRechts.write(90);
  digitalWrite(oranjeLED, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  unsigned long currentMillis = millis();

  //Print groep op LCD
  lcd.setCursor (0,0);
  lcd.print ("1IT9a-groep 8");


  //Oranje knipperlicht als slagbomen omhoog zijn
  if (!slagboomOmlaag && !treinLinks && !treinRechts && oranje) {
    if (currentMillis - oranjeMillis >= 500) {
      digitalWrite(oranjeLED, oranjeLEDState);
      oranjeLEDState = !oranjeLEDState;
      oranjeMillis = currentMillis;
    }
  }


  //Knoppen
  if (digitalRead(knop1) == HIGH) {
    treinLinks = true;
    oranje = false;
  }

  if (digitalRead(knop3) == HIGH) {
    treinRechts = true;
    oranje = false;
  }

  if (digitalRead(knop2) == HIGH) {
    treinLinks = false;
  }

  if (digitalRead(knop4) == HIGH) {
    treinRechts = false;
  }


  //Slagbomen omlaag als er minstens 1 trein aan komt
  if (treinLinks || treinRechts) {
    digitalWrite(oranjeLED, LOW);
    if (!slagboomOmlaag && currentMillis - previousMillis >= 8000) {
      if (currentMillis - omlaagMillis >= 100) {
        slagboomLinks.write(slagboomHoek);
        slagboomRechts.write(slagboomHoek);
        slagboomHoek -= 5;
        omlaagMillis = 0;
      } 
      if (slagboomHoek == 0) {
        slagboomOmlaag = true;
      }
      
    }
    if (currentMillis - roodMillis >= 250) {
      roodLEDState = !roodLEDState;
      digitalWrite(rodeLED1, roodLEDState);
      digitalWrite(rodeLED2, !roodLEDState);
      roodMillis = currentMillis;
    }
  }


  //Slagbomen terug omhoog als treinen weg zijn
  if (!treinLinks && !treinRechts) {
    if (slagboomOmlaag) {
      if (currentMillis - omhoogMillis >= 100) {
        slagboomLinks.write(slagboomHoek);
        slagboomRechts.write(slagboomHoek);
        slagboomHoek += 5;
        omhoogMillis = 0;
      } 
      if (slagboomHoek == 90) {
        slagboomOmlaag = false;
        previousMillis = currentMillis;
      }
    }
    if (currentMillis - roodMillis >= 250 && slagboomOmlaag) {
      roodLEDState = !roodLEDState;
      digitalWrite(rodeLED1, roodLEDState);
      digitalWrite(rodeLED2, !roodLEDState);
      roodMillis = currentMillis;
      delayMillis = currentMillis;
    }
    if (currentMillis - delayMillis <= 2000 && currentMillis - roodMillis >= 250 && !slagboomOmlaag) {
      roodLEDState = !roodLEDState;
      digitalWrite(rodeLED1, roodLEDState);
      digitalWrite(rodeLED2, !roodLEDState);
      roodMillis = currentMillis;
    } else if (currentMillis - delayMillis >= 2000) {
      oranje = true;
    }
  }


  //Print namen op LCD
  if (currentMillis - LCDMillis <= 2000) {
    lcd.setCursor (1,0);
    lcd.print ("Mauro De Mey");
  } else if (currentMillis - LCDMillis <= 4000) {
    lcd.setCursor (1,0);
    lcd.print ("Kobe Verelst");
  } else {
    LCDMillis = currentMillis;
  }
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r
led1:A
led1:C
led2:A
led2:C
led4:A
led4:C
led5:A
led5:C
led3:A
led3:C
led7:A
led7:C
servo1:GND
servo1:V+
servo1:PWM
servo2:GND
servo2:V+
servo2:PWM
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2