Amaldi / Mbed 2 deprecated Amaldi_16_Exercise_Game_rev3

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
pinofal
Date:
Wed Dec 05 15:50:10 2018 +0000
Parent:
2:1bdcc88f5501
Commit message:
exercise 16

Changed in this revision

Game.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Game.cpp	Tue Dec 04 13:45:23 2018 +0000
+++ b/Game.cpp	Wed Dec 05 15:50:10 2018 +0000
@@ -1,7 +1,7 @@
 #include "mbed.h"
 #include "stdlib.h"
-#include "SampledSoundBadScore.h"
-#include "SampledSoundGoodScore.h"
+#include "SampledSoundBadScore_Dummy.h"
+#include "SampledSoundGoodScore_Dummy.h"
 
 // numero di Step in cui è suddiviso il gioco
 #define GAMESTEPNUMBER 4
@@ -12,7 +12,7 @@
 // genera un oggetto serial collegato al PC
 Serial pc(USBTX, USBRX);
 
-DigitalOut myLed(LED2);
+DigitalOut myLED(LED2);
 DigitalIn myButton(USER_BUTTON);
 
 // moltiplicatore del tempo in millisecondi
@@ -58,11 +58,18 @@
 double fDeltaTBadScoreSound;
 
 
-// pulsante su cui bisogna colpire
-DigitalIn InPiezo(PA_0);
+// valore letto dall'ADC
+unsigned short usReadADC;
+
+// Sensore Piezo su cui bisogna colpire per dare risposta
+AnalogIn InPiezo(PA_0);
+
 // output analogico per i messaggi audio
 AnalogOut OutWave(PA_4);
 
+// Uscita LED per sollecitare la risposta del giococatore
+DigitalOut TriggerLED (PC_10);
+
 /****************************************/
 /* Gnerazione AudioMesaggio Good Result */
 /****************************************/
@@ -122,25 +129,22 @@
     pc.printf("\r\n*** Let's Play ***\r\n");
     
     
-    // inizialmente spegne LED
-    myLed=0;
+    // inizialmente spegne i LED 
+    myLED=0;
+    TriggerLED=0;
     
