![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
done
Fork of ESE350-Whack-a-Mole by
WhackAMolejack.cpp@1:60d092c638bf, 2016-02-24 (annotated)
- Committer:
- ese350billjack
- Date:
- Wed Feb 24 02:35:10 2016 +0000
- Revision:
- 1:60d092c638bf
created 2 whacks;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ese350billjack | 1:60d092c638bf | 1 | /* ESE 350 Lab |
ese350billjack | 1:60d092c638bf | 2 | * Part 1 |
ese350billjack | 1:60d092c638bf | 3 | * Jack Harkins and Bill He |
ese350billjack | 1:60d092c638bf | 4 | */ |
ese350billjack | 1:60d092c638bf | 5 | |
ese350billjack | 1:60d092c638bf | 6 | #include "mbed.h" |
ese350billjack | 1:60d092c638bf | 7 | #include "MRF24J40.h" |
ese350billjack | 1:60d092c638bf | 8 | #include <iostream> |
ese350billjack | 1:60d092c638bf | 9 | |
ese350billjack | 1:60d092c638bf | 10 | #include <string> |
ese350billjack | 1:60d092c638bf | 11 | |
ese350billjack | 1:60d092c638bf | 12 | // RF tranceiver to link with handheld. |
ese350billjack | 1:60d092c638bf | 13 | MRF24J40 mrf(p11, p12, p13, p14, p21); |
ese350billjack | 1:60d092c638bf | 14 | |
ese350billjack | 1:60d092c638bf | 15 | // LEDs you can treat these as variables (led2 = 1 will turn led2 on!) |
ese350billjack | 1:60d092c638bf | 16 | DigitalOut led1(LED1); |
ese350billjack | 1:60d092c638bf | 17 | DigitalOut led2(LED2); |
ese350billjack | 1:60d092c638bf | 18 | DigitalOut led3(LED3); |
ese350billjack | 1:60d092c638bf | 19 | DigitalOut led4(LED4); |
ese350billjack | 1:60d092c638bf | 20 | |
ese350billjack | 1:60d092c638bf | 21 | // Timer |
ese350billjack | 1:60d092c638bf | 22 | Timer timer; |
ese350billjack | 1:60d092c638bf | 23 | |
ese350billjack | 1:60d092c638bf | 24 | // Serial port for showing RX data. |
ese350billjack | 1:60d092c638bf | 25 | Serial pc(USBTX, USBRX); |
ese350billjack | 1:60d092c638bf | 26 | |
ese350billjack | 1:60d092c638bf | 27 | // Used for sending and receiving |
ese350billjack | 1:60d092c638bf | 28 | char txBuffer[128]; |
ese350billjack | 1:60d092c638bf | 29 | char rxBuffer[128]; |
ese350billjack | 1:60d092c638bf | 30 | int rxLen; |
ese350billjack | 1:60d092c638bf | 31 | |
ese350billjack | 1:60d092c638bf | 32 | //***************** Do not change these methods (please) *****************// |
ese350billjack | 1:60d092c638bf | 33 | |
ese350billjack | 1:60d092c638bf | 34 | /** |
ese350billjack | 1:60d092c638bf | 35 | * Receive data from the MRF24J40. |
ese350billjack | 1:60d092c638bf | 36 | * |
ese350billjack | 1:60d092c638bf | 37 | * @param data A pointer to a char array to hold the data |
ese350billjack | 1:60d092c638bf | 38 | * @param maxLength The max amount of data to read. |
ese350billjack | 1:60d092c638bf | 39 | */ |
ese350billjack | 1:60d092c638bf | 40 | int rf_receive(char *data, uint8_t maxLength) |
ese350billjack | 1:60d092c638bf | 41 | { |
ese350billjack | 1:60d092c638bf | 42 | uint8_t len = mrf.Receive((uint8_t *)data, maxLength); |
ese350billjack | 1:60d092c638bf | 43 | uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; |
ese350billjack | 1:60d092c638bf | 44 | |
ese350billjack | 1:60d092c638bf | 45 | if(len > 10) { |
ese350billjack | 1:60d092c638bf | 46 | //Remove the header and footer of the message |
ese350billjack | 1:60d092c638bf | 47 | for(uint8_t i = 0; i < len-2; i++) { |
ese350billjack | 1:60d092c638bf | 48 | if(i<8) { |
ese350billjack | 1:60d092c638bf | 49 | //Make sure our header is valid first |
ese350billjack | 1:60d092c638bf | 50 | if(data[i] != header[i]) |
ese350billjack | 1:60d092c638bf | 51 | return 0; |
ese350billjack | 1:60d092c638bf | 52 | } else { |
ese350billjack | 1:60d092c638bf | 53 | data[i-8] = data[i]; |
ese350billjack | 1:60d092c638bf | 54 | } |
ese350billjack | 1:60d092c638bf | 55 | } |
ese350billjack | 1:60d092c638bf | 56 | |
ese350billjack | 1:60d092c638bf | 57 | //pc.printf("Received: %s length:%d\r\n", data, ((int)len)-10); |
ese350billjack | 1:60d092c638bf | 58 | } |
ese350billjack | 1:60d092c638bf | 59 | return ((int)len)-10; |
ese350billjack | 1:60d092c638bf | 60 | } |
ese350billjack | 1:60d092c638bf | 61 | |
ese350billjack | 1:60d092c638bf | 62 | /** |
ese350billjack | 1:60d092c638bf | 63 | * Send data to another MRF24J40. |
ese350billjack | 1:60d092c638bf | 64 | * |
ese350billjack | 1:60d092c638bf | 65 | * @param data The string to send |
ese350billjack | 1:60d092c638bf | 66 | * @param maxLength The length of the data to send. |
ese350billjack | 1:60d092c638bf | 67 | * If you are sending a null-terminated string you can pass strlen(data)+1 |
ese350billjack | 1:60d092c638bf | 68 | */ |
ese350billjack | 1:60d092c638bf | 69 | void rf_send(char *data, uint8_t len) |
ese350billjack | 1:60d092c638bf | 70 | { |
ese350billjack | 1:60d092c638bf | 71 | //We need to prepend the message with a valid ZigBee header |
ese350billjack | 1:60d092c638bf | 72 | uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; |
ese350billjack | 1:60d092c638bf | 73 | uint8_t *send_buf = (uint8_t *) malloc( sizeof(uint8_t) * (len+8) ); |
ese350billjack | 1:60d092c638bf | 74 | |
ese350billjack | 1:60d092c638bf | 75 | for(uint8_t i = 0; i < len+8; i++) { |
ese350billjack | 1:60d092c638bf | 76 | //prepend the 8-byte header |
ese350billjack | 1:60d092c638bf | 77 | send_buf[i] = (i<8) ? header[i] : data[i-8]; |
ese350billjack | 1:60d092c638bf | 78 | } |
ese350billjack | 1:60d092c638bf | 79 | //pc.printf("Sent: %s\r\n", send_buf+8); |
ese350billjack | 1:60d092c638bf | 80 | |
ese350billjack | 1:60d092c638bf | 81 | mrf.Send(send_buf, len+8); |
ese350billjack | 1:60d092c638bf | 82 | free(send_buf); |
ese350billjack | 1:60d092c638bf | 83 | } |
ese350billjack | 1:60d092c638bf | 84 | |
ese350billjack | 1:60d092c638bf | 85 | |
ese350billjack | 1:60d092c638bf | 86 | //***************** You can start coding here *****************// |
ese350billjack | 1:60d092c638bf | 87 | int main (void) |
ese350billjack | 1:60d092c638bf | 88 | { |
ese350billjack | 1:60d092c638bf | 89 | uint8_t channel = 2; |
ese350billjack | 1:60d092c638bf | 90 | |
ese350billjack | 1:60d092c638bf | 91 | //Set the Channel. 0 is default, 15 is max |
ese350billjack | 1:60d092c638bf | 92 | mrf.SetChannel(channel); |
ese350billjack | 1:60d092c638bf | 93 | |
ese350billjack | 1:60d092c638bf | 94 | //Start the timer |
ese350billjack | 1:60d092c638bf | 95 | timer.start(); |
ese350billjack | 1:60d092c638bf | 96 | |
ese350billjack | 1:60d092c638bf | 97 | while(true) { |
ese350billjack | 1:60d092c638bf | 98 | //Try to receive some data |
ese350billjack | 1:60d092c638bf | 99 | rxLen = rf_receive(rxBuffer, 128); |
ese350billjack | 1:60d092c638bf | 100 | if(rxLen > 0) { |
ese350billjack | 1:60d092c638bf | 101 | //Toggle the Led |
ese350billjack | 1:60d092c638bf | 102 | led1 = led1^1; |
ese350billjack | 1:60d092c638bf | 103 | pc.printf("Received: %s\r\n", rxBuffer); |
ese350billjack | 1:60d092c638bf | 104 | } |
ese350billjack | 1:60d092c638bf | 105 | |
ese350billjack | 1:60d092c638bf | 106 | //Send some data every second |
ese350billjack | 1:60d092c638bf | 107 | if(timer.read_ms() >= 1000) { |
ese350billjack | 1:60d092c638bf | 108 | //Reset the timer to 0 |
ese350billjack | 1:60d092c638bf | 109 | timer.reset(); |
ese350billjack | 1:60d092c638bf | 110 | // Toggle LED 2. |
ese350billjack | 1:60d092c638bf | 111 | led2 = led2^1; |
ese350billjack | 1:60d092c638bf | 112 | //Add to the buffer. You may want to check out sprintf |
ese350billjack | 1:60d092c638bf | 113 | strcpy(txBuffer, "Jeff is the best TA!"); |
ese350billjack | 1:60d092c638bf | 114 | //Send the buffer |
ese350billjack | 1:60d092c638bf | 115 | rf_send(txBuffer, strlen(txBuffer) + 1); |
ese350billjack | 1:60d092c638bf | 116 | pc.printf("Sent: %s\r\n", txBuffer); |
ese350billjack | 1:60d092c638bf | 117 | } |
ese350billjack | 1:60d092c638bf | 118 | } |
ese350billjack | 1:60d092c638bf | 119 | } |