BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Mon Feb 13 04:37:56 2017 +0000
Revision:
11:205ddd5406af
Parent:
10:488877f7f56c
Child:
12:42986a9c3682
Transmission working...

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 3:fbd4b164e8ad 53 void toogleLED() {
benjaminroy 4:393738672d08 54 // Addresse 64 bits = 00 13 A2 00 40 8B 41 6E
marc1119 3:fbd4b164e8ad 55 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 3:fbd4b164e8ad 56 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 3:fbd4b164e8ad 57
marc1119 8:9c34eb3cb3ef 58 for (uint8_t i = 0; i < 20;) {
benjaminroy 4:393738672d08 59 if (xbee.writeable()) {
benjaminroy 4:393738672d08 60 if (boolLED) {
benjaminroy 4:393738672d08 61 xbee.putc(high[i]);
benjaminroy 4:393738672d08 62 } else {
benjaminroy 4:393738672d08 63 xbee.putc(low[i]);
benjaminroy 4:393738672d08 64 }
marc1119 3:fbd4b164e8ad 65 i++;
marc1119 3:fbd4b164e8ad 66 }
marc1119 3:fbd4b164e8ad 67 }
marc1119 3:fbd4b164e8ad 68
benjaminroy 4:393738672d08 69 if (boolLED) {
benjaminroy 4:393738672d08 70 pc.printf("Et un haut!\n");
benjaminroy 4:393738672d08 71 } else {
benjaminroy 4:393738672d08 72 pc.printf("Et un bas!\n");
benjaminroy 4:393738672d08 73 }
marc1119 3:fbd4b164e8ad 74 boolLED = !boolLED;
marc1119 3:fbd4b164e8ad 75 }
marc1119 3:fbd4b164e8ad 76
benjaminroy 11:205ddd5406af 77 void sendDataToServer(uint16_t data) {
benjaminroy 9:f6f79f136101 78 /*int responseSize;
benjaminroy 9:f6f79f136101 79 char buffer[50];
benjaminroy 9:f6f79f136101 80 sprintf(buffer, "Data: %i\n", data);
marc1119 1:ceb3f8ba8793 81
benjaminroy 9:f6f79f136101 82 if (sock.connect(serverAddress, portNumber) != 0) {
benjaminroy 9:f6f79f136101 83 pc.printf("Erreur dans la connextion au socket.\n");
benjaminroy 9:f6f79f136101 84 } else {
benjaminroy 9:f6f79f136101 85 sock.send_all(buffer, sizeof(buffer)-1);
benjaminroy 9:f6f79f136101 86 responseSize = sock.receive(buffer, sizeof(buffer)-1);
benjaminroy 9:f6f79f136101 87
benjaminroy 9:f6f79f136101 88 if (responseSize <= 0) {
benjaminroy 9:f6f79f136101 89 pc.printf("Error");
benjaminroy 9:f6f79f136101 90 //sock.close();
benjaminroy 9:f6f79f136101 91 }
benjaminroy 9:f6f79f136101 92
benjaminroy 9:f6f79f136101 93 buffer[responseSize] = '\0';
benjaminroy 9:f6f79f136101 94 pc.printf("Received %d chars from server:\n%s\n", responseSize, buffer);
benjaminroy 9:f6f79f136101 95 }*/
marc1119 1:ceb3f8ba8793 96 }
marc1119 1:ceb3f8ba8793 97
benjaminroy 4:393738672d08 98 void checkForError(uint8_t* buffer) {
benjaminroy 4:393738672d08 99 if (buffer[0] == 0x97) {
benjaminroy 4:393738672d08 100 if (buffer[1] == 0x02) {
marc1119 3:fbd4b164e8ad 101 pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat bas.\n");
marc1119 3:fbd4b164e8ad 102 }
benjaminroy 4:393738672d08 103 else if (buffer[1] == 0x01) {
marc1119 3:fbd4b164e8ad 104 pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat haut\n");
marc1119 3:fbd4b164e8ad 105 }
marc1119 3:fbd4b164e8ad 106 }
marc1119 3:fbd4b164e8ad 107 }
marc1119 3:fbd4b164e8ad 108
benjaminroy 10:488877f7f56c 109 bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) {
marc1119 2:3fbf13ba290e 110 uint32_t checkSum = 0;
benjaminroy 4:393738672d08 111
benjaminroy 10:488877f7f56c 112 for (int i = 0; i < bufferSize; i++) {
marc1119 2:3fbf13ba290e 113 checkSum += buffer[i];
benjaminroy 4:393738672d08 114 }
benjaminroy 10:488877f7f56c 115 if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) {
benjaminroy 10:488877f7f56c 116 pc.printf("Erreur dans la transmission de la trame. \n");
benjaminroy 10:488877f7f56c 117 return false;
benjaminroy 4:393738672d08 118 }
benjaminroy 10:488877f7f56c 119 return true;
marc1119 2:3fbf13ba290e 120 }
marc1119 2:3fbf13ba290e 121
benjaminroy 10:488877f7f56c 122 // We are storing the 64 bits address of the router.
marc1119 8:9c34eb3cb3ef 123 void readRouterAddress(uint8_t* buffer) {
marc1119 8:9c34eb3cb3ef 124 union {
marc1119 8:9c34eb3cb3ef 125 uint64_t u64_value;
benjaminroy 10:488877f7f56c 126 uint8_t u8_value[8];
benjaminroy 10:488877f7f56c 127 } address;
marc1119 8:9c34eb3cb3ef 128
benjaminroy 10:488877f7f56c 129 for(int i=0; i < 8; i++) {
benjaminroy 10:488877f7f56c 130 address.u8_value[i] = buffer[i + 2];
marc1119 8:9c34eb3cb3ef 131 }
benjaminroy 10:488877f7f56c 132 routerAddress = address.u64_value;
benjaminroy 10:488877f7f56c 133
benjaminroy 10:488877f7f56c 134 //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 135 pc.printf("The router address is %X\n", routerAddress);
marc1119 8:9c34eb3cb3ef 136 }
marc1119 8:9c34eb3cb3ef 137
benjaminroy 10:488877f7f56c 138 void readRouterData(uint8_t bufferSize, uint8_t* buffer) {
benjaminroy 10:488877f7f56c 139 uint16_t acc[3] = {0};
marc1119 8:9c34eb3cb3ef 140
benjaminroy 10:488877f7f56c 141 if (buffer[0] == 0x90 && bufferSize == 18) { // Accelerations (X,Y,Z)
benjaminroy 10:488877f7f56c 142 for (uint8_t i = 12; i < bufferSize; i += 2) {
benjaminroy 10:488877f7f56c 143 acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff);
marc1119 2:3fbf13ba290e 144 }
benjaminroy 10:488877f7f56c 145 // pc.printf("Acceleration X: %d\n", acc[0]);
benjaminroy 10:488877f7f56c 146 // pc.printf("Acceleration Y: %d\n", acc[1]);
benjaminroy 10:488877f7f56c 147 // pc.printf("Acceleration Z: %d\n", acc[2]);
benjaminroy 10:488877f7f56c 148
benjaminroy 11:205ddd5406af 149 sendDataToServer(acc[0]);
benjaminroy 10:488877f7f56c 150
benjaminroy 10:488877f7f56c 151 } else if (buffer[0] == 0x90 && bufferSize == 13) { // Dry contact
benjaminroy 11:205ddd5406af 152 // sendDataToServer(buffer[12]);
benjaminroy 10:488877f7f56c 153 }
benjaminroy 10:488877f7f56c 154 }
benjaminroy 10:488877f7f56c 155
benjaminroy 10:488877f7f56c 156 void readDataFromRouter(){
benjaminroy 10:488877f7f56c 157 while(1) {
benjaminroy 10:488877f7f56c 158 uint8_t bufferSize = 0;
benjaminroy 10:488877f7f56c 159 uint8_t buffer[104] = { 0 };
benjaminroy 10:488877f7f56c 160
benjaminroy 10:488877f7f56c 161 if (xbee.readable() && xbee.getc() == 0x7E) {
benjaminroy 10:488877f7f56c 162 bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff);
benjaminroy 10:488877f7f56c 163
benjaminroy 10:488877f7f56c 164 for (uint8_t i = 0; i <= bufferSize;) {
benjaminroy 10:488877f7f56c 165 if (xbee.readable()) {
benjaminroy 10:488877f7f56c 166 buffer[i] = xbee.getc();
benjaminroy 10:488877f7f56c 167 i++;
benjaminroy 10:488877f7f56c 168 }
marc1119 2:3fbf13ba290e 169 }
benjaminroy 10:488877f7f56c 170
benjaminroy 10:488877f7f56c 171 printBuffer(bufferSize, buffer);
benjaminroy 10:488877f7f56c 172 if (checksumIsValid(bufferSize, buffer)) {
benjaminroy 10:488877f7f56c 173 readRouterAddress(buffer);
benjaminroy 10:488877f7f56c 174 readRouterData(bufferSize, buffer);
marc1119 8:9c34eb3cb3ef 175 }
marc1119 8:9c34eb3cb3ef 176 }
marc1119 0:ec23a7ae804c 177 }
marc1119 0:ec23a7ae804c 178 }
marc1119 0:ec23a7ae804c 179
benjaminroy 11:205ddd5406af 180 void isr() {}
benjaminroy 11:205ddd5406af 181
marc1119 0:ec23a7ae804c 182 int main() {
benjaminroy 6:fd7d91edcf60 183 pc.printf("Starting a coordinator... \n");
benjaminroy 10:488877f7f56c 184
marc1119 1:ceb3f8ba8793 185 reset = 0;
benjaminroy 6:fd7d91edcf60 186 wait_ms(1);
marc1119 1:ceb3f8ba8793 187 reset = 1;
benjaminroy 6:fd7d91edcf60 188 wait_ms(1);
marc1119 0:ec23a7ae804c 189
marc1119 2:3fbf13ba290e 190 readConfigFile();
marc1119 2:3fbf13ba290e 191
benjaminroy 6:fd7d91edcf60 192 xbee.baud(9600); // Set baud rate
benjaminroy 6:fd7d91edcf60 193 xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID
benjaminroy 11:205ddd5406af 194 xbee.printf("ATWR \r"); // Save the changes
benjaminroy 11:205ddd5406af 195 xbee.printf("ATCN \r"); // Apply changes by sending the CN command
benjaminroy 6:fd7d91edcf60 196
benjaminroy 4:393738672d08 197 if (eth.init() != 0) { // Use DHCP
marc1119 3:fbd4b164e8ad 198 pc.printf("Erreur d'initialisation du RJ45.\n");
benjaminroy 4:393738672d08 199 }
benjaminroy 4:393738672d08 200 if (eth.connect() != 0) {
marc1119 3:fbd4b164e8ad 201 pc.printf("Erreur de connection du RJ45\n");
benjaminroy 4:393738672d08 202 }
benjaminroy 10:488877f7f56c 203 pc.printf("IP Address is %s\n", eth.getIPAddress());
marc1119 2:3fbf13ba290e 204
benjaminroy 10:488877f7f56c 205 // Démarrage des tâches:
benjaminroy 10:488877f7f56c 206 Thread _readDataFromRouter(readDataFromRouter);
benjaminroy 10:488877f7f56c 207 //Thread _toggleRouterLed(toggleLed);
benjaminroy 10:488877f7f56c 208 while(1) {}
marc1119 0:ec23a7ae804c 209 }
marc1119 0:ec23a7ae804c 210
marc1119 2:3fbf13ba290e 211