This is the coordinator node.
Dependencies: mbed-rtos mbed Zigbee_communication EthernetInterface WebSocketClient
Diff: main.cpp
- Revision:
- 2:51d67a8b2325
- Parent:
- 0:4cfeffb4d773
- Child:
- 4:d9968ed09187
--- a/main.cpp Mon Feb 13 20:25:43 2017 +0000 +++ b/main.cpp Tue Feb 14 00:10:43 2017 +0000 @@ -1,3 +1,8 @@ +// Emile Arseneault : arse1503 +// Raphael Drouin : dror2204 + +// Coordinator Node + #include "mbed.h" #define FRAMEDELIMITER 0x7E #include "rtos.h" @@ -42,12 +47,28 @@ 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) { @@ -97,6 +118,74 @@ } *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() { @@ -118,10 +207,15 @@ 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 = -1; i <len; i++) xbee.getc(); + for (int i = 0; i <len; i++) xbee.getc(); + break; } return response; } @@ -152,11 +246,9 @@ while (i < ParamLen) { - pc.putc((OptionalParam)[i]); cmdtosend[7 + i] = (OptionalParam)[i]; i++; } - pc.printf("\r\n"); } // Calculate checksum @@ -187,6 +279,102 @@ SendAtCommand('S', 'L'); } +void InitialisePANID(char PANIDMSB, char PANIDLSB) +{ + char PanID[2] = {PANIDMSB, PANIDLSB}; + + SendAtCommand('I', 'D', &PanID[0], 2); +} + +void ZigBeeTransmit(int adresse16, int adresse64, char *data, int dataLength) +{ + // Frame Type 0x10 + // 0x0000000000000000 - Reserved 64-bit address for the coordinator + // 0x000000000000FFFF - Broadcast address + + // The Transmit Status frame (0x8B) est la reponse + char cmdtosend[25]; + char checksum = 0x00; + int cmdlength = 18; + int i = 3; + + //ID command to set/read operating 64 bit PAN ID + //WR command to set operating 64 bit PAN ID across reboot + //OI command to read operating 16 bit PAN ID + //II command to set operating 16 bit PAN ID + + cmdtosend[0] = FRAMEDELIMITER; + cmdtosend[1] = 0x00; + cmdtosend[2] = 0x0E + dataLength; + cmdtosend[3] = 0x10; // Frame type + cmdtosend[4] = 0x01; // Frame number + cmdtosend[5] = 0x00; // MSB adresse 64-bit + cmdtosend[6] = 0x00; + cmdtosend[7] = 0x00; + cmdtosend[8] = 0x00; + cmdtosend[9] = 0x00; + cmdtosend[10] = 0x00; + cmdtosend[11] = 0xFF; + cmdtosend[12] = 0xFF; // LSB adresse 64-bit + cmdtosend[13] = adresse16 >> 16; // MSB adresse 16-bit + cmdtosend[14] = adresse16 && 0b0000000011111111; // LSB adresse 16-bit + cmdtosend[15] = 0x00; // Broadcast Radius + cmdtosend[16] = 0x00; // Options + + // Set RF DATA + if(data != NULL) + { + i = 0; + cmdlength += dataLength; + + while (i < dataLength) + { + cmdtosend[17 + i] = (data)[i]; + i++; + } + } + + //cmdtosend[17] = 0x00; // Start RF DATA + //cmdtosend[18] = 0x00; + //cmdtosend[19] = 0x00; + //cmdtosend[20] = 0x00; + //cmdtosend[21] = 0x00; + //cmdtosend[22] = 0x00; + //cmdtosend[23] = 0x00; + //cmdtosend[24] = 0x00; // End RF DATA + + // Calculate checksum + i = 3; + while (i < (cmdlength - 1)) + { + checksum += cmdtosend[i]; + i++; + } + cmdtosend[cmdlength - 1] = 0xFF - checksum; + + // Envoyer la commande sur UART + i = 0; + while (i < cmdlength) + { + xbee.putc(cmdtosend[i]); + i++; + } + wait(0.1); +} + +void BroadcastHelloWorld() +{ + char hello[5] = {'H', 'e', 'l', 'l', 'o'}; + char world[5] = {'w', 'o', 'r', 'l', 'd'}; + + while (1) + { + ZigBeeTransmit(0xFFFE, 0x000000000000FFFF, &hello[0], 5); + ZigBeeTransmit(0xFFFE, 0x000000000000FFFF, &world[0], 5); + wait(2); + } +} + void xbee_reader() { while(1) @@ -215,6 +403,8 @@ wait(3); ReadSerial(); + InitialisePANID(0x42, 0x69); + BroadcastHelloWorld(); while(1) { }