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 Repo_Noeud_Mobile by
Communication/Xbee.cpp@57:ce80fbd67161, 2015-04-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |