This program is a reaction time game for two players on the QW dev kit. The winner and his reaction time are shown in the console window and transmitted via Sigfox.

Dependencies:   mbed

Fork of QW-Reactiontime by Quicksand

QW Reaction Time Game

This program is a reaction time game for two players on the QW dev kit. The winner and his reaction time are shown in the console window and transmitted via Sigfox.

Code explanation

The program starts with the initialisation/declaration of the leds and pushbuttons. Also the necessary function prototypes and serial communications are declared. After that, the program is waiting to start the game. While the program is waiting, the leds are looping. Instructions to play the game are displayed in the console window. The game is started by pushing one of the buttons. Then the two players have to wait till all four leds turn on to push their button. The player that pushes the fastest after the leds turn on is the winner. The results of the game are shown in the console window and transmitted via Sigfox.

Sigfox message payload

First there is the "06", this is the Quicksand ID of the example program. This is used by Quicksand to keep track of our example programs. The second value that is transmitted is the ID of the winner. The third and last value that is transmitted is the reaction time of the winner.

More information and other example code can be found on the component page by clicking the link below: https://developer.mbed.org/components/QW-SIGFOX-Development-Kit/

Committer:
quicksand
Date:
Thu Dec 15 13:27:19 2016 +0000
Revision:
3:1bc9575369bd
Parent:
2:73b5ca784164
changed program ID in Sigfox message

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];
quicksand 3:1bc9575369bd 117 sprintf(command, "AT$SF=06%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];
quicksand 3:1bc9575369bd 138 sprintf(command, "AT$SF=06%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 }