BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
marc1119
Date:
Mon Feb 13 13:01:34 2017 +0000
Revision:
12:42986a9c3682
Parent:
11:205ddd5406af
Child:
13:62404d7dab8d
Modifier la fonction toogle light

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