gbgfa
Dependencies: mbed-rtos mbed EthernetInterface WebSocketClient
Diff: main.cpp
- Revision:
- 3:889e47988154
- Parent:
- 2:63e05b3b6938
- Child:
- 4:287c3bd0c425
--- a/main.cpp Mon Feb 13 18:38:48 2017 +0000 +++ b/main.cpp Mon Feb 13 20:43:20 2017 +0000 @@ -5,7 +5,7 @@ LocalFileSystem local("local"); DigitalOut led1(LED1); -DigitalOut led4(LED4); +DigitalOut ledError(LED4); DigitalOut reset(p8); RawSerial xbee(p13, p14); @@ -16,12 +16,14 @@ Thread* processingThread; Thread* ledThread; Thread* ethernetReceptionThread; +Thread* errorDisplay; TCPSocketConnection sock; char LED_Toggle[] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x44, 0x30, 0x00, 0x25}; //Change index 13 & 14 & 18 & 19 - + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x44, 0x30, 0x00, 0x25 + }; //Change index 13 & 14 & 18 & 19 + char AT_ID[] = {0x7E, 0x00, 0x06, 0x09, 0x01, 0x49 , 0x44, 0x00, 0x00, 0x00}; // +DATA + CS (7 & 8) const char AT_WR[] = {0x7E, 0x00, 0x04, 0x09, 0x01, 0x57, 0x52, 0x4C}; const char AT_AC[] = {0x7E, 0x00, 0x04, 0x09, 0x01, 0x41, 0x43, 0x71}; @@ -41,120 +43,171 @@ Queue<message, 25> queue; MemoryPool<message, 25> mPool; -char checksum(char array[], char length){ +char checksum(char array[], char length) +{ char cs = 0; - for (int i = 3;i<length - 1;i++){ + for (int i = 3; i<length - 1; i++) { cs += array[i]; } return 0xFF - cs; } -int traitementAcc(char msb, char lsb){ +int traitementAcc(char msb, char lsb) +{ int val = msb > 127 ? 0xFFFFF000 | (msb << 4) : msb << 4; - + // Ajout des LSB val += lsb >> 4; - + val = val > 2047 ? 2048 - val : val; val = val > 1024 ? 1024 : val; val = val < -1024 ? -1024 : val; - + return val; } -void reception(){ +void reception() +{ while(1) { - message* msg = mPool.alloc(); - - msg->msg[0] = xbee.getc(); - - if(msg->msg[0] == 0x7E){ - msg->msg[1] = xbee.getc(); - msg->msg[2] = xbee.getc(); - - for (int i = 3;i < msg->msg[2] + 4;i++){ - msg->msg[i] = xbee.getc(); + if(xbee.readable()) { + message* msg = mPool.alloc(); + + msg->msg[0] = xbee.getc(); + + if(msg->msg[0] == 0x7E) { + msg->msg[1] = xbee.getc(); + msg->msg[2] = xbee.getc(); + + for (int i = 3; i < msg->msg[2] + 4; i++) { + msg->msg[i] = xbee.getc(); + } + + queue.put(msg); + } else { + mPool.free(msg); } - - queue.put(msg); } - } } -void processing() { +void processing() +{ while(1) { message* msg = (message*)queue.get().value.p; - - if(msg->msg[2] >= 0x0C && msg->msg[3] == 0x90){ - bool exists = false; - - for (int i = 0; i< sizeof(addresses);i++){ - if(addresses[i].ah == msg->msg[12] && addresses[i].al == msg->msg[13]){ - exists = true; - break; + + switch(msg->msg[3]) { + case 0x88: + if (msg->msg[7] != 0x00) { + errorDisplay->signal_set(0x1); + printf("AT command error\r\n"); + } + break; + case 0x8A: + if (msg->msg[4] != 0x00 && msg->msg[4] != 0x06) { + errorDisplay->signal_set(0x1); + printf("%02x - Modem error\r\n", msg->msg[4]); + } + break; + case 0x97: + if (msg->msg[17] != 0x00) { + errorDisplay->signal_set(0x1); + printf("%02x - Remote AT command error\r\n", msg->msg[4]); } - } - - if (!exists) { - addresses[addressCounter].ah = msg->msg[12]; - addresses[addressCounter].al = msg->msg[13]; - pc.printf("New address: %02x %02x", addresses[addressCounter].ah, addresses[addressCounter].al); - addressCounter++; - } - - char data[7]; - //pc.printf("%02x ", msg->msg[15]); - for(int i = 15; i < msg->msg[2] + 3;i++){ - data[i - 15] = msg->msg[i]; - } - - switch(data[0]){ - case 0x00: - char response[] = "Etat du bouton: "; - if (data[1] == 0x00){ - response[16] = '0'; - } else if (data[1] == 0x01){ - response[16] = '1'; + break; + case 0x90: + if(msg->msg[2] >= 0x0C) { + bool exists = false; + + for (int i = 0; i< sizeof(addresses); i++) { + if(addresses[i].ah == msg->msg[12] && addresses[i].al == msg->msg[13]) { + exists = true; + break; + } + } + + if (!exists) { + pc.printf("----------------------\r\n"); + for(int i = 0; i < msg->msg[2] + 4;i++){ + pc.printf("%02x ", msg->msg[i]); + } + pc.printf("\r\n----------------------\r\n"); + addresses[addressCounter].ah = msg->msg[12]; + addresses[addressCounter].al = msg->msg[13]; + pc.printf("New address: %02x %02x\r\n", addresses[addressCounter].ah, addresses[addressCounter].al); + addressCounter++; + } + + char data[7]; + //pc.printf("%02x ", msg->msg[15]); + for(int i = 15; i < msg->msg[2] + 3; i++) { + data[i - 15] = msg->msg[i]; } - sock.send_all(response, 17); - pc.printf("Sending to server: %s\r\n", response); - break; - case 0x01: - int x = traitementAcc(data[1], data[2]); - int y = traitementAcc(data[3], data[4]); - int z = traitementAcc(data[5], data[6]); - char out[128]; - sprintf(out, "Accelerometre [x: %d, y: %d, z: %d]", x,y,z); - - sock.send_all(out, 128); - pc.printf("Sending to server: %s\r\n", out); - break; - } - - /* - for(int i = 0; i < msg->msg[2] + 4;i++){ - pc.printf("%02x ", msg->msg[i]); - } - pc.printf("\r\n");*/ - - } + + switch(data[0]) { + case 0x00: + char response[] = "Etat du bouton: "; + if (data[1] == 0x00) { + response[16] = '0'; + } else if (data[1] == 0x01) { + response[16] = '1'; + } + sock.send_all(response, 17); + pc.printf("Sending to server: %s\r\n", response); + break; + case 0x01: + int x = traitementAcc(data[1], data[2]); + int y = traitementAcc(data[3], data[4]); + int z = traitementAcc(data[5], data[6]); + char out[128]; + sprintf(out, "Accelerometre [x: %d, y: %d, z: %d]", x,y,z); + + sock.send_all(out, 128); + pc.printf("Sending to server: %s\r\n", out); + break; + } + + /* + for(int i = 0; i < msg->msg[2] + 4;i++){ + pc.printf("%02x ", msg->msg[i]); + } + pc.printf("\r\n");*/ + + } + break; + default: + errorDisplay->signal_set(0x1); + printf("Invalid command error\r\n"); + break; + } + mPool.free(msg); } } -void flashLED() { +void error_display() +{ + while(1) { + Thread::signal_wait(0x1); + ledError = 1; + wait(1); + ledError = 0; + } +} + +void flashLED() +{ bool high = true; - while(1){ + while(1) { Thread::signal_wait(0x1); - - for (int i = 0; i < addressCounter;i++){ + + for (int i = 0; i < addressCounter; i++) { LED_Toggle[13] = addresses[i].ah; LED_Toggle[14] = addresses[i].al; LED_Toggle[18] = high ? 0x05 : 0x04; LED_Toggle[19] = checksum(LED_Toggle, sizeof(LED_Toggle)); - - for (int j = 0; j < sizeof(LED_Toggle);j++){ + + while(!xbee.writeable()) {} + for (int j = 0; j < sizeof(LED_Toggle); j++) { xbee.putc(LED_Toggle[j]); } } @@ -163,22 +216,25 @@ } } -void LEDSignal(){ +void LEDSignal() +{ ledThread->signal_set(0x1); } -void receiveEthernet(){ +void receiveEthernet() +{ char reception[256]; sock.receive_all(reception, 256); //pc.printf("Received from server: %s", reception); } -int main() { +int main() +{ reset = 0; wait(0.4); reset = 1; wait(1); - + int pan; char url[128]; @@ -186,68 +242,75 @@ fscanf(f,"%x", &pan); fscanf(f,"%s", &url); fclose(f); - + pc.printf("URL: %s", url); - + char buff[2]; buff[0]=(pan>>8)&0xff; buff[1]=(pan)&0xff; - + AT_ID[7] = buff[0]; AT_ID[8] = buff[1]; - + pc.printf("PAN: %02x%02x", AT_ID[7],AT_ID[8]); - + char cs = checksum(AT_ID, sizeof(AT_ID)); - pc.printf("CS: %02x", cs); - + pc.printf("CS: %02x\r\n", cs); + AT_ID[9] = cs; - - for(char i = 0;i<sizeof(AT_ID);i++){ + + for(char i = 0; i<sizeof(AT_ID); i++) { xbee.putc(AT_ID[i]); } - - for(char i = 0;i<sizeof(AT_WR);i++){ + + for(char i = 0; i<sizeof(AT_WR); i++) { xbee.putc(AT_WR[i]); } - - for(char i = 0;i<sizeof(AT_AC);i++){ + + for(char i = 0; i<sizeof(AT_AC); i++) { xbee.putc(AT_AC[i]); } - - + + /* EthernetInterface eth; eth.init(); //Use DHCP eth.connect(); printf("IP Address is %s\r\n", eth.getIPAddress()); - + while(sock.connect(url, 8000)){}; */ - + + Thread errorDisplayLocal; + errorDisplay = &errorDisplayLocal; + errorDisplay->start(&error_display); + Thread localReceptionThread; receptionThread = &localReceptionThread; receptionThread->start(&reception); - - addresses[0].ah = 0x8e; - addresses[0].al = 0x69; - addressCounter++; + Thread localLedThread; + ledThread = &localLedThread; + ledThread->start(&flashLED); Ticker horloge; - horloge.attach(&LEDSignal, 0.5); - + horloge.attach(&LEDSignal, 2.5); + Thread localProcessingThread; processingThread = &localProcessingThread; processingThread->start(&processing); - Thread localLedThread; - ledThread = &localLedThread; - ledThread->start(&flashLED); - + /* + addresses[0].ah = 0xf4; + addresses[1].al = 0x13; + addressCounter++; + */ + + Thread localEthernetReceptionThread; ethernetReceptionThread = &localEthernetReceptionThread; ethernetReceptionThread->start(&receiveEthernet); - + while(1) { + } }