BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

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