BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Tue Feb 14 19:17:13 2017 +0000
Revision:
21:37a11c3659cc
Parent:
20:e96c9acfd2ea
Final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benjaminroy 16:cede55e5b075 1 // Titre: S05APP3
benjaminroy 16:cede55e5b075 2 // Auteurs: Benjamin Roy et Marc-Antoine Beaudoin
benjaminroy 16:cede55e5b075 3 // Date: 14 février 2017
benjaminroy 16:cede55e5b075 4 // =======================================================
benjaminroy 9:f6f79f136101 5 // ===================== COORDINATOR =====================
benjaminroy 9:f6f79f136101 6 // =======================================================
marc1119 0:ec23a7ae804c 7 #include "EthernetInterface.h"
marc1119 0:ec23a7ae804c 8 #include "ConfigFile.h"
marc1119 0:ec23a7ae804c 9 #include "mbed.h"
benjaminroy 9:f6f79f136101 10 #include "rtos.h"
marc1119 0:ec23a7ae804c 11
benjaminroy 15:4c748df01e5b 12 AnalogOut errorLed(p18);
marc1119 0:ec23a7ae804c 13 DigitalOut reset(p8);
benjaminroy 9:f6f79f136101 14 EthernetInterface eth;
benjaminroy 19:19caa5f5c5f5 15 Mutex mutex;
marc1119 8:9c34eb3cb3ef 16 Serial xbee(p13, p14); // tx, rx
marc1119 1:ceb3f8ba8793 17 Serial pc(USBTX, USBRX); // tx, rx
benjaminroy 18:0c71241eab4f 18 TCPSocketConnection socket;
benjaminroy 11:205ddd5406af 19 Ticker ticker1;
benjaminroy 14:8b59a90725bc 20 Thread *t1;
marc1119 0:ec23a7ae804c 21
benjaminroy 16:cede55e5b075 22 /* Boîte aux lettres */
benjaminroy 13:62404d7dab8d 23 typedef struct {
benjaminroy 14:8b59a90725bc 24 uint8_t type;
benjaminroy 14:8b59a90725bc 25 char strAccelerationX[15];
benjaminroy 14:8b59a90725bc 26 char strAccelerationY[15];
benjaminroy 14:8b59a90725bc 27 char strAccelerationZ[15];
benjaminroy 14:8b59a90725bc 28 char strDryContact[15];
benjaminroy 13:62404d7dab8d 29 } mail_t;
benjaminroy 13:62404d7dab8d 30
benjaminroy 19:19caa5f5c5f5 31 Mail<mail_t, 20> mail_box;
benjaminroy 13:62404d7dab8d 32
benjaminroy 14:8b59a90725bc 33 uint8_t routerAddress[8] = { 0 }; // Should be 00 13 A2 00 40 8B 41 6E
benjaminroy 18:0c71241eab4f 34 uint8_t startDelimiter = 0x7E;
benjaminroy 6:fd7d91edcf60 35 uint16_t portNumber = 0;
benjaminroy 6:fd7d91edcf60 36 uint16_t panId = 0;
benjaminroy 6:fd7d91edcf60 37 char serverAddress[32];
marc1119 8:9c34eb3cb3ef 38 char panIdChar[5];
benjaminroy 9:f6f79f136101 39 char portNbr[5];
marc1119 3:fbd4b164e8ad 40
benjaminroy 16:cede55e5b075 41 /*
benjaminroy 16:cede55e5b075 42 * Imprime le buffer à l'écran pour des fins de déboguage:
benjaminroy 16:cede55e5b075 43 */
benjaminroy 6:fd7d91edcf60 44 void printBuffer(uint8_t bufferSize, uint8_t* buffer) {
marc1119 8:9c34eb3cb3ef 45 for(uint8_t k = 0; k <= bufferSize; k++) {
benjaminroy 6:fd7d91edcf60 46 pc.printf("%X-", buffer[k]);
benjaminroy 6:fd7d91edcf60 47 }
benjaminroy 6:fd7d91edcf60 48 printf("\n");
benjaminroy 6:fd7d91edcf60 49 }
benjaminroy 6:fd7d91edcf60 50
benjaminroy 16:cede55e5b075 51 /*
benjaminroy 16:cede55e5b075 52 * Envoyer et recevoir des données via le protocole Xbee:
benjaminroy 16:cede55e5b075 53 */
benjaminroy 17:7ae8f91f46a2 54 uint8_t* readDataFromXbee(uint8_t bufferSize) {
benjaminroy 19:19caa5f5c5f5 55 mutex.lock();
benjaminroy 17:7ae8f91f46a2 56 uint8_t buffer[104] = { 0 };
benjaminroy 17:7ae8f91f46a2 57 for (uint8_t i = 0; i <= bufferSize;) {
benjaminroy 17:7ae8f91f46a2 58 if (xbee.readable()) {
benjaminroy 17:7ae8f91f46a2 59 buffer[i] = xbee.getc();
benjaminroy 17:7ae8f91f46a2 60 i++;
benjaminroy 17:7ae8f91f46a2 61 }
benjaminroy 17:7ae8f91f46a2 62 }
benjaminroy 19:19caa5f5c5f5 63 mutex.unlock();
benjaminroy 17:7ae8f91f46a2 64 return buffer;
benjaminroy 17:7ae8f91f46a2 65 }
benjaminroy 16:cede55e5b075 66 void sendDataToXbee(uint8_t bufferSize, uint8_t* buffer) {
benjaminroy 16:cede55e5b075 67 for (uint8_t i = 0; i < bufferSize;) {
benjaminroy 16:cede55e5b075 68 if (xbee.writeable()) {
benjaminroy 16:cede55e5b075 69 xbee.putc(buffer[i]);
benjaminroy 16:cede55e5b075 70 i++;
benjaminroy 16:cede55e5b075 71 }
benjaminroy 16:cede55e5b075 72 }
benjaminroy 15:4c748df01e5b 73 }
benjaminroy 15:4c748df01e5b 74
benjaminroy 16:cede55e5b075 75 /*
benjaminroy 16:cede55e5b075 76 * Lecture du fichier de configuration:
benjaminroy 16:cede55e5b075 77 */
benjaminroy 6:fd7d91edcf60 78 void readConfigFile() {
benjaminroy 6:fd7d91edcf60 79 LocalFileSystem local("local");
benjaminroy 6:fd7d91edcf60 80 ConfigFile cfg;
benjaminroy 6:fd7d91edcf60 81 char *serverAddressStr = "serverAddr";
benjaminroy 6:fd7d91edcf60 82 char *portNumberStr = "portNb";
benjaminroy 6:fd7d91edcf60 83 char *panIdStr = "panID";
benjaminroy 6:fd7d91edcf60 84
benjaminroy 6:fd7d91edcf60 85 if (!cfg.read("/local/input.cfg")) {
benjaminroy 16:cede55e5b075 86 error("Erreur dans la lecture du fichier de configuration...\n");
benjaminroy 6:fd7d91edcf60 87 } else {
benjaminroy 6:fd7d91edcf60 88 cfg.getValue(panIdStr, &panIdChar[0], sizeof(panIdChar));
benjaminroy 6:fd7d91edcf60 89 cfg.getValue(serverAddressStr, &serverAddress[0], sizeof(serverAddress));
benjaminroy 6:fd7d91edcf60 90 cfg.getValue(portNumberStr, &portNbr[0], sizeof(portNbr));
benjaminroy 6:fd7d91edcf60 91
benjaminroy 6:fd7d91edcf60 92 portNumber = (uint16_t)strtol(portNbr, NULL, 10);
benjaminroy 6:fd7d91edcf60 93 panId = (uint16_t)strtol(panIdChar, NULL, 10);
benjaminroy 10:488877f7f56c 94 // printf("The server address is %s\n", serverAddress);
benjaminroy 10:488877f7f56c 95 // printf("The port number is %i\n", portNumber);
benjaminroy 10:488877f7f56c 96 // printf("The PAN ID is %i\n", panId);
benjaminroy 6:fd7d91edcf60 97 }
benjaminroy 6:fd7d91edcf60 98 }
benjaminroy 6:fd7d91edcf60 99
benjaminroy 16:cede55e5b075 100 /*
benjaminroy 16:cede55e5b075 101 * Détection et gestion des erreurs (allumer une LED pendant 1 seconde lorsqu'une erreur est détectée):
benjaminroy 16:cede55e5b075 102 */
benjaminroy 17:7ae8f91f46a2 103 void printError(char* buffer) {
benjaminroy 17:7ae8f91f46a2 104 pc.printf(buffer);
benjaminroy 16:cede55e5b075 105 errorLed.write(3.3);
benjaminroy 16:cede55e5b075 106 wait(1);
benjaminroy 16:cede55e5b075 107 errorLed.write(0);
marc1119 12:42986a9c3682 108 }
marc1119 1:ceb3f8ba8793 109
benjaminroy 15:4c748df01e5b 110 void readATCommandResponse(uint8_t* buffer) {
benjaminroy 18:0c71241eab4f 111 if (buffer[4] == 0x01) printError("AT Command Response: Error.\n");
benjaminroy 16:cede55e5b075 112 else if (buffer[4] == 0x02) printError("AT Command Response: Invalid Command.\n");
benjaminroy 16:cede55e5b075 113 else if (buffer[4] == 0x03) printError("AT Command Response: Invalid Parameter.\n");
benjaminroy 16:cede55e5b075 114 else if (buffer[4] == 0x04) printError("AT Command Response: Tx Failure.\n");
benjaminroy 15:4c748df01e5b 115 }
benjaminroy 15:4c748df01e5b 116
benjaminroy 15:4c748df01e5b 117 void readRemoteATCommandResponse(uint8_t* buffer) {
benjaminroy 18:0c71241eab4f 118 if (buffer[14] == 0x01) printError("Remote AT Command Response: Error.\n");
benjaminroy 16:cede55e5b075 119 else if (buffer[14] == 0x02) printError("Remote AT Command Response: Invalid Command.\n");
benjaminroy 16:cede55e5b075 120 else if (buffer[14] == 0x03) printError("Remote AT Command Response: Invalid Parameter.\n");
benjaminroy 16:cede55e5b075 121 else if (buffer[14] == 0x04) printError("Remote AT Command Response: Tx Failure.\n");
benjaminroy 15:4c748df01e5b 122 }
benjaminroy 15:4c748df01e5b 123
benjaminroy 15:4c748df01e5b 124 void readTransmitStatus(uint8_t* buffer) {
benjaminroy 18:0c71241eab4f 125 if (buffer[5] == 0x01) pc.printf("Transmit Status: An expedted MAC acknowledgement never occured. \n");
benjaminroy 15:4c748df01e5b 126 else if (buffer[5] == 0x02) pc.printf("Transmit Status: CCA failure. \n");
benjaminroy 15:4c748df01e5b 127 else if (buffer[5] == 0x03) pc.printf("Transmit Status: Packet was purgedwithoutbeing transmitted. \n");
benjaminroy 15:4c748df01e5b 128 else if (buffer[5] == 0x04) pc.printf("Transmit Status: Physical error on the interface with the WiFi transceiver. \n");
benjaminroy 15:4c748df01e5b 129 else if (buffer[5] == 0x18) pc.printf("Transmit Status: No buffers. \n");
benjaminroy 15:4c748df01e5b 130 else if (buffer[5] == 0x21) pc.printf("Transmit Status: Expected networkacknowledgement never occured. \n");
benjaminroy 15:4c748df01e5b 131 else if (buffer[5] == 0x22) pc.printf("Transmit Status: Not joined to network. \n");
benjaminroy 15:4c748df01e5b 132 else if (buffer[5] == 0x23) pc.printf("Transmit Status: Self-addressed. \n");
benjaminroy 15:4c748df01e5b 133 else if (buffer[5] == 0x24) pc.printf("Transmit Status: Address not found. \n");
benjaminroy 15:4c748df01e5b 134 else if (buffer[5] == 0x25) pc.printf("Transmit Status: Route not found. \n");
benjaminroy 15:4c748df01e5b 135 else if (buffer[5] == 0x26) pc.printf("Transmit Status: Broadcast relay was not heard. \n");
benjaminroy 15:4c748df01e5b 136 else if (buffer[5] == 0x2B) pc.printf("Transmit Status: Invalid binding table index. \n");
benjaminroy 15:4c748df01e5b 137 else if (buffer[5] == 0x2C) pc.printf("Transmit Status: Invalid Endpoint. \n");
benjaminroy 15:4c748df01e5b 138 else if (buffer[5] == 0x31) pc.printf("Transmit Status: A software error occurred. \n");
benjaminroy 15:4c748df01e5b 139 else if (buffer[5] == 0x32) pc.printf("Transmit Status: Resource Error. \n");
benjaminroy 15:4c748df01e5b 140 else if (buffer[5] == 0x74) pc.printf("Transmit Status: Data payload too large. \n");
benjaminroy 15:4c748df01e5b 141 else if (buffer[5] == 0x76) pc.printf("Transmit Status: Client socket creationat attempt failed. \n");
benjaminroy 15:4c748df01e5b 142 }
benjaminroy 15:4c748df01e5b 143
benjaminroy 15:4c748df01e5b 144 void readModemStatus(uint8_t* buffer) {
benjaminroy 18:0c71241eab4f 145 if (buffer[1] == 0x00) pc.printf("Modem status: Hardware reset.\n");
benjaminroy 16:cede55e5b075 146 else if (buffer[1] == 0x01) printError("Modem status: Watchdog timer reset.\n");
benjaminroy 16:cede55e5b075 147 else if (buffer[1] == 0x02) printError("Modem status: Joined network.\n");
benjaminroy 16:cede55e5b075 148 else if (buffer[1] == 0x03) printError("Modem status: Disassociated.\n");
benjaminroy 16:cede55e5b075 149 else if (buffer[1] == 0x04) printError("Modem status: Configuration error/synchronization.\n");
benjaminroy 16:cede55e5b075 150 else if (buffer[1] == 0x05) printError("Modem status: Coordinator realignment.\n");
benjaminroy 16:cede55e5b075 151 else if (buffer[1] == 0x06) pc.printf("Modem status: Coordinator started.\n");
benjaminroy 16:cede55e5b075 152 else if (buffer[1] == 0x07) printError("Modem status: Network security key updated.\n");
benjaminroy 16:cede55e5b075 153 else if (buffer[1] == 0x08) printError("Modem status: Network woke up.\n");
benjaminroy 16:cede55e5b075 154 else if (buffer[1] == 0x0C) printError("Modem status: Network went to sleep.\n");
benjaminroy 16:cede55e5b075 155 else if (buffer[1] == 0x0E) printError("Modem status: Device cloud connected.\n");
benjaminroy 16:cede55e5b075 156 else if (buffer[1] == 0x0F) printError("Modem status: Device cloud disconnected.\n");
benjaminroy 16:cede55e5b075 157 else if (buffer[1] == 0x11) printError("Modem status: Modem configurationchanged while join in progress.\n");
benjaminroy 16:cede55e5b075 158 else if (buffer[1] == 0x80) printError("Modem status: Stack error (80+).\n");
benjaminroy 16:cede55e5b075 159 else if (buffer[1] == 0x82) printError("Modem status: Send/join command issuedwithout connecting from AP.\n");
benjaminroy 16:cede55e5b075 160 else if (buffer[1] == 0x83) printError("Modem status: Access point not found.\n");
benjaminroy 16:cede55e5b075 161 else if (buffer[1] == 0x84) printError("Modem status: PSK not configured.\n");
benjaminroy 16:cede55e5b075 162 }
benjaminroy 16:cede55e5b075 163
benjaminroy 16:cede55e5b075 164 /*
benjaminroy 16:cede55e5b075 165 * Calculer et vérifier le checksum des trames reçues:
benjaminroy 16:cede55e5b075 166 */
benjaminroy 16:cede55e5b075 167 uint8_t calculateChecksum(uint8_t frameTypeIndex, uint8_t frameSize, uint8_t* buffer) {
benjaminroy 16:cede55e5b075 168 char checksum = 0;
benjaminroy 16:cede55e5b075 169
benjaminroy 16:cede55e5b075 170 for (int i = frameTypeIndex; i < frameSize - 1; i++) {
benjaminroy 16:cede55e5b075 171 checksum += buffer[i];
benjaminroy 15:4c748df01e5b 172 }
benjaminroy 16:cede55e5b075 173 return (0xFF - checksum);
marc1119 3:fbd4b164e8ad 174 }
marc1119 3:fbd4b164e8ad 175
benjaminroy 10:488877f7f56c 176 bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) {
marc1119 2:3fbf13ba290e 177 uint32_t checkSum = 0;
benjaminroy 4:393738672d08 178
benjaminroy 10:488877f7f56c 179 for (int i = 0; i < bufferSize; i++) {
marc1119 2:3fbf13ba290e 180 checkSum += buffer[i];
benjaminroy 4:393738672d08 181 }
benjaminroy 10:488877f7f56c 182 if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) {
benjaminroy 17:7ae8f91f46a2 183 pc.printf("Erreur dans la transmission de la trame --> ");
benjaminroy 17:7ae8f91f46a2 184 printBuffer(bufferSize, buffer);
benjaminroy 10:488877f7f56c 185 return false;
benjaminroy 4:393738672d08 186 }
benjaminroy 10:488877f7f56c 187 return true;
marc1119 2:3fbf13ba290e 188 }
marc1119 2:3fbf13ba290e 189
benjaminroy 16:cede55e5b075 190 /*
benjaminroy 18:0c71241eab4f 191 * Faire allumer une DEL, reliée à un des ports du XBEE (DIO) du Routeur, en utilisant une commande de configuration à distance provenant du Coordinateur
benjaminroy 18:0c71241eab4f 192 * HIGH: {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3C};
benjaminroy 18:0c71241eab4f 193 * LOW: {0x7E, 0x00, 0x10, 0x17, 0x02, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3C};
benjaminroy 16:cede55e5b075 194 */
benjaminroy 16:cede55e5b075 195 void toggleRouterLed() {
benjaminroy 16:cede55e5b075 196 bool led = false;
benjaminroy 18:0c71241eab4f 197 uint8_t command[20] = { 0 };
benjaminroy 16:cede55e5b075 198
benjaminroy 18:0c71241eab4f 199 Thread::signal_wait(0x2); // Attendre que l'adresse du noeud rooteur soit connue
benjaminroy 18:0c71241eab4f 200 command[0] = startDelimiter;
benjaminroy 16:cede55e5b075 201 command[1] = 0x00;
benjaminroy 16:cede55e5b075 202 command[2] = 0x10;
benjaminroy 16:cede55e5b075 203 command[3] = 0x17;
benjaminroy 18:0c71241eab4f 204 for (uint8_t i = 0; i < sizeof(routerAddress); i++) {
benjaminroy 18:0c71241eab4f 205 command[i + 5] = routerAddress[i];
benjaminroy 18:0c71241eab4f 206 }
benjaminroy 16:cede55e5b075 207 command[13] = 0xFF;
benjaminroy 16:cede55e5b075 208 command[14] = 0xFE;
benjaminroy 16:cede55e5b075 209 command[15] = 0x02;
benjaminroy 16:cede55e5b075 210 command[16] = 0x44;
benjaminroy 16:cede55e5b075 211 command[17] = 0x34;
benjaminroy 16:cede55e5b075 212
benjaminroy 16:cede55e5b075 213 while(1) {
benjaminroy 16:cede55e5b075 214 Thread::signal_wait(0x1); // Période: 1 Hz
benjaminroy 16:cede55e5b075 215
benjaminroy 16:cede55e5b075 216 if (led) {
benjaminroy 16:cede55e5b075 217 command[4] = 0x01;
benjaminroy 16:cede55e5b075 218 command[18] = 0x05;
benjaminroy 16:cede55e5b075 219 } else {
benjaminroy 16:cede55e5b075 220 command[4] = 0x02;
benjaminroy 16:cede55e5b075 221 command[18] = 0x04;
benjaminroy 16:cede55e5b075 222 }
benjaminroy 18:0c71241eab4f 223 command[19] = calculateChecksum(3, sizeof(command), command);
benjaminroy 16:cede55e5b075 224
benjaminroy 18:0c71241eab4f 225 sendDataToXbee(sizeof(command), command);
benjaminroy 16:cede55e5b075 226 led = !led;
benjaminroy 16:cede55e5b075 227 }
benjaminroy 16:cede55e5b075 228 }
benjaminroy 16:cede55e5b075 229
benjaminroy 16:cede55e5b075 230 void sendDataToServer() {
benjaminroy 16:cede55e5b075 231 while(1) {
benjaminroy 16:cede55e5b075 232 osEvent evt = mail_box.get();
benjaminroy 16:cede55e5b075 233
benjaminroy 16:cede55e5b075 234 if (evt.status == osEventMail) {
benjaminroy 16:cede55e5b075 235 mail_t *mail = (mail_t*)evt.value.p;
benjaminroy 16:cede55e5b075 236
benjaminroy 16:cede55e5b075 237 int responseSize = 0;
benjaminroy 16:cede55e5b075 238 char buffer[50] = { 0 };
benjaminroy 16:cede55e5b075 239
benjaminroy 16:cede55e5b075 240 if (mail->type == 0) {
benjaminroy 16:cede55e5b075 241 sprintf(buffer, "%s, %s, %s\0", mail->strAccelerationX, mail->strAccelerationY, mail->strAccelerationZ);
benjaminroy 16:cede55e5b075 242 } else {
benjaminroy 16:cede55e5b075 243 sprintf(buffer, "%s\0", mail->strDryContact);
benjaminroy 16:cede55e5b075 244 }
benjaminroy 16:cede55e5b075 245
benjaminroy 21:37a11c3659cc 246 printf("Envoye des serveurs: ");
benjaminroy 20:e96c9acfd2ea 247 printBuffer(buffer, sizeof(buffer)-1);
benjaminroy 18:0c71241eab4f 248 socket.send_all(buffer, sizeof(buffer)-1);
benjaminroy 18:0c71241eab4f 249 responseSize = socket.receive(buffer, sizeof(buffer)-1);
benjaminroy 16:cede55e5b075 250 buffer[responseSize] = '\0';
benjaminroy 19:19caa5f5c5f5 251 pc.printf("Server: %s\n", buffer);
benjaminroy 16:cede55e5b075 252
benjaminroy 16:cede55e5b075 253 mail_box.free(mail);
benjaminroy 16:cede55e5b075 254 }
benjaminroy 16:cede55e5b075 255 }
benjaminroy 16:cede55e5b075 256 }
benjaminroy 16:cede55e5b075 257
benjaminroy 16:cede55e5b075 258 /*
benjaminroy 17:7ae8f91f46a2 259 * Lire et décomposer les trames reçues (adresse, données, status):
benjaminroy 16:cede55e5b075 260 */
benjaminroy 18:0c71241eab4f 261 void readRouterAddress(uint8_t* buffer) {
benjaminroy 18:0c71241eab4f 262 for (uint8_t i = 0; i < 8; i++) {
benjaminroy 18:0c71241eab4f 263 routerAddress[i] = buffer[i + 1];
benjaminroy 18:0c71241eab4f 264 }
benjaminroy 15:4c748df01e5b 265 t1->signal_set(0x02);
marc1119 8:9c34eb3cb3ef 266 }
marc1119 8:9c34eb3cb3ef 267
benjaminroy 10:488877f7f56c 268 void readRouterData(uint8_t bufferSize, uint8_t* buffer) {
benjaminroy 10:488877f7f56c 269 uint16_t acc[3] = {0};
marc1119 8:9c34eb3cb3ef 270
benjaminroy 16:cede55e5b075 271 if (buffer[0] == 0x90 && bufferSize == 18) { // Ajouter les données reçues par l'accéléromètre à la boîte aux lettres:
benjaminroy 10:488877f7f56c 272 for (uint8_t i = 12; i < bufferSize; i += 2) {
benjaminroy 10:488877f7f56c 273 acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff);
marc1119 2:3fbf13ba290e 274 }
benjaminroy 13:62404d7dab8d 275 mail_t *mail = mail_box.alloc();
benjaminroy 14:8b59a90725bc 276 mail->type = 0;
benjaminroy 19:19caa5f5c5f5 277 sprintf(mail->strAccelerationX, "X:%i\0", acc[0]);
benjaminroy 19:19caa5f5c5f5 278 sprintf(mail->strAccelerationY, "Y:%i\0", acc[1]);
benjaminroy 19:19caa5f5c5f5 279 sprintf(mail->strAccelerationZ, "Z:%i\0", acc[2]);
benjaminroy 13:62404d7dab8d 280 mail_box.put(mail);
benjaminroy 13:62404d7dab8d 281
benjaminroy 16:cede55e5b075 282 } else if (buffer[0] == 0x90 && bufferSize == 13) { // Ajouter les données reçues par le contact sec à la boîte aux lettres:
benjaminroy 14:8b59a90725bc 283 mail_t *mail = mail_box.alloc();
benjaminroy 14:8b59a90725bc 284 mail->type = 1;
benjaminroy 19:19caa5f5c5f5 285 sprintf(mail->strDryContact, "Contact: %i\0", buffer[12]);
benjaminroy 14:8b59a90725bc 286 mail_box.put(mail);
benjaminroy 10:488877f7f56c 287 }
benjaminroy 10:488877f7f56c 288 }
benjaminroy 10:488877f7f56c 289
benjaminroy 10:488877f7f56c 290 void readDataFromRouter(){
benjaminroy 10:488877f7f56c 291 while(1) {
benjaminroy 18:0c71241eab4f 292 if (xbee.readable() && xbee.getc() == startDelimiter) {
benjaminroy 17:7ae8f91f46a2 293 uint8_t buffer[104] = { 0 };
benjaminroy 17:7ae8f91f46a2 294 uint8_t bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff);
benjaminroy 17:7ae8f91f46a2 295 memcpy(buffer, readDataFromXbee(bufferSize), bufferSize + 1);
benjaminroy 10:488877f7f56c 296
benjaminroy 10:488877f7f56c 297 if (checksumIsValid(bufferSize, buffer)) {
benjaminroy 16:cede55e5b075 298 if (buffer[0] == 0x90) { // Frame Type:
benjaminroy 16:cede55e5b075 299 printBuffer(bufferSize, buffer);
benjaminroy 14:8b59a90725bc 300 readRouterAddress(buffer);
benjaminroy 14:8b59a90725bc 301 readRouterData(bufferSize, buffer);
benjaminroy 16:cede55e5b075 302 } else if (buffer[0] == 0x8A) { // Frame Type: Modem Status
benjaminroy 15:4c748df01e5b 303 readModemStatus(buffer);
benjaminroy 17:7ae8f91f46a2 304 } else if (buffer[0] == 0x8B) { // Frame Type: Transmit Status
benjaminroy 16:cede55e5b075 305 } else if (buffer[0] == 0x97) { // Frame Type: Remote AT Command Response
benjaminroy 15:4c748df01e5b 306 readRemoteATCommandResponse(buffer);
benjaminroy 16:cede55e5b075 307 } else if (buffer[0] == 0x09) { // Frame Type: AT Command Response
benjaminroy 17:7ae8f91f46a2 308 readATCommandResponse(buffer);
benjaminroy 15:4c748df01e5b 309 }
marc1119 8:9c34eb3cb3ef 310 }
marc1119 8:9c34eb3cb3ef 311 }
marc1119 0:ec23a7ae804c 312 }
marc1119 0:ec23a7ae804c 313 }
marc1119 0:ec23a7ae804c 314
benjaminroy 16:cede55e5b075 315 /*
benjaminroy 16:cede55e5b075 316 * Poser le ID du réseau PAN à rejoindre:
benjaminroy 16:cede55e5b075 317 */
benjaminroy 15:4c748df01e5b 318 void setCoordinatorPanId(uint16_t panId) {
benjaminroy 18:0c71241eab4f 319 char _8bitsPanId[2] = { (panId >> 8) & 0xFF, panId & 0xFF };
benjaminroy 16:cede55e5b075 320
benjaminroy 18:0c71241eab4f 321 uint8_t setPanIdBuffer[] = { startDelimiter, 0x00, 0x06, 0x09, 0x01, 0x49, 0x44, _8bitsPanId[0], _8bitsPanId[1], 0x00 };
benjaminroy 18:0c71241eab4f 322 uint8_t saveChangesBuffer[] = { startDelimiter, 0x00, 0x04, 0x09, 0x02, 0x57, 0x52, 0x4B };
benjaminroy 18:0c71241eab4f 323 uint8_t applyChangesBuffer[] = { startDelimiter, 0x00, 0x04, 0x09, 0x03, 0x41, 0x43, 0x6F };
benjaminroy 18:0c71241eab4f 324 setPanIdBuffer[sizeof(setPanIdBuffer) - 1] = calculateChecksum(0, sizeof(setPanIdBuffer), setPanIdBuffer); // Calculate the checksum
benjaminroy 18:0c71241eab4f 325
benjaminroy 18:0c71241eab4f 326 sendDataToXbee(sizeof(setPanIdBuffer), setPanIdBuffer); // Set the 64-bit PAN ID
benjaminroy 18:0c71241eab4f 327 sendDataToXbee(sizeof(saveChangesBuffer), saveChangesBuffer); // Save the changes
benjaminroy 18:0c71241eab4f 328 sendDataToXbee(sizeof(applyChangesBuffer), applyChangesBuffer); // Apply changes by sending the CN command
benjaminroy 15:4c748df01e5b 329 }
benjaminroy 15:4c748df01e5b 330
benjaminroy 16:cede55e5b075 331 /*
benjaminroy 16:cede55e5b075 332 * Envoyer un signal au thread qui fait clignoter la DEL du noeud routeur:
benjaminroy 16:cede55e5b075 333 */
benjaminroy 18:0c71241eab4f 334 void isr() { t1->signal_set(0x1); }
benjaminroy 11:205ddd5406af 335
benjaminroy 16:cede55e5b075 336 // --------------------------------------------------------------------------------------------
benjaminroy 16:cede55e5b075 337 // --------------------------------------------------------------------------------------------
benjaminroy 16:cede55e5b075 338 // --------------------------------------------------------------------------------------------
benjaminroy 16:cede55e5b075 339 // --------------------------------------------------------------------------------------------
marc1119 0:ec23a7ae804c 340 int main() {
benjaminroy 6:fd7d91edcf60 341 pc.printf("Starting a coordinator... \n");
benjaminroy 10:488877f7f56c 342
marc1119 1:ceb3f8ba8793 343 reset = 0;
benjaminroy 6:fd7d91edcf60 344 wait_ms(1);
marc1119 1:ceb3f8ba8793 345 reset = 1;
benjaminroy 6:fd7d91edcf60 346 wait_ms(1);
marc1119 0:ec23a7ae804c 347
benjaminroy 16:cede55e5b075 348 readConfigFile();
benjaminroy 15:4c748df01e5b 349 setCoordinatorPanId(panId);
benjaminroy 15:4c748df01e5b 350
benjaminroy 4:393738672d08 351 if (eth.init() != 0) { // Use DHCP
marc1119 3:fbd4b164e8ad 352 pc.printf("Erreur d'initialisation du RJ45.\n");
benjaminroy 4:393738672d08 353 }
benjaminroy 4:393738672d08 354 if (eth.connect() != 0) {
marc1119 3:fbd4b164e8ad 355 pc.printf("Erreur de connection du RJ45\n");
benjaminroy 17:7ae8f91f46a2 356 } else {
benjaminroy 17:7ae8f91f46a2 357 pc.printf("IP Address is %s\n", eth.getIPAddress());
benjaminroy 4:393738672d08 358 }
marc1119 2:3fbf13ba290e 359
benjaminroy 19:19caa5f5c5f5 360 int numberOfRetries = 0;
benjaminroy 18:0c71241eab4f 361 while (socket.connect(serverAddress, portNumber) != 0) {
benjaminroy 13:62404d7dab8d 362 if (numberOfRetries == 5) {
benjaminroy 13:62404d7dab8d 363 error("Erreur dans la connection au socket.\n");
benjaminroy 13:62404d7dab8d 364 }
benjaminroy 13:62404d7dab8d 365 numberOfRetries++;
benjaminroy 19:19caa5f5c5f5 366 }
benjaminroy 13:62404d7dab8d 367
benjaminroy 10:488877f7f56c 368 // Démarrage des tâches:
benjaminroy 10:488877f7f56c 369 Thread _readDataFromRouter(readDataFromRouter);
benjaminroy 16:cede55e5b075 370 Thread _toggleRouterLed(toggleRouterLed);
benjaminroy 19:19caa5f5c5f5 371 Thread _sendDataToServer(sendDataToServer);
benjaminroy 14:8b59a90725bc 372 t1 = &_toggleRouterLed;
benjaminroy 13:62404d7dab8d 373
benjaminroy 14:8b59a90725bc 374 ticker1.attach(&isr, 1);
benjaminroy 10:488877f7f56c 375 while(1) {}
marc1119 0:ec23a7ae804c 376 }
marc1119 0:ec23a7ae804c 377
marc1119 2:3fbf13ba290e 378