Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

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?

UserRevisionLine numberNew 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 }