This is the router node
Dependencies: mbed-rtos mbed Zigbee_communication
Diff: main.cpp
- Revision:
- 4:79eb621914e7
- Parent:
- 3:0acb2c3d7612
- Child:
- 6:b54b9c76aaf2
diff -r 0acb2c3d7612 -r 79eb621914e7 main.cpp --- a/main.cpp Tue Feb 14 00:08:55 2017 +0000 +++ b/main.cpp Tue Feb 14 02:39:10 2017 +0000 @@ -6,295 +6,49 @@ #include "mbed.h" #define FRAMEDELIMITER 0x7E #include "rtos.h" +#include "xbee.h" // 4269 -DigitalOut resetswitch(p8); -Serial xbee(p13, p14); +Mail<char, 250> mymail; +XBee xbee(p8, p13, p14, &mymail); + Serial pc(USBTX, USBRX); DigitalOut myled(LED1); -void printhexa(char c) -{ - char msb = c >> 4; - char lsb = c & 0xF; - - if (msb < 10) - msb += 0x30; - else - msb += 0x37; - - if (lsb < 10) - lsb += 0x30; - else - lsb += 0x37; - - pc.putc('0'); - pc.putc('x'); - pc.putc(msb); - pc.putc(lsb); - pc.putc(' '); -} - -void ATCommandResponse(int len, char* ans) -{ - char total = 0x88; - char id = xbee.getc(); - total += id; - char command[2]; - command[0] = xbee.getc(); - total += command[0]; - command[1] = xbee.getc(); - total += command[1]; - char status = xbee.getc(); - total += status; - if (status != 0) - { - pc.printf("Command failed with status code : %d\r\n", status); - } - int i = 0; - len-= 4; - char data[len]; - - pc.printf("response to command %c%c", command[0], command[1]); - pc.printf(" is "); - if (len == 0) - { - switch (status) - { - case 0 : pc.printf("OK\r\n"); break; - case 1 : pc.printf("ERROR\r\n"); break; - case 2 : pc.printf("Invalid Command\r\n"); break; - case 3 : pc.printf("Invalid Parameter\r\n"); break; - case 4 : pc.printf("Tx Failure\r\n"); break; - default : pc.printf("Unknow error ...\r\n"); break; - } - } - - while (i < len) - { - if (xbee.readable()) - { - data[i] = xbee.getc(); - total += data[i]; - printhexa(data[i]); - i++; - } - } - - char checksum = xbee.getc(); - total += checksum; - // Verify checksum - if (total != 0xFF) - { - pc.printf("Checksum is wrong"); - } - pc.printf("\r\n"); - ans = data; -} - -void ModemStatus(int len, char* ans) -{ - char status = xbee.getc(); - - switch (status){ - case 0 : pc.printf("Hardware reset\r\n"); break; - case 1 : pc.printf("Watchdog timer reset\r\n"); break; - case 2 : pc.printf("Joined network (routers and end devices)\r\n"); break; - case 3 : pc.printf("Disassociated\r\n"); break; - case 6 : pc.printf("Coordinator started\r\n"); break; - case 7 : pc.printf("Network security key was updated\r\n"); break; - case 0x0D : pc.printf("Voltage supply limit exceeded\r\n"); break; - case 0x11 : pc.printf("Modem configuration changed while join in progress\r\n"); break; - default : pc.printf("stack error\r\n"); break; - } - - char checksum = xbee.getc(); - - checksum += 0x8A + status; - - if (checksum != 0xFF) - { - pc.printf("Checksum is wrong\r\n"); - } - *ans = status; -} - -void ZigBeeTransmitStatus(int len, char* ans) -{ - char id = xbee.getc(); - char msb = xbee.getc(); - char lsb = xbee.getc(); - char retry = xbee.getc(); - char status = xbee.getc(); - char discovery = xbee.getc(); - - pc.printf("Response to transmit id %d is : ", id); - - if (status == 0) - { - pc.printf("Success\r\n"); - } - else - { - switch (status){ - case 0x01 : pc.printf("MAC ACK Failure\r\n"); break; - case 0x02 : pc.printf("CCA Failure\r\n"); break; - case 0x15 : pc.printf("Invalid destination endpoint\r\n"); break; - case 0x21 : pc.printf("Network ACK Failure\r\n"); break; - case 0x22 : pc.printf("Not Joined to Network\r\n"); break; - case 0x23 : pc.printf("Self-addressed\r\n"); break; - case 0x24 : pc.printf("Address Not Found\r\n"); break; - case 0x25 : pc.printf("Route Not Found\r\n"); break; - case 0x26 : pc.printf("Broadcast source failed to hear a neighbor relay the message\r\n"); break; - case 0x2B : pc.printf("Invalid binding table index\r\n"); break; - case 0x2C : pc.printf("Resource error lack of free buffers, timers, etc.\r\n"); break; - case 0x2D : pc.printf("Attempted broadcast with APS transmission\r\n"); break; - case 0x2E : pc.printf("Attempted unicast with APS transmission, but EE=0\r\n"); break; - case 0x32 : pc.printf("Resource error lack of free buffers, timers, etc.\r\n"); break; - case 0x74 : pc.printf("Data payload too large\r\n"); break; - default : pc.printf("Unknow error ...\r\n"); break; - } - } -} - -void ZigBeeReceivePacket(int len, char* ans) -{ - int i = 0; - char adresse64bit[8]; - char adresse16bit[2]; - char receiveOptions; - - while(i < 8) - { - adresse64bit[i] = xbee.getc(); - i++; - } - - adresse16bit[0] = xbee.getc(); - adresse16bit[1] = xbee.getc(); - - receiveOptions = xbee.getc(); - - pc.printf("Data received : "); - - i = 11; - while (i < len) - { - printhexa(xbee.getc()); - i++; - } - - // Validate checksum TODO -} - -char* InterpretMessage() -{ - char start = xbee.getc(); // = FRAMEDELIMITER - //assert - char len_msb = xbee.getc(); - char len_lsb = xbee.getc(); - - int len = ((int) len_msb << 4) + (int) len_lsb; - char frame_data[len]; - - // Resolving frame type - char type = xbee.getc(); - char *response; - len--; - - switch (type){ - case 0x88: ATCommandResponse(len, response); - break; - case 0x8A: ModemStatus(len, response); - break; - case 0x8B: ZigBeeTransmitStatus(len, response); - break; - case 0x90: ZigBeeReceivePacket(len, response); - break; - default: pc.printf("Please implement response of type"); - printhexa(type); - pc.printf("\r\n"); - for (int i = 0; i <len; i++) xbee.getc(); - break; - } - return response; -} - -void SendAtCommand(char FirstChar, char SecondChar, char *OptionalParam = NULL, int ParamLen = 0) -{ - // Frame Type 0x08 - // Two char as parameters - - char cmdtosend[10]; - char sum = 0; - int cmdlength = 8; - int i = 0; - - cmdtosend[0] = FRAMEDELIMITER; - cmdtosend[1] = 0x00; - cmdtosend[2] = 0x04 + ParamLen; - cmdtosend[3] = 0x08; - cmdtosend[4] = 0x52; - cmdtosend[5] = FirstChar; - cmdtosend[6] = SecondChar; - - // Ajouter les parametres au message - if(OptionalParam != NULL) - { - i = 0; - cmdlength += ParamLen; - - while (i < ParamLen) - { - cmdtosend[7 + i] = (OptionalParam)[i]; - i++; - } - } - - // Calculate checksum - i = 3; - while (i < (cmdlength - 1)) - { - sum += cmdtosend[i]; - i++; - } - cmdtosend[cmdlength - 1] = 0xFF - sum; - - // Envoyer la commande sur UART - i = 0; - while (i < cmdlength) - { - xbee.putc(cmdtosend[i]); - i++; - } - - wait(0.1); -} - void ReadSerial() { // 00 13 A2 00 // 40 3E 09 63 - SendAtCommand('S', 'H'); - SendAtCommand('S', 'L'); + xbee.SendATCommand('S', 'H'); + xbee.SendATCommand('S', 'L'); } void InitialisePANID(char PANIDMSB, char PANIDLSB) { char PanID[2] = {PANIDMSB, PANIDLSB}; - SendAtCommand('I', 'D', &PanID[0], 2); + xbee.SendATCommand('I', 'D', &PanID[0], 2); } void xbee_reader() { while(1) { - if (xbee.readable()) + xbee.InterpretMessage(); + wait(0.001); + } +} + +void msg_reader() +{ + while (true) { + osEvent evt = mymail.get(); + if (evt.status == osEventMail) { - InterpretMessage(); + char *c = (char*)evt.value.p; + pc.putc(*c); + mymail.free(c); } - wait(0.001); } } @@ -304,13 +58,12 @@ } int main() { - Thread thread(xbee_reader); Ticker ticker; ticker.attach(&tick, 1); pc.printf("\r\nI am router\r\n"); - resetswitch = 0; - wait(0.4); - resetswitch = 1; + + Thread thread(xbee_reader); + Thread thread_reader(msg_reader); wait(3); ReadSerial();