Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Revision 3:58b0cfe9cc3a, committed 2018-12-05
- 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