code d'envoie de trame

Dependencies:   mbed ConfigFile

Fork of app4-router by APP Team

Committer:
trixrabbit
Date:
Tue Feb 25 19:20:09 2014 +0000
Revision:
9:9b874294a381
Parent:
8:cfc86293ec94
comments added;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
trixrabbit 9:9b874294a381 1 /*******************************************************************************************
trixrabbit 9:9b874294a381 2 * FILE: Router
trixrabbit 9:9b874294a381 3 * File name: main.cpp
trixrabbit 9:9b874294a381 4 * Authors: Pierluc Asselin & Marc-Antoine Dupuis
trixrabbit 9:9b874294a381 5 * Object: S5 Info - APP5
trixrabbit 9:9b874294a381 6 * Original Date: 22/02/2014
trixrabbit 9:9b874294a381 7 * Last Modified: 25/02/2014
trixrabbit 9:9b874294a381 8 ********************************************************************************************/
trixrabbit 9:9b874294a381 9
trixrabbit 9:9b874294a381 10 /*******************
trixrabbit 9:9b874294a381 11 INCLUDES
trixrabbit 9:9b874294a381 12 *******************/
passelin 0:ed0e18b7fa30 13 #include "mbed.h"
passelin 3:ef0e12857e30 14 #include <sstream>
trixrabbit 5:b4b4a64ef0d6 15 #include <stdlib.h>
trixrabbit 2:bbe1253008e6 16 #include <string>
passelin 3:ef0e12857e30 17 #include "ConfigFile.h"
trixrabbit 7:0f107e48147d 18
passelin 3:ef0e12857e30 19
trixrabbit 9:9b874294a381 20 /**********************************
trixrabbit 9:9b874294a381 21 DEFINES REGISTRES POUR I2C
trixrabbit 9:9b874294a381 22 ***********************************/
passelin 3:ef0e12857e30 23 #define MMA8452_WRITE_ADDRESS 0x3A
passelin 3:ef0e12857e30 24 #define MMA8452_READ_ADDRESS 0x3B
passelin 3:ef0e12857e30 25 #define WHO_AM_I 0x0D
passelin 3:ef0e12857e30 26 #define OUT_X_MSB 0x01
passelin 3:ef0e12857e30 27 #define OUT_X_LSB 0x02
passelin 3:ef0e12857e30 28 #define OUT_Y_MSB 0x03
passelin 3:ef0e12857e30 29 #define OUT_Y_LSB 0x04
passelin 3:ef0e12857e30 30 #define OUT_Z_MSB 0x05
passelin 3:ef0e12857e30 31 #define OUT_Z_LSB 0x06
passelin 3:ef0e12857e30 32 #define CTRL_REG1 0x2A
passelin 3:ef0e12857e30 33 #define CTRL_REG2 0x2B
trixrabbit 2:bbe1253008e6 34
passelin 0:ed0e18b7fa30 35
trixrabbit 9:9b874294a381 36 /*******************
trixrabbit 9:9b874294a381 37 PINS
trixrabbit 9:9b874294a381 38 *******************/
passelin 0:ed0e18b7fa30 39 DigitalOut myled(LED1);
passelin 4:21b8959e8b71 40 DigitalIn pb1(p5);
passelin 0:ed0e18b7fa30 41 DigitalOut reset(p8);
passelin 0:ed0e18b7fa30 42 Serial pc(USBTX, USBRX);
passelin 0:ed0e18b7fa30 43 Serial xbee(p13, p14);
passelin 3:ef0e12857e30 44 I2C i2c(p9, p10); // I2C port (sda, scl)
passelin 3:ef0e12857e30 45
trixrabbit 9:9b874294a381 46 /*******************
trixrabbit 9:9b874294a381 47 CONFIG FILE
trixrabbit 9:9b874294a381 48 *******************/
passelin 4:21b8959e8b71 49 LocalFileSystem local("local");
passelin 3:ef0e12857e30 50 ConfigFile cfg;
passelin 3:ef0e12857e30 51
trixrabbit 9:9b874294a381 52 /***********************
trixrabbit 9:9b874294a381 53 VARIABLES GLOBALES
trixrabbit 9:9b874294a381 54 ************************/
trixrabbit 8:cfc86293ec94 55 int period_ms; //frequence que l'on obtien dans config file
trixrabbit 8:cfc86293ec94 56 string panID; //panID que l'on obtient dans config file
trixrabbit 6:cf4a6ee5d885 57
trixrabbit 6:cf4a6ee5d885 58
trixrabbit 9:9b874294a381 59 /*******************
trixrabbit 9:9b874294a381 60 convertInt
trixrabbit 9:9b874294a381 61 Converti un int en string
trixrabbit 9:9b874294a381 62 *******************/
trixrabbit 9:9b874294a381 63 string convertInt(int number)
trixrabbit 6:cf4a6ee5d885 64 {
trixrabbit 6:cf4a6ee5d885 65 stringstream ss;//create a stringstream
trixrabbit 6:cf4a6ee5d885 66 ss.str("");
trixrabbit 7:0f107e48147d 67 ss << number;//add int number to the stream
trixrabbit 6:cf4a6ee5d885 68 return ss.str();//return a string with the contents of the stream
trixrabbit 6:cf4a6ee5d885 69 }
trixrabbit 9:9b874294a381 70
trixrabbit 9:9b874294a381 71 /*******************
trixrabbit 9:9b874294a381 72 configInit
trixrabbit 9:9b874294a381 73 fonction de config avec le config file
trixrabbit 9:9b874294a381 74 *******************/
trixrabbit 9:9b874294a381 75 void configInit()
passelin 4:21b8959e8b71 76 {
passelin 4:21b8959e8b71 77 char *key1 = "PANID";
passelin 4:21b8959e8b71 78 char *key2 = "FREQ";
passelin 4:21b8959e8b71 79 char value[BUFSIZ];
passelin 4:21b8959e8b71 80
passelin 4:21b8959e8b71 81 // Read a configuration file from a mbed.
passelin 4:21b8959e8b71 82 if (!cfg.read("/local/initconf.cfg"))
passelin 4:21b8959e8b71 83 {
passelin 4:21b8959e8b71 84 error("Failure to read a configuration file.\n");
passelin 4:21b8959e8b71 85 }
passelin 4:21b8959e8b71 86
trixrabbit 7:0f107e48147d 87
trixrabbit 7:0f107e48147d 88 // Get a configuration value.
trixrabbit 7:0f107e48147d 89
passelin 4:21b8959e8b71 90 if (cfg.getValue(key1, &value[0], sizeof(value)))
passelin 4:21b8959e8b71 91 {
trixrabbit 8:cfc86293ec94 92 std::stringstream panID_s(value); //transforme la valeur du panID en string
trixrabbit 8:cfc86293ec94 93 panID_s >> panID; //place le string dans la variable globale
passelin 4:21b8959e8b71 94 }
passelin 4:21b8959e8b71 95
passelin 4:21b8959e8b71 96 if (cfg.getValue(key2, &value[0], sizeof(value)))
passelin 4:21b8959e8b71 97 {
trixrabbit 8:cfc86293ec94 98 std::stringstream freq_s(value); //transforme la frequence en string
trixrabbit 8:cfc86293ec94 99 freq_s >> period_ms; //place le string dans la variable globale
passelin 4:21b8959e8b71 100 }
passelin 4:21b8959e8b71 101 }
trixrabbit 2:bbe1253008e6 102
trixrabbit 9:9b874294a381 103 /*******************
trixrabbit 9:9b874294a381 104 xbee_init
trixrabbit 9:9b874294a381 105 fonction de config du module xBee
trixrabbit 9:9b874294a381 106 *******************/
trixrabbit 9:9b874294a381 107 void xbee_init()
passelin 3:ef0e12857e30 108 {
trixrabbit 8:cfc86293ec94 109 reset = 0; //initialisation
passelin 3:ef0e12857e30 110 wait_ms(400);
passelin 3:ef0e12857e30 111 reset = 1;
trixrabbit 5:b4b4a64ef0d6 112 wait(4);
trixrabbit 8:cfc86293ec94 113 //variables
trixrabbit 5:b4b4a64ef0d6 114 int panID_size;
trixrabbit 5:b4b4a64ef0d6 115 int panID_array[8];
trixrabbit 5:b4b4a64ef0d6 116 int i;
trixrabbit 5:b4b4a64ef0d6 117 long int panID_d;
trixrabbit 8:cfc86293ec94 118
trixrabbit 7:0f107e48147d 119 panID_size = panID.length(); //vérifie si le panID est pair ou impair
trixrabbit 5:b4b4a64ef0d6 120 if(panID_size%2 != 0)
trixrabbit 5:b4b4a64ef0d6 121 {
trixrabbit 8:cfc86293ec94 122 panID_size++; //si impair size++ (i.e. on veut que 5/2 = 3 au lieu de 2)
trixrabbit 5:b4b4a64ef0d6 123 panID = "0" + panID;
trixrabbit 5:b4b4a64ef0d6 124 }
trixrabbit 5:b4b4a64ef0d6 125
trixrabbit 7:0f107e48147d 126 panID_d = strtol(panID.c_str(),NULL,16); //converti le panID en chiffre
trixrabbit 5:b4b4a64ef0d6 127 for(i=0;i<panID_size/2;i++)
trixrabbit 5:b4b4a64ef0d6 128 {
trixrabbit 8:cfc86293ec94 129 panID_array[i] = panID_d%256; //decoupe en packet de 8 bytes (2 characteres) et place dans tableau
trixrabbit 8:cfc86293ec94 130 panID_d = panID_d >> 8; //à partir de la fin (i.e. CAFE --> array[0] = FE, array[1] = CA )
trixrabbit 5:b4b4a64ef0d6 131
trixrabbit 5:b4b4a64ef0d6 132
trixrabbit 5:b4b4a64ef0d6 133 }
trixrabbit 7:0f107e48147d 134 i--; //i est incrémentré une fois de trop dans le for avant de sortir de la boucle
trixrabbit 5:b4b4a64ef0d6 135
trixrabbit 5:b4b4a64ef0d6 136
trixrabbit 7:0f107e48147d 137 //construction des 3 trames pour changer le panID
trixrabbit 5:b4b4a64ef0d6 138 char size = panID_size/2 + 0x04; //length + 0x04
trixrabbit 5:b4b4a64ef0d6 139 char checkSum = 0;
trixrabbit 5:b4b4a64ef0d6 140 xbee.putc(0x7E); // start delimeter
trixrabbit 5:b4b4a64ef0d6 141 xbee.putc(0x00); // length
trixrabbit 5:b4b4a64ef0d6 142 xbee.putc(size); // length
trixrabbit 5:b4b4a64ef0d6 143 xbee.putc(0x09); // frame type : AT command queue
trixrabbit 5:b4b4a64ef0d6 144 xbee.putc(0x47); // frame ID
trixrabbit 7:0f107e48147d 145 xbee.putc(0x49); //AT command : (ID)
trixrabbit 7:0f107e48147d 146 xbee.putc(0x44); //AT command : (ID)
trixrabbit 5:b4b4a64ef0d6 147 checkSum = checkSum + 0x09 + 0x47 + 0x49 + 0x44;
trixrabbit 5:b4b4a64ef0d6 148 while(i>=0)
trixrabbit 8:cfc86293ec94 149 {
trixrabbit 8:cfc86293ec94 150 xbee.putc(panID_array[i]); //putc avec les valeur du tableau
trixrabbit 8:cfc86293ec94 151 checkSum += panID_array[i]; //les valeurs sont mises à l'envers dans le tableau
trixrabbit 8:cfc86293ec94 152 i--;//on doit donc décrémenter le i
trixrabbit 5:b4b4a64ef0d6 153 }
trixrabbit 5:b4b4a64ef0d6 154 checkSum = 0xff - checkSum;
trixrabbit 5:b4b4a64ef0d6 155 xbee.putc(checkSum); // checksum
trixrabbit 8:cfc86293ec94 156
trixrabbit 5:b4b4a64ef0d6 157
trixrabbit 5:b4b4a64ef0d6 158 xbee.putc(0x7E); // start delimeter
trixrabbit 5:b4b4a64ef0d6 159 xbee.putc(0x00); // length
trixrabbit 5:b4b4a64ef0d6 160 xbee.putc(0x04); // length
trixrabbit 5:b4b4a64ef0d6 161 xbee.putc(0x09); // frame type : AT command queue
trixrabbit 5:b4b4a64ef0d6 162 xbee.putc(0x49); // frame ID
trixrabbit 5:b4b4a64ef0d6 163 xbee.putc(0x57); //AT command : (WR)
trixrabbit 5:b4b4a64ef0d6 164 xbee.putc(0x52); //AT command : (WR)
trixrabbit 5:b4b4a64ef0d6 165 xbee.putc(0x04); //checksum
trixrabbit 5:b4b4a64ef0d6 166
trixrabbit 5:b4b4a64ef0d6 167
trixrabbit 5:b4b4a64ef0d6 168 xbee.putc(0x7E); // start delimeter
trixrabbit 5:b4b4a64ef0d6 169 xbee.putc(0x00); // length
trixrabbit 5:b4b4a64ef0d6 170 xbee.putc(0x04); // length
trixrabbit 5:b4b4a64ef0d6 171 xbee.putc(0x09); // frame type : AT command
trixrabbit 5:b4b4a64ef0d6 172 xbee.putc(0x4A); // frame ID
trixrabbit 5:b4b4a64ef0d6 173 xbee.putc(0x41); //AT command : (AC)
trixrabbit 5:b4b4a64ef0d6 174 xbee.putc(0x43); //AT command : (AC)
trixrabbit 5:b4b4a64ef0d6 175 xbee.putc(0x28); //checksum
trixrabbit 5:b4b4a64ef0d6 176
passelin 3:ef0e12857e30 177 }
passelin 3:ef0e12857e30 178
trixrabbit 8:cfc86293ec94 179 char i2c_read_reg(char address) //fonction i2c pour l'accelerometre
passelin 3:ef0e12857e30 180 {
passelin 3:ef0e12857e30 181 // Read from selected register adress
passelin 3:ef0e12857e30 182 i2c.start();
passelin 3:ef0e12857e30 183 i2c.write(MMA8452_WRITE_ADDRESS);
passelin 3:ef0e12857e30 184 i2c.write(address);
passelin 3:ef0e12857e30 185 i2c.start();
passelin 3:ef0e12857e30 186 i2c.write(MMA8452_READ_ADDRESS);
passelin 3:ef0e12857e30 187 char data = i2c.read(0);
passelin 3:ef0e12857e30 188 i2c.stop();
trixrabbit 2:bbe1253008e6 189
passelin 3:ef0e12857e30 190 // return the data readed
passelin 3:ef0e12857e30 191 return data;
passelin 3:ef0e12857e30 192 }
passelin 3:ef0e12857e30 193
trixrabbit 8:cfc86293ec94 194 bool initAccel() //fonction qui initialise l'accelerometre avec i2c
passelin 3:ef0e12857e30 195 {
passelin 3:ef0e12857e30 196 // Start I2C communication
passelin 3:ef0e12857e30 197 char data = i2c_read_reg(WHO_AM_I);
passelin 3:ef0e12857e30 198 if(data != 0x2A)
passelin 3:ef0e12857e30 199 {
passelin 3:ef0e12857e30 200 return false;
passelin 3:ef0e12857e30 201 }
passelin 3:ef0e12857e30 202
passelin 3:ef0e12857e30 203 // Set accelerometer in Low Noise Low Power mode
passelin 3:ef0e12857e30 204 i2c.start();
passelin 3:ef0e12857e30 205 i2c.write(MMA8452_WRITE_ADDRESS);
passelin 3:ef0e12857e30 206 i2c.write(CTRL_REG2);
passelin 3:ef0e12857e30 207 i2c.write(0x01);
passelin 3:ef0e12857e30 208 i2c.stop();
passelin 3:ef0e12857e30 209
passelin 3:ef0e12857e30 210 // Set accelerometer in active mode
passelin 3:ef0e12857e30 211 i2c.start();
passelin 3:ef0e12857e30 212 i2c.write(MMA8452_WRITE_ADDRESS);
passelin 3:ef0e12857e30 213 i2c.write(CTRL_REG1);
passelin 3:ef0e12857e30 214 i2c.write(0x01);
passelin 3:ef0e12857e30 215 i2c.stop();
passelin 3:ef0e12857e30 216
passelin 3:ef0e12857e30 217 return true;
passelin 3:ef0e12857e30 218 }
passelin 3:ef0e12857e30 219
trixrabbit 9:9b874294a381 220
trixrabbit 9:9b874294a381 221 /*******************
trixrabbit 9:9b874294a381 222 getAccelValue
trixrabbit 9:9b874294a381 223 fonction qui lit les registres de données de l'accelerometre
trixrabbit 9:9b874294a381 224 *******************/
trixrabbit 8:cfc86293ec94 225 unsigned short getAccelValue(char MSB_addr) //fonction qui lit les registres de données de l'accelerometre
trixrabbit 2:bbe1253008e6 226 {
passelin 4:21b8959e8b71 227 return i2c_read_reg(MSB_addr); // Read MSB data from MSB register
trixrabbit 2:bbe1253008e6 228 }
passelin 3:ef0e12857e30 229
trixrabbit 7:0f107e48147d 230
trixrabbit 9:9b874294a381 231 /*******************
trixrabbit 9:9b874294a381 232 getAccelData
trixrabbit 9:9b874294a381 233 fonction qui construit la string a envoyer par xbee de l'accélérometre
trixrabbit 9:9b874294a381 234 *******************/
trixrabbit 7:0f107e48147d 235 string getAccelData()
trixrabbit 2:bbe1253008e6 236 {
trixrabbit 7:0f107e48147d 237 unsigned short x, y, z;
passelin 4:21b8959e8b71 238
trixrabbit 7:0f107e48147d 239 // Get accelerometer values
trixrabbit 7:0f107e48147d 240 x= getAccelValue(OUT_X_MSB);
trixrabbit 7:0f107e48147d 241 y= getAccelValue(OUT_Y_MSB);
trixrabbit 7:0f107e48147d 242 z= getAccelValue(OUT_Z_MSB);
trixrabbit 6:cf4a6ee5d885 243
trixrabbit 7:0f107e48147d 244 return "AX" + convertInt(x) + " AY" + convertInt(y) + " AZ" + convertInt(z);
trixrabbit 7:0f107e48147d 245 }
trixrabbit 9:9b874294a381 246
trixrabbit 9:9b874294a381 247
trixrabbit 9:9b874294a381 248 /*******************
trixrabbit 9:9b874294a381 249 getPushButtonData
trixrabbit 9:9b874294a381 250 fonction qui construit la string a envoyer par xbee du bouton poussoir
trixrabbit 9:9b874294a381 251 *******************/
trixrabbit 7:0f107e48147d 252 string getPushButtonData()
trixrabbit 7:0f107e48147d 253 {
trixrabbit 7:0f107e48147d 254 return "PB" + convertInt(pb1);
trixrabbit 7:0f107e48147d 255 }
trixrabbit 7:0f107e48147d 256
trixrabbit 9:9b874294a381 257
trixrabbit 9:9b874294a381 258 /*******************
trixrabbit 9:9b874294a381 259 xbee_transmit
trixrabbit 9:9b874294a381 260 fonction d'envoie de trame xbee
trixrabbit 9:9b874294a381 261 *******************/
trixrabbit 7:0f107e48147d 262 void xbee_transmit(string data_s)
trixrabbit 7:0f107e48147d 263 {
trixrabbit 7:0f107e48147d 264
trixrabbit 2:bbe1253008e6 265 char checkSum = 0;
trixrabbit 6:cf4a6ee5d885 266 char size = data_s.length() + 0x0E; //0x0E + data type
trixrabbit 2:bbe1253008e6 267 xbee.putc(0x7E); // start delimeter
trixrabbit 2:bbe1253008e6 268 xbee.putc(0x00); // length
trixrabbit 2:bbe1253008e6 269 xbee.putc(size); // length
trixrabbit 5:b4b4a64ef0d6 270 xbee.putc(0x10); // frame type : transmit request
trixrabbit 2:bbe1253008e6 271 xbee.putc(0x01); // frame ID
trixrabbit 5:b4b4a64ef0d6 272 xbee.putc(0x00); // adress MAC octet 1 de 8
trixrabbit 5:b4b4a64ef0d6 273 xbee.putc(0x13); // adress MAC octet 2 de 8
trixrabbit 5:b4b4a64ef0d6 274 xbee.putc(0xA2); // adress MAC octet 3 de 8
trixrabbit 5:b4b4a64ef0d6 275 xbee.putc(0x00); // adress MAC octet 4 de 8
trixrabbit 5:b4b4a64ef0d6 276 xbee.putc(0x40); // adress MAC octet 5 de 8
trixrabbit 5:b4b4a64ef0d6 277 xbee.putc(0x8B); // adress MAC octet 6 de 8
trixrabbit 5:b4b4a64ef0d6 278 xbee.putc(0x41); // adress MAC octet 7 de 8
trixrabbit 5:b4b4a64ef0d6 279 xbee.putc(0x98); // adress MAC octet 8 de 8
trixrabbit 5:b4b4a64ef0d6 280 xbee.putc(0x00); // dest. adress network octet 1 de 2
trixrabbit 5:b4b4a64ef0d6 281 xbee.putc(0x00); // dest. adress network octet 2 de 2
trixrabbit 2:bbe1253008e6 282 xbee.putc(0x00); // broadcast radius
trixrabbit 2:bbe1253008e6 283 xbee.putc(0x00); // option
trixrabbit 2:bbe1253008e6 284 checkSum = checkSum + 0x10 + 0x01 + 0x00 + 0x13+ 0xA2 + 0x00 + 0x40 + 0x8B +0x41 + 0x98 + 0x00 + 0x00 + 0x00 + 0x00;
trixrabbit 6:cf4a6ee5d885 285
passelin 4:21b8959e8b71 286 for (int i=0;i<data_s.length();i++) //data
trixrabbit 2:bbe1253008e6 287 {
trixrabbit 8:cfc86293ec94 288 xbee.putc(data_s[i]); //envoie le data de la string passée en parametre
trixrabbit 8:cfc86293ec94 289 checkSum += data_s[i]; //additionne le checksum de chaque data
trixrabbit 2:bbe1253008e6 290 }
trixrabbit 2:bbe1253008e6 291 checkSum = 0xff - checkSum;
trixrabbit 2:bbe1253008e6 292 xbee.putc(checkSum); // checksum
trixrabbit 2:bbe1253008e6 293
trixrabbit 2:bbe1253008e6 294 }
passelin 0:ed0e18b7fa30 295
trixrabbit 9:9b874294a381 296
trixrabbit 9:9b874294a381 297 /*******************
trixrabbit 9:9b874294a381 298
trixrabbit 9:9b874294a381 299 MAIN
trixrabbit 9:9b874294a381 300
trixrabbit 9:9b874294a381 301 *******************/
passelin 0:ed0e18b7fa30 302 int main()
passelin 0:ed0e18b7fa30 303 {
trixrabbit 8:cfc86293ec94 304 //appelle des fonctions d'initialisations
trixrabbit 8:cfc86293ec94 305 configInit(); //fichier de config
trixrabbit 8:cfc86293ec94 306 xbee_init(); //xbee
trixrabbit 8:cfc86293ec94 307 initAccel(); //accelerometre
passelin 3:ef0e12857e30 308
passelin 4:21b8959e8b71 309 myled = 0;
passelin 3:ef0e12857e30 310
trixrabbit 7:0f107e48147d 311
passelin 0:ed0e18b7fa30 312 while(1)
passelin 0:ed0e18b7fa30 313 {
passelin 4:21b8959e8b71 314 wait_ms(period_ms);
passelin 4:21b8959e8b71 315 myled = !myled;
passelin 4:21b8959e8b71 316
trixrabbit 7:0f107e48147d 317 //Transmit PUSHBUTTON to coordonitator
trixrabbit 7:0f107e48147d 318 xbee_transmit(getPushButtonData());
trixrabbit 6:cf4a6ee5d885 319
passelin 4:21b8959e8b71 320 //Transmit ACCEL xyz to coordonitator
trixrabbit 7:0f107e48147d 321 xbee_transmit(getAccelData());
trixrabbit 7:0f107e48147d 322
passelin 4:21b8959e8b71 323
trixrabbit 7:0f107e48147d 324
passelin 3:ef0e12857e30 325
passelin 4:21b8959e8b71 326
passelin 3:ef0e12857e30 327
passelin 0:ed0e18b7fa30 328 }
passelin 0:ed0e18b7fa30 329 }
trixrabbit 2:bbe1253008e6 330