BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

Committer:
marc1119
Date:
Sun Feb 12 19:38:26 2017 +0000
Revision:
8:9c34eb3cb3ef
Parent:
7:ea6d3c6ac200
Child:
9:f6f79f136101
Test

Who changed what in which revision?

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