ESE519 Lab6 Part3

Dependencies:   MPU6050_Lab6_Part3 mbed

Fork of BroBot_v2 by Carter Sharer

Revision:
6:ae3e6aefe908
--- /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