BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Tue Feb 14 06:16:43 2017 +0000
Revision:
18:0c71241eab4f
Parent:
17:7ae8f91f46a2
Child:
19:19caa5f5c5f5
clean code

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