gbgfa
Dependencies: mbed-rtos mbed EthernetInterface WebSocketClient
main.cpp@3:889e47988154, 2017-02-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |