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@51:299408ceee3a, 2015-04-11 (annotated)
- Committer:
- Thierry19
- Date:
- Sat Apr 11 19:30:24 2015 +0000
- Revision:
- 51:299408ceee3a
- Parent:
- 48:bc531288c220
- Parent:
- 50:48e8da5fc1ae
- Child:
- 52:10fb8ca4ed03
Merge;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pete1801 | 9:b8503f5ad3bd | 1 | #include "Xbee.h" |
Thierry19 | 23:5bb76b7c35da | 2 | #define VALEURFLEX 0 |
pete1801 | 9:b8503f5ad3bd | 3 | |
llarose | 22:cccb77300fd5 | 4 | Serial x_pc(USBTX, USBRX); |
llarose | 22:cccb77300fd5 | 5 | |
pete1801 | 9:b8503f5ad3bd | 6 | Xbee::Xbee() |
pete1801 | 9:b8503f5ad3bd | 7 | { |
pete1801 | 42:94d329a40290 | 8 | //PanId = 0x1337; |
pete1801 | 42:94d329a40290 | 9 | //SetPanId(PanId); |
pete1801 | 9:b8503f5ad3bd | 10 | } |
pete1801 | 9:b8503f5ad3bd | 11 | |
pete1801 | 9:b8503f5ad3bd | 12 | Xbee::Xbee(short panId, PinName pinTx, PinName pinRx) |
pete1801 | 9:b8503f5ad3bd | 13 | { |
llarose | 22:cccb77300fd5 | 14 | this->XbeePin = new Serial(pinTx, pinRx); |
pete1801 | 9:b8503f5ad3bd | 15 | PanId = panId; |
pete1801 | 9:b8503f5ad3bd | 16 | SetPanId(PanId); |
Thierry19 | 50:48e8da5fc1ae | 17 | frameID=0; |
pete1801 | 9:b8503f5ad3bd | 18 | } |
pete1801 | 9:b8503f5ad3bd | 19 | |
pete1801 | 9:b8503f5ad3bd | 20 | Xbee::~Xbee() |
pete1801 | 9:b8503f5ad3bd | 21 | { |
pete1801 | 9:b8503f5ad3bd | 22 | } |
pete1801 | 9:b8503f5ad3bd | 23 | |
pete1801 | 9:b8503f5ad3bd | 24 | //send frames to XBee (to set PanID and do the WR) |
pete1801 | 9:b8503f5ad3bd | 25 | void Xbee::Envoyer(char array[], int size) |
pete1801 | 9:b8503f5ad3bd | 26 | { |
pete1801 | 9:b8503f5ad3bd | 27 | for(int i = 0; i < size; i++) { |
pete1801 | 9:b8503f5ad3bd | 28 | XbeePin->putc(array[i]); |
pete1801 | 9:b8503f5ad3bd | 29 | } |
pete1801 | 9:b8503f5ad3bd | 30 | } |
pete1801 | 9:b8503f5ad3bd | 31 | |
Thierry19 | 19:19adf49351b0 | 32 | //function that generates the Transmit Request frame |
Thierry19 | 19:19adf49351b0 | 33 | //and the data[] parameter is only the data we want to send |
Thierry19 | 19:19adf49351b0 | 34 | void Xbee::EnvoyerDonnees(char data[], int messageSize) |
Thierry19 | 19:19adf49351b0 | 35 | { |
Thierry19 | 23:5bb76b7c35da | 36 | //Si possible le messageSize sera une constante en fonction de la struc qu'on envoie a chaque fois (18 + data) |
Thierry19 | 19:19adf49351b0 | 37 | int size = 18 + messageSize; //18 bytes + message |
Thierry19 | 19:19adf49351b0 | 38 | int dataSize = 14 + messageSize; //14 bytes + message |
Thierry19 | 23:5bb76b7c35da | 39 | |
Thierry19 | 19:19adf49351b0 | 40 | char length1 = dataSize >> 8; //get length char 1 |
Thierry19 | 19:19adf49351b0 | 41 | char length2 = dataSize; //get length char 2 |
Thierry19 | 23:5bb76b7c35da | 42 | |
Thierry19 | 19:19adf49351b0 | 43 | char sum = 0x00; //to calculate the checksum char |
Thierry19 | 23:5bb76b7c35da | 44 | |
Thierry19 | 19:19adf49351b0 | 45 | char command[size]; |
Thierry19 | 19:19adf49351b0 | 46 | command[0] = 0x7E; //start delimiter |
Thierry19 | 19:19adf49351b0 | 47 | command[1] = length1; //length first char |
Thierry19 | 19:19adf49351b0 | 48 | command[2] = length2; //length second char |
Thierry19 | 19:19adf49351b0 | 49 | command[3] = 0x10; //frame type - Send Request |
Thierry19 | 50:48e8da5fc1ae | 50 | command[4] = frameID; //frame ID |
Thierry19 | 19:19adf49351b0 | 51 | sum += 0x10; |
Thierry19 | 19:19adf49351b0 | 52 | sum += 0x01; |
Thierry19 | 23:5bb76b7c35da | 53 | |
Thierry19 | 19:19adf49351b0 | 54 | //Blank |
Thierry19 | 23:5bb76b7c35da | 55 | for(int i = 5; i <= 12; i++) { |
Thierry19 | 19:19adf49351b0 | 56 | command[i] = 0x00; //64 bit address |
Thierry19 | 19:19adf49351b0 | 57 | } |
Thierry19 | 23:5bb76b7c35da | 58 | |
Thierry19 | 19:19adf49351b0 | 59 | //Broadcast address |
Thierry19 | 19:19adf49351b0 | 60 | command[13] = 0xFF; //16 bit address |
Thierry19 | 19:19adf49351b0 | 61 | command[14] = 0xFE; //16 bit address |
Thierry19 | 19:19adf49351b0 | 62 | sum += 0xFF; |
Thierry19 | 19:19adf49351b0 | 63 | sum += 0xFE; |
Thierry19 | 23:5bb76b7c35da | 64 | |
Thierry19 | 19:19adf49351b0 | 65 | command[15] = 0x00; //broadcast radius |
Thierry19 | 19:19adf49351b0 | 66 | command[16] = 0x00; //options |
Thierry19 | 23:5bb76b7c35da | 67 | |
Thierry19 | 23:5bb76b7c35da | 68 | for(int i = 17; i < size-1; i++) { //data |
Thierry19 | 19:19adf49351b0 | 69 | command[i] = data[i-17]; //data |
Thierry19 | 19:19adf49351b0 | 70 | sum += command[i]; //keep calculating for checksum |
Thierry19 | 19:19adf49351b0 | 71 | } |
Thierry19 | 19:19adf49351b0 | 72 | |
Thierry19 | 19:19adf49351b0 | 73 | command[size-1] = 0xFF - sum; //checksum |
Thierry19 | 19:19adf49351b0 | 74 | Envoyer(command, size); //send frame array to XBee |
Thierry19 | 50:48e8da5fc1ae | 75 | frameID++; |
Thierry19 | 19:19adf49351b0 | 76 | } |
Thierry19 | 19:19adf49351b0 | 77 | |
Thierry19 | 23:5bb76b7c35da | 78 | void Xbee::EnvoyerStructure(Mobile_Vers_Fixe mvf) |
Thierry19 | 23:5bb76b7c35da | 79 | { |
Thierry19 | 50:48e8da5fc1ae | 80 | char data[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
Thierry19 | 23:5bb76b7c35da | 81 | |
Thierry19 | 23:5bb76b7c35da | 82 | data[0] = mvf.gants; |
Thierry19 | 23:5bb76b7c35da | 83 | data[1] = mvf.accelData.x >> 8; |
Thierry19 | 23:5bb76b7c35da | 84 | data[2] = mvf.accelData.x & 0x00FF; |
Thierry19 | 23:5bb76b7c35da | 85 | data[3] = mvf.accelData.y >> 8; |
Thierry19 | 23:5bb76b7c35da | 86 | data[4] = mvf.accelData.y & 0x00FF; |
Thierry19 | 23:5bb76b7c35da | 87 | data[5] = mvf.accelData.z >> 8; |
Thierry19 | 23:5bb76b7c35da | 88 | data[6] = mvf.accelData.z & 0x00FF; |
Thierry19 | 51:299408ceee3a | 89 | x_pc.printf("\r\nClass Accel x: %d", mvf.accelData.x); |
pete1801 | 30:389d09853cd1 | 90 | mvf.flexSensor.index == 1 ? data[7] = 0x04 : data[7] = 0; |
pete1801 | 30:389d09853cd1 | 91 | mvf.flexSensor.majeur == 1 ? data[7] += 0x02 : data[7] += 0; |
pete1801 | 30:389d09853cd1 | 92 | mvf.flexSensor.annulaire == 1 ? data[7] += 0x01 : data[7] += 0; |
llarose | 48:bc531288c220 | 93 | |
Thierry19 | 23:5bb76b7c35da | 94 | EnvoyerDonnees(data, 8); |
Thierry19 | 23:5bb76b7c35da | 95 | } |
Thierry19 | 23:5bb76b7c35da | 96 | |
pete1801 | 39:558cd5780490 | 97 | void Xbee::EnvoyerStructure(Mobile_Vers_Fixe* mvf) |
pete1801 | 39:558cd5780490 | 98 | { |
Thierry19 | 50:48e8da5fc1ae | 99 | char data[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
Thierry19 | 50:48e8da5fc1ae | 100 | //x_pc.printf(" \r\n Gants id %c", mvf->gants); |
pete1801 | 39:558cd5780490 | 101 | data[0] = mvf->gants; |
pete1801 | 39:558cd5780490 | 102 | data[1] = mvf->accelData.x >> 8; |
pete1801 | 39:558cd5780490 | 103 | data[2] = mvf->accelData.x & 0x00FF; |
pete1801 | 39:558cd5780490 | 104 | data[3] = mvf->accelData.y >> 8; |
pete1801 | 39:558cd5780490 | 105 | data[4] = mvf->accelData.y & 0x00FF; |
pete1801 | 39:558cd5780490 | 106 | data[5] = mvf->accelData.z >> 8; |
pete1801 | 39:558cd5780490 | 107 | data[6] = mvf->accelData.z & 0x00FF; |
Thierry19 | 51:299408ceee3a | 108 | x_pc.printf("\r\nPointer Accel x: %d", mvf->accelData.x); |
Thierry19 | 51:299408ceee3a | 109 | |
pete1801 | 39:558cd5780490 | 110 | mvf->flexSensor.index == 1 ? data[7] = 0x04 : data[7] = 0; |
pete1801 | 39:558cd5780490 | 111 | mvf->flexSensor.majeur == 1 ? data[7] += 0x02 : data[7] += 0; |
pete1801 | 39:558cd5780490 | 112 | mvf->flexSensor.annulaire == 1 ? data[7] += 0x01 : data[7] += 0; |
pete1801 | 39:558cd5780490 | 113 | |
pete1801 | 39:558cd5780490 | 114 | EnvoyerDonnees(data, 8); |
pete1801 | 39:558cd5780490 | 115 | } |
pete1801 | 39:558cd5780490 | 116 | |
Thierry19 | 23:5bb76b7c35da | 117 | //Le noeud mobile va recevoir certaines informations comme le type de jeux et les signaux de depart/fin de parties |
Thierry19 | 24:1a16e7eabb0c | 118 | //Structure de reception sera Fixe_Vers_Mobile |
pete1801 | 9:b8503f5ad3bd | 119 | void Xbee::Recevoir() |
pete1801 | 9:b8503f5ad3bd | 120 | { |
Thierry19 | 44:0862bc49ffa7 | 121 | char buffer[3]; |
Thierry19 | 23:5bb76b7c35da | 122 | int index = 0; |
Thierry19 | 50:48e8da5fc1ae | 123 | x_pc.printf("\r\n Start recevoir thread x"); |
pete1801 | 9:b8503f5ad3bd | 124 | while(true) { |
pete1801 | 9:b8503f5ad3bd | 125 | if (XbeePin->readable()) { |
Thierry19 | 50:48e8da5fc1ae | 126 | //x_pc.printf("Data recu: %x",XbeePin->getc()); |
pete1801 | 9:b8503f5ad3bd | 127 | //Start byte |
pete1801 | 9:b8503f5ad3bd | 128 | if (XbeePin->getc() == 0x7E) { |
Thierry19 | 44:0862bc49ffa7 | 129 | index = 0; |
Thierry19 | 50:48e8da5fc1ae | 130 | //x_pc.printf("\r\n Start Byte x"); |
Thierry19 | 23:5bb76b7c35da | 131 | //Get length and frame type |
Thierry19 | 44:0862bc49ffa7 | 132 | while (index < 3) { |
Thierry19 | 23:5bb76b7c35da | 133 | buffer[index] = XbeePin->getc(); |
Thierry19 | 23:5bb76b7c35da | 134 | index++; |
Thierry19 | 23:5bb76b7c35da | 135 | } |
Thierry19 | 50:48e8da5fc1ae | 136 | //x_pc.printf("\n\r Type de trame: %x", buffer[2]); |
Thierry19 | 23:5bb76b7c35da | 137 | index = 0; |
Thierry19 | 23:5bb76b7c35da | 138 | //If frame is a receive packet |
Thierry19 | 23:5bb76b7c35da | 139 | if (buffer[2] == 0x90) { |
Thierry19 | 50:48e8da5fc1ae | 140 | //x_pc.printf("\r\n Bonne trame"); |
Thierry19 | 23:5bb76b7c35da | 141 | //Ici va falloir compter le nombre de bytes de niaiseries |
Thierry19 | 50:48e8da5fc1ae | 142 | //qui se passent avant les donnees, 11 je crois |
Thierry19 | 23:5bb76b7c35da | 143 | do { |
Thierry19 | 23:5bb76b7c35da | 144 | char c = XbeePin->getc(); |
Thierry19 | 23:5bb76b7c35da | 145 | index++; |
Thierry19 | 44:0862bc49ffa7 | 146 | } while (index < 11); |
Thierry19 | 44:0862bc49ffa7 | 147 | index = 0; |
Thierry19 | 23:5bb76b7c35da | 148 | |
Thierry19 | 44:0862bc49ffa7 | 149 | //GameID |
Thierry19 | 50:48e8da5fc1ae | 150 | |
Thierry19 | 50:48e8da5fc1ae | 151 | int gameMode = XbeePin->getc(); |
Thierry19 | 44:0862bc49ffa7 | 152 | index++; |
Thierry19 | 50:48e8da5fc1ae | 153 | x_pc.printf("\r\n gameMode %x", gameMode); |
Thierry19 | 44:0862bc49ffa7 | 154 | //ChkSum |
Thierry19 | 44:0862bc49ffa7 | 155 | buffer[0] = XbeePin->getc(); |
Thierry19 | 50:48e8da5fc1ae | 156 | |
Thierry19 | 44:0862bc49ffa7 | 157 | Fixe_Vers_Mobile *emile = mailbox_TypeDeJeu.alloc(); |
Thierry19 | 50:48e8da5fc1ae | 158 | |
Thierry19 | 44:0862bc49ffa7 | 159 | // Verifier si mail pointe pas vers 0 [boite pleine] |
Thierry19 | 44:0862bc49ffa7 | 160 | while (emile == 0) { |
Thierry19 | 44:0862bc49ffa7 | 161 | wait_ms(25); |
Thierry19 | 44:0862bc49ffa7 | 162 | emile = mailbox_TypeDeJeu.alloc(); |
pete1801 | 9:b8503f5ad3bd | 163 | } |
Thierry19 | 44:0862bc49ffa7 | 164 | emile->game = GameMode_e(gameMode); |
Thierry19 | 44:0862bc49ffa7 | 165 | mailbox_TypeDeJeu.put(emile); |
Thierry19 | 44:0862bc49ffa7 | 166 | index = 0; |
pete1801 | 9:b8503f5ad3bd | 167 | } |
pete1801 | 9:b8503f5ad3bd | 168 | } |
pete1801 | 9:b8503f5ad3bd | 169 | } |
Thierry19 | 44:0862bc49ffa7 | 170 | index = 0; |
pete1801 | 9:b8503f5ad3bd | 171 | } |
pete1801 | 9:b8503f5ad3bd | 172 | } |
pete1801 | 9:b8503f5ad3bd | 173 | |
pete1801 | 9:b8503f5ad3bd | 174 | //function to set the PAN ID |
pete1801 | 9:b8503f5ad3bd | 175 | void Xbee::SetPanId(short panId) |
pete1801 | 9:b8503f5ad3bd | 176 | { |
pete1801 | 9:b8503f5ad3bd | 177 | char c1 = panId >> 8; //PAN ID char 1 |
pete1801 | 9:b8503f5ad3bd | 178 | char c2 = panId; //PAN ID char 2 |
pete1801 | 9:b8503f5ad3bd | 179 | char checksum = 0xFF - (0x08 + 0x01 + 0x49 + 0x44 + c1 + c2); //calculate checksum |
pete1801 | 9:b8503f5ad3bd | 180 | |
pete1801 | 9:b8503f5ad3bd | 181 | //ID and WR AT Commands |
pete1801 | 9:b8503f5ad3bd | 182 | char array[] = {0x7E, 0x00, 0x06, 0x08, 0x01, 0x49, 0x44, c1, c2, checksum}; |
pete1801 | 9:b8503f5ad3bd | 183 | char wr[] = {0x7E, 0x00, 0x04, 0x08, 0x01, 0x57, 0x52, 0x4D}; |
pete1801 | 9:b8503f5ad3bd | 184 | |
llarose | 22:cccb77300fd5 | 185 | x_pc.printf("SetPanID \r\n"); |
pete1801 | 9:b8503f5ad3bd | 186 | Envoyer(array, sizeof(array)); //send ID AT Command frame |
llarose | 22:cccb77300fd5 | 187 | x_pc.printf("ID AT cmd \r\n"); |
pete1801 | 9:b8503f5ad3bd | 188 | Envoyer(wr, sizeof(wr)); //send WR AT Command frame |
llarose | 22:cccb77300fd5 | 189 | x_pc.printf("WR AR cmd \r\n"); |
pete1801 | 9:b8503f5ad3bd | 190 | } |