For master node of whack a mole program
Fork of ESE350-Whack-a-Mole by
whack_master.cpp@4:76adb6c7e67d, 2015-11-19 (annotated)
- Committer:
- prithviganeshk
- Date:
- Thu Nov 19 08:11:52 2015 +0000
- Revision:
- 4:76adb6c7e67d
- Parent:
- 3:4f09529d391b
whack
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
prithviganeshk | 1:691460a19f54 | 1 | #include "mbed.h" |
prithviganeshk | 1:691460a19f54 | 2 | #include "MRF24J40.h" |
prithviganeshk | 1:691460a19f54 | 3 | #include <string> |
prithviganeshk | 1:691460a19f54 | 4 | |
prithviganeshk | 1:691460a19f54 | 5 | |
prithviganeshk | 1:691460a19f54 | 6 | // RF tranceiver to link with handheld. |
prithviganeshk | 1:691460a19f54 | 7 | MRF24J40 mrf(p11, p12, p13, p14, p21); |
prithviganeshk | 1:691460a19f54 | 8 | |
prithviganeshk | 1:691460a19f54 | 9 | // LEDs you can treat these as variables (led2 = 1 will turn led2 on!) |
prithviganeshk | 1:691460a19f54 | 10 | DigitalOut led1(LED1); |
prithviganeshk | 1:691460a19f54 | 11 | DigitalOut led2(LED2); |
prithviganeshk | 1:691460a19f54 | 12 | // Timer |
prithviganeshk | 1:691460a19f54 | 13 | Timer timer; |
prithviganeshk | 1:691460a19f54 | 14 | |
prithviganeshk | 1:691460a19f54 | 15 | // Serial port for showing RX data. |
prithviganeshk | 1:691460a19f54 | 16 | Serial pc(USBTX, USBRX); |
prithviganeshk | 1:691460a19f54 | 17 | |
prithviganeshk | 1:691460a19f54 | 18 | // Used for sending and receiving |
prithviganeshk | 1:691460a19f54 | 19 | char txBuffer[128]; |
prithviganeshk | 1:691460a19f54 | 20 | char rxBuffer[128]; |
prithviganeshk | 1:691460a19f54 | 21 | int rxLen; |
prithviganeshk | 1:691460a19f54 | 22 | |
prithviganeshk | 1:691460a19f54 | 23 | //***************** Do not change these methods (please) *****************// |
prithviganeshk | 1:691460a19f54 | 24 | |
prithviganeshk | 1:691460a19f54 | 25 | /** |
prithviganeshk | 1:691460a19f54 | 26 | * Receive data from the MRF24J40. |
prithviganeshk | 1:691460a19f54 | 27 | * |
prithviganeshk | 1:691460a19f54 | 28 | * @param data A pointer to a char array to hold the data |
prithviganeshk | 1:691460a19f54 | 29 | * @param maxLength The max amount of data to read. |
prithviganeshk | 1:691460a19f54 | 30 | */ |
prithviganeshk | 1:691460a19f54 | 31 | int rf_receive(char *data, uint8_t maxLength) |
prithviganeshk | 1:691460a19f54 | 32 | { |
prithviganeshk | 1:691460a19f54 | 33 | uint8_t len = mrf.Receive((uint8_t *)data, maxLength); |
prithviganeshk | 1:691460a19f54 | 34 | uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; |
prithviganeshk | 1:691460a19f54 | 35 | |
prithviganeshk | 1:691460a19f54 | 36 | if(len > 10) { |
prithviganeshk | 1:691460a19f54 | 37 | //Remove the header and footer of the message |
prithviganeshk | 1:691460a19f54 | 38 | for(uint8_t i = 0; i < len-2; i++) { |
prithviganeshk | 1:691460a19f54 | 39 | if(i<8) { |
prithviganeshk | 1:691460a19f54 | 40 | //Make sure our header is valid first |
prithviganeshk | 1:691460a19f54 | 41 | if(data[i] != header[i]) |
prithviganeshk | 1:691460a19f54 | 42 | return 0; |
prithviganeshk | 1:691460a19f54 | 43 | } else { |
prithviganeshk | 1:691460a19f54 | 44 | data[i-8] = data[i]; |
prithviganeshk | 1:691460a19f54 | 45 | } |
prithviganeshk | 1:691460a19f54 | 46 | } |
prithviganeshk | 1:691460a19f54 | 47 | |
prithviganeshk | 1:691460a19f54 | 48 | //pc.printf("Received: %s length:%d\r\n", data, ((int)len)-10); |
prithviganeshk | 1:691460a19f54 | 49 | } |
prithviganeshk | 1:691460a19f54 | 50 | return ((int)len)-10; |
prithviganeshk | 1:691460a19f54 | 51 | } |
prithviganeshk | 1:691460a19f54 | 52 | |
prithviganeshk | 1:691460a19f54 | 53 | /** |
prithviganeshk | 1:691460a19f54 | 54 | * Send data to another MRF24J40. |
prithviganeshk | 1:691460a19f54 | 55 | * |
prithviganeshk | 1:691460a19f54 | 56 | * @param data The string to send |
prithviganeshk | 1:691460a19f54 | 57 | * @param maxLength The length of the data to send. |
prithviganeshk | 1:691460a19f54 | 58 | * If you are sending a null-terminated string you can pass strlen(data)+1 |
prithviganeshk | 1:691460a19f54 | 59 | */ |
prithviganeshk | 1:691460a19f54 | 60 | void rf_send(char *data, uint8_t len) |
prithviganeshk | 1:691460a19f54 | 61 | { |
prithviganeshk | 1:691460a19f54 | 62 | //We need to prepend the message with a valid ZigBee header |
prithviganeshk | 1:691460a19f54 | 63 | uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; |
prithviganeshk | 1:691460a19f54 | 64 | uint8_t *send_buf = (uint8_t *) malloc( sizeof(uint8_t) * (len+8) ); |
prithviganeshk | 1:691460a19f54 | 65 | |
prithviganeshk | 1:691460a19f54 | 66 | for(uint8_t i = 0; i < len+8; i++) { |
prithviganeshk | 1:691460a19f54 | 67 | //prepend the 8-byte header |
prithviganeshk | 1:691460a19f54 | 68 | send_buf[i] = (i<8) ? header[i] : data[i-8]; |
prithviganeshk | 1:691460a19f54 | 69 | } |
prithviganeshk | 1:691460a19f54 | 70 | //pc.printf("Sent: %s\r\n", send_buf+8); |
prithviganeshk | 1:691460a19f54 | 71 | |
prithviganeshk | 1:691460a19f54 | 72 | mrf.Send(send_buf, len+8); |
prithviganeshk | 1:691460a19f54 | 73 | free(send_buf); |
prithviganeshk | 1:691460a19f54 | 74 | } |
prithviganeshk | 1:691460a19f54 | 75 | |
prithviganeshk | 1:691460a19f54 | 76 | |
prithviganeshk | 1:691460a19f54 | 77 | //***************** You can start coding here *****************// |
prithviganeshk | 1:691460a19f54 | 78 | int main (void) |
prithviganeshk | 1:691460a19f54 | 79 | { |
prithviganeshk | 3:4f09529d391b | 80 | |
prithviganeshk | 1:691460a19f54 | 81 | |
prithviganeshk | 3:4f09529d391b | 82 | while(1){ |
prithviganeshk | 1:691460a19f54 | 83 | |
prithviganeshk | 1:691460a19f54 | 84 | |
prithviganeshk | 3:4f09529d391b | 85 | printf("Do you want to play? [y/n] \n"); |
prithviganeshk | 3:4f09529d391b | 86 | char start = pc.getc(); |
prithviganeshk | 3:4f09529d391b | 87 | |
prithviganeshk | 3:4f09529d391b | 88 | if(start == 'n'){ |
prithviganeshk | 3:4f09529d391b | 89 | printf("Game Over\n"); |
prithviganeshk | 3:4f09529d391b | 90 | exit(0); //exit is OK |
prithviganeshk | 3:4f09529d391b | 91 | } |
prithviganeshk | 3:4f09529d391b | 92 | |
prithviganeshk | 3:4f09529d391b | 93 | else if(start == 'y'){ |
prithviganeshk | 3:4f09529d391b | 94 | |
prithviganeshk | 3:4f09529d391b | 95 | printf("Start Whacking ... \n"); |
prithviganeshk | 3:4f09529d391b | 96 | //Set the Number of slaves |
prithviganeshk | 3:4f09529d391b | 97 | int slaves = 2; |
prithviganeshk | 1:691460a19f54 | 98 | |
prithviganeshk | 3:4f09529d391b | 99 | //Channels of the nodes |
prithviganeshk | 3:4f09529d391b | 100 | //channel1 = 15; //channel of the first node |
prithviganeshk | 3:4f09529d391b | 101 | //channel2 = 14; //channel of the first node |
prithviganeshk | 3:4f09529d391b | 102 | uint8_t channel; |
prithviganeshk | 1:691460a19f54 | 103 | |
prithviganeshk | 3:4f09529d391b | 104 | //Set the Count to 10 |
prithviganeshk | 4:76adb6c7e67d | 105 | int count,n = 0; |
prithviganeshk | 4:76adb6c7e67d | 106 | int dont_set_channel = 0; |
prithviganeshk | 3:4f09529d391b | 107 | float begin = 0; |
prithviganeshk | 3:4f09529d391b | 108 | float end = 0; |
prithviganeshk | 3:4f09529d391b | 109 | float diff = 0; |
prithviganeshk | 3:4f09529d391b | 110 | float tdiff = 0; |
prithviganeshk | 1:691460a19f54 | 111 | |
prithviganeshk | 3:4f09529d391b | 112 | //Start the timer |
prithviganeshk | 3:4f09529d391b | 113 | timer.start(); |
prithviganeshk | 1:691460a19f54 | 114 | |
prithviganeshk | 3:4f09529d391b | 115 | //Set the yes and no arrays |
prithviganeshk | 3:4f09529d391b | 116 | char yes[] = "y"; |
prithviganeshk | 3:4f09529d391b | 117 | char no[] = "n"; |
prithviganeshk | 3:4f09529d391b | 118 | |
prithviganeshk | 3:4f09529d391b | 119 | while(count < 10) { |
prithviganeshk | 3:4f09529d391b | 120 | |
prithviganeshk | 3:4f09529d391b | 121 | //Send message to random node |
prithviganeshk | 3:4f09529d391b | 122 | |
prithviganeshk | 3:4f09529d391b | 123 | //Calculate random number |
prithviganeshk | 3:4f09529d391b | 124 | //srand(time(0)); |
prithviganeshk | 4:76adb6c7e67d | 125 | channel = (rand()%(slaves)) + 14; |
prithviganeshk | 3:4f09529d391b | 126 | //channel = 15; |
prithviganeshk | 1:691460a19f54 | 127 | |
prithviganeshk | 4:76adb6c7e67d | 128 | //Check for channel of the mole if a light was missed |
prithviganeshk | 4:76adb6c7e67d | 129 | while(dont_set_channel == channel){ |
prithviganeshk | 4:76adb6c7e67d | 130 | channel = (rand()%(slaves)) + 14; //set to minimum channel |
prithviganeshk | 4:76adb6c7e67d | 131 | } |
prithviganeshk | 4:76adb6c7e67d | 132 | |
prithviganeshk | 4:76adb6c7e67d | 133 | //dont_set_channel= 0; |
prithviganeshk | 4:76adb6c7e67d | 134 | |
prithviganeshk | 3:4f09529d391b | 135 | //Set the Channel to the random node selected |
prithviganeshk | 3:4f09529d391b | 136 | mrf.SetChannel(channel); |
prithviganeshk | 1:691460a19f54 | 137 | |
prithviganeshk | 3:4f09529d391b | 138 | //Send message to the random slave and start timer |
prithviganeshk | 4:76adb6c7e67d | 139 | char num = n; |
prithviganeshk | 4:76adb6c7e67d | 140 | char* numptr; |
prithviganeshk | 4:76adb6c7e67d | 141 | numptr = # |
prithviganeshk | 4:76adb6c7e67d | 142 | strcpy(txBuffer, numptr); |
prithviganeshk | 3:4f09529d391b | 143 | rf_send(txBuffer, strlen(txBuffer) + 1); |
prithviganeshk | 3:4f09529d391b | 144 | //Switch on the Led when sending data |
prithviganeshk | 3:4f09529d391b | 145 | led2 = 1; |
prithviganeshk | 3:4f09529d391b | 146 | printf("Sending signal to mole %u \n", channel - 14); |
prithviganeshk | 3:4f09529d391b | 147 | begin = timer.read_ms(); |
prithviganeshk | 3:4f09529d391b | 148 | |
prithviganeshk | 3:4f09529d391b | 149 | //Wait for reply from the slave |
prithviganeshk | 3:4f09529d391b | 150 | |
prithviganeshk | 3:4f09529d391b | 151 | while(1){ |
prithviganeshk | 1:691460a19f54 | 152 | |
prithviganeshk | 3:4f09529d391b | 153 | rxLen = rf_receive(rxBuffer, 128); |
prithviganeshk | 1:691460a19f54 | 154 | |
prithviganeshk | 3:4f09529d391b | 155 | if(rxLen > 0) { |
prithviganeshk | 3:4f09529d391b | 156 | |
prithviganeshk | 3:4f09529d391b | 157 | //Calculate time difference |
prithviganeshk | 3:4f09529d391b | 158 | end = timer.read_ms(); |
prithviganeshk | 3:4f09529d391b | 159 | diff = end - begin; |
prithviganeshk | 3:4f09529d391b | 160 | tdiff += (diff / 1000); |
prithviganeshk | 3:4f09529d391b | 161 | |
prithviganeshk | 3:4f09529d391b | 162 | //Switch off Led to indicate received data |
prithviganeshk | 3:4f09529d391b | 163 | led2 = 0; |
prithviganeshk | 3:4f09529d391b | 164 | |
prithviganeshk | 3:4f09529d391b | 165 | //Check if mole was pressed or not |
prithviganeshk | 3:4f09529d391b | 166 | pc.printf("Received: %s\r\n", rxBuffer); |
prithviganeshk | 3:4f09529d391b | 167 | |
prithviganeshk | 3:4f09529d391b | 168 | //If it was pressed - increment the count |
prithviganeshk | 3:4f09529d391b | 169 | if(strcmp (yes,rxBuffer) == 0){ |
prithviganeshk | 3:4f09529d391b | 170 | pc.printf("pressed\n"); |
prithviganeshk | 3:4f09529d391b | 171 | count++; |
prithviganeshk | 4:76adb6c7e67d | 172 | n++; |
prithviganeshk | 4:76adb6c7e67d | 173 | //strcpy(txBuffer, "d"); //send d to decrement the time on slaves end |
prithviganeshk | 4:76adb6c7e67d | 174 | dont_set_channel = 0; |
prithviganeshk | 3:4f09529d391b | 175 | } |
prithviganeshk | 3:4f09529d391b | 176 | //If it was not pressed - dont alter the count |
prithviganeshk | 3:4f09529d391b | 177 | else if(strcmp (no,rxBuffer) == 0){ |
prithviganeshk | 3:4f09529d391b | 178 | pc.printf("Not pressed\n"); |
prithviganeshk | 4:76adb6c7e67d | 179 | //strcpy(txBuffer, "s"); |
prithviganeshk | 4:76adb6c7e67d | 180 | tdiff += 3; // Penalty of 3 seconds |
prithviganeshk | 4:76adb6c7e67d | 181 | dont_set_channel = channel; // if there was no press do not send on light on this channel again |
prithviganeshk | 4:76adb6c7e67d | 182 | |
prithviganeshk | 3:4f09529d391b | 183 | } |
prithviganeshk | 3:4f09529d391b | 184 | |
prithviganeshk | 3:4f09529d391b | 185 | break; |
prithviganeshk | 3:4f09529d391b | 186 | |
prithviganeshk | 3:4f09529d391b | 187 | }//end of "if" receive |
prithviganeshk | 1:691460a19f54 | 188 | |
prithviganeshk | 3:4f09529d391b | 189 | }//end of inner while |
prithviganeshk | 1:691460a19f54 | 190 | |
prithviganeshk | 3:4f09529d391b | 191 | }//end of while count |
prithviganeshk | 1:691460a19f54 | 192 | |
prithviganeshk | 3:4f09529d391b | 193 | printf("Your did it in %f seconds\n",tdiff); |
prithviganeshk | 1:691460a19f54 | 194 | |
prithviganeshk | 3:4f09529d391b | 195 | }//end of else if start |
prithviganeshk | 3:4f09529d391b | 196 | }//end of while 1 |
prithviganeshk | 1:691460a19f54 | 197 | }// end of main |