#define LED_PIN 11 // Pb2
#define LED_COUNT 2
const int latchPin = 5; // Pa5
const int clockPin = 6; // Pa6
const int dataPin = 4; // Pa4
const int LATCH_PIN = A1;  // 74HC595 pin 12 ST_CP PA1
const int DATA_PIN = A0;  // 74HC595pin 14 DS Pa0
const int CLOCK_PIN = A2;  // 74HC595 pin 11 SHCP Pa2
const int Knop1 = 8; // PA8
const int Knop2 = 9; // PA9
const int Knop3 = 10; // PA10
const int Knop4 = 11; // PA11
const int numLeds = 7;
const int DELAY_MS = 6000; // Delay for 5 seconds
const int Buzzer = 13; // PB1
long previousMillis = 0; // The last time the function was called
int Groen = 0;
int Rood = 0;
int Groen2 = 0;
int Rood2 = 0;
int randomValue = 0;
int Links = 0;
int Rechts = 0;
int code1 = 0;
int code2 = 0;
int code3 = 0;
int code4 = 0;
int potmeter = A5; // Pb3
int potValue; // Waarde van potmeter
int Helderheid;
int Ledspeed;
int i = 0;
int j = 0;
byte ledPattern = 0; //
byte ledPattern2 = 0;
bool Functie = false;
int Knop1status = digitalRead(Knop1);
int dec_digits  [10] {1, 79, 18, 6, 76, 36, 32, 15, 0, 4};


void setup() { 
  Serial.begin(115200);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(DATA_PIN, OUTPUT);
  pinMode(Buzzer, OUTPUT);
  pinMode(Knop1, INPUT_PULLUP);
  pinMode(Knop2, INPUT_PULLUP);
  pinMode(Knop3, INPUT_PULLUP);
  pinMode(Knop4, INPUT_PULLUP);
  randomSeed(analogRead(0)); // Weghalen bij pcb
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, dec_digits[i]);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, dec_digits[j]);
  digitalWrite(LATCH_PIN,  HIGH);

}

bool startCondition = false;
int timeToWaitButton = 3000;
int scorePoints = 0;

void loop() {
 
  if (!startCondition)
  { // Start wait button
    if (!digitalRead(Knop1) || 
    !digitalRead(Knop2) || 
    !digitalRead(Knop3) || 
    !digitalRead(Knop4))
    {
      Serial.println("START");
      delay(1000);
      startCondition = true;
    }
  }
  else
  { // Start game
    int LEDScore = random(1, 5);
    Serial.print("LEDScore: ");
    Serial.println(LEDScore);

    ledPattern = 1 << LEDScore;
    updateShiftRegister();

    for(int i=0; i<timeToWaitButton; i++)
    {
      delay(1);
      if (!digitalRead(Knop1) && (LEDScore == 1)){Iets(); Scoor();}
      if (!digitalRead(Knop2) && (LEDScore == 2)){Iets(); Scoor();}
      if (!digitalRead(Knop3) && (LEDScore == 3)){Iets(); Scoor();}
      if (!digitalRead(Knop4) && (LEDScore == 4)){Iets(); Scoor();}

      if (!digitalRead(Knop1) && (LEDScore == 2)){Lose();}
      if (!digitalRead(Knop1) && (LEDScore == 3)){Lose();}
      if (!digitalRead(Knop1) && (LEDScore == 4)){Lose();}

      if (!digitalRead(Knop2) && (LEDScore == 1)){Lose();}
      if (!digitalRead(Knop2) && (LEDScore == 3)){Lose();}
      if (!digitalRead(Knop2) && (LEDScore == 4)){Lose();}

            if (!digitalRead(Knop3) && (LEDScore == 1)){Lose();}
      if (!digitalRead(Knop3) && (LEDScore == 2)){Lose();}
      if (!digitalRead(Knop3) && (LEDScore == 4)){Lose();}

      if (!digitalRead(Knop4) && (LEDScore == 1)){Lose();}
      if (!digitalRead(Knop4) && (LEDScore == 2)){Lose();}
      if (!digitalRead(Knop4) && (LEDScore == 3)){Lose();}


 
    }
  }
}

void Iets()
{
  scorePoints++;
  Serial.print("Score: ");
  Serial.println(scorePoints);

  // startCondition = false;
  if (timeToWaitButton > 250)
  {
    timeToWaitButton -= 250;
  }
  else if (timeToWaitButton > 150)
  {
    timeToWaitButton -= 150;
  }
  else if (timeToWaitButton > 50)
  {
    timeToWaitButton -= 50;
  }
  else
  {
  //victory
  }

  ledPattern = 0;
  updateShiftRegister();
  delay(200);
}

void Generate()
{
  randomValue = random(1, 5);
  delay(200);
  Serial.println("Generating");
  previousMillis = millis();
  Reset();

}

void updateShiftRegister()
{
  delay(Ledspeed);
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, ledPattern);
  digitalWrite(latchPin, HIGH);
}

void Lose()
{
  delay(500);

  Serial.println("LOSE");
  randomValue = 0;
  sadBuz();
  Reset();
  updateShiftRegister();
  delay(500);
  Functie = false;
  i = 0;
  j = 0;
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, dec_digits[i]);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, dec_digits[j]);
  digitalWrite(LATCH_PIN,  HIGH);
}

void Scoor()
{
  tone(Buzzer, 500, 200);
  delay(150);
  tone(Buzzer, 500, 500);
  delay(150);
  tone(Buzzer, 800, 150);
  delay(150);
  tone(Buzzer, 600, 900);
  delay(500);
  noTone(Buzzer);
  Serial.println("Scoor");
  if (i >= 9)
  {
    i = 0;
    j += 1;
  }
  else
  {
    i += 1;
  }

  delay(1000);
  digitalWrite(LATCH_PIN, LOW);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, dec_digits[i]);
  shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, dec_digits[j]);
  digitalWrite(LATCH_PIN,  HIGH);


  Generate();
  delay(200);

}

void Reset()
{
  delay(200);
  Rechts = 0;
  Links = 0;
  code1 = 0;
  code2 = 0;
  code3 = 0;
  code4 = 0;
  Groen = 0;
  Rood = 0;
  Groen2 = 0;
  Rood2 = 0;

}


void sadBuz()
{
  tone(Buzzer, 622);
  delay(300);
  tone(Buzzer, 587);
  delay(300);
  tone(Buzzer, 554);
  delay(300);
  for (byte ic = 0; ic < 10; ic++) {
    for (int pitch = -10; pitch <= 10; pitch++) {
      tone(Buzzer, 523 + pitch);
      delay(5);
    }
  }
  noTone(Buzzer);
}

$abcdeabcde151015202530354045505560fghijfghij
74HC595
74HC595
74HC595