Quicksand micro-electronics / Mbed 2 deprecated QW-BinaryDices

Dependencies:   mbed

Fork of QW-BinaryDices by Quicksand

Committer:
quicksandjonas
Date:
Tue Dec 13 16:52:23 2016 +0000
Revision:
1:00a17f5a247c
Parent:
0:6c17d1a79f75
This program simulates a dual dice throw. The result is shown in binary on the 4 leds and is transmitted via Sigfox.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quicksandjonas 1:00a17f5a247c 1 /* This program demonstrates how to use the board to simulate a dual dice throw.
quicksandjonas 1:00a17f5a247c 2 * The result is displayed in binary on the leds and transmitted via Sigfox.
quicksandjonas 1:00a17f5a247c 3 * Open a serial console to the board to see extra info.
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
quicksandjonas 1:00a17f5a247c 24
quicksandjonas 1:00a17f5a247c 25 /* Function prototypes */
quicksandjonas 1:00a17f5a247c 26 void sw1interrupt();
quicksandjonas 1:00a17f5a247c 27 void sw2interrupt();
quicksandjonas 1:00a17f5a247c 28 void sertmout();
quicksandjonas 1:00a17f5a247c 29 bool modem_command_check_ok(char * command);
quicksandjonas 1:00a17f5a247c 30 void modem_setup();
quicksandjonas 1:00a17f5a247c 31
quicksandjonas 1:00a17f5a247c 32 bool ser_timeout = false;
quicksandjonas 1:00a17f5a247c 33
quicksandjonas 1:00a17f5a247c 34
quicksandjonas 1:00a17f5a247c 35 /* Serial port over USB */
quicksand 0:6c17d1a79f75 36 Serial pc(USBTX, USBRX);
quicksandjonas 1:00a17f5a247c 37
quicksandjonas 1:00a17f5a247c 38 /* Serial connection to sigfox modem */
quicksand 0:6c17d1a79f75 39 Serial modem(PA_9, PA_10);
quicksand 0:6c17d1a79f75 40
quicksandjonas 1:00a17f5a247c 41 bool dice1 = false;
quicksandjonas 1:00a17f5a247c 42 bool dice2 = false;
quicksandjonas 1:00a17f5a247c 43 uint8_t dice1val;
quicksandjonas 1:00a17f5a247c 44 uint8_t dice2val;
quicksandjonas 1:00a17f5a247c 45 uint8_t number;
quicksand 0:6c17d1a79f75 46
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 1:00a17f5a247c 67 srand((unsigned) time(&t));
quicksand 0:6c17d1a79f75 68
quicksand 0:6c17d1a79f75 69 while(1) {
quicksandjonas 1:00a17f5a247c 70
quicksandjonas 1:00a17f5a247c 71 if(dice1 == true && dice2 == true){
quicksandjonas 1:00a17f5a247c 72 number = dice1val + dice2val;
quicksandjonas 1:00a17f5a247c 73 pc.printf("\nThe number is: %d\n\r", number);
quicksandjonas 1:00a17f5a247c 74
quicksandjonas 1:00a17f5a247c 75 switch(number) {
quicksandjonas 1:00a17f5a247c 76 case 2 :
quicksandjonas 1:00a17f5a247c 77 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 78 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 79 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 80 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 81 break;
quicksandjonas 1:00a17f5a247c 82 case 3 :
quicksandjonas 1:00a17f5a247c 83 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 84 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 85 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 86 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 87 break;
quicksandjonas 1:00a17f5a247c 88 case 4 :
quicksandjonas 1:00a17f5a247c 89 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 90 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 91 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 92 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 93 break;
quicksandjonas 1:00a17f5a247c 94 case 5 :
quicksandjonas 1:00a17f5a247c 95 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 96 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 97 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 98 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 99 break;
quicksandjonas 1:00a17f5a247c 100 case 6 :
quicksandjonas 1:00a17f5a247c 101 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 102 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 103 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 104 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 105 break;
quicksandjonas 1:00a17f5a247c 106 case 7 :
quicksandjonas 1:00a17f5a247c 107 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 108 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 109 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 110 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 111 break;
quicksandjonas 1:00a17f5a247c 112 case 8 :
quicksandjonas 1:00a17f5a247c 113 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 114 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 115 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 116 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 117 break;
quicksandjonas 1:00a17f5a247c 118 case 9 :
quicksandjonas 1:00a17f5a247c 119 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 120 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 121 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 122 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 123 break;
quicksandjonas 1:00a17f5a247c 124 case 10 :
quicksandjonas 1:00a17f5a247c 125 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 126 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 127 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 128 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 129 break;
quicksandjonas 1:00a17f5a247c 130 case 11 :
quicksandjonas 1:00a17f5a247c 131 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 132 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 133 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 134 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 135 break;
quicksandjonas 1:00a17f5a247c 136 case 12 :
quicksandjonas 1:00a17f5a247c 137 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 138 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 139 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 140 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 141 break;
quicksandjonas 1:00a17f5a247c 142 default :
quicksandjonas 1:00a17f5a247c 143 pc.printf("\nImpossible number!!\n\r");
quicksandjonas 1:00a17f5a247c 144 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 145 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 146 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 147 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 148 }
quicksandjonas 1:00a17f5a247c 149 char command[SER_BUFFER_SIZE];
quicksandjonas 1:00a17f5a247c 150 sprintf(command, "AT$SF=04%04x,2,0\n", (int) number );
quicksandjonas 1:00a17f5a247c 151 pc.printf("Sending thrown number = %i over Sigfox using modem command: %s\n", number , command);
quicksandjonas 1:00a17f5a247c 152 modem_command_check_ok(command);
quicksandjonas 1:00a17f5a247c 153 //wait_ms(5000);
quicksandjonas 1:00a17f5a247c 154 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 155 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 156 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 157 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 158 dice1 = false;
quicksandjonas 1:00a17f5a247c 159 dice2 = false;
quicksandjonas 1:00a17f5a247c 160 }
quicksandjonas 1:00a17f5a247c 161
quicksand 0:6c17d1a79f75 162 }
quicksandjonas 1:00a17f5a247c 163 }
quicksandjonas 1:00a17f5a247c 164 void modem_setup()
quicksandjonas 1:00a17f5a247c 165 {
quicksandjonas 1:00a17f5a247c 166 /* Reset to factory defaults */
quicksandjonas 1:00a17f5a247c 167 if(modem_command_check_ok("AT&F"))
quicksandjonas 1:00a17f5a247c 168 {
quicksandjonas 1:00a17f5a247c 169 pc.printf("Factory reset succesfull\r\n");
quicksandjonas 1:00a17f5a247c 170 }
quicksandjonas 1:00a17f5a247c 171 else
quicksandjonas 1:00a17f5a247c 172 {
quicksandjonas 1:00a17f5a247c 173 pc.printf("Factory reset TD120x failed\r\n");
quicksandjonas 1:00a17f5a247c 174 }
quicksandjonas 1:00a17f5a247c 175 /* Disable local echo */
quicksandjonas 1:00a17f5a247c 176 modem.printf("ATE0\n");
quicksandjonas 1:00a17f5a247c 177 if(modem_command_check_ok("ATE0"))
quicksandjonas 1:00a17f5a247c 178 {
quicksandjonas 1:00a17f5a247c 179 pc.printf("Local echo disabled\r\n");
quicksandjonas 1:00a17f5a247c 180 }
quicksandjonas 1:00a17f5a247c 181 /* Write to mem */
quicksandjonas 1:00a17f5a247c 182 if(modem_command_check_ok("AT&W"))
quicksandjonas 1:00a17f5a247c 183 {
quicksandjonas 1:00a17f5a247c 184 pc.printf("Settings saved!\r\n");
quicksandjonas 1:00a17f5a247c 185 }
quicksandjonas 1:00a17f5a247c 186 }
quicksandjonas 1:00a17f5a247c 187
quicksandjonas 1:00a17f5a247c 188 bool modem_command_check_ok(char * command)
quicksandjonas 1:00a17f5a247c 189 {
quicksandjonas 1:00a17f5a247c 190 /* first clear serial data buffers */
quicksandjonas 1:00a17f5a247c 191 while(modem.readable()) modem.getc();
quicksandjonas 1:00a17f5a247c 192 /* Timeout for response of the modem */
quicksandjonas 1:00a17f5a247c 193 Timeout tmout;
quicksandjonas 1:00a17f5a247c 194 ser_timeout = false;
quicksandjonas 1:00a17f5a247c 195 /* Buffer for incoming data */
quicksandjonas 1:00a17f5a247c 196 char responsebuffer[6];
quicksandjonas 1:00a17f5a247c 197 /* Flag to set when we get 'OK' response */
quicksandjonas 1:00a17f5a247c 198 bool ok = false;
quicksandjonas 1:00a17f5a247c 199 bool error = false;
quicksandjonas 1:00a17f5a247c 200 /* Print command to TD120x */
quicksandjonas 1:00a17f5a247c 201 modem.printf(command);
quicksandjonas 1:00a17f5a247c 202 /* Newline to activate command */
quicksandjonas 1:00a17f5a247c 203 modem.printf("\n");
quicksandjonas 1:00a17f5a247c 204 /* Wait untill serial feedback, min 7 seconds before timeout */
quicksandjonas 1:00a17f5a247c 205 tmout.attach(&sertmout, 7.0);
quicksandjonas 1:00a17f5a247c 206 while(!modem.readable()&& ser_timeout == false);
quicksandjonas 1:00a17f5a247c 207 while(!ok && !ser_timeout && !error)
quicksandjonas 1:00a17f5a247c 208 {
quicksandjonas 1:00a17f5a247c 209 if(modem.readable())
quicksandjonas 1:00a17f5a247c 210 {
quicksandjonas 1:00a17f5a247c 211 for(int i = 0; i < 5; i++)
quicksandjonas 1:00a17f5a247c 212 {
quicksandjonas 1:00a17f5a247c 213 responsebuffer[i] = responsebuffer[i+1];
quicksandjonas 1:00a17f5a247c 214 }
quicksandjonas 1:00a17f5a247c 215 responsebuffer[5] = modem.getc();
quicksandjonas 1:00a17f5a247c 216 if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' )
quicksandjonas 1:00a17f5a247c 217 {
quicksandjonas 1:00a17f5a247c 218 ok = true;
quicksandjonas 1:00a17f5a247c 219 }
quicksandjonas 1:00a17f5a247c 220 else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' )
quicksandjonas 1:00a17f5a247c 221 {
quicksandjonas 1:00a17f5a247c 222 error = true;
quicksandjonas 1:00a17f5a247c 223 }
quicksandjonas 1:00a17f5a247c 224 }
quicksandjonas 1:00a17f5a247c 225 }
quicksandjonas 1:00a17f5a247c 226 tmout.detach();
quicksandjonas 1:00a17f5a247c 227 return ok;
quicksandjonas 1:00a17f5a247c 228 }
quicksandjonas 1:00a17f5a247c 229 /* Button 1 ISR */
quicksandjonas 1:00a17f5a247c 230 void sw1interrupt()
quicksandjonas 1:00a17f5a247c 231 {
quicksandjonas 1:00a17f5a247c 232 if(dice1 == false){
quicksandjonas 1:00a17f5a247c 233 pc.printf("\nDice 1 has been thrown\n\r");
quicksandjonas 1:00a17f5a247c 234 dice1 = true;
quicksandjonas 1:00a17f5a247c 235 dice1val = (rand() % 6)+1;
quicksandjonas 1:00a17f5a247c 236 }
quicksandjonas 1:00a17f5a247c 237 else{
quicksandjonas 1:00a17f5a247c 238 pc.printf("\nDice 1 has already been thrown\n\r");
quicksandjonas 1:00a17f5a247c 239 }
quicksandjonas 1:00a17f5a247c 240
quicksandjonas 1:00a17f5a247c 241 }
quicksandjonas 1:00a17f5a247c 242
quicksandjonas 1:00a17f5a247c 243 /* Button 2 ISR */
quicksandjonas 1:00a17f5a247c 244 void sw2interrupt()
quicksandjonas 1:00a17f5a247c 245 {
quicksandjonas 1:00a17f5a247c 246 if(dice2 == false){
quicksandjonas 1:00a17f5a247c 247 pc.printf("\nDice 2 has been thrown\n\r");
quicksandjonas 1:00a17f5a247c 248 dice2 = true;
quicksandjonas 1:00a17f5a247c 249 dice2val = (rand() % 6)+1;
quicksandjonas 1:00a17f5a247c 250 }
quicksandjonas 1:00a17f5a247c 251 else{
quicksandjonas 1:00a17f5a247c 252 pc.printf("\nDice 2 has already been thrown\n\r");
quicksandjonas 1:00a17f5a247c 253 }
quicksandjonas 1:00a17f5a247c 254 }
quicksandjonas 1:00a17f5a247c 255
quicksandjonas 1:00a17f5a247c 256 /* ISR for serial timeout */
quicksandjonas 1:00a17f5a247c 257 void sertmout()
quicksandjonas 1:00a17f5a247c 258 {
quicksandjonas 1:00a17f5a247c 259 ser_timeout = true;
quicksandjonas 1:00a17f5a247c 260 }
quicksandjonas 1:00a17f5a247c 261
quicksandjonas 1:00a17f5a247c 262
quicksandjonas 1:00a17f5a247c 263