gbgfa

Dependencies:   mbed-rtos mbed EthernetInterface WebSocketClient

Committer:
ABuche
Date:
Sat Mar 11 18:01:54 2017 +0000
Revision:
4:287c3bd0c425
Parent:
3:889e47988154
WebSocket

Who changed what in which revision?

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