Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ConfigFile EthernetInterface mbed-rtos mbed
Fork of S05APP3 by
main.cpp@8:9c34eb3cb3ef, 2017-02-12 (annotated)
- 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?
User | Revision | Line number | New 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 |