code d'envoie de trame

Dependencies:   mbed ConfigFile

Fork of app4-router by APP Team

Committer:
trixrabbit
Date:
Tue Feb 25 18:32:33 2014 +0000
Revision:
8:cfc86293ec94
Parent:
7:0f107e48147d
Child:
9:9b874294a381
version final;

Who changed what in which revision?

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