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