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 Yusheng-final_project by
Diff: communication.h
- Revision:
- 6:ae3e6aefe908
- Child:
- 11:dc410a980771
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/communication.h Thu Nov 10 19:20:55 2016 +0000 @@ -0,0 +1,212 @@ +//communication.h +//Author: Carter Sharer +//Date: 11/2/2016 + +//Taken from Part 2 (FULL IMPLEMENTATION) +//If your implementation for part 2 was different then update thoes changes below + +#include <string> +#define NONE 250 + +//============================ +//== Pin Assignments == +//============================ +//Knobs +#define POT1 p17 //Knob1 +#define POT2 p18 //Knob2 +#define POT3 p16 //Knob3 +#define POT4 p15 //Knob4 +//JoyStick +#define POTV p19 //Vertial +#define POTH p20 //Horizontal +//MRF24J +#define SDI p11 +#define SDO p12 +#define SCK p13 +#define CS p7 +#define RESET p8 +//Button +#define BUTTON1 p21 + +//MRF24J40 +PinName mosi(SDI); +PinName miso(SDO); +PinName sck(SCK); +PinName cs(CS); +PinName reset(RESET); +// RF tranceiver +MRF24J40 mrf(mosi, miso, sck, cs, reset); + +// Send / receive buffers. +// IMPORTANT: The MRF24J40 is intended as zigbee tranceiver; it tends +// to reject data that doesn't have the right header. So the first +// 8 bytes in txBuffer look like a valid header. The remaining 120 +// bytes can be used for anything you like. +char txBuffer[128]; +char rxBuffer[128]; +int rxLen; + + +//***************** Do not change these methods (please) *****************// +/** +* Receive data from the MRF24J40. +* +* @param data A pointer to a char array to hold the data +* @param maxLength The max amount of data to read. +*/ +int rf_receive(char *data, uint8_t maxLength) +{ + uint8_t len = mrf.Receive((uint8_t *)data, maxLength); + uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; + + if(len > 10) { + //Remove the header and footer of the message + for(uint8_t i = 0; i < len-2; i++) { + if(i<8) { + //Make sure our header is valid first + if(data[i] != header[i]) { + //mrf.Reset(); + return 0; + } + } else { + data[i-8] = data[i]; + } + } + //pc.printf("Received: %s length:%d\r\n", data, ((int)len)-10); + } + return ((int)len)-10; +} + +/** +* Send data to another MRF24J40. +* +* @param data The string to send +* @param maxLength The length of the data to send. +* If you are sending a null-terminated string you can pass strlen(data)+1 +*/ +void rf_send(char *data, uint8_t len) +{ + //We need to prepend the message with a valid ZigBee header + uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; + uint8_t *send_buf = (uint8_t *) malloc( sizeof(uint8_t) * (len+8) ); + + for(uint8_t i = 0; i < len+8; i++) { + //prepend the 8-byte header + send_buf[i] = (i<8) ? header[i] : data[i-8]; + } + //pc.printf("Sent: %s\r\n", send_buf+8); + + mrf.Send(send_buf, len+8); + free(send_buf); +} +//***************** You can start coding here *****************// + +//Returns true if c is a letter, false otherwise +bool isLetter(char c) { + if(('a'<=c & c<='z') | ('A'<=c & c<='Z')) + return true; + return false; +} + +//Returns true if c is a number, false otherwise +bool isNumber(char c) { + if('0'<=c & c<='9') + return true; + return false; +} + +//Pulls data out fo rxBuffer and updates global variables accordingly +void communication_protocal(int len) +{ + bool found_name = false; + bool found_num = false; + bool complete_name = false; + bool complete_num = false; + uint8_t name_start = NONE; uint8_t name_end = NONE; + uint8_t num_start = NONE; uint8_t num_end = NONE; + + //Loop through all charaters in rxBuffer + for(uint8_t i = 0; i <= rxLen; i++) { + char c = rxBuffer[i]; + //pc.printf("Indexed char '%c'\r\n", c); + + //Find the start of a name (Check if its a letter) + if(isLetter(c) & name_start==NONE) { //if a num + //If We havent found a name yet, this is start of a name + if(found_name == false) { + //pc.printf("found name start at: '%c'\r\n", c); + name_start = i; + found_name = true; + } + } + //Find 'end of name' charater: ' ', ':', '-' + else if(((c == ' ') | (c == ':') | (c == '-')) & found_name & !complete_name) {// found end name character + if(found_name) { + complete_name = true; + name_end = i; + //pc.printf("found end of name at: '%c'\r\n", txBuffer[name_end]); + } + } + + //Find 'start of a number' charater, Check if its a number, or '-', or a '.' + else if( (isNumber(c) | (c=='-') | (c=='.')) & complete_name & num_start==NONE) { + if(found_num == false) { + //pc.printf("found num start at: '%c'\r\n",c); + num_start = i; + found_num = true; + } + } + //Found end of number character: ' ', ':', '-', or a letter + else if( (((c==' ')|(c==':')|(c=='-')) | isLetter(c)) & found_num & complete_name) { + if(found_num) { + complete_num = true; + num_end = i; + //pc.printf("found end of num at: '%c' \r\n", txBuffer[num_end]); + } + } + + //If we have a complete name AND number value (ie. start and end of each != NONE) + if(found_name & found_num & complete_name & complete_num) { + //pc.printf("Found MATCH\r\n"); + //Reset flags + found_name = false; + found_num = false; + complete_name = false; + complete_num = false; + + //Set name + uint8_t nameLen = uint8_t((name_end-name_start) + 1); + char * name[nameLen]; + *name = &rxBuffer[name_start]; + rxBuffer[name_end] = '\0'; + + //Set num + uint8_t numLen = uint8_t((num_end-num_start) + 1); + char * num[numLen]; + *num = &rxBuffer[num_start]; + rxBuffer[num_end] = '\0'; + + //Set variables + if(strcmp(*name, "Jstick_h\0")==0) + jstick_h = (int8_t)atoi(*num); + else if(strcmp(*name, "Jstick_v\0")==0) + jstick_v = (int8_t)atoi(*num); + else if(strcmp(*name, "Knob1\0")==0) + knob1 = (uint8_t)atoi(*num); + else if(strcmp(*name, "Knob2\0")==0) + knob2 = (uint8_t)atoi(*num); + else if(strcmp(*name, "Knob3\0")==0) + knob3 = (uint8_t)atoi(*num); + else if(strcmp(*name, "Knob4\0")==0) + knob4 = (uint8_t)atoi(*num); + else if(strcmp(*name, "Button\0")==0) + button = (bool)atoi(*num); + + //Reset flags + name_start = NONE; + name_end = NONE; + num_start = NONE; + num_end = NONE; + } + } +} \ No newline at end of file