Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Committer:
groygirard
Date:
Sun Apr 12 03:02:21 2015 +0000
Revision:
57:ce80fbd67161
Parent:
56:6af8f2c9ddbe
Child:
58:4cdc85ed04a9
travail tard

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pete1801 9:b8503f5ad3bd 1 #include "Xbee.h"
pete1801 9:b8503f5ad3bd 2
llarose 22:cccb77300fd5 3 Serial x_pc(USBTX, USBRX);
llarose 22:cccb77300fd5 4
groygirard 56:6af8f2c9ddbe 5 inline void PrintChar(char c);
groygirard 56:6af8f2c9ddbe 6 inline void PrintEndline();
groygirard 56:6af8f2c9ddbe 7
pete1801 9:b8503f5ad3bd 8 Xbee::Xbee()
pete1801 9:b8503f5ad3bd 9 {
pete1801 42:94d329a40290 10 //PanId = 0x1337;
pete1801 42:94d329a40290 11 //SetPanId(PanId);
pete1801 9:b8503f5ad3bd 12 }
pete1801 9:b8503f5ad3bd 13
pete1801 9:b8503f5ad3bd 14 Xbee::Xbee(short panId, PinName pinTx, PinName pinRx)
pete1801 9:b8503f5ad3bd 15 {
llarose 22:cccb77300fd5 16 this->XbeePin = new Serial(pinTx, pinRx);
pete1801 9:b8503f5ad3bd 17 PanId = panId;
pete1801 9:b8503f5ad3bd 18 SetPanId(PanId);
pete1801 9:b8503f5ad3bd 19 }
pete1801 9:b8503f5ad3bd 20
pete1801 9:b8503f5ad3bd 21 Xbee::~Xbee()
pete1801 9:b8503f5ad3bd 22 {
groygirard 56:6af8f2c9ddbe 23 delete XbeePin;
pete1801 9:b8503f5ad3bd 24 }
pete1801 9:b8503f5ad3bd 25
pete1801 9:b8503f5ad3bd 26 //send frames to XBee (to set PanID and do the WR)
groygirard 56:6af8f2c9ddbe 27 void Xbee::SendXBee(char array[], int size)//SendXbee
pete1801 9:b8503f5ad3bd 28 {
pete1801 9:b8503f5ad3bd 29 for(int i = 0; i < size; i++) {
pete1801 9:b8503f5ad3bd 30 XbeePin->putc(array[i]);
pete1801 9:b8503f5ad3bd 31 }
Thierry19 19:19adf49351b0 32 }
Thierry19 19:19adf49351b0 33
Thierry19 23:5bb76b7c35da 34 void Xbee::EnvoyerStructure(Mobile_Vers_Fixe mvf)
Thierry19 23:5bb76b7c35da 35 {
groygirard 56:6af8f2c9ddbe 36 char data[2] = {0x00, 0x00};
groygirard 56:6af8f2c9ddbe 37 //x_pc.printf(" \r\n Gants id %c", mvf->gants);
Thierry19 23:5bb76b7c35da 38 data[0] = mvf.gants;
groygirard 56:6af8f2c9ddbe 39 mvf.flexSensor.index == 1 ? data[1] = 0x04 : data[1] = 0;
groygirard 56:6af8f2c9ddbe 40 mvf.flexSensor.majeur == 1 ? data[1] += 0x02 : data[1] += 0;
groygirard 56:6af8f2c9ddbe 41 mvf.flexSensor.annulaire == 1 ? data[1] += 0x01 : data[1] += 0;
Thierry19 23:5bb76b7c35da 42
groygirard 56:6af8f2c9ddbe 43 SendData(data, 2);
pete1801 39:558cd5780490 44 }
pete1801 39:558cd5780490 45
pete1801 9:b8503f5ad3bd 46 //function to set the PAN ID
pete1801 9:b8503f5ad3bd 47 void Xbee::SetPanId(short panId)
pete1801 9:b8503f5ad3bd 48 {
pete1801 9:b8503f5ad3bd 49 char c1 = panId >> 8; //PAN ID char 1
pete1801 9:b8503f5ad3bd 50 char c2 = panId; //PAN ID char 2
pete1801 9:b8503f5ad3bd 51 char checksum = 0xFF - (0x08 + 0x01 + 0x49 + 0x44 + c1 + c2); //calculate checksum
pete1801 9:b8503f5ad3bd 52
pete1801 9:b8503f5ad3bd 53 //ID and WR AT Commands
pete1801 9:b8503f5ad3bd 54 char array[] = {0x7E, 0x00, 0x06, 0x08, 0x01, 0x49, 0x44, c1, c2, checksum};
pete1801 9:b8503f5ad3bd 55 char wr[] = {0x7E, 0x00, 0x04, 0x08, 0x01, 0x57, 0x52, 0x4D};
pete1801 9:b8503f5ad3bd 56
groygirard 56:6af8f2c9ddbe 57 SendXBee(array, sizeof(array)); //send ID AT Command frame
groygirard 56:6af8f2c9ddbe 58 SendXBee(wr, sizeof(wr)); //send WR AT Command frame
groygirard 56:6af8f2c9ddbe 59 }
groygirard 56:6af8f2c9ddbe 60
groygirard 56:6af8f2c9ddbe 61 //Patate
groygirard 56:6af8f2c9ddbe 62
groygirard 56:6af8f2c9ddbe 63 //function to set the PAN ID
groygirard 56:6af8f2c9ddbe 64
groygirard 56:6af8f2c9ddbe 65
groygirard 56:6af8f2c9ddbe 66
groygirard 56:6af8f2c9ddbe 67
groygirard 56:6af8f2c9ddbe 68 //initialise HexToAscii table for correct output on Websocket Server
groygirard 56:6af8f2c9ddbe 69 void Xbee::BuildHexToAsciiTable()
groygirard 56:6af8f2c9ddbe 70 {
groygirard 56:6af8f2c9ddbe 71 HexToAscii[0x0] = '0';
groygirard 56:6af8f2c9ddbe 72 HexToAscii[0x1] = '1';
groygirard 56:6af8f2c9ddbe 73 HexToAscii[0x2] = '2';
groygirard 56:6af8f2c9ddbe 74 HexToAscii[0x3] = '3';
groygirard 56:6af8f2c9ddbe 75 HexToAscii[0x4] = '4';
groygirard 56:6af8f2c9ddbe 76 HexToAscii[0x5] = '5';
groygirard 56:6af8f2c9ddbe 77 HexToAscii[0x6] = '6';
groygirard 56:6af8f2c9ddbe 78 HexToAscii[0x7] = '7';
groygirard 56:6af8f2c9ddbe 79 HexToAscii[0x8] = '8';
groygirard 56:6af8f2c9ddbe 80 HexToAscii[0x9] = '9';
groygirard 56:6af8f2c9ddbe 81 HexToAscii[0xa] = 'A';
groygirard 56:6af8f2c9ddbe 82 HexToAscii[0xb] = 'B';
groygirard 56:6af8f2c9ddbe 83 HexToAscii[0xc] = 'C';
groygirard 56:6af8f2c9ddbe 84 HexToAscii[0xd] = 'D';
groygirard 56:6af8f2c9ddbe 85 HexToAscii[0xe] = 'E';
groygirard 56:6af8f2c9ddbe 86 HexToAscii[0xf] = 'F';
groygirard 56:6af8f2c9ddbe 87 }
groygirard 56:6af8f2c9ddbe 88
groygirard 56:6af8f2c9ddbe 89 //get data from xbee thread
groygirard 56:6af8f2c9ddbe 90 void Xbee::GetData()
groygirard 56:6af8f2c9ddbe 91 {
groygirard 56:6af8f2c9ddbe 92 data* input;
groygirard 56:6af8f2c9ddbe 93 while(true) {
groygirard 56:6af8f2c9ddbe 94 if(XbeePin->readable()) { //gets 1 full frame and store in mailbox
groygirard 56:6af8f2c9ddbe 95 input = mailbox.alloc(); //alloc in mailbox
groygirard 56:6af8f2c9ddbe 96
groygirard 56:6af8f2c9ddbe 97 if(input != NULL) { //if alloc was successful
groygirard 56:6af8f2c9ddbe 98 char c = XbeePin->getc(); //start delimiter
groygirard 56:6af8f2c9ddbe 99 char c1 = XbeePin->getc(); //length byte 1
groygirard 56:6af8f2c9ddbe 100 char c2 = XbeePin->getc(); //length byte 2
groygirard 56:6af8f2c9ddbe 101 short length = c1 << 8 | c2; //calculate length
groygirard 56:6af8f2c9ddbe 102 input->size = length + 4; //length = dataLength + start delimiter + length (2) + checksum
groygirard 56:6af8f2c9ddbe 103 input->array[0] = c;
groygirard 56:6af8f2c9ddbe 104 input->array[1] = c1;
groygirard 56:6af8f2c9ddbe 105 input->array[2] = c2;
groygirard 56:6af8f2c9ddbe 106 short pos = 3;
groygirard 56:6af8f2c9ddbe 107 while(length+1 > 0) { //include checksum
groygirard 56:6af8f2c9ddbe 108 c = XbeePin->getc(); //get char
groygirard 56:6af8f2c9ddbe 109 input->array[pos] = c; //store data
groygirard 56:6af8f2c9ddbe 110 pos++; //current position
groygirard 56:6af8f2c9ddbe 111 length--; //length left until the end of frame
groygirard 56:6af8f2c9ddbe 112 }
groygirard 56:6af8f2c9ddbe 113
groygirard 56:6af8f2c9ddbe 114 mailbox.put(input); //put data in mailbox
groygirard 56:6af8f2c9ddbe 115 } else { //if mailbox is full
groygirard 56:6af8f2c9ddbe 116 x_pc.printf("Mailbox is full!\r\n");
groygirard 56:6af8f2c9ddbe 117 }
groygirard 56:6af8f2c9ddbe 118 }
groygirard 56:6af8f2c9ddbe 119 }
groygirard 56:6af8f2c9ddbe 120 }
groygirard 56:6af8f2c9ddbe 121
groygirard 56:6af8f2c9ddbe 122 //output data on PC terminal thread
groygirard 56:6af8f2c9ddbe 123 void Xbee::OutputData()
groygirard 56:6af8f2c9ddbe 124 {
groygirard 56:6af8f2c9ddbe 125 osEvent event;
groygirard 56:6af8f2c9ddbe 126 data* mail;
groygirard 56:6af8f2c9ddbe 127 while(true) {
groygirard 56:6af8f2c9ddbe 128 event = mailbox.get(); //get data from mailbox blocking function
groygirard 56:6af8f2c9ddbe 129 mail = (data*)event.value.p; //this mail is of type data*, our own struct defined at the top
groygirard 56:6af8f2c9ddbe 130 if (event.status == osEventMail) { //if Event
groygirard 56:6af8f2c9ddbe 131 if(mail->array[0] != 0x7e) { //verify header is correct
groygirard 56:6af8f2c9ddbe 132 x_pc.printf("Header error! ");
groygirard 56:6af8f2c9ddbe 133 }
groygirard 56:6af8f2c9ddbe 134
groygirard 56:6af8f2c9ddbe 135 char sum = 0x00; //to calculate checksum
groygirard 56:6af8f2c9ddbe 136 PrintChar(mail->array[0]); //print start delimiter
groygirard 56:6af8f2c9ddbe 137 PrintChar(mail->array[1]); //print length byte 1
groygirard 56:6af8f2c9ddbe 138 PrintChar(mail->array[2]); //print length byte 2
groygirard 56:6af8f2c9ddbe 139 for(int i = 3; i < mail->size-1; i++) { //data
groygirard 56:6af8f2c9ddbe 140 PrintChar(mail->array[i]); //print data
groygirard 56:6af8f2c9ddbe 141 sum+= mail->array[i]; //calculate checksum
groygirard 56:6af8f2c9ddbe 142 }
groygirard 56:6af8f2c9ddbe 143 PrintChar(mail->array[(mail->size)-1]); //print checksum
groygirard 56:6af8f2c9ddbe 144 char expected = 0xFF - sum; //expected checksum
groygirard 56:6af8f2c9ddbe 145 if(mail->array[mail->size-1] != expected) { //verify checksum is OK
groygirard 56:6af8f2c9ddbe 146 x_pc.printf(" Checksum Error! expected: %x, received: %x", expected, mail->array[mail->size-1]);
groygirard 56:6af8f2c9ddbe 147 }
groygirard 56:6af8f2c9ddbe 148 } else { //not an event mail
groygirard 56:6af8f2c9ddbe 149 x_pc.printf("Status != osEventMail\r\n");
groygirard 56:6af8f2c9ddbe 150 }
groygirard 56:6af8f2c9ddbe 151
groygirard 56:6af8f2c9ddbe 152 //POINTER based on the FRAME TYPE (4th byte of the trame)
groygirard 56:6af8f2c9ddbe 153 ReceivePacket(mail);
groygirard 56:6af8f2c9ddbe 154
groygirard 56:6af8f2c9ddbe 155 mailbox.free(mail); //free the space in the mailbox
groygirard 56:6af8f2c9ddbe 156 PrintEndline();
groygirard 56:6af8f2c9ddbe 157 }
groygirard 56:6af8f2c9ddbe 158 }
groygirard 56:6af8f2c9ddbe 159
groygirard 56:6af8f2c9ddbe 160 //function that generates the Transmit Request frame
groygirard 56:6af8f2c9ddbe 161 //and the data[] parameter is only the data we want to send
groygirard 56:6af8f2c9ddbe 162 void Xbee::SendData(char data[], int messageSize)
groygirard 56:6af8f2c9ddbe 163 {
groygirard 56:6af8f2c9ddbe 164 int size = 18 + messageSize; //18 bytes + message
groygirard 56:6af8f2c9ddbe 165 int dataSize = 14 + messageSize; //14 bytes + message
groygirard 56:6af8f2c9ddbe 166
groygirard 56:6af8f2c9ddbe 167 char length1 = dataSize >> 8; //get length char 1
groygirard 56:6af8f2c9ddbe 168 char length2 = dataSize; //get length char 2
groygirard 56:6af8f2c9ddbe 169
groygirard 56:6af8f2c9ddbe 170 char sum = 0x00; //to calculate the checksum char
groygirard 56:6af8f2c9ddbe 171
groygirard 56:6af8f2c9ddbe 172 char command[size];
groygirard 56:6af8f2c9ddbe 173 command[0] = 0x7E; //start delimiter
groygirard 56:6af8f2c9ddbe 174 command[1] = length1; //length first char
groygirard 56:6af8f2c9ddbe 175 command[2] = length2; //length second char
groygirard 56:6af8f2c9ddbe 176 command[3] = 0x10; //frame type
groygirard 56:6af8f2c9ddbe 177 command[4] = 0x01; //frame ID
groygirard 56:6af8f2c9ddbe 178 sum += 0x10;
groygirard 56:6af8f2c9ddbe 179 sum += 0x01;
groygirard 56:6af8f2c9ddbe 180
groygirard 56:6af8f2c9ddbe 181 for(int i = 5; i <= 12; i++)
groygirard 56:6af8f2c9ddbe 182 {
groygirard 56:6af8f2c9ddbe 183 command[i] = 0x00; //64 bit address
groygirard 56:6af8f2c9ddbe 184 }
groygirard 56:6af8f2c9ddbe 185
groygirard 56:6af8f2c9ddbe 186 command[13] = 0xFF; //16 bit address
groygirard 56:6af8f2c9ddbe 187 command[14] = 0xFE; //16 bit address
groygirard 56:6af8f2c9ddbe 188 sum += 0xFF;
groygirard 56:6af8f2c9ddbe 189 sum += 0xFE;
groygirard 56:6af8f2c9ddbe 190
groygirard 56:6af8f2c9ddbe 191 command[15] = 0x00; //broadcast radius
groygirard 56:6af8f2c9ddbe 192 command[16] = 0x00; //options
groygirard 56:6af8f2c9ddbe 193
groygirard 56:6af8f2c9ddbe 194 for(int i = 17; i < size-1; i++) //data
groygirard 56:6af8f2c9ddbe 195 {
groygirard 56:6af8f2c9ddbe 196 command[i] = data[i-17]; //data
groygirard 56:6af8f2c9ddbe 197 sum += command[i]; //keep calculating for checksum
groygirard 56:6af8f2c9ddbe 198 x_pc.printf("");
groygirard 56:6af8f2c9ddbe 199 }
groygirard 56:6af8f2c9ddbe 200
groygirard 56:6af8f2c9ddbe 201 command[size-1] = 0xFF - sum; //checksum
groygirard 56:6af8f2c9ddbe 202
groygirard 56:6af8f2c9ddbe 203 SendXBee(command, size); //send frame array to XBee
groygirard 56:6af8f2c9ddbe 204 }
groygirard 56:6af8f2c9ddbe 205
groygirard 56:6af8f2c9ddbe 206 //receive packet frame
groygirard 56:6af8f2c9ddbe 207 //this function analyses it and puts in wsMailbox to send to websocket
groygirard 56:6af8f2c9ddbe 208 void Xbee::ReceivePacket(data* trame)
groygirard 56:6af8f2c9ddbe 209 {
groygirard 57:ce80fbd67161 210 Fixe_Vers_Mobile* fvm = fvm_mailbox.alloc(); //alloc in mailbox
groygirard 56:6af8f2c9ddbe 211
groygirard 57:ce80fbd67161 212 if(fvm != NULL) { //if alloc was successful
groygirard 56:6af8f2c9ddbe 213 x_pc.printf("Receive Packet Info");
groygirard 56:6af8f2c9ddbe 214
groygirard 56:6af8f2c9ddbe 215 switch(trame->array[14]) { //print receive option
groygirard 56:6af8f2c9ddbe 216 case 0x01:
groygirard 56:6af8f2c9ddbe 217 x_pc.printf("\r\nPacket acknowledged");
groygirard 56:6af8f2c9ddbe 218 break;
groygirard 56:6af8f2c9ddbe 219 case 0x02:
groygirard 56:6af8f2c9ddbe 220 x_pc.printf("\r\nPacket was a broadcast packet");
groygirard 56:6af8f2c9ddbe 221 break;
groygirard 56:6af8f2c9ddbe 222 case 0x20:
groygirard 56:6af8f2c9ddbe 223 x_pc.printf("\r\nPacket encrypted with APS encryption");
groygirard 56:6af8f2c9ddbe 224 break;
groygirard 56:6af8f2c9ddbe 225 case 0x40:
groygirard 56:6af8f2c9ddbe 226 x_pc.printf("\r\nPacket was sent from an end device");
groygirard 56:6af8f2c9ddbe 227 break;
groygirard 56:6af8f2c9ddbe 228 default:
groygirard 56:6af8f2c9ddbe 229 x_pc.printf("\r\nUnknown option: %x", trame->array[14]);
groygirard 56:6af8f2c9ddbe 230 break;
groygirard 56:6af8f2c9ddbe 231 }
groygirard 56:6af8f2c9ddbe 232 // Data aquisition
groygirard 57:ce80fbd67161 233 fvm->game = (GameMode_e)trame->array[15];
groygirard 56:6af8f2c9ddbe 234
groygirard 57:ce80fbd67161 235 fvm_mailbox.put(fvm); //put data in mailbox
groygirard 56:6af8f2c9ddbe 236 } else {
groygirard 56:6af8f2c9ddbe 237 x_pc.printf("Mobile Vers Fixe mailbox is full!\r\n");
groygirard 56:6af8f2c9ddbe 238 }
groygirard 56:6af8f2c9ddbe 239 }
groygirard 56:6af8f2c9ddbe 240
groygirard 56:6af8f2c9ddbe 241 //utility function for proper output on PC Terminal
groygirard 56:6af8f2c9ddbe 242 inline void PrintChar(char c)
groygirard 56:6af8f2c9ddbe 243 {
groygirard 56:6af8f2c9ddbe 244 if(c < 0x10) { //if char is between 0 and F, put a 0 before
groygirard 56:6af8f2c9ddbe 245 x_pc.printf("0%x ", c);
groygirard 56:6af8f2c9ddbe 246 } else {
groygirard 56:6af8f2c9ddbe 247 x_pc.printf("%x ", c);
groygirard 56:6af8f2c9ddbe 248 }
groygirard 56:6af8f2c9ddbe 249 }
groygirard 56:6af8f2c9ddbe 250
groygirard 56:6af8f2c9ddbe 251 //utility function to print an endline
groygirard 56:6af8f2c9ddbe 252 inline void PrintEndline()
groygirard 56:6af8f2c9ddbe 253 {
groygirard 56:6af8f2c9ddbe 254 x_pc.printf("\r\n");
pete1801 9:b8503f5ad3bd 255 }