BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Tue Feb 14 19:15:11 2017 +0000
Revision:
20:e96c9acfd2ea
Parent:
19:19caa5f5c5f5
Child:
21:37a11c3659cc
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 20:e96c9acfd2ea 246 printBuffer(buffer, sizeof(buffer)-1);
benjaminroy 18:0c71241eab4f 247 socket.send_all(buffer, sizeof(buffer)-1);
benjaminroy 18:0c71241eab4f 248 responseSize = socket.receive(buffer, sizeof(buffer)-1);
benjaminroy 16:cede55e5b075 249 buffer[responseSize] = '\0';
benjaminroy 19:19caa5f5c5f5 250 pc.printf("Server: %s\n", buffer);
benjaminroy 16:cede55e5b075 251
benjaminroy 16:cede55e5b075 252 mail_box.free(mail);
benjaminroy 16:cede55e5b075 253 }
benjaminroy 16:cede55e5b075 254 }
benjaminroy 16:cede55e5b075 255 }
benjaminroy 16:cede55e5b075 256
benjaminroy 16:cede55e5b075 257 /*
benjaminroy 17:7ae8f91f46a2 258 * Lire et décomposer les trames reçues (adresse, données, status):
benjaminroy 16:cede55e5b075 259 */
benjaminroy 18:0c71241eab4f 260 void readRouterAddress(uint8_t* buffer) {
benjaminroy 18:0c71241eab4f 261 for (uint8_t i = 0; i < 8; i++) {
benjaminroy 18:0c71241eab4f 262 routerAddress[i] = buffer[i + 1];
benjaminroy 18:0c71241eab4f 263 }
benjaminroy 15:4c748df01e5b 264 t1->signal_set(0x02);
marc1119 8:9c34eb3cb3ef 265 }
marc1119 8:9c34eb3cb3ef 266
benjaminroy 10:488877f7f56c 267 void readRouterData(uint8_t bufferSize, uint8_t* buffer) {
benjaminroy 10:488877f7f56c 268 uint16_t acc[3] = {0};
marc1119 8:9c34eb3cb3ef 269
benjaminroy 16:cede55e5b075 270 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 271 for (uint8_t i = 12; i < bufferSize; i += 2) {
benjaminroy 10:488877f7f56c 272 acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff);
marc1119 2:3fbf13ba290e 273 }
benjaminroy 13:62404d7dab8d 274 mail_t *mail = mail_box.alloc();
benjaminroy 14:8b59a90725bc 275 mail->type = 0;
benjaminroy 19:19caa5f5c5f5 276 sprintf(mail->strAccelerationX, "X:%i\0", acc[0]);
benjaminroy 19:19caa5f5c5f5 277 sprintf(mail->strAccelerationY, "Y:%i\0", acc[1]);
benjaminroy 19:19caa5f5c5f5 278 sprintf(mail->strAccelerationZ, "Z:%i\0", acc[2]);
benjaminroy 13:62404d7dab8d 279 mail_box.put(mail);
benjaminroy 13:62404d7dab8d 280
benjaminroy 16:cede55e5b075 281 } 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 282 mail_t *mail = mail_box.alloc();
benjaminroy 14:8b59a90725bc 283 mail->type = 1;
benjaminroy 19:19caa5f5c5f5 284 sprintf(mail->strDryContact, "Contact: %i\0", buffer[12]);
benjaminroy 14:8b59a90725bc 285 mail_box.put(mail);
benjaminroy 10:488877f7f56c 286 }
benjaminroy 10:488877f7f56c 287 }
benjaminroy 10:488877f7f56c 288
benjaminroy 10:488877f7f56c 289 void readDataFromRouter(){
benjaminroy 10:488877f7f56c 290 while(1) {
benjaminroy 18:0c71241eab4f 291 if (xbee.readable() && xbee.getc() == startDelimiter) {
benjaminroy 17:7ae8f91f46a2 292 uint8_t buffer[104] = { 0 };
benjaminroy 17:7ae8f91f46a2 293 uint8_t bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff);
benjaminroy 17:7ae8f91f46a2 294 memcpy(buffer, readDataFromXbee(bufferSize), bufferSize + 1);
benjaminroy 10:488877f7f56c 295
benjaminroy 10:488877f7f56c 296 if (checksumIsValid(bufferSize, buffer)) {
benjaminroy 16:cede55e5b075 297 if (buffer[0] == 0x90) { // Frame Type:
benjaminroy 16:cede55e5b075 298 printBuffer(bufferSize, buffer);
benjaminroy 14:8b59a90725bc 299 readRouterAddress(buffer);
benjaminroy 14:8b59a90725bc 300 readRouterData(bufferSize, buffer);
benjaminroy 16:cede55e5b075 301 } else if (buffer[0] == 0x8A) { // Frame Type: Modem Status
benjaminroy 15:4c748df01e5b 302 readModemStatus(buffer);
benjaminroy 17:7ae8f91f46a2 303 } else if (buffer[0] == 0x8B) { // Frame Type: Transmit Status
benjaminroy 16:cede55e5b075 304 } else if (buffer[0] == 0x97) { // Frame Type: Remote AT Command Response
benjaminroy 15:4c748df01e5b 305 readRemoteATCommandResponse(buffer);
benjaminroy 16:cede55e5b075 306 } else if (buffer[0] == 0x09) { // Frame Type: AT Command Response
benjaminroy 17:7ae8f91f46a2 307 readATCommandResponse(buffer);
benjaminroy 15:4c748df01e5b 308 }
marc1119 8:9c34eb3cb3ef 309 }
marc1119 8:9c34eb3cb3ef 310 }
marc1119 0:ec23a7ae804c 311 }
marc1119 0:ec23a7ae804c 312 }
marc1119 0:ec23a7ae804c 313
benjaminroy 16:cede55e5b075 314 /*
benjaminroy 16:cede55e5b075 315 * Poser le ID du réseau PAN à rejoindre:
benjaminroy 16:cede55e5b075 316 */
benjaminroy 15:4c748df01e5b 317 void setCoordinatorPanId(uint16_t panId) {
benjaminroy 18:0c71241eab4f 318 char _8bitsPanId[2] = { (panId >> 8) & 0xFF, panId & 0xFF };
benjaminroy 16:cede55e5b075 319
benjaminroy 18:0c71241eab4f 320 uint8_t setPanIdBuffer[] = { startDelimiter, 0x00, 0x06, 0x09, 0x01, 0x49, 0x44, _8bitsPanId[0], _8bitsPanId[1], 0x00 };
benjaminroy 18:0c71241eab4f 321 uint8_t saveChangesBuffer[] = { startDelimiter, 0x00, 0x04, 0x09, 0x02, 0x57, 0x52, 0x4B };
benjaminroy 18:0c71241eab4f 322 uint8_t applyChangesBuffer[] = { startDelimiter, 0x00, 0x04, 0x09, 0x03, 0x41, 0x43, 0x6F };
benjaminroy 18:0c71241eab4f 323 setPanIdBuffer[sizeof(setPanIdBuffer) - 1] = calculateChecksum(0, sizeof(setPanIdBuffer), setPanIdBuffer); // Calculate the checksum
benjaminroy 18:0c71241eab4f 324
benjaminroy 18:0c71241eab4f 325 sendDataToXbee(sizeof(setPanIdBuffer), setPanIdBuffer); // Set the 64-bit PAN ID
benjaminroy 18:0c71241eab4f 326 sendDataToXbee(sizeof(saveChangesBuffer), saveChangesBuffer); // Save the changes
benjaminroy 18:0c71241eab4f 327 sendDataToXbee(sizeof(applyChangesBuffer), applyChangesBuffer); // Apply changes by sending the CN command
benjaminroy 15:4c748df01e5b 328 }
benjaminroy 15:4c748df01e5b 329
benjaminroy 16:cede55e5b075 330 /*
benjaminroy 16:cede55e5b075 331 * Envoyer un signal au thread qui fait clignoter la DEL du noeud routeur:
benjaminroy 16:cede55e5b075 332 */
benjaminroy 18:0c71241eab4f 333 void isr() { t1->signal_set(0x1); }
benjaminroy 11:205ddd5406af 334
benjaminroy 16:cede55e5b075 335 // --------------------------------------------------------------------------------------------
benjaminroy 16:cede55e5b075 336 // --------------------------------------------------------------------------------------------
benjaminroy 16:cede55e5b075 337 // --------------------------------------------------------------------------------------------
benjaminroy 16:cede55e5b075 338 // --------------------------------------------------------------------------------------------
marc1119 0:ec23a7ae804c 339 int main() {
benjaminroy 6:fd7d91edcf60 340 pc.printf("Starting a coordinator... \n");
benjaminroy 10:488877f7f56c 341
marc1119 1:ceb3f8ba8793 342 reset = 0;
benjaminroy 6:fd7d91edcf60 343 wait_ms(1);
marc1119 1:ceb3f8ba8793 344 reset = 1;
benjaminroy 6:fd7d91edcf60 345 wait_ms(1);
marc1119 0:ec23a7ae804c 346
benjaminroy 16:cede55e5b075 347 readConfigFile();
benjaminroy 15:4c748df01e5b 348 setCoordinatorPanId(panId);
benjaminroy 15:4c748df01e5b 349
benjaminroy 4:393738672d08 350 if (eth.init() != 0) { // Use DHCP
marc1119 3:fbd4b164e8ad 351 pc.printf("Erreur d'initialisation du RJ45.\n");
benjaminroy 4:393738672d08 352 }
benjaminroy 4:393738672d08 353 if (eth.connect() != 0) {
marc1119 3:fbd4b164e8ad 354 pc.printf("Erreur de connection du RJ45\n");
benjaminroy 17:7ae8f91f46a2 355 } else {
benjaminroy 17:7ae8f91f46a2 356 pc.printf("IP Address is %s\n", eth.getIPAddress());
benjaminroy 4:393738672d08 357 }
marc1119 2:3fbf13ba290e 358
benjaminroy 19:19caa5f5c5f5 359 int numberOfRetries = 0;
benjaminroy 18:0c71241eab4f 360 while (socket.connect(serverAddress, portNumber) != 0) {
benjaminroy 13:62404d7dab8d 361 if (numberOfRetries == 5) {
benjaminroy 13:62404d7dab8d 362 error("Erreur dans la connection au socket.\n");
benjaminroy 13:62404d7dab8d 363 }
benjaminroy 13:62404d7dab8d 364 numberOfRetries++;
benjaminroy 19:19caa5f5c5f5 365 }
benjaminroy 13:62404d7dab8d 366
benjaminroy 10:488877f7f56c 367 // Démarrage des tâches:
benjaminroy 10:488877f7f56c 368 Thread _readDataFromRouter(readDataFromRouter);
benjaminroy 16:cede55e5b075 369 Thread _toggleRouterLed(toggleRouterLed);
benjaminroy 19:19caa5f5c5f5 370 Thread _sendDataToServer(sendDataToServer);
benjaminroy 14:8b59a90725bc 371 t1 = &_toggleRouterLed;
benjaminroy 13:62404d7dab8d 372
benjaminroy 14:8b59a90725bc 373 ticker1.attach(&isr, 1);
benjaminroy 10:488877f7f56c 374 while(1) {}
marc1119 0:ec23a7ae804c 375 }
marc1119 0:ec23a7ae804c 376
marc1119 2:3fbf13ba290e 377