This is the router node
Dependencies: mbed-rtos mbed Zigbee_communication
main.cpp@1:7b547c552df0, 2017-02-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |