This is the router node

Dependencies:   mbed-rtos mbed Zigbee_communication

Committer:
ShaolinPoutine
Date:
Mon Feb 13 20:43:36 2017 +0000
Revision:
1:7b547c552df0
Parent:
0:f36ba442dcb2
Child:
3:0acb2c3d7612
Added common library

Who changed what in which revision?

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