This program simulates a dual dice throw by pushing the 2 buttons on the QW dev kit. The results of the throw are shown in binary on the leds, printed in the console window and transmitted via Sigfox.

Dependencies:   mbed

Fork of QW-BinaryDices by Quicksand

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /* This program demonstrates how to use the board to simulate a dual dice throw.
00002  * The result is displayed in binary on the leds and transmitted via Sigfox.
00003  * Open a serial console to the board to see extra info.
00004  */
00005  
00006 #include "mbed.h"
00007 
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010 
00011 #define SER_BUFFER_SIZE 32
00012 
00013 /* The 4 onboard LEDs */
00014 DigitalOut LED_0 (PB_6);
00015 DigitalOut LED_1 (PA_7);
00016 DigitalOut LED_2 (PA_6);
00017 DigitalOut LED_3 (PA_5);
00018 
00019 /* The 2 user buttons */
00020 InterruptIn SW1(PA_8);
00021 InterruptIn SW2(PB_10);
00022 
00023 
00024 
00025 /* Function prototypes */
00026 void sw1interrupt();
00027 void sw2interrupt();
00028 void sertmout();
00029 bool modem_command_check_ok(char * command);
00030 void modem_setup();
00031 
00032 bool ser_timeout = false; 
00033 
00034 
00035 /* Serial port over USB */
00036 Serial pc(USBTX, USBRX);
00037 
00038 /* Serial connection to sigfox modem */
00039 Serial modem(PA_9, PA_10);
00040 
00041 bool dice1 = false;
00042 bool dice2 = false;
00043 uint8_t dice1val;
00044 uint8_t dice2val;
00045 uint8_t number;
00046 
00047 
00048 int main() {   
00049     
00050     time_t t;
00051     
00052     /* Setup TD120x */
00053     wait(3);
00054     modem_setup();
00055     
00056     /* Turn off all LED */
00057     LED_0 = 1;
00058     LED_1 = 1;
00059     LED_2 = 1;
00060     LED_3 = 1;
00061     
00062     /* Setup button interrupts */    
00063     SW1.fall(&sw1interrupt);
00064     SW2.fall(&sw2interrupt); 
00065     
00066     /* Intializes random number generator */
00067     srand((unsigned) time(&t));     
00068     
00069     while(1) { 
00070         
00071         if(dice1 == true && dice2 == true){
00072             number = dice1val + dice2val;
00073             pc.printf("\nThe number is: %d\n\r", number);            
00074             
00075             switch(number) {
00076                 case 2  :
00077                     LED_0 = 1;
00078                     LED_1 = 1;
00079                     LED_2 = 0;
00080                     LED_3 = 1;
00081                     break; 
00082                 case 3  :
00083                     LED_0 = 1;
00084                     LED_1 = 1;
00085                     LED_2 = 0;
00086                     LED_3 = 0;
00087                     break;
00088                 case 4  :
00089                     LED_0 = 1;
00090                     LED_1 = 0;
00091                     LED_2 = 1;
00092                     LED_3 = 1;
00093                     break; 
00094                 case 5  :
00095                     LED_0 = 1;
00096                     LED_1 = 0;
00097                     LED_2 = 1;
00098                     LED_3 = 0;
00099                     break; 
00100                 case 6  :
00101                     LED_0 = 1;
00102                     LED_1 = 0;
00103                     LED_2 = 0;
00104                     LED_3 = 1;
00105                     break; 
00106                 case 7 :
00107                     LED_0 = 1;
00108                     LED_1 = 0;
00109                     LED_2 = 0;
00110                     LED_3 = 0;
00111                     break; 
00112                 case 8  :
00113                     LED_0 = 0;
00114                     LED_1 = 1;
00115                     LED_2 = 1;
00116                     LED_3 = 1;
00117                     break;
00118                 case 9  :
00119                     LED_0 = 0;
00120                     LED_1 = 1;
00121                     LED_2 = 1;
00122                     LED_3 = 0;
00123                     break; 
00124                 case 10 :
00125                     LED_0 = 0;
00126                     LED_1 = 1;
00127                     LED_2 = 0;
00128                     LED_3 = 1;
00129                     break; 
00130                 case 11  :
00131                     LED_0 = 0;
00132                     LED_1 = 1;
00133                     LED_2 = 0;
00134                     LED_3 = 0;
00135                     break;  
00136                 case 12  :
00137                     LED_0 = 0;
00138                     LED_1 = 0;
00139                     LED_2 = 1;
00140                     LED_3 = 1;
00141                     break;                
00142                 default : 
00143                     pc.printf("\nImpossible number!!\n\r");
00144                     LED_0 = 1;
00145                     LED_1 = 1;
00146                     LED_2 = 1;
00147                     LED_3 = 1;
00148             }
00149             char command[SER_BUFFER_SIZE];
00150             sprintf(command, "AT$SF=04%04x,2,0\n", (int) number );
00151             pc.printf("Sending thrown number =  %i over Sigfox using modem command: %s\n", number , command);
00152             modem_command_check_ok(command);
00153             //wait_ms(5000);
00154             LED_0 = 1;
00155             LED_1 = 1;
00156             LED_2 = 1;
00157             LED_3 = 1;
00158             dice1 = false;
00159             dice2 = false;
00160         }        
00161         
00162     }
00163 }
00164 void modem_setup()
00165 {
00166     /* Reset to factory defaults */
00167     if(modem_command_check_ok("AT&F")) 
00168     {
00169         pc.printf("Factory reset succesfull\r\n");
00170     }
00171     else 
00172     {
00173         pc.printf("Factory reset TD120x failed\r\n");
00174     }
00175     /* Disable local echo */
00176     modem.printf("ATE0\n");
00177     if(modem_command_check_ok("ATE0")) 
00178     {
00179         pc.printf("Local echo disabled\r\n");
00180     }
00181     /* Write to mem */
00182     if(modem_command_check_ok("AT&W")) 
00183     {
00184         pc.printf("Settings saved!\r\n");
00185     }    
00186 }
00187 
00188 bool modem_command_check_ok(char * command)
00189 {
00190     /* first clear serial data buffers */
00191     while(modem.readable()) modem.getc();
00192     /* Timeout for response of the modem */
00193     Timeout tmout;
00194     ser_timeout = false;
00195     /* Buffer for incoming data */
00196     char responsebuffer[6];
00197     /* Flag to set when we get 'OK' response */
00198     bool ok = false;
00199     bool error = false;
00200     /* Print command to TD120x */
00201     modem.printf(command);
00202     /* Newline to activate command */
00203     modem.printf("\n");
00204     /* Wait untill serial feedback, min 7 seconds before timeout */
00205     tmout.attach(&sertmout, 7.0);
00206     while(!modem.readable()&& ser_timeout == false);
00207     while(!ok && !ser_timeout && !error) 
00208     {
00209         if(modem.readable()) 
00210         {
00211             for(int i = 0; i < 5; i++)
00212             {
00213                 responsebuffer[i] = responsebuffer[i+1];
00214             }
00215             responsebuffer[5] = modem.getc();
00216             if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' ) 
00217             {
00218                 ok = true;
00219             }
00220             else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' ) 
00221             {
00222                 error = true;
00223             }
00224         }
00225     }
00226     tmout.detach();
00227     return ok;
00228 }
00229 /* Button 1 ISR */
00230 void sw1interrupt()
00231 {
00232     if(dice1 == false){
00233         pc.printf("\nDice 1 has been thrown\n\r");
00234         dice1 =  true; 
00235         dice1val = (rand() % 6)+1; 
00236     }
00237     else{
00238         pc.printf("\nDice 1 has already been thrown\n\r");
00239     }
00240          
00241 }
00242 
00243 /* Button 2 ISR */
00244 void sw2interrupt()
00245 {
00246     if(dice2 == false){
00247         pc.printf("\nDice 2 has been thrown\n\r");
00248         dice2 =  true; 
00249         dice2val = (rand() % 6)+1; 
00250     }
00251     else{
00252         pc.printf("\nDice 2 has already been thrown\n\r");
00253     }
00254 }
00255 
00256 /* ISR for serial timeout */
00257 void sertmout()
00258 {
00259     ser_timeout = true;
00260 }
00261 
00262 
00263