This is the coordinator node.

Dependencies:   mbed-rtos mbed Zigbee_communication EthernetInterface WebSocketClient

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?

UserRevisionLine numberNew 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 }