VR FabLab - RoboVal / Mbed 2 deprecated Chronometer_V2

Dependencies:   mbed keypadLib TextLCD

Revision:
3:fd1353986910
Parent:
2:bd0c735e81d6
Child:
4:23472c2b246b
--- a/main.cpp	Fri May 18 23:15:11 2018 +0000
+++ b/main.cpp	Sun May 20 23:19:17 2018 +0000
@@ -31,13 +31,15 @@
 // Reference for Low/Min Voltage battery
 #define VBAT_MIN 7.2
 
-
-// Modalità di funzionamento (in attesa della tastiera)
+// Different function modes
+// Switch among them using the USER button
+// (waiting for the keypad to work properly)
 enum modes {
     LABYRINTH,
     SPEED
 } mode = SPEED;
 
+// Human-readable time helper
 typedef struct time_screen {
    int cents;
    int seconds;
@@ -45,13 +47,13 @@
 } measured_time;
 
 
-// Defines the pins connected to the rows
-Keypad keypad(PA_0 , PA_1 , PA_4 , PB_0,PA_13 , PA_14 , PC_2 , PC_3 );
+// Keypad connection (4 columns, 4 rows)
+Keypad keypad(PA_0 , PA_1 , PA_4 , PB_0, PA_13 , PA_14 , PC_2 , PC_3 );
 
 // Configures the serial port
 Serial pc( USBTX , USBRX );
  
- // read Voltage battery
+// Heartbeat LED
 DigitalOut heartbeat(LED1);
 
 // read Voltage battery, analog pin used PC_3 (Pin 37 of Morpho layout)
@@ -60,23 +62,28 @@
 // User button pressure 
 InterruptIn user_button(USER_BUTTON); 
 
-// Sensor connected to digital input D9, alias PC7 on Morpho layout
-// Now p29 and p31
-InterruptIn gateStart(PA_15); 
-InterruptIn gateEnd(PB_7); 
+// Gates connected to digital input PA_15 and PB_7
+InterruptIn gateStart(PA_15), gateEnd(PB_7); 
 
 // LCD Display (RS, E, D4, D5, D6, D7);
 TextLCD lcd(D2,D3,D4,D5,D6,D7); 
 
+// Timer for the chrono function
 Timer t;
  
-int lap = 0;
+// Number of laps
+int lap = -1;
+// Best lap
+int best_lap = 0;
+// Last time read
 int last_read = 0;
+// Last lap time
 int lap_time = 0;
-
+// Best lap time
+int best_time = -1;
+// Pointer to the loop function (depending on the selected mode)
 void (*loopMethod)(void);
 
-
 //Conversione da millisecondi a mm:ss:cc
 measured_time human_read(int ms){
     measured_time read;
@@ -93,37 +100,32 @@
     return read;    
 }
 
-void measure_time(){
+// Invoked when startGate triggered.
+// Start the timer or read the timer and store lap and best time
+void measure_time() {
     int read = t.read_ms();
-    
-    if(lap == 0){
+
+    if(lap == -1){
         t.start();
         lap++;
     }else{
         //Dabouncing per evitare problemi
         if(read - last_read > 1000){
             
+            lap++;
             lap_time = read - last_read;
+            if (best_time < 0 || lap_time < best_time) {
+                best_time = lap_time;
+                best_lap = lap;
+            }
             
-            if(lap >= NUM_LAP){
+            if(lap >= NUM_LAP) {
                 t.stop();
-                lap++;
-            }else{
-                lap++;
             }
             
             last_read = read;     
         }
-    }
-    
-}
-
-void reset_measure(){
-    t.stop();
-    t.reset();
-    lap = 0;
-    last_read = 0;
-    lcd.cls();
+    }    
 }
 
 
@@ -136,10 +138,17 @@
     lcd.printf("Totale %02d:%02d:%02d",time.minutes,time.seconds,time.cents);
     
     //Gestione dei parziali
-    if(lap > 1){
+    if(lap > 0) {
         time = human_read(lap_time);
         lcd.locate(0,1);
-        lcd.printf("Giro %d %02d:%02d:%02d",lap - 1,time.minutes,time.seconds,time.cents);
+        lcd.printf("Giro %d %02d:%02d:%02d",lap,time.minutes,time.seconds,time.cents);
+    }
+    if (lap >= NUM_LAP) {
+        time = human_read(best_time);
+        lcd.locate(0,1);
+        wait(1);
+        lcd.printf("Best %d %02d:%02d:%02d",best_lap,time.minutes,time.seconds,time.cents);
+        wait(1);
     }
 }
 
@@ -155,14 +164,15 @@
     
     measured_time time = human_read(read);
     
-    lcd.locate(0,1);
-    lcd.printf("                ");
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("Ended.");
     lcd.locate(0,1);
     lcd.printf("Totale %02d:%02d:%02d",time.minutes,time.seconds,time.cents);
 }
 
 void labyrinthLoop() {
-    if (!lap) {
+    if (lap == 0) {
         int read = t.read_ms(); 
         
         measured_time time = human_read(read);
@@ -176,18 +186,47 @@
     switch(mode) {
         case LABYRINTH:
             gateStart.rise(&start_time);
+            gateEnd.enable_irq();
             gateEnd.rise(&stop_time);
             loopMethod = &labyrinthLoop;
+            lcd.cls();
+            lcd.locate(0,0);
+            lcd.printf("Mode: LABYRINTH ");
+            wait(1);
+            lcd.cls();
             break;
         
         case SPEED:
         default:
             gateStart.rise(&measure_time);
+            gateEnd.disable_irq();
             loopMethod = &speedLoop;
+            lcd.cls();
+            lcd.locate(0,0);
+            lcd.printf("Mode: SPEED     ");
+            wait(1);
+            lcd.cls();
             break;
     }
 }
 
+void reset_measure(){
+    t.stop();
+    t.reset();
+    lap = -1;
+    last_read = 0;
+    best_lap = 0;
+    best_time = -1;
+    lcd.cls();
+}
+
+void switchMode() {
+    mode = mode == SPEED ? LABYRINTH : SPEED;
+    reset_measure(); 
+    configMode();
+
+}
+
 //------------------------------------------------------------ 
 //
 //       Main body
@@ -195,7 +234,7 @@
 //------------------------------------------------------------
 int main() {
     char key;
-    user_button.fall(&reset_measure);
+    user_button.fall(&switchMode);
 
     gateStart.mode(PullDown);
     gateEnd.mode(PullDown);
@@ -206,22 +245,20 @@
         heartbeat = !heartbeat;
         loopMethod();
         wait(0.1);
+        /*
         key = keypad.getKey(); 
         if (key != KEY_RELEASED) {
             if(key == 'A') {
-                lcd.locate(0,0);
-                lcd.printf("Mode: LABYRINTH ");
                 mode = LABYRINTH;
                 configMode();
             } else if(key == 'B') {
-                lcd.locate(0,0);
-                lcd.printf("Mode: SPEED     ");
                 mode = SPEED;
                 configMode();
             } else if(key == '*') {
                 reset_measure();
             }
         }
+        */
     }
 }