BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Mon Feb 13 20:14:12 2017 +0000
Revision:
15:4c748df01e5b
Parent:
14:8b59a90725bc
Child:
16:cede55e5b075
Gestion des erreurs...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benjaminroy 9:f6f79f136101 1 // ===================== COORDINATOR =====================
benjaminroy 9:f6f79f136101 2 // =======================================================
marc1119 0:ec23a7ae804c 3 #include "EthernetInterface.h"
marc1119 0:ec23a7ae804c 4 #include "ConfigFile.h"
marc1119 0:ec23a7ae804c 5 #include "mbed.h"
benjaminroy 9:f6f79f136101 6 #include "rtos.h"
marc1119 0:ec23a7ae804c 7
benjaminroy 15:4c748df01e5b 8 AnalogOut errorLed(p18);
marc1119 0:ec23a7ae804c 9 DigitalOut reset(p8);
benjaminroy 15:4c748df01e5b 10 DigitalOut led1(LED1);
benjaminroy 9:f6f79f136101 11 EthernetInterface eth;
marc1119 8:9c34eb3cb3ef 12 Serial xbee(p13, p14); // tx, rx
marc1119 1:ceb3f8ba8793 13 Serial pc(USBTX, USBRX); // tx, rx
benjaminroy 9:f6f79f136101 14 TCPSocketConnection sock;
benjaminroy 11:205ddd5406af 15 Ticker ticker1;
benjaminroy 14:8b59a90725bc 16 Thread *t1;
marc1119 0:ec23a7ae804c 17
benjaminroy 13:62404d7dab8d 18 /* Mail */
benjaminroy 13:62404d7dab8d 19 typedef struct {
benjaminroy 14:8b59a90725bc 20 uint8_t type;
benjaminroy 14:8b59a90725bc 21 char strAccelerationX[15];
benjaminroy 14:8b59a90725bc 22 char strAccelerationY[15];
benjaminroy 14:8b59a90725bc 23 char strAccelerationZ[15];
benjaminroy 14:8b59a90725bc 24 char strDryContact[15];
benjaminroy 13:62404d7dab8d 25 } mail_t;
benjaminroy 13:62404d7dab8d 26
benjaminroy 13:62404d7dab8d 27 Mail<mail_t, 100> mail_box;
benjaminroy 13:62404d7dab8d 28
benjaminroy 14:8b59a90725bc 29 uint8_t routerAddress[8] = { 0 }; // Should be 00 13 A2 00 40 8B 41 6E
benjaminroy 6:fd7d91edcf60 30 uint16_t portNumber = 0;
benjaminroy 6:fd7d91edcf60 31 uint16_t panId = 0;
benjaminroy 6:fd7d91edcf60 32 char serverAddress[32];
marc1119 8:9c34eb3cb3ef 33 char panIdChar[5];
benjaminroy 9:f6f79f136101 34 char portNbr[5];
benjaminroy 15:4c748df01e5b 35 bool led = false;
marc1119 3:fbd4b164e8ad 36
benjaminroy 6:fd7d91edcf60 37 void printBuffer(uint8_t bufferSize, uint8_t* buffer) {
marc1119 8:9c34eb3cb3ef 38 for(uint8_t k = 0; k <= bufferSize; k++) {
benjaminroy 6:fd7d91edcf60 39 pc.printf("%X-", buffer[k]);
benjaminroy 6:fd7d91edcf60 40 }
benjaminroy 6:fd7d91edcf60 41 printf("\n");
benjaminroy 6:fd7d91edcf60 42 }
benjaminroy 6:fd7d91edcf60 43
benjaminroy 15:4c748df01e5b 44 void toggleErrorLed() {
benjaminroy 15:4c748df01e5b 45 errorLed.write(3.3);
benjaminroy 15:4c748df01e5b 46 wait(1);
benjaminroy 15:4c748df01e5b 47 errorLed.write(0);
benjaminroy 15:4c748df01e5b 48 }
benjaminroy 15:4c748df01e5b 49
benjaminroy 6:fd7d91edcf60 50 void readConfigFile() {
benjaminroy 6:fd7d91edcf60 51 LocalFileSystem local("local");
benjaminroy 6:fd7d91edcf60 52 ConfigFile cfg;
benjaminroy 6:fd7d91edcf60 53 char *serverAddressStr = "serverAddr";
benjaminroy 6:fd7d91edcf60 54 char *portNumberStr = "portNb";
benjaminroy 6:fd7d91edcf60 55 char *panIdStr = "panID";
benjaminroy 6:fd7d91edcf60 56
benjaminroy 6:fd7d91edcf60 57 if (!cfg.read("/local/input.cfg")) {
benjaminroy 6:fd7d91edcf60 58 error("Erreur dans la lecture du fichier de configuration.\n");
benjaminroy 6:fd7d91edcf60 59 } else {
benjaminroy 6:fd7d91edcf60 60 cfg.getValue(panIdStr, &panIdChar[0], sizeof(panIdChar));
benjaminroy 6:fd7d91edcf60 61 cfg.getValue(serverAddressStr, &serverAddress[0], sizeof(serverAddress));
benjaminroy 6:fd7d91edcf60 62 cfg.getValue(portNumberStr, &portNbr[0], sizeof(portNbr));
benjaminroy 6:fd7d91edcf60 63
benjaminroy 6:fd7d91edcf60 64 portNumber = (uint16_t)strtol(portNbr, NULL, 10);
benjaminroy 6:fd7d91edcf60 65 panId = (uint16_t)strtol(panIdChar, NULL, 10);
benjaminroy 6:fd7d91edcf60 66
benjaminroy 10:488877f7f56c 67 // printf("The server address is %s\n", serverAddress);
benjaminroy 10:488877f7f56c 68 // printf("The port number is %i\n", portNumber);
benjaminroy 10:488877f7f56c 69 // printf("The PAN ID is %i\n", panId);
benjaminroy 6:fd7d91edcf60 70 }
benjaminroy 6:fd7d91edcf60 71 }
benjaminroy 6:fd7d91edcf60 72
benjaminroy 15:4c748df01e5b 73 uint8_t calculateChecksum(uint8_t frameTypeIndex, uint8_t frameSize, uint8_t* buffer) {
benjaminroy 14:8b59a90725bc 74 char checksum = 0;
marc1119 12:42986a9c3682 75
marc1119 12:42986a9c3682 76 for (int i = frameTypeIndex; i < frameSize - 1; i++) {
marc1119 12:42986a9c3682 77 checksum += buffer[i];
marc1119 12:42986a9c3682 78 }
marc1119 12:42986a9c3682 79
benjaminroy 14:8b59a90725bc 80 return (0xFF - checksum);
marc1119 12:42986a9c3682 81 }
marc1119 12:42986a9c3682 82
benjaminroy 14:8b59a90725bc 83 void toggleLed() {
benjaminroy 14:8b59a90725bc 84 // uint8_t high[20] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3C};
benjaminroy 14:8b59a90725bc 85 // uint8_t low[20] = {0x7E, 0x00, 0x10, 0x17, 0x02, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3C};
benjaminroy 15:4c748df01e5b 86 Thread::signal_wait(0x2);
benjaminroy 15:4c748df01e5b 87
benjaminroy 14:8b59a90725bc 88 while(1) {
benjaminroy 14:8b59a90725bc 89 Thread::signal_wait(0x1);
benjaminroy 14:8b59a90725bc 90
benjaminroy 14:8b59a90725bc 91 uint8_t command[20] = {0};
benjaminroy 14:8b59a90725bc 92
benjaminroy 14:8b59a90725bc 93 command[0] = 0x7E;
benjaminroy 14:8b59a90725bc 94 command[1] = 0x00;
benjaminroy 14:8b59a90725bc 95 command[2] = 0x10;
benjaminroy 14:8b59a90725bc 96 command[3] = 0x17;
benjaminroy 15:4c748df01e5b 97 if (led) {
benjaminroy 14:8b59a90725bc 98 command[4] = 0x01;
benjaminroy 14:8b59a90725bc 99 }
benjaminroy 14:8b59a90725bc 100 else {
benjaminroy 14:8b59a90725bc 101 command[4] = 0x02;
benjaminroy 14:8b59a90725bc 102 }
benjaminroy 14:8b59a90725bc 103 command[5] = routerAddress[0];
benjaminroy 14:8b59a90725bc 104 command[6] = routerAddress[1];
benjaminroy 14:8b59a90725bc 105 command[7] = routerAddress[2];
benjaminroy 14:8b59a90725bc 106 command[8] = routerAddress[3];
benjaminroy 14:8b59a90725bc 107 command[9] = routerAddress[4];
benjaminroy 14:8b59a90725bc 108 command[10] = routerAddress[5];
benjaminroy 14:8b59a90725bc 109 command[11] = routerAddress[6];
benjaminroy 14:8b59a90725bc 110 command[12] = routerAddress[7];
benjaminroy 14:8b59a90725bc 111 command[13] = 0xFF;
benjaminroy 14:8b59a90725bc 112 command[14] = 0xFE;
benjaminroy 14:8b59a90725bc 113 command[15] = 0x02;
benjaminroy 14:8b59a90725bc 114 command[16] = 0x44;
benjaminroy 14:8b59a90725bc 115 command[17] = 0x34;
benjaminroy 15:4c748df01e5b 116 if (led) {
benjaminroy 14:8b59a90725bc 117 command[18] = 0x05;
benjaminroy 14:8b59a90725bc 118 }
benjaminroy 14:8b59a90725bc 119 else {
benjaminroy 14:8b59a90725bc 120 command[18] = 0x04;
benjaminroy 14:8b59a90725bc 121 }
benjaminroy 15:4c748df01e5b 122 command[19] = calculateChecksum(3, 20, command);
benjaminroy 14:8b59a90725bc 123
benjaminroy 14:8b59a90725bc 124 for (uint8_t i = 0; i < 20;) {
benjaminroy 14:8b59a90725bc 125 if (xbee.writeable()) {
benjaminroy 14:8b59a90725bc 126 xbee.putc(command[i]);
benjaminroy 14:8b59a90725bc 127 i++;
benjaminroy 14:8b59a90725bc 128 }
benjaminroy 14:8b59a90725bc 129 }
benjaminroy 15:4c748df01e5b 130 led = !led;
benjaminroy 15:4c748df01e5b 131 led1 = !led1;
marc1119 3:fbd4b164e8ad 132 }
marc1119 3:fbd4b164e8ad 133 }
marc1119 3:fbd4b164e8ad 134
benjaminroy 13:62404d7dab8d 135 void sendDataToServer() {
benjaminroy 13:62404d7dab8d 136 while(1) {
benjaminroy 13:62404d7dab8d 137 osEvent evt = mail_box.get();
benjaminroy 9:f6f79f136101 138
benjaminroy 13:62404d7dab8d 139 if (evt.status == osEventMail) {
benjaminroy 13:62404d7dab8d 140 mail_t *mail = (mail_t*)evt.value.p;
benjaminroy 13:62404d7dab8d 141
benjaminroy 13:62404d7dab8d 142 int responseSize = 0;
benjaminroy 13:62404d7dab8d 143 char buffer[50] = { 0 };
benjaminroy 14:8b59a90725bc 144
benjaminroy 14:8b59a90725bc 145 if (mail->type == 0) {
benjaminroy 14:8b59a90725bc 146 sprintf(buffer, "%s, %s, %s\0", mail->strAccelerationX, mail->strAccelerationY, mail->strAccelerationZ);
benjaminroy 14:8b59a90725bc 147 } else {
benjaminroy 14:8b59a90725bc 148 sprintf(buffer, "%s\0", mail->strDryContact);
benjaminroy 13:62404d7dab8d 149 }
benjaminroy 14:8b59a90725bc 150
benjaminroy 13:62404d7dab8d 151 sock.send_all(buffer, sizeof(buffer)-1);
benjaminroy 13:62404d7dab8d 152 responseSize = sock.receive(buffer, sizeof(buffer)-1);
benjaminroy 13:62404d7dab8d 153
benjaminroy 13:62404d7dab8d 154 if (responseSize <= 0) {
benjaminroy 13:62404d7dab8d 155 pc.printf("Error");
benjaminroy 13:62404d7dab8d 156 }
benjaminroy 13:62404d7dab8d 157
benjaminroy 13:62404d7dab8d 158 buffer[responseSize] = '\0';
benjaminroy 13:62404d7dab8d 159 pc.printf("Received %d chars from server: %s\n", responseSize, buffer);
benjaminroy 13:62404d7dab8d 160
benjaminroy 13:62404d7dab8d 161 mail_box.free(mail);
benjaminroy 9:f6f79f136101 162 }
benjaminroy 13:62404d7dab8d 163 }
marc1119 1:ceb3f8ba8793 164 }
marc1119 1:ceb3f8ba8793 165
benjaminroy 15:4c748df01e5b 166 void readATCommandResponse(uint8_t* buffer) {
benjaminroy 15:4c748df01e5b 167 if (!buffer[4] == 0x00) toggleErrorLed();
benjaminroy 15:4c748df01e5b 168
benjaminroy 15:4c748df01e5b 169 if (buffer[4] == 0x01) pc.printf("AT Command Response: Error.\n");
benjaminroy 15:4c748df01e5b 170 else if (buffer[4] == 0x02) pc.printf("AT Command Response: Invalid Command.\n");
benjaminroy 15:4c748df01e5b 171 else if (buffer[4] == 0x03) pc.printf("AT Command Response: Invalid Parameter.\n");
benjaminroy 15:4c748df01e5b 172 else if (buffer[4] == 0x04) pc.printf("AT Command Response: Tx Failure.\n");
benjaminroy 15:4c748df01e5b 173 }
benjaminroy 15:4c748df01e5b 174
benjaminroy 15:4c748df01e5b 175 void readRemoteATCommandResponse(uint8_t* buffer) {
benjaminroy 15:4c748df01e5b 176 if (!buffer[14] == 0x00) toggleErrorLed();
benjaminroy 15:4c748df01e5b 177
benjaminroy 15:4c748df01e5b 178 if (buffer[14] == 0x01) pc.printf("Remote AT Command Response: Error.\n");
benjaminroy 15:4c748df01e5b 179 else if (buffer[14] == 0x02) pc.printf("Remote AT Command Response: Invalid Command.\n");
benjaminroy 15:4c748df01e5b 180 else if (buffer[14] == 0x03) pc.printf("Remote AT Command Response: Invalid Parameter.\n");
benjaminroy 15:4c748df01e5b 181 else if (buffer[14] == 0x04) pc.printf("Remote AT Command Response: Tx Failure.\n");
benjaminroy 15:4c748df01e5b 182 }
benjaminroy 15:4c748df01e5b 183
benjaminroy 15:4c748df01e5b 184 void readTransmitStatus(uint8_t* buffer) {
benjaminroy 15:4c748df01e5b 185 if (buffer[5] == 0x01) pc.printf("Transmit Status: An expedted MAC acknowledgement never occured. \n");
benjaminroy 15:4c748df01e5b 186 else if (buffer[5] == 0x02) pc.printf("Transmit Status: CCA failure. \n");
benjaminroy 15:4c748df01e5b 187 else if (buffer[5] == 0x03) pc.printf("Transmit Status: Packet was purgedwithoutbeing transmitted. \n");
benjaminroy 15:4c748df01e5b 188 else if (buffer[5] == 0x04) pc.printf("Transmit Status: Physical error on the interface with the WiFi transceiver. \n");
benjaminroy 15:4c748df01e5b 189 else if (buffer[5] == 0x18) pc.printf("Transmit Status: No buffers. \n");
benjaminroy 15:4c748df01e5b 190 else if (buffer[5] == 0x21) pc.printf("Transmit Status: Expected networkacknowledgement never occured. \n");
benjaminroy 15:4c748df01e5b 191 else if (buffer[5] == 0x22) pc.printf("Transmit Status: Not joined to network. \n");
benjaminroy 15:4c748df01e5b 192 else if (buffer[5] == 0x23) pc.printf("Transmit Status: Self-addressed. \n");
benjaminroy 15:4c748df01e5b 193 else if (buffer[5] == 0x24) pc.printf("Transmit Status: Address not found. \n");
benjaminroy 15:4c748df01e5b 194 else if (buffer[5] == 0x25) pc.printf("Transmit Status: Route not found. \n");
benjaminroy 15:4c748df01e5b 195 else if (buffer[5] == 0x26) pc.printf("Transmit Status: Broadcast relay was not heard. \n");
benjaminroy 15:4c748df01e5b 196 else if (buffer[5] == 0x2B) pc.printf("Transmit Status: Invalid binding table index. \n");
benjaminroy 15:4c748df01e5b 197 else if (buffer[5] == 0x2C) pc.printf("Transmit Status: Invalid Endpoint. \n");
benjaminroy 15:4c748df01e5b 198 else if (buffer[5] == 0x31) pc.printf("Transmit Status: A software error occurred. \n");
benjaminroy 15:4c748df01e5b 199 else if (buffer[5] == 0x32) pc.printf("Transmit Status: Resource Error. \n");
benjaminroy 15:4c748df01e5b 200 else if (buffer[5] == 0x74) pc.printf("Transmit Status: Data payload too large. \n");
benjaminroy 15:4c748df01e5b 201 else if (buffer[5] == 0x76) pc.printf("Transmit Status: Client socket creationat attempt failed. \n");
benjaminroy 15:4c748df01e5b 202 }
benjaminroy 15:4c748df01e5b 203
benjaminroy 15:4c748df01e5b 204 void readModemStatus(uint8_t* buffer) {
benjaminroy 15:4c748df01e5b 205 if (buffer[1] == 0x00) {
benjaminroy 15:4c748df01e5b 206 pc.printf("Modem status: Hardware reset.\n");
benjaminroy 15:4c748df01e5b 207 }
benjaminroy 15:4c748df01e5b 208 else if (buffer[1] == 0x01) {
benjaminroy 15:4c748df01e5b 209 pc.printf("Modem status: Watchdog timer reset.\n");
benjaminroy 15:4c748df01e5b 210 toggleErrorLed();
benjaminroy 15:4c748df01e5b 211 }
benjaminroy 15:4c748df01e5b 212 else if (buffer[1] == 0x02) {
benjaminroy 15:4c748df01e5b 213 pc.printf("Modem status: Joined network.\n");
benjaminroy 15:4c748df01e5b 214 toggleErrorLed();
benjaminroy 15:4c748df01e5b 215 }
benjaminroy 15:4c748df01e5b 216 else if (buffer[1] == 0x03) {
benjaminroy 15:4c748df01e5b 217 pc.printf("Modem status: Disassociated.\n");
benjaminroy 15:4c748df01e5b 218 toggleErrorLed();
benjaminroy 15:4c748df01e5b 219 }
benjaminroy 15:4c748df01e5b 220 else if (buffer[1] == 0x04) {
benjaminroy 15:4c748df01e5b 221 pc.printf("Modem status: Configuration error/synchronization.\n");
benjaminroy 15:4c748df01e5b 222 toggleErrorLed();
benjaminroy 15:4c748df01e5b 223 }
benjaminroy 15:4c748df01e5b 224 else if (buffer[1] == 0x05) {
benjaminroy 15:4c748df01e5b 225 pc.printf("Modem status: Coordinator realignment.\n");
benjaminroy 15:4c748df01e5b 226 toggleErrorLed();
benjaminroy 15:4c748df01e5b 227 }
benjaminroy 15:4c748df01e5b 228 else if (buffer[1] == 0x06) {
benjaminroy 15:4c748df01e5b 229 pc.printf("Modem status: Coordinator started.\n");
benjaminroy 15:4c748df01e5b 230 }
benjaminroy 15:4c748df01e5b 231 else if (buffer[1] == 0x07) {
benjaminroy 15:4c748df01e5b 232 pc.printf("Modem status: Network security key updated.\n");
benjaminroy 15:4c748df01e5b 233 toggleErrorLed();
benjaminroy 15:4c748df01e5b 234 }
benjaminroy 15:4c748df01e5b 235 else if (buffer[1] == 0x08) {
benjaminroy 15:4c748df01e5b 236 pc.printf("Modem status: Network woke up.\n");
benjaminroy 15:4c748df01e5b 237 toggleErrorLed();
benjaminroy 15:4c748df01e5b 238 }
benjaminroy 15:4c748df01e5b 239 else if (buffer[1] == 0x0C) {
benjaminroy 15:4c748df01e5b 240 pc.printf("Modem status: Network went to sleep.\n");
benjaminroy 15:4c748df01e5b 241 toggleErrorLed();
benjaminroy 15:4c748df01e5b 242 }
benjaminroy 15:4c748df01e5b 243 else if (buffer[1] == 0x0E) {
benjaminroy 15:4c748df01e5b 244 pc.printf("Modem status: Device cloud connected.\n");
benjaminroy 15:4c748df01e5b 245 toggleErrorLed();
benjaminroy 15:4c748df01e5b 246 }
benjaminroy 15:4c748df01e5b 247 else if (buffer[1] == 0x0F) {
benjaminroy 15:4c748df01e5b 248 pc.printf("Modem status: Device cloud disconnected.\n");
benjaminroy 15:4c748df01e5b 249 toggleErrorLed();
benjaminroy 15:4c748df01e5b 250 }
benjaminroy 15:4c748df01e5b 251 else if (buffer[1] == 0x11) {
benjaminroy 15:4c748df01e5b 252 pc.printf("Modem status: Modem configurationchanged while join in progress.\n");
benjaminroy 15:4c748df01e5b 253 toggleErrorLed();
benjaminroy 15:4c748df01e5b 254 }
benjaminroy 15:4c748df01e5b 255 else if (buffer[1] == 0x80) {
benjaminroy 15:4c748df01e5b 256 pc.printf("Modem status: Stack error (80+).\n");
benjaminroy 15:4c748df01e5b 257 toggleErrorLed();
benjaminroy 15:4c748df01e5b 258 }
benjaminroy 15:4c748df01e5b 259 else if (buffer[1] == 0x82) {
benjaminroy 15:4c748df01e5b 260 pc.printf("Modem status: Send/join command issuedwithout connecting from AP.\n");
benjaminroy 15:4c748df01e5b 261 toggleErrorLed();
benjaminroy 15:4c748df01e5b 262 }
benjaminroy 15:4c748df01e5b 263 else if (buffer[1] == 0x83) {
benjaminroy 15:4c748df01e5b 264 pc.printf("Modem status: Access point not found.\n");
benjaminroy 15:4c748df01e5b 265 toggleErrorLed();
benjaminroy 15:4c748df01e5b 266 }
benjaminroy 15:4c748df01e5b 267 else if (buffer[1] == 0x84) {
benjaminroy 15:4c748df01e5b 268 pc.printf("Modem status: PSK not configured.\n");
benjaminroy 15:4c748df01e5b 269 toggleErrorLed();
marc1119 3:fbd4b164e8ad 270 }
marc1119 3:fbd4b164e8ad 271 }
marc1119 3:fbd4b164e8ad 272
benjaminroy 10:488877f7f56c 273 bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) {
marc1119 2:3fbf13ba290e 274 uint32_t checkSum = 0;
benjaminroy 4:393738672d08 275
benjaminroy 10:488877f7f56c 276 for (int i = 0; i < bufferSize; i++) {
marc1119 2:3fbf13ba290e 277 checkSum += buffer[i];
benjaminroy 4:393738672d08 278 }
benjaminroy 10:488877f7f56c 279 if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) {
benjaminroy 10:488877f7f56c 280 pc.printf("Erreur dans la transmission de la trame. \n");
benjaminroy 10:488877f7f56c 281 return false;
benjaminroy 4:393738672d08 282 }
benjaminroy 10:488877f7f56c 283 return true;
marc1119 2:3fbf13ba290e 284 }
marc1119 2:3fbf13ba290e 285
marc1119 8:9c34eb3cb3ef 286 void readRouterAddress(uint8_t* buffer) {
benjaminroy 14:8b59a90725bc 287 routerAddress[0] = buffer[1];
benjaminroy 14:8b59a90725bc 288 routerAddress[1] = buffer[2];
benjaminroy 14:8b59a90725bc 289 routerAddress[2] = buffer[3];
benjaminroy 14:8b59a90725bc 290 routerAddress[3] = buffer[4];
benjaminroy 14:8b59a90725bc 291 routerAddress[4] = buffer[5];
benjaminroy 14:8b59a90725bc 292 routerAddress[5] = buffer[6];
benjaminroy 14:8b59a90725bc 293 routerAddress[6] = buffer[7];
benjaminroy 14:8b59a90725bc 294 routerAddress[7] = buffer[8];
benjaminroy 15:4c748df01e5b 295 t1->signal_set(0x02);
marc1119 8:9c34eb3cb3ef 296 }
marc1119 8:9c34eb3cb3ef 297
benjaminroy 10:488877f7f56c 298 void readRouterData(uint8_t bufferSize, uint8_t* buffer) {
benjaminroy 10:488877f7f56c 299 uint16_t acc[3] = {0};
marc1119 8:9c34eb3cb3ef 300
benjaminroy 10:488877f7f56c 301 if (buffer[0] == 0x90 && bufferSize == 18) { // Accelerations (X,Y,Z)
benjaminroy 10:488877f7f56c 302 for (uint8_t i = 12; i < bufferSize; i += 2) {
benjaminroy 10:488877f7f56c 303 acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff);
marc1119 2:3fbf13ba290e 304 }
benjaminroy 10:488877f7f56c 305 // pc.printf("Acceleration X: %d\n", acc[0]);
benjaminroy 10:488877f7f56c 306 // pc.printf("Acceleration Y: %d\n", acc[1]);
benjaminroy 10:488877f7f56c 307 // pc.printf("Acceleration Z: %d\n", acc[2]);
benjaminroy 13:62404d7dab8d 308
benjaminroy 13:62404d7dab8d 309 mail_t *mail = mail_box.alloc();
benjaminroy 14:8b59a90725bc 310 mail->type = 0;
benjaminroy 13:62404d7dab8d 311 sprintf(mail->strAccelerationX, "Acc. X: %i\0", acc[0]);
benjaminroy 13:62404d7dab8d 312 sprintf(mail->strAccelerationY, "Acc. Y: %i\0", acc[1]);
benjaminroy 13:62404d7dab8d 313 sprintf(mail->strAccelerationZ, "Acc. Z: %i\0", acc[2]);
benjaminroy 13:62404d7dab8d 314 mail_box.put(mail);
benjaminroy 13:62404d7dab8d 315
benjaminroy 10:488877f7f56c 316 } else if (buffer[0] == 0x90 && bufferSize == 13) { // Dry contact
benjaminroy 14:8b59a90725bc 317 mail_t *mail = mail_box.alloc();
benjaminroy 14:8b59a90725bc 318 mail->type = 1;
benjaminroy 14:8b59a90725bc 319 sprintf(mail->strDryContact, "Dry Contact: %i\0", buffer[12]);
benjaminroy 14:8b59a90725bc 320 mail_box.put(mail);
benjaminroy 10:488877f7f56c 321 }
benjaminroy 10:488877f7f56c 322 }
benjaminroy 10:488877f7f56c 323
benjaminroy 10:488877f7f56c 324 void readDataFromRouter(){
benjaminroy 10:488877f7f56c 325 while(1) {
benjaminroy 10:488877f7f56c 326 uint8_t bufferSize = 0;
benjaminroy 10:488877f7f56c 327 uint8_t buffer[104] = { 0 };
benjaminroy 10:488877f7f56c 328
benjaminroy 10:488877f7f56c 329 if (xbee.readable() && xbee.getc() == 0x7E) {
benjaminroy 10:488877f7f56c 330 bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff);
benjaminroy 10:488877f7f56c 331
benjaminroy 10:488877f7f56c 332 for (uint8_t i = 0; i <= bufferSize;) {
benjaminroy 10:488877f7f56c 333 if (xbee.readable()) {
benjaminroy 10:488877f7f56c 334 buffer[i] = xbee.getc();
benjaminroy 10:488877f7f56c 335 i++;
benjaminroy 10:488877f7f56c 336 }
marc1119 2:3fbf13ba290e 337 }
benjaminroy 10:488877f7f56c 338
benjaminroy 10:488877f7f56c 339 printBuffer(bufferSize, buffer);
benjaminroy 10:488877f7f56c 340 if (checksumIsValid(bufferSize, buffer)) {
benjaminroy 14:8b59a90725bc 341 if (buffer[0] == 0x90) {
benjaminroy 14:8b59a90725bc 342 readRouterAddress(buffer);
benjaminroy 14:8b59a90725bc 343 readRouterData(bufferSize, buffer);
benjaminroy 14:8b59a90725bc 344
benjaminroy 15:4c748df01e5b 345 } else if (buffer[0] == 0x8A) { // Modem Status
benjaminroy 15:4c748df01e5b 346 readModemStatus(buffer);
benjaminroy 15:4c748df01e5b 347 } else if (buffer[0] == 0x8B) { // Transmit Status
benjaminroy 15:4c748df01e5b 348 // Should never occur...
benjaminroy 15:4c748df01e5b 349 } else if (buffer[0] == 0x97) { // Remote AT Command Response
benjaminroy 15:4c748df01e5b 350 readRemoteATCommandResponse(buffer);
benjaminroy 15:4c748df01e5b 351 } else if (buffer[0] == 0x09) { // AT Command Response
benjaminroy 15:4c748df01e5b 352 printf("AT COMMAND RESPONSE");
benjaminroy 15:4c748df01e5b 353
benjaminroy 15:4c748df01e5b 354 }
benjaminroy 15:4c748df01e5b 355 } else {
benjaminroy 15:4c748df01e5b 356
benjaminroy 15:4c748df01e5b 357 // HERE: Try to resend the frame...
marc1119 8:9c34eb3cb3ef 358 }
marc1119 8:9c34eb3cb3ef 359 }
marc1119 0:ec23a7ae804c 360 }
marc1119 0:ec23a7ae804c 361 }
marc1119 0:ec23a7ae804c 362
benjaminroy 15:4c748df01e5b 363 void setCoordinatorPanId(uint16_t panId) {
benjaminroy 15:4c748df01e5b 364 char _8bitsPanId[2];
benjaminroy 15:4c748df01e5b 365 _8bitsPanId[0] = (panId >> 8) & 0xFF;
benjaminroy 15:4c748df01e5b 366 _8bitsPanId[1] = panId & 0xFF;
benjaminroy 15:4c748df01e5b 367 uint8_t setPanIdBuffer[10] = {0x07, 0x00, 0x06, 0x09, 0x01, 0x49, 0x44, _8bitsPanId[0], _8bitsPanId[1], 0x00};
benjaminroy 15:4c748df01e5b 368 setPanIdBuffer[10] = calculateChecksum(0, 10, setPanIdBuffer);
benjaminroy 15:4c748df01e5b 369
benjaminroy 15:4c748df01e5b 370 for (uint8_t i = 0; i < 10;) {
benjaminroy 15:4c748df01e5b 371 if (xbee.writeable()) {
benjaminroy 15:4c748df01e5b 372 xbee.putc(setPanIdBuffer[i]);
benjaminroy 15:4c748df01e5b 373 i++;
benjaminroy 15:4c748df01e5b 374 }
benjaminroy 15:4c748df01e5b 375 }
benjaminroy 15:4c748df01e5b 376
benjaminroy 15:4c748df01e5b 377 uint8_t saveChangesBuffer[8] = {0x7E, 0x00, 0x04, 0x09, 0x02, 0x57, 0x52, 0x4B};
benjaminroy 15:4c748df01e5b 378
benjaminroy 15:4c748df01e5b 379 for (uint8_t i = 0; i < 8;) {
benjaminroy 15:4c748df01e5b 380 if (xbee.writeable()) {
benjaminroy 15:4c748df01e5b 381 xbee.putc(saveChangesBuffer[i]);
benjaminroy 15:4c748df01e5b 382 i++;
benjaminroy 15:4c748df01e5b 383 }
benjaminroy 15:4c748df01e5b 384 }
benjaminroy 15:4c748df01e5b 385
benjaminroy 15:4c748df01e5b 386
benjaminroy 15:4c748df01e5b 387 uint8_t applyChangesBuffer[8] = {0x7E, 0x00, 0x04, 0x09, 0x03, 0x41, 0x43, 0x6F};
benjaminroy 15:4c748df01e5b 388
benjaminroy 15:4c748df01e5b 389 for (uint8_t i = 0; i < 8;) {
benjaminroy 15:4c748df01e5b 390 if (xbee.writeable()) {
benjaminroy 15:4c748df01e5b 391 xbee.putc(saveChangesBuffer[i]);
benjaminroy 15:4c748df01e5b 392 i++;
benjaminroy 15:4c748df01e5b 393 }
benjaminroy 15:4c748df01e5b 394 }
benjaminroy 15:4c748df01e5b 395 }
benjaminroy 15:4c748df01e5b 396
benjaminroy 14:8b59a90725bc 397 void isr() {
benjaminroy 14:8b59a90725bc 398 t1->signal_set(0x1);
benjaminroy 14:8b59a90725bc 399 }
benjaminroy 11:205ddd5406af 400
marc1119 0:ec23a7ae804c 401 int main() {
benjaminroy 6:fd7d91edcf60 402 pc.printf("Starting a coordinator... \n");
benjaminroy 10:488877f7f56c 403
marc1119 1:ceb3f8ba8793 404 reset = 0;
benjaminroy 6:fd7d91edcf60 405 wait_ms(1);
marc1119 1:ceb3f8ba8793 406 reset = 1;
benjaminroy 6:fd7d91edcf60 407 wait_ms(1);
marc1119 0:ec23a7ae804c 408
marc1119 2:3fbf13ba290e 409 readConfigFile();
marc1119 2:3fbf13ba290e 410
benjaminroy 6:fd7d91edcf60 411 xbee.baud(9600); // Set baud rate
benjaminroy 15:4c748df01e5b 412 //xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID
benjaminroy 15:4c748df01e5b 413 //xbee.printf("ATWR \r"); // Save the changes
benjaminroy 15:4c748df01e5b 414 //xbee.printf("ATCN \r"); // Apply changes by sending the CN command
benjaminroy 15:4c748df01e5b 415 setCoordinatorPanId(panId);
benjaminroy 15:4c748df01e5b 416
benjaminroy 4:393738672d08 417 if (eth.init() != 0) { // Use DHCP
marc1119 3:fbd4b164e8ad 418 pc.printf("Erreur d'initialisation du RJ45.\n");
benjaminroy 4:393738672d08 419 }
benjaminroy 4:393738672d08 420 if (eth.connect() != 0) {
marc1119 3:fbd4b164e8ad 421 pc.printf("Erreur de connection du RJ45\n");
benjaminroy 4:393738672d08 422 }
benjaminroy 10:488877f7f56c 423 pc.printf("IP Address is %s\n", eth.getIPAddress());
marc1119 2:3fbf13ba290e 424
benjaminroy 15:4c748df01e5b 425 /*int numberOfRetries = 0;
benjaminroy 13:62404d7dab8d 426 while (sock.connect(serverAddress, portNumber) != 0) {
benjaminroy 13:62404d7dab8d 427 if (numberOfRetries == 5) {
benjaminroy 13:62404d7dab8d 428 error("Erreur dans la connection au socket.\n");
benjaminroy 13:62404d7dab8d 429 }
benjaminroy 13:62404d7dab8d 430 numberOfRetries++;
benjaminroy 15:4c748df01e5b 431 }*/
benjaminroy 13:62404d7dab8d 432
benjaminroy 10:488877f7f56c 433 // Démarrage des tâches:
benjaminroy 10:488877f7f56c 434 Thread _readDataFromRouter(readDataFromRouter);
benjaminroy 15:4c748df01e5b 435 //Thread _sendDataToServer(sendDataToServer);
benjaminroy 14:8b59a90725bc 436 Thread _toggleRouterLed(toggleLed);
benjaminroy 14:8b59a90725bc 437 t1 = &_toggleRouterLed;
benjaminroy 13:62404d7dab8d 438
benjaminroy 14:8b59a90725bc 439 ticker1.attach(&isr, 1);
benjaminroy 14:8b59a90725bc 440
benjaminroy 10:488877f7f56c 441 while(1) {}
marc1119 0:ec23a7ae804c 442 }
marc1119 0:ec23a7ae804c 443
marc1119 2:3fbf13ba290e 444