gbgfa

Dependencies:   mbed-rtos mbed EthernetInterface WebSocketClient

Committer:
ABuche
Date:
Mon Feb 13 18:38:48 2017 +0000
Revision:
2:63e05b3b6938
Parent:
1:446da73e1118
Child:
3:889e47988154
gfgf

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