code d'envoie de trame
Dependencies: mbed ConfigFile
Fork of app4-router by
main.cpp@8:cfc86293ec94, 2014-02-25 (annotated)
- 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?
User | Revision | Line number | New 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 |