gbgfa

Dependencies:   mbed-rtos mbed EthernetInterface WebSocketClient

Committer:
ABuche
Date:
Mon Feb 13 20:43:20 2017 +0000
Revision:
3:889e47988154
Parent:
2:63e05b3b6938
Child:
4:287c3bd0c425
FINAL?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ABuche 0:1be517779135 1 #include "mbed.h"
ABuche 0:1be517779135 2 #include "rtos.h"
ABuche 2:63e05b3b6938 3 #include "EthernetInterface.h"
ABuche 0:1be517779135 4
ABuche 0:1be517779135 5 LocalFileSystem local("local");
ABuche 0:1be517779135 6
ABuche 0:1be517779135 7 DigitalOut led1(LED1);
ABuche 3:889e47988154 8 DigitalOut ledError(LED4);
ABuche 2:63e05b3b6938 9
ABuche 0:1be517779135 10 DigitalOut reset(p8);
ABuche 0:1be517779135 11 RawSerial xbee(p13, p14);
ABuche 0:1be517779135 12
ABuche 0:1be517779135 13 RawSerial pc(USBTX, USBRX);
ABuche 0:1be517779135 14
ABuche 2:63e05b3b6938 15 Thread* receptionThread;
ABuche 2:63e05b3b6938 16 Thread* processingThread;
ABuche 2:63e05b3b6938 17 Thread* ledThread;
ABuche 2:63e05b3b6938 18 Thread* ethernetReceptionThread;
ABuche 3:889e47988154 19 Thread* errorDisplay;
ABuche 2:63e05b3b6938 20
ABuche 2:63e05b3b6938 21 TCPSocketConnection sock;
ABuche 0:1be517779135 22
ABuche 0:1be517779135 23 char LED_Toggle[] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x00, 0x00,
ABuche 3:889e47988154 24 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x44, 0x30, 0x00, 0x25
ABuche 3:889e47988154 25 }; //Change index 13 & 14 & 18 & 19
ABuche 3:889e47988154 26
ABuche 2:63e05b3b6938 27 char AT_ID[] = {0x7E, 0x00, 0x06, 0x09, 0x01, 0x49 , 0x44, 0x00, 0x00, 0x00}; // +DATA + CS (7 & 8)
ABuche 0:1be517779135 28 const char AT_WR[] = {0x7E, 0x00, 0x04, 0x09, 0x01, 0x57, 0x52, 0x4C};
ABuche 0:1be517779135 29 const char AT_AC[] = {0x7E, 0x00, 0x04, 0x09, 0x01, 0x41, 0x43, 0x71};
ABuche 0:1be517779135 30
ABuche 0:1be517779135 31 typedef struct {
ABuche 0:1be517779135 32 char msg[25];
ABuche 0:1be517779135 33 } message;
ABuche 0:1be517779135 34
ABuche 0:1be517779135 35 typedef struct {
ABuche 0:1be517779135 36 char al;
ABuche 0:1be517779135 37 char ah;
ABuche 0:1be517779135 38 } address;
ABuche 0:1be517779135 39
ABuche 1:446da73e1118 40 address addresses[2];
ABuche 0:1be517779135 41 char addressCounter = 0;
ABuche 0:1be517779135 42
ABuche 0:1be517779135 43 Queue<message, 25> queue;
ABuche 0:1be517779135 44 MemoryPool<message, 25> mPool;
ABuche 0:1be517779135 45
ABuche 3:889e47988154 46 char checksum(char array[], char length)
ABuche 3:889e47988154 47 {
ABuche 0:1be517779135 48 char cs = 0;
ABuche 3:889e47988154 49 for (int i = 3; i<length - 1; i++) {
ABuche 0:1be517779135 50 cs += array[i];
ABuche 0:1be517779135 51 }
ABuche 0:1be517779135 52 return 0xFF - cs;
ABuche 0:1be517779135 53 }
ABuche 0:1be517779135 54
ABuche 3:889e47988154 55 int traitementAcc(char msb, char lsb)
ABuche 3:889e47988154 56 {
ABuche 2:63e05b3b6938 57 int val = msb > 127 ? 0xFFFFF000 | (msb << 4) : msb << 4;
ABuche 3:889e47988154 58
ABuche 2:63e05b3b6938 59 // Ajout des LSB
ABuche 2:63e05b3b6938 60 val += lsb >> 4;
ABuche 3:889e47988154 61
ABuche 2:63e05b3b6938 62 val = val > 2047 ? 2048 - val : val;
ABuche 2:63e05b3b6938 63 val = val > 1024 ? 1024 : val;
ABuche 2:63e05b3b6938 64 val = val < -1024 ? -1024 : val;
ABuche 3:889e47988154 65
ABuche 2:63e05b3b6938 66 return val;
ABuche 2:63e05b3b6938 67 }
ABuche 2:63e05b3b6938 68
ABuche 3:889e47988154 69 void reception()
ABuche 3:889e47988154 70 {
ABuche 0:1be517779135 71 while(1) {
ABuche 3:889e47988154 72 if(xbee.readable()) {
ABuche 3:889e47988154 73 message* msg = mPool.alloc();
ABuche 3:889e47988154 74
ABuche 3:889e47988154 75 msg->msg[0] = xbee.getc();
ABuche 3:889e47988154 76
ABuche 3:889e47988154 77 if(msg->msg[0] == 0x7E) {
ABuche 3:889e47988154 78 msg->msg[1] = xbee.getc();
ABuche 3:889e47988154 79 msg->msg[2] = xbee.getc();
ABuche 3:889e47988154 80
ABuche 3:889e47988154 81 for (int i = 3; i < msg->msg[2] + 4; i++) {
ABuche 3:889e47988154 82 msg->msg[i] = xbee.getc();
ABuche 3:889e47988154 83 }
ABuche 3:889e47988154 84
ABuche 3:889e47988154 85 queue.put(msg);
ABuche 3:889e47988154 86 } else {
ABuche 3:889e47988154 87 mPool.free(msg);
ABuche 0:1be517779135 88 }
ABuche 0:1be517779135 89 }
ABuche 0:1be517779135 90 }
ABuche 0:1be517779135 91 }
ABuche 0:1be517779135 92
ABuche 3:889e47988154 93 void processing()
ABuche 3:889e47988154 94 {
ABuche 0:1be517779135 95 while(1) {
ABuche 0:1be517779135 96 message* msg = (message*)queue.get().value.p;
ABuche 3:889e47988154 97
ABuche 3:889e47988154 98 switch(msg->msg[3]) {
ABuche 3:889e47988154 99 case 0x88:
ABuche 3:889e47988154 100 if (msg->msg[7] != 0x00) {
ABuche 3:889e47988154 101 errorDisplay->signal_set(0x1);
ABuche 3:889e47988154 102 printf("AT command error\r\n");
ABuche 3:889e47988154 103 }
ABuche 3:889e47988154 104 break;
ABuche 3:889e47988154 105 case 0x8A:
ABuche 3:889e47988154 106 if (msg->msg[4] != 0x00 && msg->msg[4] != 0x06) {
ABuche 3:889e47988154 107 errorDisplay->signal_set(0x1);
ABuche 3:889e47988154 108 printf("%02x - Modem error\r\n", msg->msg[4]);
ABuche 3:889e47988154 109 }
ABuche 3:889e47988154 110 break;
ABuche 3:889e47988154 111 case 0x97:
ABuche 3:889e47988154 112 if (msg->msg[17] != 0x00) {
ABuche 3:889e47988154 113 errorDisplay->signal_set(0x1);
ABuche 3:889e47988154 114 printf("%02x - Remote AT command error\r\n", msg->msg[4]);
ABuche 0:1be517779135 115 }
ABuche 3:889e47988154 116 break;
ABuche 3:889e47988154 117 case 0x90:
ABuche 3:889e47988154 118 if(msg->msg[2] >= 0x0C) {
ABuche 3:889e47988154 119 bool exists = false;
ABuche 3:889e47988154 120
ABuche 3:889e47988154 121 for (int i = 0; i< sizeof(addresses); i++) {
ABuche 3:889e47988154 122 if(addresses[i].ah == msg->msg[12] && addresses[i].al == msg->msg[13]) {
ABuche 3:889e47988154 123 exists = true;
ABuche 3:889e47988154 124 break;
ABuche 3:889e47988154 125 }
ABuche 3:889e47988154 126 }
ABuche 3:889e47988154 127
ABuche 3:889e47988154 128 if (!exists) {
ABuche 3:889e47988154 129 pc.printf("----------------------\r\n");
ABuche 3:889e47988154 130 for(int i = 0; i < msg->msg[2] + 4;i++){
ABuche 3:889e47988154 131 pc.printf("%02x ", msg->msg[i]);
ABuche 3:889e47988154 132 }
ABuche 3:889e47988154 133 pc.printf("\r\n----------------------\r\n");
ABuche 3:889e47988154 134 addresses[addressCounter].ah = msg->msg[12];
ABuche 3:889e47988154 135 addresses[addressCounter].al = msg->msg[13];
ABuche 3:889e47988154 136 pc.printf("New address: %02x %02x\r\n", addresses[addressCounter].ah, addresses[addressCounter].al);
ABuche 3:889e47988154 137 addressCounter++;
ABuche 3:889e47988154 138 }
ABuche 3:889e47988154 139
ABuche 3:889e47988154 140 char data[7];
ABuche 3:889e47988154 141 //pc.printf("%02x ", msg->msg[15]);
ABuche 3:889e47988154 142 for(int i = 15; i < msg->msg[2] + 3; i++) {
ABuche 3:889e47988154 143 data[i - 15] = msg->msg[i];
ABuche 2:63e05b3b6938 144 }
ABuche 3:889e47988154 145
ABuche 3:889e47988154 146 switch(data[0]) {
ABuche 3:889e47988154 147 case 0x00:
ABuche 3:889e47988154 148 char response[] = "Etat du bouton: ";
ABuche 3:889e47988154 149 if (data[1] == 0x00) {
ABuche 3:889e47988154 150 response[16] = '0';
ABuche 3:889e47988154 151 } else if (data[1] == 0x01) {
ABuche 3:889e47988154 152 response[16] = '1';
ABuche 3:889e47988154 153 }
ABuche 3:889e47988154 154 sock.send_all(response, 17);
ABuche 3:889e47988154 155 pc.printf("Sending to server: %s\r\n", response);
ABuche 3:889e47988154 156 break;
ABuche 3:889e47988154 157 case 0x01:
ABuche 3:889e47988154 158 int x = traitementAcc(data[1], data[2]);
ABuche 3:889e47988154 159 int y = traitementAcc(data[3], data[4]);
ABuche 3:889e47988154 160 int z = traitementAcc(data[5], data[6]);
ABuche 3:889e47988154 161 char out[128];
ABuche 3:889e47988154 162 sprintf(out, "Accelerometre [x: %d, y: %d, z: %d]", x,y,z);
ABuche 3:889e47988154 163
ABuche 3:889e47988154 164 sock.send_all(out, 128);
ABuche 3:889e47988154 165 pc.printf("Sending to server: %s\r\n", out);
ABuche 3:889e47988154 166 break;
ABuche 3:889e47988154 167 }
ABuche 3:889e47988154 168
ABuche 3:889e47988154 169 /*
ABuche 3:889e47988154 170 for(int i = 0; i < msg->msg[2] + 4;i++){
ABuche 3:889e47988154 171 pc.printf("%02x ", msg->msg[i]);
ABuche 3:889e47988154 172 }
ABuche 3:889e47988154 173 pc.printf("\r\n");*/
ABuche 3:889e47988154 174
ABuche 3:889e47988154 175 }
ABuche 3:889e47988154 176 break;
ABuche 3:889e47988154 177 default:
ABuche 3:889e47988154 178 errorDisplay->signal_set(0x1);
ABuche 3:889e47988154 179 printf("Invalid command error\r\n");
ABuche 3:889e47988154 180 break;
ABuche 3:889e47988154 181 }
ABuche 3:889e47988154 182
ABuche 0:1be517779135 183 mPool.free(msg);
ABuche 0:1be517779135 184 }
ABuche 0:1be517779135 185 }
ABuche 0:1be517779135 186
ABuche 3:889e47988154 187 void error_display()
ABuche 3:889e47988154 188 {
ABuche 3:889e47988154 189 while(1) {
ABuche 3:889e47988154 190 Thread::signal_wait(0x1);
ABuche 3:889e47988154 191 ledError = 1;
ABuche 3:889e47988154 192 wait(1);
ABuche 3:889e47988154 193 ledError = 0;
ABuche 3:889e47988154 194 }
ABuche 3:889e47988154 195 }
ABuche 3:889e47988154 196
ABuche 3:889e47988154 197 void flashLED()
ABuche 3:889e47988154 198 {
ABuche 0:1be517779135 199 bool high = true;
ABuche 3:889e47988154 200 while(1) {
ABuche 0:1be517779135 201 Thread::signal_wait(0x1);
ABuche 3:889e47988154 202
ABuche 3:889e47988154 203 for (int i = 0; i < addressCounter; i++) {
ABuche 0:1be517779135 204 LED_Toggle[13] = addresses[i].ah;
ABuche 0:1be517779135 205 LED_Toggle[14] = addresses[i].al;
ABuche 0:1be517779135 206 LED_Toggle[18] = high ? 0x05 : 0x04;
ABuche 0:1be517779135 207 LED_Toggle[19] = checksum(LED_Toggle, sizeof(LED_Toggle));
ABuche 3:889e47988154 208
ABuche 3:889e47988154 209 while(!xbee.writeable()) {}
ABuche 3:889e47988154 210 for (int j = 0; j < sizeof(LED_Toggle); j++) {
ABuche 0:1be517779135 211 xbee.putc(LED_Toggle[j]);
ABuche 2:63e05b3b6938 212 }
ABuche 0:1be517779135 213 }
ABuche 2:63e05b3b6938 214 led1 = !led1;
ABuche 2:63e05b3b6938 215 high = !high;
ABuche 0:1be517779135 216 }
ABuche 0:1be517779135 217 }
ABuche 0:1be517779135 218
ABuche 3:889e47988154 219 void LEDSignal()
ABuche 3:889e47988154 220 {
ABuche 2:63e05b3b6938 221 ledThread->signal_set(0x1);
ABuche 2:63e05b3b6938 222 }
ABuche 2:63e05b3b6938 223
ABuche 3:889e47988154 224 void receiveEthernet()
ABuche 3:889e47988154 225 {
ABuche 2:63e05b3b6938 226 char reception[256];
ABuche 2:63e05b3b6938 227 sock.receive_all(reception, 256);
ABuche 2:63e05b3b6938 228 //pc.printf("Received from server: %s", reception);
ABuche 0:1be517779135 229 }
ABuche 0:1be517779135 230
ABuche 3:889e47988154 231 int main()
ABuche 3:889e47988154 232 {
ABuche 0:1be517779135 233 reset = 0;
ABuche 0:1be517779135 234 wait(0.4);
ABuche 0:1be517779135 235 reset = 1;
ABuche 0:1be517779135 236 wait(1);
ABuche 3:889e47988154 237
ABuche 0:1be517779135 238 int pan;
ABuche 0:1be517779135 239 char url[128];
ABuche 0:1be517779135 240
ABuche 0:1be517779135 241 FILE* f = fopen("/local/coord.cfg", "r");
ABuche 0:1be517779135 242 fscanf(f,"%x", &pan);
ABuche 0:1be517779135 243 fscanf(f,"%s", &url);
ABuche 0:1be517779135 244 fclose(f);
ABuche 3:889e47988154 245
ABuche 0:1be517779135 246 pc.printf("URL: %s", url);
ABuche 3:889e47988154 247
ABuche 0:1be517779135 248 char buff[2];
ABuche 0:1be517779135 249 buff[0]=(pan>>8)&0xff;
ABuche 0:1be517779135 250 buff[1]=(pan)&0xff;
ABuche 3:889e47988154 251
ABuche 2:63e05b3b6938 252 AT_ID[7] = buff[0];
ABuche 2:63e05b3b6938 253 AT_ID[8] = buff[1];
ABuche 3:889e47988154 254
ABuche 2:63e05b3b6938 255 pc.printf("PAN: %02x%02x", AT_ID[7],AT_ID[8]);
ABuche 3:889e47988154 256
ABuche 2:63e05b3b6938 257 char cs = checksum(AT_ID, sizeof(AT_ID));
ABuche 3:889e47988154 258 pc.printf("CS: %02x\r\n", cs);
ABuche 3:889e47988154 259
ABuche 2:63e05b3b6938 260 AT_ID[9] = cs;
ABuche 3:889e47988154 261
ABuche 3:889e47988154 262 for(char i = 0; i<sizeof(AT_ID); i++) {
ABuche 2:63e05b3b6938 263 xbee.putc(AT_ID[i]);
ABuche 0:1be517779135 264 }
ABuche 3:889e47988154 265
ABuche 3:889e47988154 266 for(char i = 0; i<sizeof(AT_WR); i++) {
ABuche 0:1be517779135 267 xbee.putc(AT_WR[i]);
ABuche 0:1be517779135 268 }
ABuche 3:889e47988154 269
ABuche 3:889e47988154 270 for(char i = 0; i<sizeof(AT_AC); i++) {
ABuche 0:1be517779135 271 xbee.putc(AT_AC[i]);
ABuche 2:63e05b3b6938 272 }
ABuche 3:889e47988154 273
ABuche 3:889e47988154 274
ABuche 1:446da73e1118 275 /*
ABuche 2:63e05b3b6938 276 EthernetInterface eth;
ABuche 2:63e05b3b6938 277 eth.init(); //Use DHCP
ABuche 2:63e05b3b6938 278 eth.connect();
ABuche 2:63e05b3b6938 279 printf("IP Address is %s\r\n", eth.getIPAddress());
ABuche 3:889e47988154 280
ABuche 2:63e05b3b6938 281 while(sock.connect(url, 8000)){};
ABuche 2:63e05b3b6938 282 */
ABuche 3:889e47988154 283
ABuche 3:889e47988154 284 Thread errorDisplayLocal;
ABuche 3:889e47988154 285 errorDisplay = &errorDisplayLocal;
ABuche 3:889e47988154 286 errorDisplay->start(&error_display);
ABuche 3:889e47988154 287
ABuche 2:63e05b3b6938 288 Thread localReceptionThread;
ABuche 2:63e05b3b6938 289 receptionThread = &localReceptionThread;
ABuche 2:63e05b3b6938 290 receptionThread->start(&reception);
ABuche 3:889e47988154 291 Thread localLedThread;
ABuche 3:889e47988154 292 ledThread = &localLedThread;
ABuche 3:889e47988154 293 ledThread->start(&flashLED);
ABuche 0:1be517779135 294
ABuche 0:1be517779135 295 Ticker horloge;
ABuche 3:889e47988154 296 horloge.attach(&LEDSignal, 2.5);
ABuche 3:889e47988154 297
ABuche 2:63e05b3b6938 298 Thread localProcessingThread;
ABuche 2:63e05b3b6938 299 processingThread = &localProcessingThread;
ABuche 2:63e05b3b6938 300 processingThread->start(&processing);
ABuche 0:1be517779135 301
ABuche 3:889e47988154 302 /*
ABuche 3:889e47988154 303 addresses[0].ah = 0xf4;
ABuche 3:889e47988154 304 addresses[1].al = 0x13;
ABuche 3:889e47988154 305 addressCounter++;
ABuche 3:889e47988154 306 */
ABuche 3:889e47988154 307
ABuche 3:889e47988154 308
ABuche 2:63e05b3b6938 309 Thread localEthernetReceptionThread;
ABuche 2:63e05b3b6938 310 ethernetReceptionThread = &localEthernetReceptionThread;
ABuche 2:63e05b3b6938 311 ethernetReceptionThread->start(&receiveEthernet);
ABuche 3:889e47988154 312
ABuche 0:1be517779135 313 while(1) {
ABuche 3:889e47988154 314
ABuche 0:1be517779135 315 }
ABuche 0:1be517779135 316 }