This is the coordinator node.

Dependencies:   mbed-rtos mbed Zigbee_communication EthernetInterface WebSocketClient

Committer:
ShaolinPoutine
Date:
Mon Feb 13 20:25:43 2017 +0000
Revision:
0:4cfeffb4d773
Child:
2:51d67a8b2325
Created coordinator node.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ShaolinPoutine 0:4cfeffb4d773 1 #include "mbed.h"
ShaolinPoutine 0:4cfeffb4d773 2 #define FRAMEDELIMITER 0x7E
ShaolinPoutine 0:4cfeffb4d773 3 #include "rtos.h"
ShaolinPoutine 0:4cfeffb4d773 4
ShaolinPoutine 0:4cfeffb4d773 5 // 4269
ShaolinPoutine 0:4cfeffb4d773 6 DigitalOut resetswitch(p8);
ShaolinPoutine 0:4cfeffb4d773 7 Serial xbee(p13, p14);
ShaolinPoutine 0:4cfeffb4d773 8 Serial pc(USBTX, USBRX);
ShaolinPoutine 0:4cfeffb4d773 9 DigitalOut myled(LED1);
ShaolinPoutine 0:4cfeffb4d773 10
ShaolinPoutine 0:4cfeffb4d773 11 void printhexa(char c)
ShaolinPoutine 0:4cfeffb4d773 12 {
ShaolinPoutine 0:4cfeffb4d773 13 char msb = c >> 4;
ShaolinPoutine 0:4cfeffb4d773 14 char lsb = c & 0xF;
ShaolinPoutine 0:4cfeffb4d773 15
ShaolinPoutine 0:4cfeffb4d773 16 if (msb < 10)
ShaolinPoutine 0:4cfeffb4d773 17 msb += 0x30;
ShaolinPoutine 0:4cfeffb4d773 18 else
ShaolinPoutine 0:4cfeffb4d773 19 msb += 0x37;
ShaolinPoutine 0:4cfeffb4d773 20
ShaolinPoutine 0:4cfeffb4d773 21 if (lsb < 10)
ShaolinPoutine 0:4cfeffb4d773 22 lsb += 0x30;
ShaolinPoutine 0:4cfeffb4d773 23 else
ShaolinPoutine 0:4cfeffb4d773 24 lsb += 0x37;
ShaolinPoutine 0:4cfeffb4d773 25
ShaolinPoutine 0:4cfeffb4d773 26 pc.putc('0');
ShaolinPoutine 0:4cfeffb4d773 27 pc.putc('x');
ShaolinPoutine 0:4cfeffb4d773 28 pc.putc(msb);
ShaolinPoutine 0:4cfeffb4d773 29 pc.putc(lsb);
ShaolinPoutine 0:4cfeffb4d773 30 pc.putc(' ');
ShaolinPoutine 0:4cfeffb4d773 31 }
ShaolinPoutine 0:4cfeffb4d773 32
ShaolinPoutine 0:4cfeffb4d773 33 void ATCommandResponse(int len, char* ans)
ShaolinPoutine 0:4cfeffb4d773 34 {
ShaolinPoutine 0:4cfeffb4d773 35 char total = 0x88;
ShaolinPoutine 0:4cfeffb4d773 36 char id = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 37 total += id;
ShaolinPoutine 0:4cfeffb4d773 38 char command[2];
ShaolinPoutine 0:4cfeffb4d773 39 command[0] = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 40 total += command[0];
ShaolinPoutine 0:4cfeffb4d773 41 command[1] = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 42 total += command[1];
ShaolinPoutine 0:4cfeffb4d773 43 char status = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 44 total += status;
ShaolinPoutine 0:4cfeffb4d773 45 int i = 0;
ShaolinPoutine 0:4cfeffb4d773 46 len-= 4;
ShaolinPoutine 0:4cfeffb4d773 47 char data[len];
ShaolinPoutine 0:4cfeffb4d773 48
ShaolinPoutine 0:4cfeffb4d773 49 pc.printf("response to command %c%c", command[0], command[1]);
ShaolinPoutine 0:4cfeffb4d773 50 pc.printf(" is ");
ShaolinPoutine 0:4cfeffb4d773 51
ShaolinPoutine 0:4cfeffb4d773 52 while (i < len)
ShaolinPoutine 0:4cfeffb4d773 53 {
ShaolinPoutine 0:4cfeffb4d773 54 if (xbee.readable())
ShaolinPoutine 0:4cfeffb4d773 55 {
ShaolinPoutine 0:4cfeffb4d773 56 data[i] = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 57 total += data[i];
ShaolinPoutine 0:4cfeffb4d773 58 printhexa(data[i]);
ShaolinPoutine 0:4cfeffb4d773 59 i++;
ShaolinPoutine 0:4cfeffb4d773 60 }
ShaolinPoutine 0:4cfeffb4d773 61 }
ShaolinPoutine 0:4cfeffb4d773 62
ShaolinPoutine 0:4cfeffb4d773 63 char checksum = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 64 total += checksum;
ShaolinPoutine 0:4cfeffb4d773 65 // Verify checksum
ShaolinPoutine 0:4cfeffb4d773 66 if (total != 0xFF)
ShaolinPoutine 0:4cfeffb4d773 67 {
ShaolinPoutine 0:4cfeffb4d773 68 pc.printf("Checksum is wrong");
ShaolinPoutine 0:4cfeffb4d773 69 }
ShaolinPoutine 0:4cfeffb4d773 70 pc.printf("\r\n");
ShaolinPoutine 0:4cfeffb4d773 71 ans = data;
ShaolinPoutine 0:4cfeffb4d773 72 }
ShaolinPoutine 0:4cfeffb4d773 73
ShaolinPoutine 0:4cfeffb4d773 74 void ModemStatus(int len, char* ans)
ShaolinPoutine 0:4cfeffb4d773 75 {
ShaolinPoutine 0:4cfeffb4d773 76 char status = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 77
ShaolinPoutine 0:4cfeffb4d773 78 switch (status){
ShaolinPoutine 0:4cfeffb4d773 79 case 0 : pc.printf("Hardware reset\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 80 case 1 : pc.printf("Watchdog timer reset\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 81 case 2 : pc.printf("Joined network (routers and end devices)\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 82 case 3 : pc.printf("Disassociated\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 83 case 6 : pc.printf("Coordinator started\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 84 case 7 : pc.printf("Network security key was updated\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 85 case 0x0D : pc.printf("Voltage supply limit exceeded\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 86 case 0x11 : pc.printf("Modem configuration changed while join in progress\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 87 default : pc.printf("stack error\r\n"); break;
ShaolinPoutine 0:4cfeffb4d773 88 }
ShaolinPoutine 0:4cfeffb4d773 89
ShaolinPoutine 0:4cfeffb4d773 90 char checksum = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 91
ShaolinPoutine 0:4cfeffb4d773 92 checksum += 0x8A + status;
ShaolinPoutine 0:4cfeffb4d773 93
ShaolinPoutine 0:4cfeffb4d773 94 if (checksum != 0xFF)
ShaolinPoutine 0:4cfeffb4d773 95 {
ShaolinPoutine 0:4cfeffb4d773 96 pc.printf("Checksum is wrong\r\n");
ShaolinPoutine 0:4cfeffb4d773 97 }
ShaolinPoutine 0:4cfeffb4d773 98 *ans = status;
ShaolinPoutine 0:4cfeffb4d773 99 }
ShaolinPoutine 0:4cfeffb4d773 100
ShaolinPoutine 0:4cfeffb4d773 101 char* InterpretMessage()
ShaolinPoutine 0:4cfeffb4d773 102 {
ShaolinPoutine 0:4cfeffb4d773 103 char start = xbee.getc(); // = FRAMEDELIMITER
ShaolinPoutine 0:4cfeffb4d773 104 //assert
ShaolinPoutine 0:4cfeffb4d773 105 char len_msb = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 106 char len_lsb = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 107
ShaolinPoutine 0:4cfeffb4d773 108 int len = ((int) len_msb << 4) + (int) len_lsb;
ShaolinPoutine 0:4cfeffb4d773 109 char frame_data[len];
ShaolinPoutine 0:4cfeffb4d773 110
ShaolinPoutine 0:4cfeffb4d773 111 // Resolving frame type
ShaolinPoutine 0:4cfeffb4d773 112 char type = xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 113 char *response;
ShaolinPoutine 0:4cfeffb4d773 114 len--;
ShaolinPoutine 0:4cfeffb4d773 115
ShaolinPoutine 0:4cfeffb4d773 116 switch (type){
ShaolinPoutine 0:4cfeffb4d773 117 case 0x88: ATCommandResponse(len, response);
ShaolinPoutine 0:4cfeffb4d773 118 break;
ShaolinPoutine 0:4cfeffb4d773 119 case 0x8A: ModemStatus(len, response);
ShaolinPoutine 0:4cfeffb4d773 120 break;
ShaolinPoutine 0:4cfeffb4d773 121 default: pc.printf("Please implement response of type");
ShaolinPoutine 0:4cfeffb4d773 122 printhexa(type);
ShaolinPoutine 0:4cfeffb4d773 123 pc.printf("\r\n");
ShaolinPoutine 0:4cfeffb4d773 124 for (int i = -1; i <len; i++) xbee.getc();
ShaolinPoutine 0:4cfeffb4d773 125 }
ShaolinPoutine 0:4cfeffb4d773 126 return response;
ShaolinPoutine 0:4cfeffb4d773 127 }
ShaolinPoutine 0:4cfeffb4d773 128
ShaolinPoutine 0:4cfeffb4d773 129 void SendAtCommand(char FirstChar, char SecondChar, char *OptionalParam = NULL, int ParamLen = 0)
ShaolinPoutine 0:4cfeffb4d773 130 {
ShaolinPoutine 0:4cfeffb4d773 131 // Frame Type 0x08
ShaolinPoutine 0:4cfeffb4d773 132 // Two char as parameters
ShaolinPoutine 0:4cfeffb4d773 133
ShaolinPoutine 0:4cfeffb4d773 134 char cmdtosend[10];
ShaolinPoutine 0:4cfeffb4d773 135 char sum = 0;
ShaolinPoutine 0:4cfeffb4d773 136 int cmdlength = 8;
ShaolinPoutine 0:4cfeffb4d773 137 int i = 0;
ShaolinPoutine 0:4cfeffb4d773 138
ShaolinPoutine 0:4cfeffb4d773 139 cmdtosend[0] = FRAMEDELIMITER;
ShaolinPoutine 0:4cfeffb4d773 140 cmdtosend[1] = 0x00;
ShaolinPoutine 0:4cfeffb4d773 141 cmdtosend[2] = 0x04 + ParamLen;
ShaolinPoutine 0:4cfeffb4d773 142 cmdtosend[3] = 0x08;
ShaolinPoutine 0:4cfeffb4d773 143 cmdtosend[4] = 0x52;
ShaolinPoutine 0:4cfeffb4d773 144 cmdtosend[5] = FirstChar;
ShaolinPoutine 0:4cfeffb4d773 145 cmdtosend[6] = SecondChar;
ShaolinPoutine 0:4cfeffb4d773 146
ShaolinPoutine 0:4cfeffb4d773 147 // Ajouter les parametres au message
ShaolinPoutine 0:4cfeffb4d773 148 if(OptionalParam != NULL)
ShaolinPoutine 0:4cfeffb4d773 149 {
ShaolinPoutine 0:4cfeffb4d773 150 i = 0;
ShaolinPoutine 0:4cfeffb4d773 151 cmdlength += ParamLen;
ShaolinPoutine 0:4cfeffb4d773 152
ShaolinPoutine 0:4cfeffb4d773 153 while (i < ParamLen)
ShaolinPoutine 0:4cfeffb4d773 154 {
ShaolinPoutine 0:4cfeffb4d773 155 pc.putc((OptionalParam)[i]);
ShaolinPoutine 0:4cfeffb4d773 156 cmdtosend[7 + i] = (OptionalParam)[i];
ShaolinPoutine 0:4cfeffb4d773 157 i++;
ShaolinPoutine 0:4cfeffb4d773 158 }
ShaolinPoutine 0:4cfeffb4d773 159 pc.printf("\r\n");
ShaolinPoutine 0:4cfeffb4d773 160 }
ShaolinPoutine 0:4cfeffb4d773 161
ShaolinPoutine 0:4cfeffb4d773 162 // Calculate checksum
ShaolinPoutine 0:4cfeffb4d773 163 i = 3;
ShaolinPoutine 0:4cfeffb4d773 164 while (i < (cmdlength - 1))
ShaolinPoutine 0:4cfeffb4d773 165 {
ShaolinPoutine 0:4cfeffb4d773 166 sum += cmdtosend[i];
ShaolinPoutine 0:4cfeffb4d773 167 i++;
ShaolinPoutine 0:4cfeffb4d773 168 }
ShaolinPoutine 0:4cfeffb4d773 169 cmdtosend[cmdlength - 1] = 0xFF - sum;
ShaolinPoutine 0:4cfeffb4d773 170
ShaolinPoutine 0:4cfeffb4d773 171 // Envoyer la commande sur UART
ShaolinPoutine 0:4cfeffb4d773 172 i = 0;
ShaolinPoutine 0:4cfeffb4d773 173 while (i < cmdlength)
ShaolinPoutine 0:4cfeffb4d773 174 {
ShaolinPoutine 0:4cfeffb4d773 175 xbee.putc(cmdtosend[i]);
ShaolinPoutine 0:4cfeffb4d773 176 i++;
ShaolinPoutine 0:4cfeffb4d773 177 }
ShaolinPoutine 0:4cfeffb4d773 178
ShaolinPoutine 0:4cfeffb4d773 179 wait(0.1);
ShaolinPoutine 0:4cfeffb4d773 180 }
ShaolinPoutine 0:4cfeffb4d773 181
ShaolinPoutine 0:4cfeffb4d773 182 void ReadSerial()
ShaolinPoutine 0:4cfeffb4d773 183 {
ShaolinPoutine 0:4cfeffb4d773 184 // 00 13 A2 00
ShaolinPoutine 0:4cfeffb4d773 185 // 40 3E 09 63
ShaolinPoutine 0:4cfeffb4d773 186 SendAtCommand('S', 'H');
ShaolinPoutine 0:4cfeffb4d773 187 SendAtCommand('S', 'L');
ShaolinPoutine 0:4cfeffb4d773 188 }
ShaolinPoutine 0:4cfeffb4d773 189
ShaolinPoutine 0:4cfeffb4d773 190 void xbee_reader()
ShaolinPoutine 0:4cfeffb4d773 191 {
ShaolinPoutine 0:4cfeffb4d773 192 while(1)
ShaolinPoutine 0:4cfeffb4d773 193 {
ShaolinPoutine 0:4cfeffb4d773 194 if (xbee.readable())
ShaolinPoutine 0:4cfeffb4d773 195 {
ShaolinPoutine 0:4cfeffb4d773 196 InterpretMessage();
ShaolinPoutine 0:4cfeffb4d773 197 }
ShaolinPoutine 0:4cfeffb4d773 198 wait(0.001);
ShaolinPoutine 0:4cfeffb4d773 199 }
ShaolinPoutine 0:4cfeffb4d773 200 }
ShaolinPoutine 0:4cfeffb4d773 201
ShaolinPoutine 0:4cfeffb4d773 202 void tick()
ShaolinPoutine 0:4cfeffb4d773 203 {
ShaolinPoutine 0:4cfeffb4d773 204 myled = !myled;
ShaolinPoutine 0:4cfeffb4d773 205 }
ShaolinPoutine 0:4cfeffb4d773 206
ShaolinPoutine 0:4cfeffb4d773 207 int main() {
ShaolinPoutine 0:4cfeffb4d773 208 Thread thread(xbee_reader);
ShaolinPoutine 0:4cfeffb4d773 209 Ticker ticker;
ShaolinPoutine 0:4cfeffb4d773 210 ticker.attach(&tick, 1);
ShaolinPoutine 0:4cfeffb4d773 211 pc.printf("\r\nI am coordinator\r\n");
ShaolinPoutine 0:4cfeffb4d773 212 resetswitch = 0;
ShaolinPoutine 0:4cfeffb4d773 213 wait(0.4);
ShaolinPoutine 0:4cfeffb4d773 214 resetswitch = 1;
ShaolinPoutine 0:4cfeffb4d773 215
ShaolinPoutine 0:4cfeffb4d773 216 wait(3);
ShaolinPoutine 0:4cfeffb4d773 217 ReadSerial();
ShaolinPoutine 0:4cfeffb4d773 218
ShaolinPoutine 0:4cfeffb4d773 219 while(1) {
ShaolinPoutine 0:4cfeffb4d773 220 }
ShaolinPoutine 0:4cfeffb4d773 221 }