BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Mon Feb 13 17:09:27 2017 +0000
Revision:
13:62404d7dab8d
Parent:
12:42986a9c3682
Child:
14:8b59a90725bc
Envoie des donn?es au serveur

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benjaminroy 9:f6f79f136101 1 // ===================== COORDINATOR =====================
benjaminroy 9:f6f79f136101 2 // =======================================================
marc1119 0:ec23a7ae804c 3 #include "EthernetInterface.h"
marc1119 0:ec23a7ae804c 4 #include "ConfigFile.h"
marc1119 0:ec23a7ae804c 5 #include "mbed.h"
benjaminroy 9:f6f79f136101 6 #include "rtos.h"
marc1119 0:ec23a7ae804c 7
marc1119 0:ec23a7ae804c 8 DigitalOut reset(p8);
benjaminroy 9:f6f79f136101 9 EthernetInterface eth;
marc1119 8:9c34eb3cb3ef 10 Serial xbee(p13, p14); // tx, rx
marc1119 1:ceb3f8ba8793 11 Serial pc(USBTX, USBRX); // tx, rx
benjaminroy 9:f6f79f136101 12 TCPSocketConnection sock;
benjaminroy 11:205ddd5406af 13 Ticker ticker1;
marc1119 0:ec23a7ae804c 14
benjaminroy 13:62404d7dab8d 15 /* Mail */
benjaminroy 13:62404d7dab8d 16 typedef struct {
benjaminroy 13:62404d7dab8d 17 char strAccelerationX[10];
benjaminroy 13:62404d7dab8d 18 char strAccelerationY[10];
benjaminroy 13:62404d7dab8d 19 char strAccelerationZ[10];
benjaminroy 13:62404d7dab8d 20 char strDryContact[10];
benjaminroy 13:62404d7dab8d 21 } mail_t;
benjaminroy 13:62404d7dab8d 22
benjaminroy 13:62404d7dab8d 23 Mail<mail_t, 100> mail_box;
benjaminroy 13:62404d7dab8d 24
benjaminroy 13:62404d7dab8d 25 uint8_t routerAddress[8];
benjaminroy 6:fd7d91edcf60 26 uint16_t portNumber = 0;
benjaminroy 6:fd7d91edcf60 27 uint16_t panId = 0;
benjaminroy 6:fd7d91edcf60 28 char serverAddress[32];
marc1119 8:9c34eb3cb3ef 29 char panIdChar[5];
benjaminroy 9:f6f79f136101 30 char portNbr[5];
marc1119 3:fbd4b164e8ad 31 bool boolLED = false;
marc1119 3:fbd4b164e8ad 32
benjaminroy 6:fd7d91edcf60 33 void printBuffer(uint8_t bufferSize, uint8_t* buffer) {
marc1119 8:9c34eb3cb3ef 34 for(uint8_t k = 0; k <= bufferSize; k++) {
benjaminroy 6:fd7d91edcf60 35 pc.printf("%X-", buffer[k]);
benjaminroy 6:fd7d91edcf60 36 }
benjaminroy 6:fd7d91edcf60 37 printf("\n");
benjaminroy 6:fd7d91edcf60 38 }
benjaminroy 6:fd7d91edcf60 39
benjaminroy 6:fd7d91edcf60 40 void readConfigFile() {
benjaminroy 6:fd7d91edcf60 41 LocalFileSystem local("local");
benjaminroy 6:fd7d91edcf60 42 ConfigFile cfg;
benjaminroy 6:fd7d91edcf60 43 char *serverAddressStr = "serverAddr";
benjaminroy 6:fd7d91edcf60 44 char *portNumberStr = "portNb";
benjaminroy 6:fd7d91edcf60 45 char *panIdStr = "panID";
benjaminroy 6:fd7d91edcf60 46
benjaminroy 6:fd7d91edcf60 47 if (!cfg.read("/local/input.cfg")) {
benjaminroy 6:fd7d91edcf60 48 error("Erreur dans la lecture du fichier de configuration.\n");
benjaminroy 6:fd7d91edcf60 49 } else {
benjaminroy 6:fd7d91edcf60 50 cfg.getValue(panIdStr, &panIdChar[0], sizeof(panIdChar));
benjaminroy 6:fd7d91edcf60 51 cfg.getValue(serverAddressStr, &serverAddress[0], sizeof(serverAddress));
benjaminroy 6:fd7d91edcf60 52 cfg.getValue(portNumberStr, &portNbr[0], sizeof(portNbr));
benjaminroy 6:fd7d91edcf60 53
benjaminroy 6:fd7d91edcf60 54 portNumber = (uint16_t)strtol(portNbr, NULL, 10);
benjaminroy 6:fd7d91edcf60 55 panId = (uint16_t)strtol(panIdChar, NULL, 10);
benjaminroy 6:fd7d91edcf60 56
benjaminroy 10:488877f7f56c 57 // printf("The server address is %s\n", serverAddress);
benjaminroy 10:488877f7f56c 58 // printf("The port number is %i\n", portNumber);
benjaminroy 10:488877f7f56c 59 // printf("The PAN ID is %i\n", panId);
benjaminroy 6:fd7d91edcf60 60 }
benjaminroy 6:fd7d91edcf60 61 }
benjaminroy 6:fd7d91edcf60 62
marc1119 12:42986a9c3682 63 uint8_t calculateChecksum(uint8_t frameSize, uint8_t* buffer) {
marc1119 12:42986a9c3682 64 uint32_t checksum = 0;
marc1119 12:42986a9c3682 65 uint8_t frameTypeIndex = 3;
marc1119 12:42986a9c3682 66
marc1119 12:42986a9c3682 67 for (int i = frameTypeIndex; i < frameSize - 1; i++) {
marc1119 12:42986a9c3682 68 checksum += buffer[i];
marc1119 12:42986a9c3682 69 }
marc1119 12:42986a9c3682 70
marc1119 12:42986a9c3682 71 return (uint8_t)(0xFF - (checksum & 0xFF));
marc1119 12:42986a9c3682 72 }
marc1119 12:42986a9c3682 73
benjaminroy 13:62404d7dab8d 74 void toogleLED(uint8_t bufferSize, uint8_t* buffer) {
benjaminroy 4:393738672d08 75 // Addresse 64 bits = 00 13 A2 00 40 8B 41 6E
marc1119 12:42986a9c3682 76 //uint8_t high[20] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3C};
marc1119 12:42986a9c3682 77 //uint8_t low[20] = {0x7E, 0x00, 0x10, 0x17, 0x02, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3C};
marc1119 12:42986a9c3682 78 uint8_t command[20] = {0};
marc1119 12:42986a9c3682 79
marc1119 12:42986a9c3682 80 command[0] = 0x7E;
marc1119 12:42986a9c3682 81 command[1] = 0x00;
marc1119 12:42986a9c3682 82 command[2] = 0x10;
marc1119 12:42986a9c3682 83 command[3] = 0x17;
marc1119 12:42986a9c3682 84 if(boolLED) command[4] = 0x01;
marc1119 12:42986a9c3682 85 else command[4] = 0x02;
benjaminroy 13:62404d7dab8d 86 command[5] = routerAddress[0];
benjaminroy 13:62404d7dab8d 87 command[6] = routerAddress[1];
benjaminroy 13:62404d7dab8d 88 command[7] = routerAddress[2];
benjaminroy 13:62404d7dab8d 89 command[8] = routerAddress[3];
benjaminroy 13:62404d7dab8d 90 command[9] = routerAddress[4];
benjaminroy 13:62404d7dab8d 91 command[10] = routerAddress[5];
benjaminroy 13:62404d7dab8d 92 command[11] = routerAddress[6];
benjaminroy 13:62404d7dab8d 93 command[12] = routerAddress[7];
marc1119 12:42986a9c3682 94 command[13] = 0xFF;
marc1119 12:42986a9c3682 95 command[14] = 0xFE;
marc1119 12:42986a9c3682 96 command[15] = 0x02;
marc1119 12:42986a9c3682 97 command[16] = 0x44;
marc1119 12:42986a9c3682 98 command[17] = 0x34;
marc1119 12:42986a9c3682 99 if(boolLED) command[4] = 0x05;
marc1119 12:42986a9c3682 100 else command[4] = 0x04;
marc1119 12:42986a9c3682 101 command[19] = calculateChecksum(bufferSize, buffer);
marc1119 12:42986a9c3682 102
marc1119 12:42986a9c3682 103 // for (uint8_t i = 0; i < 20;) {
marc1119 12:42986a9c3682 104 // if (xbee.writeable()) {
marc1119 12:42986a9c3682 105 // if (boolLED) {
marc1119 12:42986a9c3682 106 // xbee.putc(high[i]);
marc1119 12:42986a9c3682 107 // } else {
marc1119 12:42986a9c3682 108 // xbee.putc(low[i]);
marc1119 12:42986a9c3682 109 // }
marc1119 12:42986a9c3682 110 // i++;
marc1119 12:42986a9c3682 111 // }
marc1119 12:42986a9c3682 112 // }
marc1119 12:42986a9c3682 113
marc1119 8:9c34eb3cb3ef 114 for (uint8_t i = 0; i < 20;) {
benjaminroy 4:393738672d08 115 if (xbee.writeable()) {
marc1119 12:42986a9c3682 116 xbee.putc(command[i]);
marc1119 3:fbd4b164e8ad 117 i++;
marc1119 3:fbd4b164e8ad 118 }
marc1119 3:fbd4b164e8ad 119 }
marc1119 3:fbd4b164e8ad 120
benjaminroy 4:393738672d08 121 if (boolLED) {
benjaminroy 4:393738672d08 122 pc.printf("Et un haut!\n");
benjaminroy 4:393738672d08 123 } else {
benjaminroy 4:393738672d08 124 pc.printf("Et un bas!\n");
benjaminroy 4:393738672d08 125 }
marc1119 3:fbd4b164e8ad 126 boolLED = !boolLED;
marc1119 3:fbd4b164e8ad 127 }
marc1119 3:fbd4b164e8ad 128
benjaminroy 13:62404d7dab8d 129 void sendDataToServer() {
benjaminroy 13:62404d7dab8d 130 while(1) {
benjaminroy 13:62404d7dab8d 131 osEvent evt = mail_box.get();
benjaminroy 9:f6f79f136101 132
benjaminroy 13:62404d7dab8d 133 if (evt.status == osEventMail) {
benjaminroy 13:62404d7dab8d 134 mail_t *mail = (mail_t*)evt.value.p;
benjaminroy 13:62404d7dab8d 135
benjaminroy 13:62404d7dab8d 136 int responseSize = 0;
benjaminroy 13:62404d7dab8d 137 char buffer[50] = { 0 };
benjaminroy 13:62404d7dab8d 138 for (int i = 0; i < 50; i++) {
benjaminroy 13:62404d7dab8d 139 buffer[i] = 0;
benjaminroy 13:62404d7dab8d 140 }
benjaminroy 13:62404d7dab8d 141 sprintf(buffer, "%s, %s, %s\0", mail->strAccelerationX, mail->strAccelerationY, mail->strAccelerationZ);
benjaminroy 13:62404d7dab8d 142 pc.printf("Send to server: %s\n", buffer);
benjaminroy 13:62404d7dab8d 143
benjaminroy 13:62404d7dab8d 144 sock.send_all(buffer, sizeof(buffer)-1);
benjaminroy 13:62404d7dab8d 145 responseSize = sock.receive(buffer, sizeof(buffer)-1);
benjaminroy 13:62404d7dab8d 146
benjaminroy 13:62404d7dab8d 147 if (responseSize <= 0) {
benjaminroy 13:62404d7dab8d 148 pc.printf("Error");
benjaminroy 13:62404d7dab8d 149 }
benjaminroy 13:62404d7dab8d 150
benjaminroy 13:62404d7dab8d 151 buffer[responseSize] = '\0';
benjaminroy 13:62404d7dab8d 152 pc.printf("Received %d chars from server: %s\n", responseSize, buffer);
benjaminroy 13:62404d7dab8d 153
benjaminroy 13:62404d7dab8d 154 mail_box.free(mail);
benjaminroy 9:f6f79f136101 155 }
benjaminroy 13:62404d7dab8d 156 }
marc1119 1:ceb3f8ba8793 157 }
marc1119 1:ceb3f8ba8793 158
benjaminroy 4:393738672d08 159 void checkForError(uint8_t* buffer) {
benjaminroy 4:393738672d08 160 if (buffer[0] == 0x97) {
benjaminroy 4:393738672d08 161 if (buffer[1] == 0x02) {
marc1119 3:fbd4b164e8ad 162 pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat bas.\n");
marc1119 3:fbd4b164e8ad 163 }
benjaminroy 4:393738672d08 164 else if (buffer[1] == 0x01) {
marc1119 3:fbd4b164e8ad 165 pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat haut\n");
marc1119 3:fbd4b164e8ad 166 }
marc1119 3:fbd4b164e8ad 167 }
marc1119 3:fbd4b164e8ad 168 }
marc1119 3:fbd4b164e8ad 169
benjaminroy 10:488877f7f56c 170 bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) {
marc1119 2:3fbf13ba290e 171 uint32_t checkSum = 0;
benjaminroy 4:393738672d08 172
benjaminroy 10:488877f7f56c 173 for (int i = 0; i < bufferSize; i++) {
marc1119 2:3fbf13ba290e 174 checkSum += buffer[i];
benjaminroy 4:393738672d08 175 }
benjaminroy 10:488877f7f56c 176 if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) {
benjaminroy 10:488877f7f56c 177 pc.printf("Erreur dans la transmission de la trame. \n");
benjaminroy 10:488877f7f56c 178 return false;
benjaminroy 4:393738672d08 179 }
benjaminroy 10:488877f7f56c 180 return true;
marc1119 2:3fbf13ba290e 181 }
marc1119 2:3fbf13ba290e 182
benjaminroy 10:488877f7f56c 183 // We are storing the 64 bits address of the router.
marc1119 8:9c34eb3cb3ef 184 void readRouterAddress(uint8_t* buffer) {
benjaminroy 13:62404d7dab8d 185 routerAddress[0] = buffer[2];
benjaminroy 13:62404d7dab8d 186 routerAddress[1] = buffer[3];
benjaminroy 13:62404d7dab8d 187 routerAddress[2] = buffer[4];
benjaminroy 13:62404d7dab8d 188 routerAddress[3] = buffer[5];
benjaminroy 13:62404d7dab8d 189 routerAddress[4] = buffer[6];
benjaminroy 13:62404d7dab8d 190 routerAddress[5] = buffer[7];
benjaminroy 13:62404d7dab8d 191 routerAddress[6] = buffer[8];
benjaminroy 13:62404d7dab8d 192 routerAddress[7] = buffer[9];
marc1119 8:9c34eb3cb3ef 193 }
marc1119 8:9c34eb3cb3ef 194
benjaminroy 10:488877f7f56c 195 void readRouterData(uint8_t bufferSize, uint8_t* buffer) {
benjaminroy 10:488877f7f56c 196 uint16_t acc[3] = {0};
marc1119 8:9c34eb3cb3ef 197
benjaminroy 10:488877f7f56c 198 if (buffer[0] == 0x90 && bufferSize == 18) { // Accelerations (X,Y,Z)
benjaminroy 10:488877f7f56c 199 for (uint8_t i = 12; i < bufferSize; i += 2) {
benjaminroy 10:488877f7f56c 200 acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff);
marc1119 2:3fbf13ba290e 201 }
benjaminroy 10:488877f7f56c 202 // pc.printf("Acceleration X: %d\n", acc[0]);
benjaminroy 10:488877f7f56c 203 // pc.printf("Acceleration Y: %d\n", acc[1]);
benjaminroy 10:488877f7f56c 204 // pc.printf("Acceleration Z: %d\n", acc[2]);
benjaminroy 13:62404d7dab8d 205
benjaminroy 13:62404d7dab8d 206 mail_t *mail = mail_box.alloc();
benjaminroy 13:62404d7dab8d 207 sprintf(mail->strAccelerationX, "Acc. X: %i\0", acc[0]);
benjaminroy 13:62404d7dab8d 208 sprintf(mail->strAccelerationY, "Acc. Y: %i\0", acc[1]);
benjaminroy 13:62404d7dab8d 209 sprintf(mail->strAccelerationZ, "Acc. Z: %i\0", acc[2]);
benjaminroy 13:62404d7dab8d 210 mail_box.put(mail);
benjaminroy 13:62404d7dab8d 211
benjaminroy 10:488877f7f56c 212 } else if (buffer[0] == 0x90 && bufferSize == 13) { // Dry contact
benjaminroy 13:62404d7dab8d 213 //mail_t *mail = mail_box.alloc();
benjaminroy 13:62404d7dab8d 214 //mail->data = acc[0];
benjaminroy 13:62404d7dab8d 215 //mail_box.put(mail);
benjaminroy 10:488877f7f56c 216 }
benjaminroy 10:488877f7f56c 217 }
benjaminroy 10:488877f7f56c 218
benjaminroy 10:488877f7f56c 219 void readDataFromRouter(){
benjaminroy 10:488877f7f56c 220 while(1) {
benjaminroy 10:488877f7f56c 221 uint8_t bufferSize = 0;
benjaminroy 10:488877f7f56c 222 uint8_t buffer[104] = { 0 };
benjaminroy 10:488877f7f56c 223
benjaminroy 10:488877f7f56c 224 if (xbee.readable() && xbee.getc() == 0x7E) {
benjaminroy 10:488877f7f56c 225 bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff);
benjaminroy 10:488877f7f56c 226
benjaminroy 10:488877f7f56c 227 for (uint8_t i = 0; i <= bufferSize;) {
benjaminroy 10:488877f7f56c 228 if (xbee.readable()) {
benjaminroy 10:488877f7f56c 229 buffer[i] = xbee.getc();
benjaminroy 10:488877f7f56c 230 i++;
benjaminroy 10:488877f7f56c 231 }
marc1119 2:3fbf13ba290e 232 }
benjaminroy 10:488877f7f56c 233
benjaminroy 10:488877f7f56c 234 printBuffer(bufferSize, buffer);
benjaminroy 10:488877f7f56c 235 if (checksumIsValid(bufferSize, buffer)) {
benjaminroy 10:488877f7f56c 236 readRouterAddress(buffer);
benjaminroy 10:488877f7f56c 237 readRouterData(bufferSize, buffer);
marc1119 8:9c34eb3cb3ef 238 }
marc1119 8:9c34eb3cb3ef 239 }
marc1119 0:ec23a7ae804c 240 }
marc1119 0:ec23a7ae804c 241 }
marc1119 0:ec23a7ae804c 242
benjaminroy 11:205ddd5406af 243 void isr() {}
benjaminroy 11:205ddd5406af 244
marc1119 0:ec23a7ae804c 245 int main() {
benjaminroy 6:fd7d91edcf60 246 pc.printf("Starting a coordinator... \n");
benjaminroy 10:488877f7f56c 247
marc1119 1:ceb3f8ba8793 248 reset = 0;
benjaminroy 6:fd7d91edcf60 249 wait_ms(1);
marc1119 1:ceb3f8ba8793 250 reset = 1;
benjaminroy 6:fd7d91edcf60 251 wait_ms(1);
marc1119 0:ec23a7ae804c 252
marc1119 2:3fbf13ba290e 253 readConfigFile();
marc1119 2:3fbf13ba290e 254
benjaminroy 6:fd7d91edcf60 255 xbee.baud(9600); // Set baud rate
benjaminroy 6:fd7d91edcf60 256 xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID
benjaminroy 11:205ddd5406af 257 xbee.printf("ATWR \r"); // Save the changes
benjaminroy 11:205ddd5406af 258 xbee.printf("ATCN \r"); // Apply changes by sending the CN command
benjaminroy 6:fd7d91edcf60 259
benjaminroy 4:393738672d08 260 if (eth.init() != 0) { // Use DHCP
marc1119 3:fbd4b164e8ad 261 pc.printf("Erreur d'initialisation du RJ45.\n");
benjaminroy 4:393738672d08 262 }
benjaminroy 4:393738672d08 263 if (eth.connect() != 0) {
marc1119 3:fbd4b164e8ad 264 pc.printf("Erreur de connection du RJ45\n");
benjaminroy 4:393738672d08 265 }
benjaminroy 10:488877f7f56c 266 pc.printf("IP Address is %s\n", eth.getIPAddress());
marc1119 2:3fbf13ba290e 267
benjaminroy 13:62404d7dab8d 268 int numberOfRetries = 0;
benjaminroy 13:62404d7dab8d 269 while (sock.connect(serverAddress, portNumber) != 0) {
benjaminroy 13:62404d7dab8d 270 if (numberOfRetries == 5) {
benjaminroy 13:62404d7dab8d 271 error("Erreur dans la connection au socket.\n");
benjaminroy 13:62404d7dab8d 272 }
benjaminroy 13:62404d7dab8d 273 numberOfRetries++;
benjaminroy 13:62404d7dab8d 274 }
benjaminroy 13:62404d7dab8d 275
benjaminroy 10:488877f7f56c 276 // Démarrage des tâches:
benjaminroy 10:488877f7f56c 277 Thread _readDataFromRouter(readDataFromRouter);
benjaminroy 13:62404d7dab8d 278 Thread _sendDataToServer(sendDataToServer);
benjaminroy 13:62404d7dab8d 279
benjaminroy 10:488877f7f56c 280 //Thread _toggleRouterLed(toggleLed);
benjaminroy 10:488877f7f56c 281 while(1) {}
marc1119 0:ec23a7ae804c 282 }
marc1119 0:ec23a7ae804c 283
marc1119 2:3fbf13ba290e 284