Amaldi Game

Dependencies:   mbed

Committer:
pinofal
Date:
Sat Dec 01 23:53:13 2018 +0000
Revision:
1:61ebf06c61cc
Parent:
0:42458802c36f
Amaldi Game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nucleo 0:42458802c36f 1 #include "mbed.h"
nucleo 0:42458802c36f 2 #include "stdlib.h"
nucleo 0:42458802c36f 3 #include <Timer.h>
nucleo 0:42458802c36f 4
pinofal 1:61ebf06c61cc 5 // genera un oggetto serial collegato al PC
pinofal 1:61ebf06c61cc 6 Serial pc(USBTX, USBRX);
pinofal 1:61ebf06c61cc 7 DigitalOut myLed(LED1);
pinofal 1:61ebf06c61cc 8
pinofal 1:61ebf06c61cc 9 // moltiplicatore del tempo in millisecondi
pinofal 1:61ebf06c61cc 10 double nMultiplier = 500.0;
pinofal 1:61ebf06c61cc 11 Timer myTimer;
nucleo 0:42458802c36f 12
pinofal 1:61ebf06c61cc 13 // Tempo a disposizione del giocatore per colpire il piezo dopo l'accensiond del LED
pinofal 1:61ebf06c61cc 14 int32_t nDelay = 500; // tempo in [msec]
pinofal 1:61ebf06c61cc 15 float fDelay = 500.0; // tempo in [msec]
pinofal 1:61ebf06c61cc 16
pinofal 1:61ebf06c61cc 17 // tempi misurati con il timer
pinofal 1:61ebf06c61cc 18 int32_t nStartTimeGame, nElapsedTimeGame, nCurrentTimeGame;
nucleo 0:42458802c36f 19
pinofal 1:61ebf06c61cc 20 // seme per la generazione di numeri casuali
pinofal 1:61ebf06c61cc 21 unsigned int nSeed;
pinofal 1:61ebf06c61cc 22
pinofal 1:61ebf06c61cc 23 // pulsante su cui bisogna colpire
pinofal 1:61ebf06c61cc 24 DigitalIn InPiezo(PA_4);
pinofal 1:61ebf06c61cc 25
nucleo 0:42458802c36f 26
nucleo 0:42458802c36f 27
pinofal 1:61ebf06c61cc 28 /********/
pinofal 1:61ebf06c61cc 29 /* MAIN */
pinofal 1:61ebf06c61cc 30 /********/
pinofal 1:61ebf06c61cc 31 int main()
pinofal 1:61ebf06c61cc 32 {
pinofal 1:61ebf06c61cc 33 // velocità di comunicazione sulla seriale con PC
pinofal 1:61ebf06c61cc 34 pc.baud(921600);
pinofal 1:61ebf06c61cc 35
pinofal 1:61ebf06c61cc 36 // inizialmente spegne LED
pinofal 1:61ebf06c61cc 37 myLed=0;
pinofal 1:61ebf06c61cc 38
pinofal 1:61ebf06c61cc 39 // pc.printf("RANDMAX= %d\r\n", RAND_MAX); // scopi diagnostici
pinofal 1:61ebf06c61cc 40
pinofal 1:61ebf06c61cc 41 while(1)
pinofal 1:61ebf06c61cc 42 {
pinofal 1:61ebf06c61cc 43 // avvia il timer
pinofal 1:61ebf06c61cc 44 myTimer.start();
pinofal 1:61ebf06c61cc 45 //rand() fissa sempre la stessa sequenza di numeri patendo da 1,
pinofal 1:61ebf06c61cc 46 //srand(seed) fissa il numero di partenza, seed, ma la sequenza è sempre la stessa
pinofal 1:61ebf06c61cc 47 // per generare una sequenza diversa partendo da un numero diverso il seed lo imposto leggendo l'orologio di sistema (p.e. timer)
pinofal 1:61ebf06c61cc 48 // RAND_MAX = 2147483647
pinofal 1:61ebf06c61cc 49 nSeed = unsigned(myTimer.read_ms()% RAND_MAX); // resto della divisione timer_read_ms() / RAND_MAX
pinofal 1:61ebf06c61cc 50 srand(nSeed);
pinofal 1:61ebf06c61cc 51
pinofal 1:61ebf06c61cc 52
pinofal 1:61ebf06c61cc 53 // calcola il tempo entro il quale è attesa la risposta del giocatore
pinofal 1:61ebf06c61cc 54 fDelay = (nMultiplier * (float(rand()) / RAND_MAX));
pinofal 1:61ebf06c61cc 55 // pc.printf("\r\ndelay float = %f\r\n", fDelay); // scopi diagnostici
pinofal 1:61ebf06c61cc 56 nDelay = int(fDelay);
pinofal 1:61ebf06c61cc 57 //pc.printf("delay int = %d\r\n", nDelay); // scopi diagnostici
pinofal 1:61ebf06c61cc 58
pinofal 1:61ebf06c61cc 59 // se il ritardo è maggiore di 5000, dividilo per 3 fino a quando non diventa inferiore a 5000
pinofal 1:61ebf06c61cc 60 while(nDelay > 5000)
pinofal 1:61ebf06c61cc 61 {
pinofal 1:61ebf06c61cc 62 nDelay /= 3;
pinofal 1:61ebf06c61cc 63 }
pinofal 1:61ebf06c61cc 64
pinofal 1:61ebf06c61cc 65 // se il ritardo è minore di 100, moltiplicalo per 2 fino a quando non diventa maggiore di 100
pinofal 1:61ebf06c61cc 66 while(nDelay < 100)
pinofal 1:61ebf06c61cc 67 {
pinofal 1:61ebf06c61cc 68 nDelay *= 2;
pinofal 1:61ebf06c61cc 69 }
pinofal 1:61ebf06c61cc 70
pinofal 1:61ebf06c61cc 71 // accendi il LED e attendi che il giocatore prema sul piezo
pinofal 1:61ebf06c61cc 72 nStartTimeGame = myTimer.read_ms(); // istante di partenza del gioco
pinofal 1:61ebf06c61cc 73 myLed = 1;
pinofal 1:61ebf06c61cc 74 while( (InPiezo == 0) && (nElapsedTimeGame < nDelay) )
pinofal 1:61ebf06c61cc 75 {
pinofal 1:61ebf06c61cc 76 nCurrentTimeGame = myTimer.read_ms(); // acquisisci il timer attuale
pinofal 1:61ebf06c61cc 77 nElapsedTimeGame = (nCurrentTimeGame - nStartTimeGame); // tempo trascorso dall'inizio gioco
pinofal 1:61ebf06c61cc 78 }
pinofal 1:61ebf06c61cc 79 myLed = 0;
pinofal 1:61ebf06c61cc 80 myTimer.stop(); // istante di fine del gioco
pinofal 1:61ebf06c61cc 81
pinofal 1:61ebf06c61cc 82
pinofal 1:61ebf06c61cc 83 // stampa la risposta e il tempo a disposizione
pinofal 1:61ebf06c61cc 84 pc.printf("\r\nrisposta in = %d; tempo a disposizione= %d \r\n", nElapsedTimeGame, nDelay);
pinofal 1:61ebf06c61cc 85 if(nElapsedTimeGame < nDelay)
pinofal 1:61ebf06c61cc 86 {
pinofal 1:61ebf06c61cc 87 pc.printf("GOOD !!! \r\n"); // il giocatore ha risposto prima della scadenza del timer
pinofal 1:61ebf06c61cc 88 }
pinofal 1:61ebf06c61cc 89 else
pinofal 1:61ebf06c61cc 90 {
pinofal 1:61ebf06c61cc 91 pc.printf("BAD ... \r\n"); // il giocatore ha risposto dopo la scadenza del timer
pinofal 1:61ebf06c61cc 92 }
pinofal 1:61ebf06c61cc 93
pinofal 1:61ebf06c61cc 94
pinofal 1:61ebf06c61cc 95
pinofal 1:61ebf06c61cc 96
pinofal 1:61ebf06c61cc 97 }
pinofal 1:61ebf06c61cc 98 }