Quicksand micro-electronics / Mbed 2 deprecated QW-Reactiontime

Dependencies:   mbed

Fork of QW-Reactiontime by Quicksand

Committer:
quicksandjonas
Date:
Thu Dec 15 09:57:11 2016 +0000
Revision:
2:73b5ca784164
Parent:
1:00a17f5a247c
Child:
3:1bc9575369bd
This program is a reaction time game. The results are shown in the console window and transmitted via Sigfox.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quicksandjonas 2:73b5ca784164 1 /* This program demonstrates how to use the board to play a reaction time game.
quicksandjonas 2:73b5ca784164 2 * The winner and his reaction time are displayed in the console window and transmitted via Sigfox.
quicksandjonas 2:73b5ca784164 3 * Open a serial connection to the board to see extra info and instructions.
quicksandjonas 1:00a17f5a247c 4 */
quicksandjonas 1:00a17f5a247c 5
quicksand 0:6c17d1a79f75 6 #include "mbed.h"
quicksandjonas 1:00a17f5a247c 7
quicksandjonas 1:00a17f5a247c 8 #include <stdio.h>
quicksandjonas 1:00a17f5a247c 9 #include <stdlib.h>
quicksand 0:6c17d1a79f75 10
quicksandjonas 1:00a17f5a247c 11 #define SER_BUFFER_SIZE 32
quicksandjonas 1:00a17f5a247c 12
quicksandjonas 1:00a17f5a247c 13 /* The 4 onboard LEDs */
quicksand 0:6c17d1a79f75 14 DigitalOut LED_0 (PB_6);
quicksand 0:6c17d1a79f75 15 DigitalOut LED_1 (PA_7);
quicksand 0:6c17d1a79f75 16 DigitalOut LED_2 (PA_6);
quicksand 0:6c17d1a79f75 17 DigitalOut LED_3 (PA_5);
quicksandjonas 1:00a17f5a247c 18
quicksandjonas 1:00a17f5a247c 19 /* The 2 user buttons */
quicksandjonas 1:00a17f5a247c 20 InterruptIn SW1(PA_8);
quicksandjonas 1:00a17f5a247c 21 InterruptIn SW2(PB_10);
quicksandjonas 1:00a17f5a247c 22
quicksandjonas 1:00a17f5a247c 23 /* Function prototypes */
quicksandjonas 1:00a17f5a247c 24 void sw1interrupt();
quicksandjonas 1:00a17f5a247c 25 void sw2interrupt();
quicksandjonas 1:00a17f5a247c 26 void sertmout();
quicksandjonas 1:00a17f5a247c 27 bool modem_command_check_ok(char * command);
quicksandjonas 1:00a17f5a247c 28 void modem_setup();
quicksandjonas 1:00a17f5a247c 29
quicksandjonas 1:00a17f5a247c 30 bool ser_timeout = false;
quicksandjonas 1:00a17f5a247c 31
quicksandjonas 1:00a17f5a247c 32 /* Serial port over USB */
quicksand 0:6c17d1a79f75 33 Serial pc(USBTX, USBRX);
quicksandjonas 1:00a17f5a247c 34
quicksandjonas 1:00a17f5a247c 35 /* Serial connection to sigfox modem */
quicksand 0:6c17d1a79f75 36 Serial modem(PA_9, PA_10);
quicksand 0:6c17d1a79f75 37
quicksandjonas 2:73b5ca784164 38 /* User variables */
quicksandjonas 2:73b5ca784164 39 uint16_t randomTime;
quicksandjonas 2:73b5ca784164 40 uint16_t reactionTime;
quicksandjonas 2:73b5ca784164 41 uint8_t winner;
quicksand 0:6c17d1a79f75 42
quicksandjonas 2:73b5ca784164 43 bool play = false;
quicksandjonas 2:73b5ca784164 44 bool player1 = false;
quicksandjonas 2:73b5ca784164 45 bool player2 = false;
quicksandjonas 2:73b5ca784164 46 bool busyPlaying = false;
quicksand 0:6c17d1a79f75 47
quicksandjonas 1:00a17f5a247c 48 int main() {
quicksandjonas 1:00a17f5a247c 49
quicksandjonas 1:00a17f5a247c 50 time_t t;
quicksand 0:6c17d1a79f75 51
quicksandjonas 1:00a17f5a247c 52 /* Setup TD120x */
quicksandjonas 1:00a17f5a247c 53 wait(3);
quicksandjonas 1:00a17f5a247c 54 modem_setup();
quicksandjonas 1:00a17f5a247c 55
quicksandjonas 1:00a17f5a247c 56 /* Turn off all LED */
quicksand 0:6c17d1a79f75 57 LED_0 = 1;
quicksand 0:6c17d1a79f75 58 LED_1 = 1;
quicksand 0:6c17d1a79f75 59 LED_2 = 1;
quicksand 0:6c17d1a79f75 60 LED_3 = 1;
quicksand 0:6c17d1a79f75 61
quicksandjonas 1:00a17f5a247c 62 /* Setup button interrupts */
quicksandjonas 1:00a17f5a247c 63 SW1.fall(&sw1interrupt);
quicksandjonas 1:00a17f5a247c 64 SW2.fall(&sw2interrupt);
quicksandjonas 1:00a17f5a247c 65
quicksandjonas 1:00a17f5a247c 66 /* Intializes random number generator */
quicksandjonas 2:73b5ca784164 67 srand((unsigned) time(&t));
quicksand 0:6c17d1a79f75 68
quicksandjonas 2:73b5ca784164 69 /* Push a button to start the first game */
quicksandjonas 2:73b5ca784164 70 pc.printf("\nPress a button to start the reaction time game...\n\r");
quicksandjonas 2:73b5ca784164 71
quicksandjonas 2:73b5ca784164 72 while(1) {
quicksandjonas 1:00a17f5a247c 73
quicksandjonas 2:73b5ca784164 74 /* When waiting to start a new game, show a loop on the leds */
quicksandjonas 2:73b5ca784164 75 while(play == false){
quicksandjonas 2:73b5ca784164 76 if(play == false){ // Check every time, otherwise after interrupt, loop would be finished first
quicksandjonas 2:73b5ca784164 77 LED_0 = 1;LED_1 = 1;LED_2 = 1;LED_3 = 0;
quicksandjonas 2:73b5ca784164 78 wait_ms(100);
quicksandjonas 2:73b5ca784164 79 }
quicksandjonas 2:73b5ca784164 80 if(play == false){
quicksandjonas 2:73b5ca784164 81 LED_0 = 1;LED_1 = 1;LED_2 = 0;LED_3 = 1;
quicksandjonas 2:73b5ca784164 82 wait_ms(100);
quicksandjonas 2:73b5ca784164 83 }
quicksandjonas 2:73b5ca784164 84 if(play == false){
quicksandjonas 2:73b5ca784164 85 LED_0 = 1;LED_1 = 0;LED_2 = 1;LED_3 = 1;
quicksandjonas 2:73b5ca784164 86 wait_ms(100);
quicksandjonas 2:73b5ca784164 87 }
quicksandjonas 2:73b5ca784164 88 if(play == false){
quicksandjonas 2:73b5ca784164 89 LED_0 = 0;LED_1 = 1;LED_2 = 1;LED_3 = 1;
quicksandjonas 2:73b5ca784164 90 wait_ms(100);
quicksandjonas 1:00a17f5a247c 91 }
quicksandjonas 2:73b5ca784164 92 if(play == false){
quicksandjonas 2:73b5ca784164 93 LED_0 = 1;LED_1 = 0;LED_2 = 1;LED_3 = 1;
quicksandjonas 2:73b5ca784164 94 wait_ms(100);
quicksandjonas 2:73b5ca784164 95 }
quicksandjonas 2:73b5ca784164 96 if(play == false){
quicksandjonas 2:73b5ca784164 97 LED_0 = 1;LED_1 = 1;LED_2 = 0;LED_3 = 1;
quicksandjonas 2:73b5ca784164 98 wait_ms(100);
quicksandjonas 2:73b5ca784164 99 }
quicksandjonas 2:73b5ca784164 100 }
quicksandjonas 2:73b5ca784164 101
quicksandjonas 2:73b5ca784164 102 /* After the 4 leds flash on, calculate the reaction time */
quicksandjonas 2:73b5ca784164 103 while(busyPlaying == true && player1==false && player2 == false){
quicksandjonas 2:73b5ca784164 104 reactionTime++;
quicksandjonas 2:73b5ca784164 105 wait_ms(1);
quicksandjonas 2:73b5ca784164 106 }
quicksandjonas 2:73b5ca784164 107
quicksandjonas 2:73b5ca784164 108 /* When player 1 has won */
quicksandjonas 2:73b5ca784164 109 if(player1 == true){
quicksandjonas 2:73b5ca784164 110 pc.printf("\nPlayer 1 was the fastest. His time was: %d ms\n\r", reactionTime);
quicksandjonas 1:00a17f5a247c 111 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 112 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 113 LED_2 = 1;
quicksandjonas 2:73b5ca784164 114 LED_3 = 1;
quicksandjonas 2:73b5ca784164 115 winner = 1;
quicksandjonas 2:73b5ca784164 116 char command[SER_BUFFER_SIZE];
quicksandjonas 2:73b5ca784164 117 sprintf(command, "AT$SF=05%04x%04x,2,0\n", (int) winner, (int) reactionTime );
quicksandjonas 2:73b5ca784164 118 pc.printf("Sending winner = %i and reaction time = %i ms over Sigfox\n", winner, reactionTime);
quicksandjonas 2:73b5ca784164 119 pc.printf("using modem command: %s\n", command);
quicksandjonas 2:73b5ca784164 120 modem_command_check_ok(command);
quicksandjonas 2:73b5ca784164 121 player1 = false;
quicksandjonas 2:73b5ca784164 122 player2= false;
quicksandjonas 2:73b5ca784164 123 busyPlaying = false;
quicksandjonas 2:73b5ca784164 124 play = false;
quicksandjonas 2:73b5ca784164 125 reactionTime = 0;
quicksandjonas 2:73b5ca784164 126 pc.printf("\nPress a button to start a new game...\n\r");
quicksandjonas 2:73b5ca784164 127 }
quicksandjonas 2:73b5ca784164 128
quicksandjonas 2:73b5ca784164 129 /* When player 2 has won */
quicksandjonas 2:73b5ca784164 130 if(player2 == true){
quicksandjonas 2:73b5ca784164 131 pc.printf("\nPlayer 2 was the fastest. His time was: %d ms\n\r", reactionTime);
quicksandjonas 2:73b5ca784164 132 LED_0 = 1;
quicksandjonas 2:73b5ca784164 133 LED_1 = 1;
quicksandjonas 2:73b5ca784164 134 LED_2 = 1;
quicksandjonas 2:73b5ca784164 135 LED_3 = 1;
quicksandjonas 2:73b5ca784164 136 winner = 2;
quicksandjonas 2:73b5ca784164 137 char command[SER_BUFFER_SIZE];
quicksandjonas 2:73b5ca784164 138 sprintf(command, "AT$SF=05%04x%04x,2,0\n", (int) winner, (int) reactionTime );
quicksandjonas 2:73b5ca784164 139 pc.printf("Sending winner = %i and reaction time = %i ms over Sigfox\n", winner, reactionTime);
quicksandjonas 2:73b5ca784164 140 pc.printf("using modem command: %s\n", command);
quicksandjonas 2:73b5ca784164 141 modem_command_check_ok(command);
quicksandjonas 2:73b5ca784164 142 player1 = false;
quicksandjonas 2:73b5ca784164 143 player2= false;
quicksandjonas 2:73b5ca784164 144 busyPlaying = false;
quicksandjonas 2:73b5ca784164 145 play = false;
quicksandjonas 2:73b5ca784164 146 reactionTime = 0;
quicksandjonas 2:73b5ca784164 147 pc.printf("\nPress a button to start a new game...\n\r");
quicksandjonas 1:00a17f5a247c 148 }
quicksandjonas 1:00a17f5a247c 149
quicksandjonas 2:73b5ca784164 150 /* Check if a new game has been started, when a game has been started then generate a random time */
quicksandjonas 2:73b5ca784164 151 if(play == true){
quicksandjonas 2:73b5ca784164 152 pc.printf("\nGame has started, push your button as quick as possible when leds go on!\n\r");
quicksandjonas 2:73b5ca784164 153 randomTime = (rand() % 5000)+1; //random wait max 5 seconds
quicksandjonas 2:73b5ca784164 154 wait_ms( randomTime + 1000 ); // wait for random time + 1 second
quicksandjonas 2:73b5ca784164 155 busyPlaying = true;
quicksandjonas 2:73b5ca784164 156 LED_0 = 0;
quicksandjonas 2:73b5ca784164 157 LED_1 = 0;
quicksandjonas 2:73b5ca784164 158 LED_2 = 0;
quicksandjonas 2:73b5ca784164 159 LED_3 = 0;
quicksandjonas 2:73b5ca784164 160 }
quicksandjonas 2:73b5ca784164 161
quicksandjonas 2:73b5ca784164 162
quicksand 0:6c17d1a79f75 163 }
quicksandjonas 1:00a17f5a247c 164 }
quicksandjonas 2:73b5ca784164 165
quicksandjonas 1:00a17f5a247c 166 void modem_setup()
quicksandjonas 1:00a17f5a247c 167 {
quicksandjonas 1:00a17f5a247c 168 /* Reset to factory defaults */
quicksandjonas 1:00a17f5a247c 169 if(modem_command_check_ok("AT&F"))
quicksandjonas 1:00a17f5a247c 170 {
quicksandjonas 1:00a17f5a247c 171 pc.printf("Factory reset succesfull\r\n");
quicksandjonas 1:00a17f5a247c 172 }
quicksandjonas 1:00a17f5a247c 173 else
quicksandjonas 1:00a17f5a247c 174 {
quicksandjonas 1:00a17f5a247c 175 pc.printf("Factory reset TD120x failed\r\n");
quicksandjonas 1:00a17f5a247c 176 }
quicksandjonas 1:00a17f5a247c 177 /* Disable local echo */
quicksandjonas 1:00a17f5a247c 178 modem.printf("ATE0\n");
quicksandjonas 1:00a17f5a247c 179 if(modem_command_check_ok("ATE0"))
quicksandjonas 1:00a17f5a247c 180 {
quicksandjonas 1:00a17f5a247c 181 pc.printf("Local echo disabled\r\n");
quicksandjonas 1:00a17f5a247c 182 }
quicksandjonas 1:00a17f5a247c 183 /* Write to mem */
quicksandjonas 1:00a17f5a247c 184 if(modem_command_check_ok("AT&W"))
quicksandjonas 1:00a17f5a247c 185 {
quicksandjonas 1:00a17f5a247c 186 pc.printf("Settings saved!\r\n");
quicksandjonas 1:00a17f5a247c 187 }
quicksandjonas 1:00a17f5a247c 188 }
quicksandjonas 1:00a17f5a247c 189
quicksandjonas 1:00a17f5a247c 190 bool modem_command_check_ok(char * command)
quicksandjonas 1:00a17f5a247c 191 {
quicksandjonas 2:73b5ca784164 192 /* First clear serial data buffers */
quicksandjonas 1:00a17f5a247c 193 while(modem.readable()) modem.getc();
quicksandjonas 1:00a17f5a247c 194 /* Timeout for response of the modem */
quicksandjonas 1:00a17f5a247c 195 Timeout tmout;
quicksandjonas 1:00a17f5a247c 196 ser_timeout = false;
quicksandjonas 1:00a17f5a247c 197 /* Buffer for incoming data */
quicksandjonas 1:00a17f5a247c 198 char responsebuffer[6];
quicksandjonas 1:00a17f5a247c 199 /* Flag to set when we get 'OK' response */
quicksandjonas 1:00a17f5a247c 200 bool ok = false;
quicksandjonas 1:00a17f5a247c 201 bool error = false;
quicksandjonas 1:00a17f5a247c 202 /* Print command to TD120x */
quicksandjonas 1:00a17f5a247c 203 modem.printf(command);
quicksandjonas 1:00a17f5a247c 204 /* Newline to activate command */
quicksandjonas 1:00a17f5a247c 205 modem.printf("\n");
quicksandjonas 1:00a17f5a247c 206 /* Wait untill serial feedback, min 7 seconds before timeout */
quicksandjonas 1:00a17f5a247c 207 tmout.attach(&sertmout, 7.0);
quicksandjonas 1:00a17f5a247c 208 while(!modem.readable()&& ser_timeout == false);
quicksandjonas 1:00a17f5a247c 209 while(!ok && !ser_timeout && !error)
quicksandjonas 1:00a17f5a247c 210 {
quicksandjonas 1:00a17f5a247c 211 if(modem.readable())
quicksandjonas 1:00a17f5a247c 212 {
quicksandjonas 1:00a17f5a247c 213 for(int i = 0; i < 5; i++)
quicksandjonas 1:00a17f5a247c 214 {
quicksandjonas 1:00a17f5a247c 215 responsebuffer[i] = responsebuffer[i+1];
quicksandjonas 1:00a17f5a247c 216 }
quicksandjonas 1:00a17f5a247c 217 responsebuffer[5] = modem.getc();
quicksandjonas 1:00a17f5a247c 218 if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' )
quicksandjonas 1:00a17f5a247c 219 {
quicksandjonas 1:00a17f5a247c 220 ok = true;
quicksandjonas 1:00a17f5a247c 221 }
quicksandjonas 1:00a17f5a247c 222 else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' )
quicksandjonas 1:00a17f5a247c 223 {
quicksandjonas 1:00a17f5a247c 224 error = true;
quicksandjonas 1:00a17f5a247c 225 }
quicksandjonas 1:00a17f5a247c 226 }
quicksandjonas 1:00a17f5a247c 227 }
quicksandjonas 1:00a17f5a247c 228 tmout.detach();
quicksandjonas 1:00a17f5a247c 229 return ok;
quicksandjonas 1:00a17f5a247c 230 }
quicksandjonas 2:73b5ca784164 231
quicksandjonas 1:00a17f5a247c 232 /* Button 1 ISR */
quicksandjonas 1:00a17f5a247c 233 void sw1interrupt()
quicksandjonas 2:73b5ca784164 234 {
quicksandjonas 2:73b5ca784164 235 if(play == false && busyPlaying == false){ // If not already playing...
quicksandjonas 2:73b5ca784164 236 play = true;
quicksandjonas 2:73b5ca784164 237 LED_0 = 1;
quicksandjonas 2:73b5ca784164 238 LED_1 = 1;
quicksandjonas 2:73b5ca784164 239 LED_2 = 1;
quicksandjonas 2:73b5ca784164 240 LED_3 = 1;
quicksandjonas 2:73b5ca784164 241 }
quicksandjonas 2:73b5ca784164 242 if(busyPlaying == true && player2 != true){ // When playing and there is no winner yet...
quicksandjonas 2:73b5ca784164 243 player1 = true;
quicksandjonas 2:73b5ca784164 244 }
quicksandjonas 1:00a17f5a247c 245
quicksandjonas 1:00a17f5a247c 246 }
quicksandjonas 1:00a17f5a247c 247
quicksandjonas 1:00a17f5a247c 248 /* Button 2 ISR */
quicksandjonas 1:00a17f5a247c 249 void sw2interrupt()
quicksandjonas 2:73b5ca784164 250 {
quicksandjonas 2:73b5ca784164 251 if(play == false && busyPlaying == false){ // If not already playing...
quicksandjonas 2:73b5ca784164 252 play = true;
quicksandjonas 2:73b5ca784164 253 LED_0 = 1;
quicksandjonas 2:73b5ca784164 254 LED_1 = 1;
quicksandjonas 2:73b5ca784164 255 LED_2 = 1;
quicksandjonas 2:73b5ca784164 256 LED_3 = 1;
quicksandjonas 2:73b5ca784164 257 }
quicksandjonas 2:73b5ca784164 258 if(busyPlaying == true && player1 != true){ // When playing and there is no winner yet...
quicksandjonas 2:73b5ca784164 259 player2 = true;
quicksandjonas 2:73b5ca784164 260 }
quicksandjonas 2:73b5ca784164 261
quicksandjonas 1:00a17f5a247c 262 }
quicksandjonas 1:00a17f5a247c 263
quicksandjonas 1:00a17f5a247c 264 /* ISR for serial timeout */
quicksandjonas 1:00a17f5a247c 265 void sertmout()
quicksandjonas 1:00a17f5a247c 266 {
quicksandjonas 1:00a17f5a247c 267 ser_timeout = true;
quicksandjonas 1:00a17f5a247c 268 }