-    // pc.printf("RANDMAX= %d\r\n", RAND_MAX); // scopi diagnostici
-        
+    //++++++++++++++++++++++++++++++++++++++++++++++++++
+    //++++++++++++  INIZIO CICLO PRINCIPALE ++++++++++++
+    //++++++++++++++++++++++++++++++++++++++++++++++++++
     while(true) 
     {
         //++++++  INIZIO Attendi pressione USER_BUTTON per Start Game +++++++
         pc.printf("\r\n*** PRESS Blue Button to START ***\r\n");
         while(myButton ==1)
-        {
-            //myLed = 1;
-        }
+        {}
         if(myButton ==0)
         {
             while(myButton ==0){};
-            //myLed = 0;
-            //BadScoreMessage();
-            //GoodScoreMessage();
         }
         //++++++  FINE Attendi pressione USER_BUTTON per Start Game +++++++
         
@@ -149,7 +153,9 @@
         for(nStepIndex =0; nStepIndex < GAMESTEPNUMBER; nStepIndex++)
         {
             pc.printf("\r\nINIZIO FASE %d\r\n",nStepIndex); // scopi diagnostici
-            
+                       
+            //+++++++++++ INIZIO calcola ritardo variabile tra uno step e il successivo ++++++++
+            // pc.printf("RANDMAX= %d\r\n", RAND_MAX); // scopi diagnostici
             //rand() fissa sempre la stessa sequenza di numeri patendo da 1, 
             //srand(seed) fissa il numero di partenza, seed, ma la sequenza è sempre la stessa
             // per generare una sequenza diversa partendo da un numero diverso il seed lo imposto leggendo l'orologio di sistema (p.e. timer)
@@ -162,38 +168,53 @@
             nDelay = int(fDelay);
             pc.printf("delay [msec] = %d\r\n", nDelay); // scopi diagnostici
             
+            // se il ritardo è minore di 100, moltiplicalo per 2 fino a quando non diventa maggiore di 100    
+            nDelay +=1; // aggiungi sempre 1[msec] al valore del ritardo. Se nDelay=0, nei cicli while successivi potrebbe bloccarsi
+            while(nDelay < 100)
+            {
+                nDelay *= 2;    
+                
+            }
+            
             // se il ritardo è maggiore di 500, dividilo per 3 fino a quando non diventa inferiore a 5000
             while(nDelay > 500)
             {
                 nDelay /= 3;
             }
             
-            // se il ritardo è minore di 100, moltiplicalo per 2 fino a quando non diventa maggiore di 100    
-            while(nDelay < 50)
-            {
-                nDelay *= 2;    
-            }
+            
             // tra uno step e l'altro attendi (TIMEBETWEEN + nDelay) [msec]. In questo modo il giocatore non può memorizzare i tempi di risposta
             wait_ms(TIMEBETWEEN+nDelay);
             pc.printf("Tempo tra due step [ms] = %d\r\n", (TIMEBETWEEN+nDelay)); // scopi diagnostici
+            //+++++++++++ FINE calcola ritardo variabile tra uno step e il successivo ++++++++
             
+            //+++++++++++ INIZIO Accende LED e attende risposta del giocatore ++++++++
             // Accendi il LED per un tempo pari a una parte fissa in naStepDuration[nStepIndex] e una parte random pari a nDelay
-            myLed=1; // Accendi LED
+            TriggerLED = 1; // Accendi LED di inizio Gioco
+            myLED = 1; // scopi diagnostici
             nStartTimeGame = myTimer.read_ms();
             nElapsedTimeGame=0; // inizializza tempo trascorso
-            // attendi fino alla pressione del pulsante/piezo oppure al timeout. Il timeout è fissato nell'array naStepDuration[]. mYButton diventa '0' alla pressione
-            while( (nElapsedTimeGame < naStepDuration[nStepIndex]) && (myButton == 1))
+            usReadADC = 0; // inizializza valore letto dall'ADC collegato al piezo
+            // attendi fino alla pressione del pulsante/piezo oppure al timeout. Il timeout è fissato nell'array naStepDuration[]. Valori molto vassi di Inpiezo sono considerati rumore
+            while( (nElapsedTimeGame < naStepDuration[nStepIndex]) && (usReadADC < 0x200)) 
             {
                 // misura il tempo trascorso da StartTimeGame
                 nCurrentTimeGame = myTimer.read_ms();
                 nElapsedTimeGame= nCurrentTimeGame-nStartTimeGame;
+                
+                // acquisisce risposta dal sensore Piezo
+                usReadADC = InPiezo.read_u16();
+                //if(usReadADC > 0x1000)
             }
-            myLed=0; // Spegni LED
+            TriggerLED = 0;// Spegni LED di fine gioco
+            myLED =0; // scopi diagnostici
+            pc.printf(" ADC0 = %x \n\r",usReadADC); // scopi diagnostici
             // memorizza lo score guadagnato nello Step
             naStepScore[nStepIndex] = nElapsedTimeGame;
+            pc.printf("StepDuration= %d; Elapsed= %d\r\n", naStepDuration[nStepIndex], nElapsedTimeGame); //scopi diagnostici
+            //+++++++++++ FINE Accende LED e attende risposta del giocatore ++++++++
             
-            pc.printf("StepDuration= %d; Elapsed= %d\r\n", naStepDuration[nStepIndex], nElapsedTimeGame); //scopi diagnostici
-            
+            //+++++++++++ INIZIO Calcola Score ++++++++
             // calcola lo score in percentuale della durata step. fScore = (durata dello step-tempo trascorso)/ durata dello step.
             fScore = ((float)(naStepDuration[nStepIndex] - naStepScore[nStepIndex])/(float)naStepDuration[nStepIndex])*100.0;
             pc.printf("Score [%%] %.2f \r\n",fScore); //scopi diagnostici
@@ -207,7 +228,7 @@
             if((fScore > 0) && (fScore <= 50))
             {
                 // accendi LED YELLOW relativo alla fase in cui ci si trova
-                pc.printf("SO-SO !!! \r\n"); // il giocatore ha risposto in un tempo intermedio
+                pc.printf("SO-SO :|  :|  :| \r\n"); // il giocatore ha risposto in un tempo intermedio
                 BadScoreMessage();
             }
             if(fScore > 50)
@@ -216,8 +237,9 @@
                 pc.printf("GOOD :)  :)  :) \r\n"); // il giocatore ha risposto prima della scadenza del timer
                 GoodScoreMessage();
             }
-            
+            //+++++++++++ FINE Calcola Score ++++++++
         }
-       
-    }            
+        //++++++ FINE degli step del gioco +++++++++++++++++++++
+    }
+    //++++++++++++  INIZIO CICLO PRINCIPALE ++++++++++++
 }
\ No newline at end of file