Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of QW-BinaryDices by
main.cpp@1:00a17f5a247c, 2016-12-13 (annotated)
- 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?
| User | Revision | Line number | New 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 |
