This is the coordinator node.
Dependencies: mbed-rtos mbed Zigbee_communication EthernetInterface WebSocketClient
main.cpp@2:51d67a8b2325, 2017-02-14 (annotated)
- Committer:
- EmileArseneault
- Date:
- Tue Feb 14 00:10:43 2017 +0000
- Revision:
- 2:51d67a8b2325
- Parent:
- 0:4cfeffb4d773
- Child:
- 4:d9968ed09187
Ajout de types de message
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EmileArseneault | 2:51d67a8b2325 | 1 | // Emile Arseneault : arse1503 |
EmileArseneault | 2:51d67a8b2325 | 2 | // Raphael Drouin : dror2204 |
EmileArseneault | 2:51d67a8b2325 | 3 | |
EmileArseneault | 2:51d67a8b2325 | 4 | // Coordinator Node |
EmileArseneault | 2:51d67a8b2325 | 5 | |
ShaolinPoutine | 0:4cfeffb4d773 | 6 | #include "mbed.h" |
ShaolinPoutine | 0:4cfeffb4d773 | 7 | #define FRAMEDELIMITER 0x7E |
ShaolinPoutine | 0:4cfeffb4d773 | 8 | #include "rtos.h" |
ShaolinPoutine | 0:4cfeffb4d773 | 9 | |
ShaolinPoutine | 0:4cfeffb4d773 | 10 | // 4269 |
ShaolinPoutine | 0:4cfeffb4d773 | 11 | DigitalOut resetswitch(p8); |
ShaolinPoutine | 0:4cfeffb4d773 | 12 | Serial xbee(p13, p14); |
ShaolinPoutine | 0:4cfeffb4d773 | 13 | Serial pc(USBTX, USBRX); |
ShaolinPoutine | 0:4cfeffb4d773 | 14 | DigitalOut myled(LED1); |
ShaolinPoutine | 0:4cfeffb4d773 | 15 | |
ShaolinPoutine | 0:4cfeffb4d773 | 16 | void printhexa(char c) |
ShaolinPoutine | 0:4cfeffb4d773 | 17 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 18 | char msb = c >> 4; |
ShaolinPoutine | 0:4cfeffb4d773 | 19 | char lsb = c & 0xF; |
ShaolinPoutine | 0:4cfeffb4d773 | 20 | |
ShaolinPoutine | 0:4cfeffb4d773 | 21 | if (msb < 10) |
ShaolinPoutine | 0:4cfeffb4d773 | 22 | msb += 0x30; |
ShaolinPoutine | 0:4cfeffb4d773 | 23 | else |
ShaolinPoutine | 0:4cfeffb4d773 | 24 | msb += 0x37; |
ShaolinPoutine | 0:4cfeffb4d773 | 25 | |
ShaolinPoutine | 0:4cfeffb4d773 | 26 | if (lsb < 10) |
ShaolinPoutine | 0:4cfeffb4d773 | 27 | lsb += 0x30; |
ShaolinPoutine | 0:4cfeffb4d773 | 28 | else |
ShaolinPoutine | 0:4cfeffb4d773 | 29 | lsb += 0x37; |
ShaolinPoutine | 0:4cfeffb4d773 | 30 | |
ShaolinPoutine | 0:4cfeffb4d773 | 31 | pc.putc('0'); |
ShaolinPoutine | 0:4cfeffb4d773 | 32 | pc.putc('x'); |
ShaolinPoutine | 0:4cfeffb4d773 | 33 | pc.putc(msb); |
ShaolinPoutine | 0:4cfeffb4d773 | 34 | pc.putc(lsb); |
ShaolinPoutine | 0:4cfeffb4d773 | 35 | pc.putc(' '); |
ShaolinPoutine | 0:4cfeffb4d773 | 36 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 37 | |
ShaolinPoutine | 0:4cfeffb4d773 | 38 | void ATCommandResponse(int len, char* ans) |
ShaolinPoutine | 0:4cfeffb4d773 | 39 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 40 | char total = 0x88; |
ShaolinPoutine | 0:4cfeffb4d773 | 41 | char id = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 42 | total += id; |
ShaolinPoutine | 0:4cfeffb4d773 | 43 | char command[2]; |
ShaolinPoutine | 0:4cfeffb4d773 | 44 | command[0] = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 45 | total += command[0]; |
ShaolinPoutine | 0:4cfeffb4d773 | 46 | command[1] = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 47 | total += command[1]; |
ShaolinPoutine | 0:4cfeffb4d773 | 48 | char status = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 49 | total += status; |
EmileArseneault | 2:51d67a8b2325 | 50 | if (status != 0) |
EmileArseneault | 2:51d67a8b2325 | 51 | { |
EmileArseneault | 2:51d67a8b2325 | 52 | pc.printf("Command failed with status code : %d\r\n", status); |
EmileArseneault | 2:51d67a8b2325 | 53 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 54 | int i = 0; |
ShaolinPoutine | 0:4cfeffb4d773 | 55 | len-= 4; |
ShaolinPoutine | 0:4cfeffb4d773 | 56 | char data[len]; |
ShaolinPoutine | 0:4cfeffb4d773 | 57 | |
ShaolinPoutine | 0:4cfeffb4d773 | 58 | pc.printf("response to command %c%c", command[0], command[1]); |
ShaolinPoutine | 0:4cfeffb4d773 | 59 | pc.printf(" is "); |
EmileArseneault | 2:51d67a8b2325 | 60 | if (len == 0) |
EmileArseneault | 2:51d67a8b2325 | 61 | { |
EmileArseneault | 2:51d67a8b2325 | 62 | switch (status) |
EmileArseneault | 2:51d67a8b2325 | 63 | { |
EmileArseneault | 2:51d67a8b2325 | 64 | case 0 : pc.printf("OK\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 65 | case 1 : pc.printf("ERROR\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 66 | case 2 : pc.printf("Invalid Command\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 67 | case 3 : pc.printf("Invalid Parameter\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 68 | case 4 : pc.printf("Tx Failure\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 69 | default : pc.printf("Unknow error ...\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 70 | } |
EmileArseneault | 2:51d67a8b2325 | 71 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 72 | |
ShaolinPoutine | 0:4cfeffb4d773 | 73 | while (i < len) |
ShaolinPoutine | 0:4cfeffb4d773 | 74 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 75 | if (xbee.readable()) |
ShaolinPoutine | 0:4cfeffb4d773 | 76 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 77 | data[i] = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 78 | total += data[i]; |
ShaolinPoutine | 0:4cfeffb4d773 | 79 | printhexa(data[i]); |
ShaolinPoutine | 0:4cfeffb4d773 | 80 | i++; |
ShaolinPoutine | 0:4cfeffb4d773 | 81 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 82 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 83 | |
ShaolinPoutine | 0:4cfeffb4d773 | 84 | char checksum = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 85 | total += checksum; |
ShaolinPoutine | 0:4cfeffb4d773 | 86 | // Verify checksum |
ShaolinPoutine | 0:4cfeffb4d773 | 87 | if (total != 0xFF) |
ShaolinPoutine | 0:4cfeffb4d773 | 88 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 89 | pc.printf("Checksum is wrong"); |
ShaolinPoutine | 0:4cfeffb4d773 | 90 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 91 | pc.printf("\r\n"); |
ShaolinPoutine | 0:4cfeffb4d773 | 92 | ans = data; |
ShaolinPoutine | 0:4cfeffb4d773 | 93 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 94 | |
ShaolinPoutine | 0:4cfeffb4d773 | 95 | void ModemStatus(int len, char* ans) |
ShaolinPoutine | 0:4cfeffb4d773 | 96 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 97 | char status = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 98 | |
ShaolinPoutine | 0:4cfeffb4d773 | 99 | switch (status){ |
ShaolinPoutine | 0:4cfeffb4d773 | 100 | case 0 : pc.printf("Hardware reset\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 101 | case 1 : pc.printf("Watchdog timer reset\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 102 | case 2 : pc.printf("Joined network (routers and end devices)\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 103 | case 3 : pc.printf("Disassociated\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 104 | case 6 : pc.printf("Coordinator started\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 105 | case 7 : pc.printf("Network security key was updated\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 106 | case 0x0D : pc.printf("Voltage supply limit exceeded\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 107 | case 0x11 : pc.printf("Modem configuration changed while join in progress\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 108 | default : pc.printf("stack error\r\n"); break; |
ShaolinPoutine | 0:4cfeffb4d773 | 109 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 110 | |
ShaolinPoutine | 0:4cfeffb4d773 | 111 | char checksum = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 112 | |
ShaolinPoutine | 0:4cfeffb4d773 | 113 | checksum += 0x8A + status; |
ShaolinPoutine | 0:4cfeffb4d773 | 114 | |
ShaolinPoutine | 0:4cfeffb4d773 | 115 | if (checksum != 0xFF) |
ShaolinPoutine | 0:4cfeffb4d773 | 116 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 117 | pc.printf("Checksum is wrong\r\n"); |
ShaolinPoutine | 0:4cfeffb4d773 | 118 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 119 | *ans = status; |
ShaolinPoutine | 0:4cfeffb4d773 | 120 | } |
EmileArseneault | 2:51d67a8b2325 | 121 | |
EmileArseneault | 2:51d67a8b2325 | 122 | void ZigBeeTransmitStatus(int len, char* ans) |
EmileArseneault | 2:51d67a8b2325 | 123 | { |
EmileArseneault | 2:51d67a8b2325 | 124 | char id = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 125 | char msb = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 126 | char lsb = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 127 | char retry = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 128 | char status = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 129 | char discovery = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 130 | |
EmileArseneault | 2:51d67a8b2325 | 131 | pc.printf("Response to transmit id %d is : ", id); |
EmileArseneault | 2:51d67a8b2325 | 132 | |
EmileArseneault | 2:51d67a8b2325 | 133 | if (status == 0) |
EmileArseneault | 2:51d67a8b2325 | 134 | { |
EmileArseneault | 2:51d67a8b2325 | 135 | pc.printf("Success\r\n"); |
EmileArseneault | 2:51d67a8b2325 | 136 | } |
EmileArseneault | 2:51d67a8b2325 | 137 | else |
EmileArseneault | 2:51d67a8b2325 | 138 | { |
EmileArseneault | 2:51d67a8b2325 | 139 | switch (status){ |
EmileArseneault | 2:51d67a8b2325 | 140 | case 0x01 : pc.printf("MAC ACK Failure\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 141 | case 0x02 : pc.printf("CCA Failure\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 142 | case 0x15 : pc.printf("Invalid destination endpoint\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 143 | case 0x21 : pc.printf("Network ACK Failure\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 144 | case 0x22 : pc.printf("Not Joined to Network\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 145 | case 0x23 : pc.printf("Self-addressed\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 146 | case 0x24 : pc.printf("Address Not Found\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 147 | case 0x25 : pc.printf("Route Not Found\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 148 | case 0x26 : pc.printf("Broadcast source failed to hear a neighbor relay the message\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 149 | case 0x2B : pc.printf("Invalid binding table index\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 150 | case 0x2C : pc.printf("Resource error lack of free buffers, timers, etc.\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 151 | case 0x2D : pc.printf("Attempted broadcast with APS transmission\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 152 | case 0x2E : pc.printf("Attempted unicast with APS transmission, but EE=0\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 153 | case 0x32 : pc.printf("Resource error lack of free buffers, timers, etc.\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 154 | case 0x74 : pc.printf("Data payload too large\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 155 | default : pc.printf("Unknow error ...\r\n"); break; |
EmileArseneault | 2:51d67a8b2325 | 156 | } |
EmileArseneault | 2:51d67a8b2325 | 157 | } |
EmileArseneault | 2:51d67a8b2325 | 158 | } |
EmileArseneault | 2:51d67a8b2325 | 159 | |
EmileArseneault | 2:51d67a8b2325 | 160 | void ZigBeeReceivePacket(int len, char* ans) |
EmileArseneault | 2:51d67a8b2325 | 161 | { |
EmileArseneault | 2:51d67a8b2325 | 162 | int i = 0; |
EmileArseneault | 2:51d67a8b2325 | 163 | char adresse64bit[8]; |
EmileArseneault | 2:51d67a8b2325 | 164 | char adresse16bit[2]; |
EmileArseneault | 2:51d67a8b2325 | 165 | char receiveOptions; |
EmileArseneault | 2:51d67a8b2325 | 166 | |
EmileArseneault | 2:51d67a8b2325 | 167 | while(i < 8) |
EmileArseneault | 2:51d67a8b2325 | 168 | { |
EmileArseneault | 2:51d67a8b2325 | 169 | adresse64bit[i] = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 170 | i++; |
EmileArseneault | 2:51d67a8b2325 | 171 | } |
EmileArseneault | 2:51d67a8b2325 | 172 | |
EmileArseneault | 2:51d67a8b2325 | 173 | adresse16bit[0] = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 174 | adresse16bit[1] = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 175 | |
EmileArseneault | 2:51d67a8b2325 | 176 | receiveOptions = xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 177 | |
EmileArseneault | 2:51d67a8b2325 | 178 | pc.printf("Data received : "); |
EmileArseneault | 2:51d67a8b2325 | 179 | |
EmileArseneault | 2:51d67a8b2325 | 180 | i = 11; |
EmileArseneault | 2:51d67a8b2325 | 181 | while (i < len) |
EmileArseneault | 2:51d67a8b2325 | 182 | { |
EmileArseneault | 2:51d67a8b2325 | 183 | printhexa(xbee.getc()); |
EmileArseneault | 2:51d67a8b2325 | 184 | i++; |
EmileArseneault | 2:51d67a8b2325 | 185 | } |
EmileArseneault | 2:51d67a8b2325 | 186 | |
EmileArseneault | 2:51d67a8b2325 | 187 | // Validate checksum TODO |
EmileArseneault | 2:51d67a8b2325 | 188 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 189 | |
ShaolinPoutine | 0:4cfeffb4d773 | 190 | char* InterpretMessage() |
ShaolinPoutine | 0:4cfeffb4d773 | 191 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 192 | char start = xbee.getc(); // = FRAMEDELIMITER |
ShaolinPoutine | 0:4cfeffb4d773 | 193 | //assert |
ShaolinPoutine | 0:4cfeffb4d773 | 194 | char len_msb = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 195 | char len_lsb = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 196 | |
ShaolinPoutine | 0:4cfeffb4d773 | 197 | int len = ((int) len_msb << 4) + (int) len_lsb; |
ShaolinPoutine | 0:4cfeffb4d773 | 198 | char frame_data[len]; |
ShaolinPoutine | 0:4cfeffb4d773 | 199 | |
ShaolinPoutine | 0:4cfeffb4d773 | 200 | // Resolving frame type |
ShaolinPoutine | 0:4cfeffb4d773 | 201 | char type = xbee.getc(); |
ShaolinPoutine | 0:4cfeffb4d773 | 202 | char *response; |
ShaolinPoutine | 0:4cfeffb4d773 | 203 | len--; |
ShaolinPoutine | 0:4cfeffb4d773 | 204 | |
ShaolinPoutine | 0:4cfeffb4d773 | 205 | switch (type){ |
ShaolinPoutine | 0:4cfeffb4d773 | 206 | case 0x88: ATCommandResponse(len, response); |
ShaolinPoutine | 0:4cfeffb4d773 | 207 | break; |
ShaolinPoutine | 0:4cfeffb4d773 | 208 | case 0x8A: ModemStatus(len, response); |
ShaolinPoutine | 0:4cfeffb4d773 | 209 | break; |
EmileArseneault | 2:51d67a8b2325 | 210 | case 0x8B: ZigBeeTransmitStatus(len, response); |
EmileArseneault | 2:51d67a8b2325 | 211 | break; |
EmileArseneault | 2:51d67a8b2325 | 212 | case 0x90: ZigBeeReceivePacket(len, response); |
EmileArseneault | 2:51d67a8b2325 | 213 | break; |
ShaolinPoutine | 0:4cfeffb4d773 | 214 | default: pc.printf("Please implement response of type"); |
ShaolinPoutine | 0:4cfeffb4d773 | 215 | printhexa(type); |
ShaolinPoutine | 0:4cfeffb4d773 | 216 | pc.printf("\r\n"); |
EmileArseneault | 2:51d67a8b2325 | 217 | for (int i = 0; i <len; i++) xbee.getc(); |
EmileArseneault | 2:51d67a8b2325 | 218 | break; |
ShaolinPoutine | 0:4cfeffb4d773 | 219 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 220 | return response; |
ShaolinPoutine | 0:4cfeffb4d773 | 221 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 222 | |
ShaolinPoutine | 0:4cfeffb4d773 | 223 | void SendAtCommand(char FirstChar, char SecondChar, char *OptionalParam = NULL, int ParamLen = 0) |
ShaolinPoutine | 0:4cfeffb4d773 | 224 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 225 | // Frame Type 0x08 |
ShaolinPoutine | 0:4cfeffb4d773 | 226 | // Two char as parameters |
ShaolinPoutine | 0:4cfeffb4d773 | 227 | |
ShaolinPoutine | 0:4cfeffb4d773 | 228 | char cmdtosend[10]; |
ShaolinPoutine | 0:4cfeffb4d773 | 229 | char sum = 0; |
ShaolinPoutine | 0:4cfeffb4d773 | 230 | int cmdlength = 8; |
ShaolinPoutine | 0:4cfeffb4d773 | 231 | int i = 0; |
ShaolinPoutine | 0:4cfeffb4d773 | 232 | |
ShaolinPoutine | 0:4cfeffb4d773 | 233 | cmdtosend[0] = FRAMEDELIMITER; |
ShaolinPoutine | 0:4cfeffb4d773 | 234 | cmdtosend[1] = 0x00; |
ShaolinPoutine | 0:4cfeffb4d773 | 235 | cmdtosend[2] = 0x04 + ParamLen; |
ShaolinPoutine | 0:4cfeffb4d773 | 236 | cmdtosend[3] = 0x08; |
ShaolinPoutine | 0:4cfeffb4d773 | 237 | cmdtosend[4] = 0x52; |
ShaolinPoutine | 0:4cfeffb4d773 | 238 | cmdtosend[5] = FirstChar; |
ShaolinPoutine | 0:4cfeffb4d773 | 239 | cmdtosend[6] = SecondChar; |
ShaolinPoutine | 0:4cfeffb4d773 | 240 | |
ShaolinPoutine | 0:4cfeffb4d773 | 241 | // Ajouter les parametres au message |
ShaolinPoutine | 0:4cfeffb4d773 | 242 | if(OptionalParam != NULL) |
ShaolinPoutine | 0:4cfeffb4d773 | 243 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 244 | i = 0; |
ShaolinPoutine | 0:4cfeffb4d773 | 245 | cmdlength += ParamLen; |
ShaolinPoutine | 0:4cfeffb4d773 | 246 | |
ShaolinPoutine | 0:4cfeffb4d773 | 247 | while (i < ParamLen) |
ShaolinPoutine | 0:4cfeffb4d773 | 248 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 249 | cmdtosend[7 + i] = (OptionalParam)[i]; |
ShaolinPoutine | 0:4cfeffb4d773 | 250 | i++; |
ShaolinPoutine | 0:4cfeffb4d773 | 251 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 252 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 253 | |
ShaolinPoutine | 0:4cfeffb4d773 | 254 | // Calculate checksum |
ShaolinPoutine | 0:4cfeffb4d773 | 255 | i = 3; |
ShaolinPoutine | 0:4cfeffb4d773 | 256 | while (i < (cmdlength - 1)) |
ShaolinPoutine | 0:4cfeffb4d773 | 257 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 258 | sum += cmdtosend[i]; |
ShaolinPoutine | 0:4cfeffb4d773 | 259 | i++; |
ShaolinPoutine | 0:4cfeffb4d773 | 260 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 261 | cmdtosend[cmdlength - 1] = 0xFF - sum; |
ShaolinPoutine | 0:4cfeffb4d773 | 262 | |
ShaolinPoutine | 0:4cfeffb4d773 | 263 | // Envoyer la commande sur UART |
ShaolinPoutine | 0:4cfeffb4d773 | 264 | i = 0; |
ShaolinPoutine | 0:4cfeffb4d773 | 265 | while (i < cmdlength) |
ShaolinPoutine | 0:4cfeffb4d773 | 266 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 267 | xbee.putc(cmdtosend[i]); |
ShaolinPoutine | 0:4cfeffb4d773 | 268 | i++; |
ShaolinPoutine | 0:4cfeffb4d773 | 269 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 270 | |
ShaolinPoutine | 0:4cfeffb4d773 | 271 | wait(0.1); |
ShaolinPoutine | 0:4cfeffb4d773 | 272 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 273 | |
ShaolinPoutine | 0:4cfeffb4d773 | 274 | void ReadSerial() |
ShaolinPoutine | 0:4cfeffb4d773 | 275 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 276 | // 00 13 A2 00 |
ShaolinPoutine | 0:4cfeffb4d773 | 277 | // 40 3E 09 63 |
ShaolinPoutine | 0:4cfeffb4d773 | 278 | SendAtCommand('S', 'H'); |
ShaolinPoutine | 0:4cfeffb4d773 | 279 | SendAtCommand('S', 'L'); |
ShaolinPoutine | 0:4cfeffb4d773 | 280 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 281 | |
EmileArseneault | 2:51d67a8b2325 | 282 | void InitialisePANID(char PANIDMSB, char PANIDLSB) |
EmileArseneault | 2:51d67a8b2325 | 283 | { |
EmileArseneault | 2:51d67a8b2325 | 284 | char PanID[2] = {PANIDMSB, PANIDLSB}; |
EmileArseneault | 2:51d67a8b2325 | 285 | |
EmileArseneault | 2:51d67a8b2325 | 286 | SendAtCommand('I', 'D', &PanID[0], 2); |
EmileArseneault | 2:51d67a8b2325 | 287 | } |
EmileArseneault | 2:51d67a8b2325 | 288 | |
EmileArseneault | 2:51d67a8b2325 | 289 | void ZigBeeTransmit(int adresse16, int adresse64, char *data, int dataLength) |
EmileArseneault | 2:51d67a8b2325 | 290 | { |
EmileArseneault | 2:51d67a8b2325 | 291 | // Frame Type 0x10 |
EmileArseneault | 2:51d67a8b2325 | 292 | // 0x0000000000000000 - Reserved 64-bit address for the coordinator |
EmileArseneault | 2:51d67a8b2325 | 293 | // 0x000000000000FFFF - Broadcast address |
EmileArseneault | 2:51d67a8b2325 | 294 | |
EmileArseneault | 2:51d67a8b2325 | 295 | // The Transmit Status frame (0x8B) est la reponse |
EmileArseneault | 2:51d67a8b2325 | 296 | char cmdtosend[25]; |
EmileArseneault | 2:51d67a8b2325 | 297 | char checksum = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 298 | int cmdlength = 18; |
EmileArseneault | 2:51d67a8b2325 | 299 | int i = 3; |
EmileArseneault | 2:51d67a8b2325 | 300 | |
EmileArseneault | 2:51d67a8b2325 | 301 | //ID command to set/read operating 64 bit PAN ID |
EmileArseneault | 2:51d67a8b2325 | 302 | //WR command to set operating 64 bit PAN ID across reboot |
EmileArseneault | 2:51d67a8b2325 | 303 | //OI command to read operating 16 bit PAN ID |
EmileArseneault | 2:51d67a8b2325 | 304 | //II command to set operating 16 bit PAN ID |
EmileArseneault | 2:51d67a8b2325 | 305 | |
EmileArseneault | 2:51d67a8b2325 | 306 | cmdtosend[0] = FRAMEDELIMITER; |
EmileArseneault | 2:51d67a8b2325 | 307 | cmdtosend[1] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 308 | cmdtosend[2] = 0x0E + dataLength; |
EmileArseneault | 2:51d67a8b2325 | 309 | cmdtosend[3] = 0x10; // Frame type |
EmileArseneault | 2:51d67a8b2325 | 310 | cmdtosend[4] = 0x01; // Frame number |
EmileArseneault | 2:51d67a8b2325 | 311 | cmdtosend[5] = 0x00; // MSB adresse 64-bit |
EmileArseneault | 2:51d67a8b2325 | 312 | cmdtosend[6] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 313 | cmdtosend[7] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 314 | cmdtosend[8] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 315 | cmdtosend[9] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 316 | cmdtosend[10] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 317 | cmdtosend[11] = 0xFF; |
EmileArseneault | 2:51d67a8b2325 | 318 | cmdtosend[12] = 0xFF; // LSB adresse 64-bit |
EmileArseneault | 2:51d67a8b2325 | 319 | cmdtosend[13] = adresse16 >> 16; // MSB adresse 16-bit |
EmileArseneault | 2:51d67a8b2325 | 320 | cmdtosend[14] = adresse16 && 0b0000000011111111; // LSB adresse 16-bit |
EmileArseneault | 2:51d67a8b2325 | 321 | cmdtosend[15] = 0x00; // Broadcast Radius |
EmileArseneault | 2:51d67a8b2325 | 322 | cmdtosend[16] = 0x00; // Options |
EmileArseneault | 2:51d67a8b2325 | 323 | |
EmileArseneault | 2:51d67a8b2325 | 324 | // Set RF DATA |
EmileArseneault | 2:51d67a8b2325 | 325 | if(data != NULL) |
EmileArseneault | 2:51d67a8b2325 | 326 | { |
EmileArseneault | 2:51d67a8b2325 | 327 | i = 0; |
EmileArseneault | 2:51d67a8b2325 | 328 | cmdlength += dataLength; |
EmileArseneault | 2:51d67a8b2325 | 329 | |
EmileArseneault | 2:51d67a8b2325 | 330 | while (i < dataLength) |
EmileArseneault | 2:51d67a8b2325 | 331 | { |
EmileArseneault | 2:51d67a8b2325 | 332 | cmdtosend[17 + i] = (data)[i]; |
EmileArseneault | 2:51d67a8b2325 | 333 | i++; |
EmileArseneault | 2:51d67a8b2325 | 334 | } |
EmileArseneault | 2:51d67a8b2325 | 335 | } |
EmileArseneault | 2:51d67a8b2325 | 336 | |
EmileArseneault | 2:51d67a8b2325 | 337 | //cmdtosend[17] = 0x00; // Start RF DATA |
EmileArseneault | 2:51d67a8b2325 | 338 | //cmdtosend[18] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 339 | //cmdtosend[19] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 340 | //cmdtosend[20] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 341 | //cmdtosend[21] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 342 | //cmdtosend[22] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 343 | //cmdtosend[23] = 0x00; |
EmileArseneault | 2:51d67a8b2325 | 344 | //cmdtosend[24] = 0x00; // End RF DATA |
EmileArseneault | 2:51d67a8b2325 | 345 | |
EmileArseneault | 2:51d67a8b2325 | 346 | // Calculate checksum |
EmileArseneault | 2:51d67a8b2325 | 347 | i = 3; |
EmileArseneault | 2:51d67a8b2325 | 348 | while (i < (cmdlength - 1)) |
EmileArseneault | 2:51d67a8b2325 | 349 | { |
EmileArseneault | 2:51d67a8b2325 | 350 | checksum += cmdtosend[i]; |
EmileArseneault | 2:51d67a8b2325 | 351 | i++; |
EmileArseneault | 2:51d67a8b2325 | 352 | } |
EmileArseneault | 2:51d67a8b2325 | 353 | cmdtosend[cmdlength - 1] = 0xFF - checksum; |
EmileArseneault | 2:51d67a8b2325 | 354 | |
EmileArseneault | 2:51d67a8b2325 | 355 | // Envoyer la commande sur UART |
EmileArseneault | 2:51d67a8b2325 | 356 | i = 0; |
EmileArseneault | 2:51d67a8b2325 | 357 | while (i < cmdlength) |
EmileArseneault | 2:51d67a8b2325 | 358 | { |
EmileArseneault | 2:51d67a8b2325 | 359 | xbee.putc(cmdtosend[i]); |
EmileArseneault | 2:51d67a8b2325 | 360 | i++; |
EmileArseneault | 2:51d67a8b2325 | 361 | } |
EmileArseneault | 2:51d67a8b2325 | 362 | wait(0.1); |
EmileArseneault | 2:51d67a8b2325 | 363 | } |
EmileArseneault | 2:51d67a8b2325 | 364 | |
EmileArseneault | 2:51d67a8b2325 | 365 | void BroadcastHelloWorld() |
EmileArseneault | 2:51d67a8b2325 | 366 | { |
EmileArseneault | 2:51d67a8b2325 | 367 | char hello[5] = {'H', 'e', 'l', 'l', 'o'}; |
EmileArseneault | 2:51d67a8b2325 | 368 | char world[5] = {'w', 'o', 'r', 'l', 'd'}; |
EmileArseneault | 2:51d67a8b2325 | 369 | |
EmileArseneault | 2:51d67a8b2325 | 370 | while (1) |
EmileArseneault | 2:51d67a8b2325 | 371 | { |
EmileArseneault | 2:51d67a8b2325 | 372 | ZigBeeTransmit(0xFFFE, 0x000000000000FFFF, &hello[0], 5); |
EmileArseneault | 2:51d67a8b2325 | 373 | ZigBeeTransmit(0xFFFE, 0x000000000000FFFF, &world[0], 5); |
EmileArseneault | 2:51d67a8b2325 | 374 | wait(2); |
EmileArseneault | 2:51d67a8b2325 | 375 | } |
EmileArseneault | 2:51d67a8b2325 | 376 | } |
EmileArseneault | 2:51d67a8b2325 | 377 | |
ShaolinPoutine | 0:4cfeffb4d773 | 378 | void xbee_reader() |
ShaolinPoutine | 0:4cfeffb4d773 | 379 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 380 | while(1) |
ShaolinPoutine | 0:4cfeffb4d773 | 381 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 382 | if (xbee.readable()) |
ShaolinPoutine | 0:4cfeffb4d773 | 383 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 384 | InterpretMessage(); |
ShaolinPoutine | 0:4cfeffb4d773 | 385 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 386 | wait(0.001); |
ShaolinPoutine | 0:4cfeffb4d773 | 387 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 388 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 389 | |
ShaolinPoutine | 0:4cfeffb4d773 | 390 | void tick() |
ShaolinPoutine | 0:4cfeffb4d773 | 391 | { |
ShaolinPoutine | 0:4cfeffb4d773 | 392 | myled = !myled; |
ShaolinPoutine | 0:4cfeffb4d773 | 393 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 394 | |
ShaolinPoutine | 0:4cfeffb4d773 | 395 | int main() { |
ShaolinPoutine | 0:4cfeffb4d773 | 396 | Thread thread(xbee_reader); |
ShaolinPoutine | 0:4cfeffb4d773 | 397 | Ticker ticker; |
ShaolinPoutine | 0:4cfeffb4d773 | 398 | ticker.attach(&tick, 1); |
ShaolinPoutine | 0:4cfeffb4d773 | 399 | pc.printf("\r\nI am coordinator\r\n"); |
ShaolinPoutine | 0:4cfeffb4d773 | 400 | resetswitch = 0; |
ShaolinPoutine | 0:4cfeffb4d773 | 401 | wait(0.4); |
ShaolinPoutine | 0:4cfeffb4d773 | 402 | resetswitch = 1; |
ShaolinPoutine | 0:4cfeffb4d773 | 403 | |
ShaolinPoutine | 0:4cfeffb4d773 | 404 | wait(3); |
ShaolinPoutine | 0:4cfeffb4d773 | 405 | ReadSerial(); |
EmileArseneault | 2:51d67a8b2325 | 406 | InitialisePANID(0x42, 0x69); |
EmileArseneault | 2:51d67a8b2325 | 407 | BroadcastHelloWorld(); |
ShaolinPoutine | 0:4cfeffb4d773 | 408 | |
ShaolinPoutine | 0:4cfeffb4d773 | 409 | while(1) { |
ShaolinPoutine | 0:4cfeffb4d773 | 410 | } |
ShaolinPoutine | 0:4cfeffb4d773 | 411 | } |