BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Tue Feb 14 02:35:07 2017 +0000
Revision:
16:cede55e5b075
Parent:
15:4c748df01e5b
Child:
17:7ae8f91f46a2
Some changes...

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