code d'envoie de trame

Dependencies:   mbed ConfigFile

Fork of app4-router by APP Team

Committer:
passelin
Date:
Mon Feb 24 18:27:45 2014 +0000
Revision:
4:21b8959e8b71
Parent:
3:ef0e12857e30
Child:
5:b4b4a64ef0d6
config file fonctionnel

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 2:bbe1253008e6 3 #include <string>
passelin 3:ef0e12857e30 4 #include "ConfigFile.h"
passelin 3:ef0e12857e30 5
passelin 3:ef0e12857e30 6 #define DELAY 0.25
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 4:21b8959e8b71 20 #define ACCEL_X 0x01
passelin 4:21b8959e8b71 21 #define ACCEL_Y 0x02
passelin 4:21b8959e8b71 22 #define ACCEL_Z 0x03
passelin 4:21b8959e8b71 23 #define PUSHBOUTON 0x04
passelin 0:ed0e18b7fa30 24
passelin 0:ed0e18b7fa30 25 DigitalOut myled(LED1);
passelin 4:21b8959e8b71 26 DigitalIn pb1(p5);
passelin 0:ed0e18b7fa30 27 DigitalOut reset(p8);
passelin 0:ed0e18b7fa30 28 Serial pc(USBTX, USBRX);
passelin 0:ed0e18b7fa30 29 Serial xbee(p13, p14);
passelin 3:ef0e12857e30 30 I2C i2c(p9, p10); // I2C port (sda, scl)
passelin 3:ef0e12857e30 31
passelin 4:21b8959e8b71 32 LocalFileSystem local("local");
passelin 3:ef0e12857e30 33 ConfigFile cfg;
passelin 3:ef0e12857e30 34
passelin 3:ef0e12857e30 35 string AccelData;
passelin 4:21b8959e8b71 36 int period_ms;
passelin 4:21b8959e8b71 37
passelin 4:21b8959e8b71 38 void configInit()
passelin 4:21b8959e8b71 39 {
passelin 4:21b8959e8b71 40 char *key1 = "PANID";
passelin 4:21b8959e8b71 41 char *key2 = "FREQ";
passelin 4:21b8959e8b71 42 char value[BUFSIZ];
passelin 4:21b8959e8b71 43
passelin 4:21b8959e8b71 44 // Read a configuration file from a mbed.
passelin 4:21b8959e8b71 45 if (!cfg.read("/local/initconf.cfg"))
passelin 4:21b8959e8b71 46 {
passelin 4:21b8959e8b71 47 error("Failure to read a configuration file.\n");
passelin 4:21b8959e8b71 48 }
passelin 4:21b8959e8b71 49
passelin 4:21b8959e8b71 50 /*
passelin 4:21b8959e8b71 51 * Get a configuration value.
passelin 4:21b8959e8b71 52 */
passelin 4:21b8959e8b71 53 if (cfg.getValue(key1, &value[0], sizeof(value)))
passelin 4:21b8959e8b71 54 {
passelin 4:21b8959e8b71 55 printf("'%s'='%s'\n", key1, value);
passelin 4:21b8959e8b71 56 }
passelin 4:21b8959e8b71 57
passelin 4:21b8959e8b71 58 if (cfg.getValue(key2, &value[0], sizeof(value)))
passelin 4:21b8959e8b71 59 {
passelin 4:21b8959e8b71 60 std::stringstream freq_s(value);
passelin 4:21b8959e8b71 61 freq_s >> period_ms;
passelin 4:21b8959e8b71 62 printf("'%s'='%d'\n", key2, period_ms);
passelin 4:21b8959e8b71 63 }
passelin 4:21b8959e8b71 64 }
trixrabbit 2:bbe1253008e6 65
passelin 3:ef0e12857e30 66 void xbee_init()
passelin 3:ef0e12857e30 67 {
passelin 3:ef0e12857e30 68 reset = 0;
passelin 3:ef0e12857e30 69 wait_ms(400);
passelin 3:ef0e12857e30 70 reset = 1;
passelin 3:ef0e12857e30 71 }
passelin 3:ef0e12857e30 72
passelin 3:ef0e12857e30 73 char i2c_read_reg(char address)
passelin 3:ef0e12857e30 74 {
passelin 3:ef0e12857e30 75 // Read from selected register adress
passelin 3:ef0e12857e30 76 i2c.start();
passelin 3:ef0e12857e30 77 i2c.write(MMA8452_WRITE_ADDRESS);
passelin 3:ef0e12857e30 78 i2c.write(address);
passelin 3:ef0e12857e30 79 i2c.start();
passelin 3:ef0e12857e30 80 i2c.write(MMA8452_READ_ADDRESS);
passelin 3:ef0e12857e30 81 char data = i2c.read(0);
passelin 3:ef0e12857e30 82 i2c.stop();
trixrabbit 2:bbe1253008e6 83
passelin 3:ef0e12857e30 84 // return the data readed
passelin 3:ef0e12857e30 85 return data;
passelin 3:ef0e12857e30 86 }
passelin 3:ef0e12857e30 87
passelin 3:ef0e12857e30 88 bool initAccel()
passelin 3:ef0e12857e30 89 {
passelin 3:ef0e12857e30 90 // Start I2C communication
passelin 3:ef0e12857e30 91 char data = i2c_read_reg(WHO_AM_I);
passelin 3:ef0e12857e30 92 if(data != 0x2A)
passelin 3:ef0e12857e30 93 {
passelin 3:ef0e12857e30 94 return false;
passelin 3:ef0e12857e30 95 }
passelin 3:ef0e12857e30 96
passelin 3:ef0e12857e30 97 // Set accelerometer in Low Noise Low Power mode
passelin 3:ef0e12857e30 98 i2c.start();
passelin 3:ef0e12857e30 99 i2c.write(MMA8452_WRITE_ADDRESS);
passelin 3:ef0e12857e30 100 i2c.write(CTRL_REG2);
passelin 3:ef0e12857e30 101 i2c.write(0x01);
passelin 3:ef0e12857e30 102 i2c.stop();
passelin 3:ef0e12857e30 103
passelin 3:ef0e12857e30 104 // Set accelerometer in active mode
passelin 3:ef0e12857e30 105 i2c.start();
passelin 3:ef0e12857e30 106 i2c.write(MMA8452_WRITE_ADDRESS);
passelin 3:ef0e12857e30 107 i2c.write(CTRL_REG1);
passelin 3:ef0e12857e30 108 i2c.write(0x01);
passelin 3:ef0e12857e30 109 i2c.stop();
passelin 3:ef0e12857e30 110
passelin 3:ef0e12857e30 111 return true;
passelin 3:ef0e12857e30 112 }
passelin 3:ef0e12857e30 113
passelin 3:ef0e12857e30 114
passelin 3:ef0e12857e30 115 unsigned short getAccelValue(char MSB_addr, char LSB_addr)
trixrabbit 2:bbe1253008e6 116 {
passelin 4:21b8959e8b71 117 return i2c_read_reg(MSB_addr); // Read MSB data from MSB register
trixrabbit 2:bbe1253008e6 118 }
passelin 3:ef0e12857e30 119
passelin 4:21b8959e8b71 120 void xbee_transmit(char type, int data)
trixrabbit 2:bbe1253008e6 121 {
passelin 4:21b8959e8b71 122 std::stringstream out;
passelin 4:21b8959e8b71 123
passelin 4:21b8959e8b71 124 string type_s;
passelin 4:21b8959e8b71 125 switch(type)
passelin 4:21b8959e8b71 126 {
passelin 4:21b8959e8b71 127 case ACCEL_X: type_s = "<AX";
passelin 4:21b8959e8b71 128 break;
passelin 4:21b8959e8b71 129
passelin 4:21b8959e8b71 130 case ACCEL_Y: type_s = "<AY";
passelin 4:21b8959e8b71 131 break;
passelin 4:21b8959e8b71 132
passelin 4:21b8959e8b71 133 case ACCEL_Z: type_s = "<AZ";
passelin 4:21b8959e8b71 134 break;
passelin 4:21b8959e8b71 135
passelin 4:21b8959e8b71 136 case PUSHBOUTON: type_s = "<PB";
passelin 4:21b8959e8b71 137 break;
passelin 4:21b8959e8b71 138 }
passelin 4:21b8959e8b71 139
passelin 4:21b8959e8b71 140 out << data;
passelin 4:21b8959e8b71 141 string data_s = out.str();
passelin 4:21b8959e8b71 142 data_s = type_s + data_s + ">";
passelin 4:21b8959e8b71 143
trixrabbit 2:bbe1253008e6 144 char checkSum = 0;
passelin 4:21b8959e8b71 145 char size = data_s.length() + 0x0E; //0x0E + data type + nombre de data = 0x0F + nombre de data
trixrabbit 2:bbe1253008e6 146 xbee.putc(0x7E); // start delimeter
trixrabbit 2:bbe1253008e6 147 xbee.putc(0x00); // length
trixrabbit 2:bbe1253008e6 148 xbee.putc(size); // length
trixrabbit 2:bbe1253008e6 149
trixrabbit 2:bbe1253008e6 150 xbee.putc(0x10); // frame type
trixrabbit 2:bbe1253008e6 151 xbee.putc(0x01); // frame ID
trixrabbit 2:bbe1253008e6 152 xbee.putc(0x00); // adress MAC debut
trixrabbit 2:bbe1253008e6 153 xbee.putc(0x13); // |
trixrabbit 2:bbe1253008e6 154 xbee.putc(0xA2); // |
trixrabbit 2:bbe1253008e6 155 xbee.putc(0x00); // |
trixrabbit 2:bbe1253008e6 156 xbee.putc(0x40); // |
trixrabbit 2:bbe1253008e6 157 xbee.putc(0x8B); // |
trixrabbit 2:bbe1253008e6 158 xbee.putc(0x41); // |
trixrabbit 2:bbe1253008e6 159 xbee.putc(0x98); // adress MAC fin
trixrabbit 2:bbe1253008e6 160 xbee.putc(0x00); // dest. adress network
trixrabbit 2:bbe1253008e6 161 xbee.putc(0x00); // dest. adress network
trixrabbit 2:bbe1253008e6 162 xbee.putc(0x00); // broadcast radius
trixrabbit 2:bbe1253008e6 163 xbee.putc(0x00); // option
trixrabbit 2:bbe1253008e6 164 checkSum = checkSum + 0x10 + 0x01 + 0x00 + 0x13+ 0xA2 + 0x00 + 0x40 + 0x8B +0x41 + 0x98 + 0x00 + 0x00 + 0x00 + 0x00;
trixrabbit 2:bbe1253008e6 165 //data type
passelin 4:21b8959e8b71 166 for (int i=0;i<data_s.length();i++) //data
trixrabbit 2:bbe1253008e6 167 {
passelin 4:21b8959e8b71 168 xbee.putc(data_s[i]);
passelin 4:21b8959e8b71 169 checkSum += data_s[i];
trixrabbit 2:bbe1253008e6 170 }
trixrabbit 2:bbe1253008e6 171 checkSum = 0xff - checkSum;
trixrabbit 2:bbe1253008e6 172 xbee.putc(checkSum); // checksum
trixrabbit 2:bbe1253008e6 173
trixrabbit 2:bbe1253008e6 174 }
passelin 0:ed0e18b7fa30 175
passelin 0:ed0e18b7fa30 176 int main()
passelin 0:ed0e18b7fa30 177 {
passelin 4:21b8959e8b71 178 unsigned short x, y, z;
passelin 3:ef0e12857e30 179
passelin 4:21b8959e8b71 180
passelin 4:21b8959e8b71 181 configInit();
passelin 3:ef0e12857e30 182 xbee_init();
passelin 3:ef0e12857e30 183 initAccel();
passelin 3:ef0e12857e30 184
passelin 4:21b8959e8b71 185 myled = 0;
passelin 3:ef0e12857e30 186
passelin 3:ef0e12857e30 187 wait(4);
passelin 3:ef0e12857e30 188
passelin 0:ed0e18b7fa30 189 while(1)
passelin 0:ed0e18b7fa30 190 {
passelin 4:21b8959e8b71 191 wait_ms(period_ms);
passelin 4:21b8959e8b71 192 myled = !myled;
passelin 4:21b8959e8b71 193
passelin 4:21b8959e8b71 194 // Get accelerometer values
passelin 4:21b8959e8b71 195 x= getAccelValue(OUT_X_MSB, OUT_X_LSB);
passelin 4:21b8959e8b71 196 y= getAccelValue(OUT_Y_MSB, OUT_Y_LSB);
passelin 3:ef0e12857e30 197 z= getAccelValue(OUT_Z_MSB, OUT_Z_LSB);
passelin 4:21b8959e8b71 198
passelin 4:21b8959e8b71 199 //Transmit ACCEL xyz to coordonitator
passelin 4:21b8959e8b71 200 xbee_transmit(ACCEL_X, x);
passelin 4:21b8959e8b71 201 xbee_transmit(ACCEL_Y, y);
passelin 4:21b8959e8b71 202 xbee_transmit(ACCEL_Z, z);
passelin 4:21b8959e8b71 203
passelin 4:21b8959e8b71 204 //Transmit PUSHBUTTON to coordonitator
passelin 4:21b8959e8b71 205 xbee_transmit(PUSHBOUTON, pb1.read());
passelin 3:ef0e12857e30 206
passelin 4:21b8959e8b71 207
passelin 3:ef0e12857e30 208
passelin 0:ed0e18b7fa30 209 }
passelin 0:ed0e18b7fa30 210 }
trixrabbit 2:bbe1253008e6 211