Projet_S5 / Mbed 2 deprecated Repo_Noeud_Mobile_refactor

Dependencies:   mbed-rtos mbed

Fork of Repo_Noeud_Mobile by Projet_S5

Committer:
pete1801
Date:
Mon Apr 06 20:18:02 2015 +0000
Revision:
39:558cd5780490
Parent:
36:e587950c288c
Child:
41:0cb286b1005e
Ajout d'un thread qui envois les structures vers le fixe.

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