master

Dependencies:   mbed

Fork of ESE350-Whack-a-Mole by Eric Berdinis

Committer:
shibulal
Date:
Thu Oct 22 02:16:41 2015 +0000
Revision:
3:3c0c008bacb3
Parent:
2:4c79ab84c285
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mlab4 0:ddc820578cb0 1 #include "mbed.h"
mlab4 0:ddc820578cb0 2 #include "MRF24J40.h"
shibulal 1:d905afad53c0 3 #include <string>
mlab4 0:ddc820578cb0 4
shibulal 1:d905afad53c0 5
mlab4 0:ddc820578cb0 6
mlab4 0:ddc820578cb0 7 // RF tranceiver to link with handheld.
mlab4 0:ddc820578cb0 8 MRF24J40 mrf(p11, p12, p13, p14, p21);
mlab4 0:ddc820578cb0 9
mlab4 0:ddc820578cb0 10 // LEDs you can treat these as variables (led2 = 1 will turn led2 on!)
mlab4 0:ddc820578cb0 11 DigitalOut led1(LED1);
mlab4 0:ddc820578cb0 12 DigitalOut led2(LED2);
mlab4 0:ddc820578cb0 13 DigitalOut led3(LED3);
mlab4 0:ddc820578cb0 14 DigitalOut led4(LED4);
mlab4 0:ddc820578cb0 15
mlab4 0:ddc820578cb0 16 // Timer
mlab4 0:ddc820578cb0 17 Timer timer;
mlab4 0:ddc820578cb0 18
mlab4 0:ddc820578cb0 19 // Serial port for showing RX data.
mlab4 0:ddc820578cb0 20 Serial pc(USBTX, USBRX);
mlab4 0:ddc820578cb0 21
mlab4 0:ddc820578cb0 22 // Used for sending and receiving
mlab4 0:ddc820578cb0 23 char txBuffer[128];
mlab4 0:ddc820578cb0 24 char rxBuffer[128];
mlab4 0:ddc820578cb0 25 int rxLen;
mlab4 0:ddc820578cb0 26
mlab4 0:ddc820578cb0 27 //***************** Do not change these methods (please) *****************//
mlab4 0:ddc820578cb0 28
mlab4 0:ddc820578cb0 29 /**
mlab4 0:ddc820578cb0 30 * Receive data from the MRF24J40.
mlab4 0:ddc820578cb0 31 *
mlab4 0:ddc820578cb0 32 * @param data A pointer to a char array to hold the data
mlab4 0:ddc820578cb0 33 * @param maxLength The max amount of data to read.
mlab4 0:ddc820578cb0 34 */
mlab4 0:ddc820578cb0 35 int rf_receive(char *data, uint8_t maxLength)
mlab4 0:ddc820578cb0 36 {
mlab4 0:ddc820578cb0 37 uint8_t len = mrf.Receive((uint8_t *)data, maxLength);
mlab4 0:ddc820578cb0 38 uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00};
mlab4 0:ddc820578cb0 39
mlab4 0:ddc820578cb0 40 if(len > 10) {
mlab4 0:ddc820578cb0 41 //Remove the header and footer of the message
mlab4 0:ddc820578cb0 42 for(uint8_t i = 0; i < len-2; i++) {
mlab4 0:ddc820578cb0 43 if(i<8) {
mlab4 0:ddc820578cb0 44 //Make sure our header is valid first
mlab4 0:ddc820578cb0 45 if(data[i] != header[i])
mlab4 0:ddc820578cb0 46 return 0;
mlab4 0:ddc820578cb0 47 } else {
mlab4 0:ddc820578cb0 48 data[i-8] = data[i];
mlab4 0:ddc820578cb0 49 }
mlab4 0:ddc820578cb0 50 }
mlab4 0:ddc820578cb0 51
mlab4 0:ddc820578cb0 52 //pc.printf("Received: %s length:%d\r\n", data, ((int)len)-10);
mlab4 0:ddc820578cb0 53 }
mlab4 0:ddc820578cb0 54 return ((int)len)-10;
mlab4 0:ddc820578cb0 55 }
mlab4 0:ddc820578cb0 56
mlab4 0:ddc820578cb0 57 /**
mlab4 0:ddc820578cb0 58 * Send data to another MRF24J40.
mlab4 0:ddc820578cb0 59 *
mlab4 0:ddc820578cb0 60 * @param data The string to send
mlab4 0:ddc820578cb0 61 * @param maxLength The length of the data to send.
mlab4 0:ddc820578cb0 62 * If you are sending a null-terminated string you can pass strlen(data)+1
mlab4 0:ddc820578cb0 63 */
mlab4 0:ddc820578cb0 64 void rf_send(char *data, uint8_t len)
mlab4 0:ddc820578cb0 65 {
mlab4 0:ddc820578cb0 66 //We need to prepend the message with a valid ZigBee header
mlab4 0:ddc820578cb0 67 uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00};
mlab4 0:ddc820578cb0 68 uint8_t *send_buf = (uint8_t *) malloc( sizeof(uint8_t) * (len+8) );
mlab4 0:ddc820578cb0 69
mlab4 0:ddc820578cb0 70 for(uint8_t i = 0; i < len+8; i++) {
mlab4 0:ddc820578cb0 71 //prepend the 8-byte header
mlab4 0:ddc820578cb0 72 send_buf[i] = (i<8) ? header[i] : data[i-8];
mlab4 0:ddc820578cb0 73 }
mlab4 0:ddc820578cb0 74 //pc.printf("Sent: %s\r\n", send_buf+8);
mlab4 0:ddc820578cb0 75
mlab4 0:ddc820578cb0 76 mrf.Send(send_buf, len+8);
mlab4 0:ddc820578cb0 77 free(send_buf);
mlab4 0:ddc820578cb0 78 }
mlab4 0:ddc820578cb0 79
mlab4 0:ddc820578cb0 80
mlab4 0:ddc820578cb0 81 //***************** You can start coding here *****************//
mlab4 0:ddc820578cb0 82 int main (void)
mlab4 0:ddc820578cb0 83 {
shibulal 2:4c79ab84c285 84 uint8_t channel = 5;
shibulal 1:d905afad53c0 85
mlab4 0:ddc820578cb0 86 //Set the Channel. 0 is default, 15 is max
mlab4 0:ddc820578cb0 87 mrf.SetChannel(channel);
shibulal 1:d905afad53c0 88 int action;
shibulal 1:d905afad53c0 89 int round_counter;
shibulal 1:d905afad53c0 90 int score_counter;
shibulal 3:3c0c008bacb3 91 int best_score=0;
shibulal 3:3c0c008bacb3 92 int level;
shibulal 3:3c0c008bacb3 93 int number_of_nodes=2;
shibulal 1:d905afad53c0 94 char input;
shibulal 3:3c0c008bacb3 95 bool confirmed;
mlab4 0:ddc820578cb0 96 //Start the timer
mlab4 0:ddc820578cb0 97 timer.start();
shibulal 3:3c0c008bacb3 98 if (number_of_nodes>=3){
shibulal 3:3c0c008bacb3 99 confirmed=false;
shibulal 3:3c0c008bacb3 100 strcpy(txBuffer, "check_3");
shibulal 3:3c0c008bacb3 101 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 3:3c0c008bacb3 102 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 3:3c0c008bacb3 103 timer.reset();
shibulal 3:3c0c008bacb3 104 while(timer.read_ms()<2000){
shibulal 3:3c0c008bacb3 105 rxLen = rf_receive(rxBuffer, 128);
shibulal 3:3c0c008bacb3 106 if (rxLen>0){
shibulal 3:3c0c008bacb3 107 pc.printf("Received: %s\r\n", rxBuffer);
shibulal 3:3c0c008bacb3 108 //strcpy(rxBuffer,"");
shibulal 3:3c0c008bacb3 109 if(!strcmp("confirm_3", rxBuffer)) {
shibulal 3:3c0c008bacb3 110 confirmed=true;
shibulal 3:3c0c008bacb3 111 pc.printf("Node 3 alive\r\n");
shibulal 3:3c0c008bacb3 112 break;
shibulal 3:3c0c008bacb3 113 }
shibulal 3:3c0c008bacb3 114 }
shibulal 3:3c0c008bacb3 115 }
shibulal 3:3c0c008bacb3 116 if (!confirmed){
shibulal 3:3c0c008bacb3 117 pc.printf("Node 3 is dead. Repair your hardware!!!");
shibulal 3:3c0c008bacb3 118 return 0;
shibulal 3:3c0c008bacb3 119 }
shibulal 3:3c0c008bacb3 120 }
shibulal 3:3c0c008bacb3 121 if (number_of_nodes>=2){
shibulal 3:3c0c008bacb3 122 confirmed=false;
shibulal 3:3c0c008bacb3 123 strcpy(txBuffer, "check_2");
shibulal 3:3c0c008bacb3 124 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 3:3c0c008bacb3 125 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 3:3c0c008bacb3 126 timer.reset();
shibulal 3:3c0c008bacb3 127 while(timer.read_ms()<2000){
shibulal 3:3c0c008bacb3 128 rxLen = rf_receive(rxBuffer, 128);
shibulal 3:3c0c008bacb3 129 if (rxLen>0){
shibulal 3:3c0c008bacb3 130 pc.printf("Received: %s\r\n", rxBuffer);
shibulal 3:3c0c008bacb3 131 //strcpy(rxBuffer,"");
shibulal 3:3c0c008bacb3 132 if(!strcmp("confirm_2", rxBuffer)) {
shibulal 3:3c0c008bacb3 133 confirmed=true;
shibulal 3:3c0c008bacb3 134 pc.printf("Node 2 alive\r\n");
shibulal 3:3c0c008bacb3 135 break;
shibulal 3:3c0c008bacb3 136 }
shibulal 3:3c0c008bacb3 137 }
shibulal 3:3c0c008bacb3 138 }
shibulal 3:3c0c008bacb3 139 if (!confirmed){
shibulal 3:3c0c008bacb3 140 pc.printf("Node 2 is dead. Repair your hardware!!!");
shibulal 3:3c0c008bacb3 141 return 0;
shibulal 3:3c0c008bacb3 142 }
shibulal 3:3c0c008bacb3 143 }
shibulal 3:3c0c008bacb3 144 if (number_of_nodes>=1){
shibulal 3:3c0c008bacb3 145 confirmed=false;
shibulal 3:3c0c008bacb3 146 strcpy(txBuffer, "check_1");
shibulal 3:3c0c008bacb3 147 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 3:3c0c008bacb3 148 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 3:3c0c008bacb3 149 timer.reset();
shibulal 3:3c0c008bacb3 150 while(timer.read_ms()<2000){
shibulal 3:3c0c008bacb3 151 rxLen = rf_receive(rxBuffer, 128);
shibulal 3:3c0c008bacb3 152 if (rxLen>0){
shibulal 3:3c0c008bacb3 153 pc.printf("Received: %s\r\n", rxBuffer);
shibulal 3:3c0c008bacb3 154 //strcpy(rxBuffer,"");
shibulal 3:3c0c008bacb3 155 if(!strcmp("confirm_1", rxBuffer)) {
shibulal 3:3c0c008bacb3 156 confirmed=true;
shibulal 3:3c0c008bacb3 157 pc.printf("Node 1 alive\r\n");
shibulal 3:3c0c008bacb3 158 break;
shibulal 3:3c0c008bacb3 159 }
shibulal 3:3c0c008bacb3 160 }
shibulal 3:3c0c008bacb3 161 }
shibulal 3:3c0c008bacb3 162 if (!confirmed){
shibulal 3:3c0c008bacb3 163 pc.printf("Node 1 is dead. Repair your hardware!!!");
shibulal 3:3c0c008bacb3 164 return 0;
shibulal 3:3c0c008bacb3 165 }
shibulal 3:3c0c008bacb3 166 }
shibulal 3:3c0c008bacb3 167 while (true){
shibulal 3:3c0c008bacb3 168 pc.printf("Enter Level (1-3) \r\n");
shibulal 3:3c0c008bacb3 169 input=pc.getc();
shibulal 3:3c0c008bacb3 170 if (input=='1'){
shibulal 3:3c0c008bacb3 171 level=1;
shibulal 3:3c0c008bacb3 172 break;
shibulal 3:3c0c008bacb3 173 }
shibulal 3:3c0c008bacb3 174 else if (input=='2'){
shibulal 3:3c0c008bacb3 175 level=2;
shibulal 3:3c0c008bacb3 176 break;
shibulal 3:3c0c008bacb3 177 }
shibulal 3:3c0c008bacb3 178 else if (input=='3'){
shibulal 3:3c0c008bacb3 179 level=3;
shibulal 3:3c0c008bacb3 180 break;
shibulal 3:3c0c008bacb3 181 }
shibulal 3:3c0c008bacb3 182 }
shibulal 3:3c0c008bacb3 183 while (true){
shibulal 3:3c0c008bacb3 184 pc.printf("Press 's' to start \r\n");
shibulal 3:3c0c008bacb3 185 input=pc.getc();
shibulal 3:3c0c008bacb3 186 if (input=='s'){
shibulal 3:3c0c008bacb3 187 break;
shibulal 3:3c0c008bacb3 188 }
shibulal 3:3c0c008bacb3 189 }
mlab4 0:ddc820578cb0 190 while(true) {
shibulal 3:3c0c008bacb3 191
shibulal 1:d905afad53c0 192 pc.printf("start!");
shibulal 1:d905afad53c0 193 round_counter=0;
shibulal 1:d905afad53c0 194 score_counter=0;
shibulal 1:d905afad53c0 195 while(round_counter<10){
shibulal 3:3c0c008bacb3 196 action = rand()%(number_of_nodes+1);
shibulal 1:d905afad53c0 197 if(action==0){
shibulal 3:3c0c008bacb3 198 wait_ms(1000/level);
shibulal 1:d905afad53c0 199 }
shibulal 1:d905afad53c0 200 else if (action==1){
shibulal 1:d905afad53c0 201 timer.reset();
shibulal 1:d905afad53c0 202 strcpy(txBuffer, "activate_1");
shibulal 2:4c79ab84c285 203 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 2:4c79ab84c285 204 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 1:d905afad53c0 205 while(true){
shibulal 3:3c0c008bacb3 206 rxLen = rf_receive(rxBuffer, 128);
shibulal 3:3c0c008bacb3 207 if (timer.read_ms()>((1000+(500*(10-round_counter)))/level)){
shibulal 3:3c0c008bacb3 208 strcpy(txBuffer, "time_out_1");
shibulal 3:3c0c008bacb3 209 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 3:3c0c008bacb3 210 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 3:3c0c008bacb3 211 score_counter+=((500*(10-round_counter))/level)+2000;
shibulal 3:3c0c008bacb3 212 break;
shibulal 3:3c0c008bacb3 213 }
shibulal 3:3c0c008bacb3 214 else if (rxLen>0){
shibulal 2:4c79ab84c285 215 pc.printf("Received: %s\r\n", rxBuffer);
shibulal 2:4c79ab84c285 216 if(!strcmp("finished_1", rxBuffer)) {
shibulal 3:3c0c008bacb3 217 score_counter+=timer.read_ms();
shibulal 2:4c79ab84c285 218 break;
shibulal 2:4c79ab84c285 219 }
shibulal 1:d905afad53c0 220 }
shibulal 1:d905afad53c0 221 }
shibulal 1:d905afad53c0 222 round_counter++;
shibulal 1:d905afad53c0 223 }
shibulal 1:d905afad53c0 224 else if (action==2){
shibulal 1:d905afad53c0 225 timer.reset();
shibulal 1:d905afad53c0 226 strcpy(txBuffer, "activate_2");
shibulal 2:4c79ab84c285 227 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 2:4c79ab84c285 228 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 1:d905afad53c0 229 while(true){
shibulal 3:3c0c008bacb3 230 rxLen = rf_receive(rxBuffer, 128);
shibulal 3:3c0c008bacb3 231 if (timer.read_ms()>((1000+(500*(10-round_counter)))/level)){
shibulal 3:3c0c008bacb3 232 strcpy(txBuffer, "time_out_2");
shibulal 3:3c0c008bacb3 233 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 3:3c0c008bacb3 234 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 3:3c0c008bacb3 235 score_counter+=((500*(10-round_counter))/level)+2000;
shibulal 3:3c0c008bacb3 236 break;
shibulal 3:3c0c008bacb3 237 }
shibulal 3:3c0c008bacb3 238 else if (rxLen>0){
shibulal 3:3c0c008bacb3 239 pc.printf("Received: %s\r\n", rxBuffer);
shibulal 3:3c0c008bacb3 240 if(!strcmp("finished_2", rxBuffer)) {
shibulal 3:3c0c008bacb3 241 score_counter+=timer.read_ms();
shibulal 2:4c79ab84c285 242 break;
shibulal 2:4c79ab84c285 243 }
shibulal 1:d905afad53c0 244 }
shibulal 1:d905afad53c0 245 }
shibulal 1:d905afad53c0 246 round_counter++;
shibulal 1:d905afad53c0 247 }
shibulal 1:d905afad53c0 248 else if (action ==3){
shibulal 1:d905afad53c0 249 timer.reset();
shibulal 1:d905afad53c0 250 strcpy(txBuffer, "activate_3");
shibulal 2:4c79ab84c285 251 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 3:3c0c008bacb3 252 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 1:d905afad53c0 253 while(true){
shibulal 3:3c0c008bacb3 254 rxLen = rf_receive(rxBuffer, 128);
shibulal 3:3c0c008bacb3 255 if (timer.read_ms()>((1000+(500*(10-round_counter)))/level)){
shibulal 3:3c0c008bacb3 256 strcpy(txBuffer, "time_out_3");
shibulal 3:3c0c008bacb3 257 rf_send(txBuffer, strlen(txBuffer)+1);
shibulal 3:3c0c008bacb3 258 pc.printf("Sent: %s\r\n", txBuffer);
shibulal 3:3c0c008bacb3 259 score_counter+=((500*(10-round_counter))/level)+2000;
shibulal 3:3c0c008bacb3 260 break;
shibulal 3:3c0c008bacb3 261 }
shibulal 3:3c0c008bacb3 262 else if (rxLen>0){
shibulal 3:3c0c008bacb3 263 pc.printf("Received: %s\r\n", rxBuffer);
shibulal 3:3c0c008bacb3 264 if(!strcmp("finished_3", rxBuffer)) {
shibulal 3:3c0c008bacb3 265 score_counter+=timer.read_ms();
shibulal 2:4c79ab84c285 266 break;
shibulal 2:4c79ab84c285 267 }
shibulal 1:d905afad53c0 268 }
shibulal 1:d905afad53c0 269 }
shibulal 1:d905afad53c0 270 round_counter++;
shibulal 1:d905afad53c0 271 }
mlab4 0:ddc820578cb0 272 }
shibulal 3:3c0c008bacb3 273 pc.printf("Score: %d \r\n", score_counter);
shibulal 3:3c0c008bacb3 274 if (score_counter<best_score){
shibulal 3:3c0c008bacb3 275 best_score=score_counter;
shibulal 3:3c0c008bacb3 276 }
shibulal 3:3c0c008bacb3 277 while (true){
shibulal 3:3c0c008bacb3 278 pc.printf("New game? (y/n)\r\n");
shibulal 3:3c0c008bacb3 279 input=pc.getc();
shibulal 3:3c0c008bacb3 280 if (input=='y'|| input=='n'){
shibulal 3:3c0c008bacb3 281 break;
shibulal 3:3c0c008bacb3 282 }
shibulal 3:3c0c008bacb3 283 }
shibulal 3:3c0c008bacb3 284 if (input=='n'){
shibulal 3:3c0c008bacb3 285 pc.printf("Best Score %d", best_score);
shibulal 3:3c0c008bacb3 286 break;
shibulal 3:3c0c008bacb3 287 }
shibulal 3:3c0c008bacb3 288
mlab4 0:ddc820578cb0 289 }
mlab4 0:ddc820578cb0 290 }