/*********************************************************************
Juergen Walter
04.07.2017
What?
Timekeeping for one round
Realease for start
Button: GPIO0 - Boot - parallel drive-over switch

Was?
Zeitmessung fuer eine Runde mit:
Freigabe fuer Start
Taster: GPIO0 Boot - parallel zum Überfahrschalter

*********************************************************************/

#include <Wire.h> // I2C
#include <Adafruit_GFX.h> // OLED
#include <Adafruit_SSD1306.h> // Graphic


#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);

void setup() {

// initialize with the I2C addr 0x3C
// mit I2C-Adresse 0x3c initialisieren
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Serial.begin(115200);

display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(2 );
display.setTextColor(INVERSE);
}

unsigned MessungNr=0;

void loop()
{
unsigned long Zeit=0;
unsigned long Start=0;
unsigned long Ende=0;
float s=0;

/*************************************************************************************
READY
FREIGABE
**************************************************************************************/
Serial.println();
Serial.println("Startfreigabe ");


// M-Nr: ### send to display
// Messung Nr. und Freigabe auf Display senden

display.clearDisplay();
display.setCursor(0,0);
display.print("M-Nr: ");
MessungNr++;
display.print(MessungNr);
display.setCursor(0,32);
display.print("Freigabe");
display.display();



/*************************************************************************************
Wait for START
Warten auf Messung START
**************************************************************************************/
while (digitalRead(0) == HIGH)
{
yield(); //warten fuer ESP8266
}

Start = millis();
Serial.print("gestartet Messung Nr.: ");
Serial.print(MessungNr);

// started send to display
// gestartet auf Display senden
display.clearDisplay();
display.setCursor(0,0);
display.print("M-Nr: ");
display.print(MessungNr);
display.setCursor(0,32);
display.print("gestartet");
display.display();

// wait for second wheel
// Draisine hat zwei Raeder
delay(2000);

/*************************************************************************************
// Waiting for FINISH
// Warten auf ZIEL
**************************************************************************************/
while (digitalRead(0) == HIGH)
{
Ende = millis();
Zeit = (Ende - Start);
s=Zeit;
s=s/1000;

// Result send to display
// Zeit auf Display senden
display.clearDisplay();
display.setCursor(0,0);
display.print("E-Nr: ");
display.print(MessungNr);
display.setCursor(0,32);
display.print(s,2);
display.print("s");
display.display();
}

//ERGEBNIS
Serial.print(" Ergebnis ");
Serial.print(s,3);
Serial.println("s");
display.clearDisplay();
display.setCursor(0,0);
display.print("E-Nr: ");
display.print(MessungNr);
display.setCursor(0,32);
display.print(s,3);
display.print("s");
display.display();

/*************************************************************************************
// Display RESULT for two seconds --> Button
// Ergebnisanzeige fuer mindestens 2s bis Taster betaetigt werden kann
*************************************************************************************/
delay(2000);

// RESULTS accepted
// Datenuebernahme mit Taster bestaetigen
while(digitalRead(0) ==HIGH)
{
yield(); //warten
}
// send WAIT to display
// Warten an Display senden
display.clearDisplay();
display.setCursor(0,0);
display.print("WARTEN");
display.display();
delay(2000);
}