BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
benjaminroy
Date:
Mon Feb 13 02:20:15 2017 +0000
Revision:
9:f6f79f136101
Parent:
8:9c34eb3cb3ef
Child:
10:488877f7f56c
Read data from router is finally 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 9:f6f79f136101 13 Thread *t1;
benjaminroy 9:f6f79f136101 14 Thread *t2;
marc1119 0:ec23a7ae804c 15
benjaminroy 6:fd7d91edcf60 16 uint16_t portNumber = 0;
benjaminroy 6:fd7d91edcf60 17 uint16_t panId = 0;
marc1119 8:9c34eb3cb3ef 18
benjaminroy 6:fd7d91edcf60 19 char serverAddress[32];
marc1119 8:9c34eb3cb3ef 20 char panIdChar[5];
benjaminroy 9:f6f79f136101 21 char portNbr[5];
marc1119 8:9c34eb3cb3ef 22
marc1119 3:fbd4b164e8ad 23 bool boolLED = false;
marc1119 8:9c34eb3cb3ef 24 uint64_t routerAddr;
marc1119 3:fbd4b164e8ad 25
benjaminroy 6:fd7d91edcf60 26 void printBuffer(uint8_t bufferSize, uint8_t* buffer) {
marc1119 8:9c34eb3cb3ef 27 for(uint8_t k = 0; k <= bufferSize; k++) {
benjaminroy 6:fd7d91edcf60 28 pc.printf("%X-", buffer[k]);
benjaminroy 6:fd7d91edcf60 29 }
benjaminroy 6:fd7d91edcf60 30 printf("\n");
benjaminroy 6:fd7d91edcf60 31 }
benjaminroy 6:fd7d91edcf60 32
benjaminroy 6:fd7d91edcf60 33 void readConfigFile() {
benjaminroy 6:fd7d91edcf60 34 LocalFileSystem local("local");
benjaminroy 6:fd7d91edcf60 35 ConfigFile cfg;
benjaminroy 6:fd7d91edcf60 36 char *serverAddressStr = "serverAddr";
benjaminroy 6:fd7d91edcf60 37 char *portNumberStr = "portNb";
benjaminroy 6:fd7d91edcf60 38 char *panIdStr = "panID";
benjaminroy 6:fd7d91edcf60 39
benjaminroy 6:fd7d91edcf60 40 if (!cfg.read("/local/input.cfg")) {
benjaminroy 6:fd7d91edcf60 41 error("Erreur dans la lecture du fichier de configuration.\n");
benjaminroy 6:fd7d91edcf60 42 } else {
benjaminroy 6:fd7d91edcf60 43 cfg.getValue(panIdStr, &panIdChar[0], sizeof(panIdChar));
benjaminroy 6:fd7d91edcf60 44 cfg.getValue(serverAddressStr, &serverAddress[0], sizeof(serverAddress));
benjaminroy 6:fd7d91edcf60 45 cfg.getValue(portNumberStr, &portNbr[0], sizeof(portNbr));
benjaminroy 6:fd7d91edcf60 46
benjaminroy 6:fd7d91edcf60 47 portNumber = (uint16_t)strtol(portNbr, NULL, 10);
benjaminroy 6:fd7d91edcf60 48 panId = (uint16_t)strtol(panIdChar, NULL, 10);
benjaminroy 6:fd7d91edcf60 49
benjaminroy 6:fd7d91edcf60 50 printf("The server address is %s\n", serverAddress);
benjaminroy 6:fd7d91edcf60 51 printf("The port number is %i\n", portNumber);
benjaminroy 6:fd7d91edcf60 52 printf("The PAN ID is %i\n", panId);
benjaminroy 6:fd7d91edcf60 53 }
benjaminroy 6:fd7d91edcf60 54 }
benjaminroy 6:fd7d91edcf60 55
marc1119 8:9c34eb3cb3ef 56 uint16_t convert8bitsTo16bits(uint8_t value1, uint8_t value2) {
marc1119 2:3fbf13ba290e 57 union {
marc1119 2:3fbf13ba290e 58 uint16_t u16_value;
marc1119 2:3fbf13ba290e 59 uint8_t u8_value[2];
marc1119 2:3fbf13ba290e 60 } length;
marc1119 2:3fbf13ba290e 61
marc1119 2:3fbf13ba290e 62 length.u8_value[1] = value1;
marc1119 2:3fbf13ba290e 63 length.u8_value[0] = value2;
marc1119 2:3fbf13ba290e 64
marc1119 2:3fbf13ba290e 65 return length.u16_value;
marc1119 2:3fbf13ba290e 66 }
marc1119 2:3fbf13ba290e 67
marc1119 3:fbd4b164e8ad 68 void toogleLED() {
benjaminroy 4:393738672d08 69 // Addresse 64 bits = 00 13 A2 00 40 8B 41 6E
marc1119 3:fbd4b164e8ad 70 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 71 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 72
marc1119 8:9c34eb3cb3ef 73 for (uint8_t i = 0; i < 20;) {
benjaminroy 4:393738672d08 74 if (xbee.writeable()) {
benjaminroy 4:393738672d08 75 if (boolLED) {
benjaminroy 4:393738672d08 76 xbee.putc(high[i]);
benjaminroy 4:393738672d08 77 } else {
benjaminroy 4:393738672d08 78 xbee.putc(low[i]);
benjaminroy 4:393738672d08 79 }
marc1119 3:fbd4b164e8ad 80 i++;
marc1119 3:fbd4b164e8ad 81 }
marc1119 3:fbd4b164e8ad 82 }
marc1119 3:fbd4b164e8ad 83
benjaminroy 4:393738672d08 84 if (boolLED) {
benjaminroy 4:393738672d08 85 pc.printf("Et un haut!\n");
benjaminroy 4:393738672d08 86 } else {
benjaminroy 4:393738672d08 87 pc.printf("Et un bas!\n");
benjaminroy 4:393738672d08 88 }
marc1119 3:fbd4b164e8ad 89 boolLED = !boolLED;
marc1119 3:fbd4b164e8ad 90 }
marc1119 3:fbd4b164e8ad 91
benjaminroy 9:f6f79f136101 92 void initSocket(uint16_t data) {
benjaminroy 9:f6f79f136101 93 /*int responseSize;
benjaminroy 9:f6f79f136101 94 char buffer[50];
benjaminroy 9:f6f79f136101 95 sprintf(buffer, "Data: %i\n", data);
marc1119 1:ceb3f8ba8793 96
benjaminroy 9:f6f79f136101 97 if (sock.connect(serverAddress, portNumber) != 0) {
benjaminroy 9:f6f79f136101 98 pc.printf("Erreur dans la connextion au socket.\n");
benjaminroy 9:f6f79f136101 99 } else {
benjaminroy 9:f6f79f136101 100 sock.send_all(buffer, sizeof(buffer)-1);
benjaminroy 9:f6f79f136101 101 responseSize = sock.receive(buffer, sizeof(buffer)-1);
benjaminroy 9:f6f79f136101 102
benjaminroy 9:f6f79f136101 103 if (responseSize <= 0) {
benjaminroy 9:f6f79f136101 104 pc.printf("Error");
benjaminroy 9:f6f79f136101 105 //sock.close();
benjaminroy 9:f6f79f136101 106 }
benjaminroy 9:f6f79f136101 107
benjaminroy 9:f6f79f136101 108 buffer[responseSize] = '\0';
benjaminroy 9:f6f79f136101 109 pc.printf("Received %d chars from server:\n%s\n", responseSize, buffer);
benjaminroy 9:f6f79f136101 110 }*/
marc1119 1:ceb3f8ba8793 111 }
marc1119 1:ceb3f8ba8793 112
benjaminroy 4:393738672d08 113 void checkForError(uint8_t* buffer) {
benjaminroy 4:393738672d08 114 if (buffer[0] == 0x97) {
benjaminroy 4:393738672d08 115 if (buffer[1] == 0x02) {
marc1119 3:fbd4b164e8ad 116 pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat bas.\n");
marc1119 3:fbd4b164e8ad 117 }
benjaminroy 4:393738672d08 118 else if (buffer[1] == 0x01) {
marc1119 3:fbd4b164e8ad 119 pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat haut\n");
marc1119 3:fbd4b164e8ad 120 }
marc1119 3:fbd4b164e8ad 121 }
marc1119 3:fbd4b164e8ad 122 }
marc1119 3:fbd4b164e8ad 123
marc1119 8:9c34eb3cb3ef 124 void checksum(uint8_t frameSize, uint8_t* buffer) {
marc1119 2:3fbf13ba290e 125 uint32_t checkSum = 0;
benjaminroy 4:393738672d08 126
benjaminroy 4:393738672d08 127 for (int i = 0; i < frameSize; i++) {
marc1119 2:3fbf13ba290e 128 checkSum += buffer[i];
benjaminroy 4:393738672d08 129 }
benjaminroy 4:393738672d08 130 if ((0xFF - (checkSum & 0xFF)) != buffer[frameSize]) {
marc1119 2:3fbf13ba290e 131 pc.printf("Erreur dans le checksum. \n");
benjaminroy 4:393738672d08 132 }
benjaminroy 7:ea6d3c6ac200 133
benjaminroy 7:ea6d3c6ac200 134 //checkForError(buffer);
marc1119 2:3fbf13ba290e 135 }
marc1119 2:3fbf13ba290e 136
marc1119 8:9c34eb3cb3ef 137 //We are keeping the 64 bits address of the router.
marc1119 8:9c34eb3cb3ef 138 void readRouterAddress(uint8_t* buffer) {
marc1119 8:9c34eb3cb3ef 139 union {
marc1119 8:9c34eb3cb3ef 140 uint64_t u64_value;
marc1119 8:9c34eb3cb3ef 141 uint8_t u8_value[8];
marc1119 8:9c34eb3cb3ef 142 } addr;
marc1119 8:9c34eb3cb3ef 143
marc1119 8:9c34eb3cb3ef 144 for(int i= 0; i < 8; i++) {
marc1119 8:9c34eb3cb3ef 145 addr.u8_value[i] = buffer[i + 2];
marc1119 8:9c34eb3cb3ef 146 }
marc1119 8:9c34eb3cb3ef 147
marc1119 8:9c34eb3cb3ef 148 routerAddr = addr.u64_value;
marc1119 8:9c34eb3cb3ef 149 }
marc1119 8:9c34eb3cb3ef 150
benjaminroy 9:f6f79f136101 151 void readDateFromRouter(){
marc1119 8:9c34eb3cb3ef 152 uint8_t bufferSize = 0;
benjaminroy 6:fd7d91edcf60 153 uint8_t sizeBytes[2] = { 0 };
benjaminroy 4:393738672d08 154 uint8_t buffer[104] = { 0 };
benjaminroy 9:f6f79f136101 155 uint16_t data[3] = {0};
marc1119 8:9c34eb3cb3ef 156
benjaminroy 4:393738672d08 157 if (xbee.readable() && xbee.getc() == 0x7E) {
marc1119 8:9c34eb3cb3ef 158 for (uint8_t i = 0; i < 2;) {
benjaminroy 6:fd7d91edcf60 159 sizeBytes[i] = xbee.getc();
benjaminroy 6:fd7d91edcf60 160 i++;
marc1119 2:3fbf13ba290e 161 }
marc1119 8:9c34eb3cb3ef 162 bufferSize = convert8bitsTo16bits(sizeBytes[0], sizeBytes[1]);
marc1119 2:3fbf13ba290e 163
marc1119 8:9c34eb3cb3ef 164 for (uint8_t i = 0; i <= bufferSize;) {
benjaminroy 4:393738672d08 165 if (xbee.readable()) {
marc1119 8:9c34eb3cb3ef 166 buffer[i] = xbee.getc();
marc1119 8:9c34eb3cb3ef 167 i++;
marc1119 2:3fbf13ba290e 168 }
marc1119 2:3fbf13ba290e 169 }
benjaminroy 4:393738672d08 170
benjaminroy 7:ea6d3c6ac200 171 checksum(bufferSize, buffer);
benjaminroy 7:ea6d3c6ac200 172 printBuffer(bufferSize, buffer);
marc1119 8:9c34eb3cb3ef 173 readRouterAddress(buffer);
marc1119 8:9c34eb3cb3ef 174
benjaminroy 9:f6f79f136101 175 if (buffer[0] == 0x90 && bufferSize == 18) {
marc1119 8:9c34eb3cb3ef 176 for(uint8_t i = 12; i < bufferSize; i += 2) {
benjaminroy 9:f6f79f136101 177 data[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff);
marc1119 8:9c34eb3cb3ef 178 }
benjaminroy 9:f6f79f136101 179 // pc.printf("Acceleration X: %d\n", data[0]);
benjaminroy 9:f6f79f136101 180 // pc.printf("Acceleration Y: %d\n", data[1]);
benjaminroy 9:f6f79f136101 181 // pc.printf("Acceleration Z: %d\n", data[2]);
benjaminroy 9:f6f79f136101 182
benjaminroy 9:f6f79f136101 183 initSocket(data[0]);
benjaminroy 9:f6f79f136101 184
benjaminroy 9:f6f79f136101 185 } else if (buffer[0] == 0x90 && bufferSize == 13) {
benjaminroy 9:f6f79f136101 186 //data[0] = buffer[12];
marc1119 8:9c34eb3cb3ef 187 }
marc1119 0:ec23a7ae804c 188 }
marc1119 0:ec23a7ae804c 189 }
marc1119 0:ec23a7ae804c 190
marc1119 0:ec23a7ae804c 191 int main() {
benjaminroy 6:fd7d91edcf60 192 pc.printf("Starting a coordinator... \n");
benjaminroy 9:f6f79f136101 193 pc.printf("IP: %s\n", eth.getIPAddress());
benjaminroy 9:f6f79f136101 194
marc1119 1:ceb3f8ba8793 195 reset = 0;
benjaminroy 6:fd7d91edcf60 196 wait_ms(1);
marc1119 1:ceb3f8ba8793 197 reset = 1;
benjaminroy 6:fd7d91edcf60 198 wait_ms(1);
marc1119 0:ec23a7ae804c 199
marc1119 2:3fbf13ba290e 200 readConfigFile();
marc1119 2:3fbf13ba290e 201
benjaminroy 6:fd7d91edcf60 202 xbee.baud(9600); // Set baud rate
benjaminroy 6:fd7d91edcf60 203 xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID
benjaminroy 6:fd7d91edcf60 204 xbee.printf("ATWR \r"); //
benjaminroy 6:fd7d91edcf60 205 xbee.printf("ATCN \r");
benjaminroy 6:fd7d91edcf60 206
benjaminroy 4:393738672d08 207 if (eth.init() != 0) { // Use DHCP
marc1119 3:fbd4b164e8ad 208 pc.printf("Erreur d'initialisation du RJ45.\n");
benjaminroy 4:393738672d08 209 }
benjaminroy 4:393738672d08 210 if (eth.connect() != 0) {
marc1119 3:fbd4b164e8ad 211 pc.printf("Erreur de connection du RJ45\n");
benjaminroy 4:393738672d08 212 }
marc1119 2:3fbf13ba290e 213
marc1119 1:ceb3f8ba8793 214 while(1) {
benjaminroy 9:f6f79f136101 215 readDateFromRouter();
marc1119 1:ceb3f8ba8793 216 }
marc1119 0:ec23a7ae804c 217 }
marc1119 0:ec23a7ae804c 218
marc1119 2:3fbf13ba290e 219