
#include <TM1638.h>

TM1638 module(10, 11, 12);


const int trigPin = 5;
const int echoPin = 4;
//const int led = 3;
//const int led2 = 2;
const int trigPinBis = 9;
const int echoPinBis = 8;
//const int ledBis = 6;
//const int led2Bis = 7;


const int a = 119;
const int b = 124;
const int c = 57;
const int d = 94;
const int e = 121;
const int f = 113;
const int g = 61;
const int h = 118;
const int i = 6;
const int j = 14;
const int k = 118;
const int l = 56;
const int m = 55;
const int n = 55;
const int o = 63;
const int p = 115;
const int q = 63;
const int r = 119;
const int s = 109;
const int t = 112;
const int u = 62;
const int v = 62;
const int w = 62;
const int  x = 80;
const int y = 114;
const int z = 91;

bool goal;
long lastGoal = 0;
int scoreP1 = 0 ;
int scoreP2 = 0 ;
int buttons;
int matchNumpoints = 15;

void checkPresence1() {
  goal = false;
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
  //  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;
  if (distance < 4) {  // This is where the LED On/Off happens
    //digitalWrite(led, HIGH); // When the Red condition is met, the Green LED should turn off
    //digitalWrite(led2, LOW);
    goalScored(1);
  }
  else {
    //digitalWrite(led, LOW);
    //digitalWrite(led2, HIGH);
  }
  /*
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  */
}

void checkPresence2() {
  long durationBis, distanceBis;
  digitalWrite(trigPinBis, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPinBis, HIGH);
  //  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPinBis, LOW);
  durationBis = pulseIn(echoPinBis, HIGH);
  distanceBis = (durationBis / 2) / 29.1;

  if (distanceBis < 4) {  // This is where the LED On/Off happens
    //digitalWrite(ledBis, HIGH); // When the Red condition is met, the Green LED should turn off
    //digitalWrite(led2Bis, LOW);
    goalScored(2);
  }
  else {
    //digitalWrite(ledBis, LOW);
    //digitalWrite(led2Bis, HIGH);
  }

  /*if (distanceBis >= 200 || distanceBis <= 0){
    Serial.println("BisOut of range");
  }
  else {
    Serial.print(distanceBis);
    Serial.println(" cmBis");
  }

  */
}

void goalScored(int player) {

  long diffTime = millis() - lastGoal;
  Serial.println(diffTime);
  Serial.println(lastGoal);
  Serial.println();

  if (diffTime > 4000) {

    if (player == 1) {
      scoreP1 += 1;
      module.setDisplayToString(" Goal P1");
      for (int count = 24; count > 0; count--) {
        module.setLEDs(0x0);
        module.setLED(TM1638_COLOR_GREEN, count);
        delay(100);
      }
      module.setLEDs(0x0);
    }
    else {
      scoreP2 += 1;
      module.setDisplayToString(" Goal P2");
      for (int count = 0; count < 24; count++) {
        module.setLEDs(0x0);
        module.setLED(TM1638_COLOR_RED, count);
        delay(100);
      }
      module.setLEDs(0x0);
    }
    module.clearDisplay();
    displayPoints();
  }
   lastGoal = millis();
  checkVictory();
}

void beginMatch() {
  module.clearDisplay();
  module.setDisplayToString(" Match");
  delay(2000);
  for (int  ii = 5; ii > 0; ii--) {
    module.setLEDs(0x0);
    module.setDisplayToDecNumber(ii, 0, false);
    for (int count = 0; count < 8; count++) {

      module.setLED(TM1638_COLOR_GREEN, count);

      delay(100);
    }
  }
  module.setLEDs(0x0);
  module.clearDisplay();
  module.setDisplayToString(" Begin");
  delay(2000);
  scoreP1 = 0;
  scoreP2 = 0;
}

void displayPoints() {
  String displayString = "1.";
  if (scoreP1 < 10) {
    displayString += " ";
    displayString += scoreP1;
  }
  else {
    displayString += scoreP1;
  }
  displayString +=  "2.";
  if (scoreP2 < 10) {
    displayString += " ";
    displayString += scoreP2;
  }
  else {
    displayString += scoreP2;
  }
  module.setDisplayToString(displayString);
}


void checkVictory() {
  if (scoreP1 == matchNumpoints) {
    module.setDisplayToString(" P1 wins");
    delay(5000);
    choiceMatch();
  }
  if (scoreP2 == matchNumpoints) {
    module.setDisplayToString(" P2 wins");
    delay(5000);
    choiceMatch();
  }
}

void choiceMatch() {
  buttons = 0;
  module.clearDisplay();
  module.setDisplayToString(" newgame");
  delay(5000);
  module.clearDisplay();
  module.setDisplayToString(" ready..");
  while (buttons == 0) {
    buttons = module.getButtons();
    delay(100);
  }
  beginMatch();
}

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  //pinMode(led, OUTPUT);
  //pinMode(led2, OUTPUT);

  pinMode(trigPinBis, OUTPUT);
  pinMode(echoPinBis, INPUT);
  //pinMode(ledBis, OUTPUT);
  //pinMode(led2Bis, OUTPUT);

  module.setupDisplay(true, 7);
}

void loop() {
  if (millis() < 100) {
    beginMatch();
  }

  buttons = module.getButtons();
  // module.setDisplayToDecNumber(buttons,0,false);

  displayPoints();

  checkPresence1();

  checkPresence2();

  delay(300);



}
