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@6:fd7d91edcf60, 2017-02-12 (annotated)
- Committer:
- benjaminroy
- Date:
- Sun Feb 12 02:27:01 2017 +0000
- Revision:
- 6:fd7d91edcf60
- Parent:
- 4:393738672d08
- Child:
- 7:ea6d3c6ac200
:-( Pas capable de communiquer
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); |
benjaminroy | 4:393738672d08 | 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; |
benjaminroy | 6:fd7d91edcf60 | 12 | char serverAddress[32]; |
benjaminroy | 6:fd7d91edcf60 | 13 | char portNbr[4]; |
benjaminroy | 6:fd7d91edcf60 | 14 | char panIdChar[5]; |
marc1119 | 3:fbd4b164e8ad | 15 | bool boolLED = false; |
marc1119 | 3:fbd4b164e8ad | 16 | |
benjaminroy | 6:fd7d91edcf60 | 17 | void printBuffer(uint8_t bufferSize, uint8_t* buffer) { |
benjaminroy | 6:fd7d91edcf60 | 18 | for(int k = 0; k < bufferSize; k++) { |
benjaminroy | 6:fd7d91edcf60 | 19 | pc.printf("%X-", buffer[k]); |
benjaminroy | 6:fd7d91edcf60 | 20 | } |
benjaminroy | 6:fd7d91edcf60 | 21 | printf("\n"); |
benjaminroy | 6:fd7d91edcf60 | 22 | } |
benjaminroy | 6:fd7d91edcf60 | 23 | |
benjaminroy | 6:fd7d91edcf60 | 24 | /* |
benjaminroy | 6:fd7d91edcf60 | 25 | * Read a configuration file from a mbed. |
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 | |
benjaminroy | 4:393738672d08 | 50 | uint16_t getFrameSize(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, 0x00, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3D}; |
marc1119 | 3:fbd4b164e8ad | 65 | //uint8_t low[20] = {0x7E, 0x00, 0x10, 0x17, 0x00, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3E}; |
marc1119 | 3:fbd4b164e8ad | 66 | 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 | 67 | 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 | 68 | |
benjaminroy | 4:393738672d08 | 69 | for (int i = 0; i < 20;) { |
benjaminroy | 4:393738672d08 | 70 | if (xbee.writeable()) { |
benjaminroy | 4:393738672d08 | 71 | if (boolLED) { |
benjaminroy | 4:393738672d08 | 72 | xbee.putc(high[i]); |
benjaminroy | 4:393738672d08 | 73 | } else { |
benjaminroy | 4:393738672d08 | 74 | xbee.putc(low[i]); |
benjaminroy | 4:393738672d08 | 75 | } |
marc1119 | 3:fbd4b164e8ad | 76 | i++; |
marc1119 | 3:fbd4b164e8ad | 77 | } |
marc1119 | 3:fbd4b164e8ad | 78 | } |
marc1119 | 3:fbd4b164e8ad | 79 | |
benjaminroy | 4:393738672d08 | 80 | if (boolLED) { |
benjaminroy | 4:393738672d08 | 81 | pc.printf("Et un haut!\n"); |
benjaminroy | 4:393738672d08 | 82 | } else { |
benjaminroy | 4:393738672d08 | 83 | pc.printf("Et un bas!\n"); |
benjaminroy | 4:393738672d08 | 84 | } |
marc1119 | 3:fbd4b164e8ad | 85 | boolLED = !boolLED; |
marc1119 | 3:fbd4b164e8ad | 86 | } |
marc1119 | 3:fbd4b164e8ad | 87 | |
benjaminroy | 4:393738672d08 | 88 | void initSocket() { |
marc1119 | 2:3fbf13ba290e | 89 | //int repSize; |
marc1119 | 1:ceb3f8ba8793 | 90 | //while (true) { |
marc1119 | 1:ceb3f8ba8793 | 91 | |
benjaminroy | 4:393738672d08 | 92 | //sprintf (buffer, (const char *)xbee.getc()); |
marc1119 | 1:ceb3f8ba8793 | 93 | //sock.send_all(buffer, sizeof(buffer)-1); |
marc1119 | 1:ceb3f8ba8793 | 94 | |
marc1119 | 1:ceb3f8ba8793 | 95 | //repSize = sock.receive(buffer, sizeof(buffer)-1); |
marc1119 | 1:ceb3f8ba8793 | 96 | // if (repSize <= 0) { |
marc1119 | 1:ceb3f8ba8793 | 97 | // printf("Error"); |
marc1119 | 1:ceb3f8ba8793 | 98 | // sock.close(); |
marc1119 | 1:ceb3f8ba8793 | 99 | // break; |
marc1119 | 1:ceb3f8ba8793 | 100 | // } |
marc1119 | 1:ceb3f8ba8793 | 101 | //buffer[repSize] = '\0'; |
marc1119 | 1:ceb3f8ba8793 | 102 | //printf("Received %d chars from server:\n%s\n", repSize, buffer); |
marc1119 | 1:ceb3f8ba8793 | 103 | //} |
marc1119 | 1:ceb3f8ba8793 | 104 | } |
marc1119 | 1:ceb3f8ba8793 | 105 | |
benjaminroy | 4:393738672d08 | 106 | void checkForError(uint8_t* buffer) { |
benjaminroy | 4:393738672d08 | 107 | if (buffer[0] == 0x97) { |
benjaminroy | 4:393738672d08 | 108 | if (buffer[1] == 0x02) { |
marc1119 | 3:fbd4b164e8ad | 109 | pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat bas.\n"); |
marc1119 | 3:fbd4b164e8ad | 110 | } |
benjaminroy | 4:393738672d08 | 111 | else if (buffer[1] == 0x01) { |
marc1119 | 3:fbd4b164e8ad | 112 | pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat haut\n"); |
marc1119 | 3:fbd4b164e8ad | 113 | } |
marc1119 | 3:fbd4b164e8ad | 114 | } |
marc1119 | 3:fbd4b164e8ad | 115 | } |
marc1119 | 3:fbd4b164e8ad | 116 | |
benjaminroy | 4:393738672d08 | 117 | void verifyChecksum(uint16_t frameSize, uint8_t* buffer) { |
marc1119 | 2:3fbf13ba290e | 118 | uint32_t checkSum = 0; |
benjaminroy | 4:393738672d08 | 119 | |
benjaminroy | 4:393738672d08 | 120 | for (int i = 0; i < frameSize; i++) { |
marc1119 | 2:3fbf13ba290e | 121 | checkSum += buffer[i]; |
benjaminroy | 4:393738672d08 | 122 | } |
benjaminroy | 4:393738672d08 | 123 | if ((0xFF - (checkSum & 0xFF)) != buffer[frameSize]) { |
marc1119 | 2:3fbf13ba290e | 124 | pc.printf("Erreur dans le checksum. \n"); |
benjaminroy | 4:393738672d08 | 125 | } |
marc1119 | 3:fbd4b164e8ad | 126 | |
benjaminroy | 4:393738672d08 | 127 | checkForError(buffer); |
marc1119 | 2:3fbf13ba290e | 128 | } |
marc1119 | 2:3fbf13ba290e | 129 | |
marc1119 | 2:3fbf13ba290e | 130 | void readFrame(){ |
benjaminroy | 6:fd7d91edcf60 | 131 | uint8_t sizeBytes[2] = { 0 }; |
benjaminroy | 4:393738672d08 | 132 | uint8_t buffer[104] = { 0 }; |
marc1119 | 2:3fbf13ba290e | 133 | |
benjaminroy | 6:fd7d91edcf60 | 134 | while (xbee.readable() == 0){} // Wait for UART to have new data |
benjaminroy | 6:fd7d91edcf60 | 135 | pc.printf("new char"); |
benjaminroy | 6:fd7d91edcf60 | 136 | |
benjaminroy | 4:393738672d08 | 137 | if (xbee.readable() && xbee.getc() == 0x7E) { |
benjaminroy | 4:393738672d08 | 138 | for (int i = 0; i < 2;) { |
benjaminroy | 6:fd7d91edcf60 | 139 | sizeBytes[i] = xbee.getc(); |
benjaminroy | 6:fd7d91edcf60 | 140 | i++; |
marc1119 | 2:3fbf13ba290e | 141 | } |
benjaminroy | 6:fd7d91edcf60 | 142 | uint16_t frameSize = getFrameSize(sizeBytes[0], sizeBytes[1]); |
marc1119 | 2:3fbf13ba290e | 143 | |
benjaminroy | 4:393738672d08 | 144 | for (int j = 0; j <= frameSize;) { |
benjaminroy | 4:393738672d08 | 145 | if (xbee.readable()) { |
benjaminroy | 4:393738672d08 | 146 | buffer[j] = xbee.getc(); |
marc1119 | 2:3fbf13ba290e | 147 | j++; |
marc1119 | 2:3fbf13ba290e | 148 | } |
marc1119 | 2:3fbf13ba290e | 149 | } |
benjaminroy | 4:393738672d08 | 150 | |
benjaminroy | 4:393738672d08 | 151 | verifyChecksum(frameSize, buffer); |
benjaminroy | 6:fd7d91edcf60 | 152 | printBuffer(frameSize, buffer); |
marc1119 | 0:ec23a7ae804c | 153 | } |
marc1119 | 0:ec23a7ae804c | 154 | } |
marc1119 | 0:ec23a7ae804c | 155 | |
marc1119 | 0:ec23a7ae804c | 156 | int main() { |
benjaminroy | 6:fd7d91edcf60 | 157 | pc.printf("Starting a coordinator... \n"); |
benjaminroy | 6:fd7d91edcf60 | 158 | |
benjaminroy | 4:393738672d08 | 159 | EthernetInterface eth; |
benjaminroy | 4:393738672d08 | 160 | TCPSocketConnection sock; |
marc1119 | 2:3fbf13ba290e | 161 | |
marc1119 | 1:ceb3f8ba8793 | 162 | reset = 0; |
benjaminroy | 6:fd7d91edcf60 | 163 | wait_ms(1); |
marc1119 | 1:ceb3f8ba8793 | 164 | reset = 1; |
benjaminroy | 6:fd7d91edcf60 | 165 | wait_ms(1); |
marc1119 | 0:ec23a7ae804c | 166 | |
marc1119 | 2:3fbf13ba290e | 167 | readConfigFile(); |
marc1119 | 2:3fbf13ba290e | 168 | |
benjaminroy | 6:fd7d91edcf60 | 169 | xbee.baud(9600); // Set baud rate |
benjaminroy | 6:fd7d91edcf60 | 170 | xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID |
benjaminroy | 6:fd7d91edcf60 | 171 | xbee.printf("ATWR \r"); // |
benjaminroy | 6:fd7d91edcf60 | 172 | xbee.printf("ATCN \r"); |
benjaminroy | 6:fd7d91edcf60 | 173 | |
benjaminroy | 4:393738672d08 | 174 | if (eth.init() != 0) { // Use DHCP |
marc1119 | 3:fbd4b164e8ad | 175 | pc.printf("Erreur d'initialisation du RJ45.\n"); |
benjaminroy | 4:393738672d08 | 176 | } |
benjaminroy | 4:393738672d08 | 177 | if (eth.connect() != 0) { |
marc1119 | 3:fbd4b164e8ad | 178 | pc.printf("Erreur de connection du RJ45\n"); |
benjaminroy | 4:393738672d08 | 179 | } |
benjaminroy | 6:fd7d91edcf60 | 180 | if (sock.connect(serverAddress, portNumber) != 0) { |
marc1119 | 3:fbd4b164e8ad | 181 | pc.printf("Erreur de socket.\n"); |
benjaminroy | 4:393738672d08 | 182 | } |
marc1119 | 2:3fbf13ba290e | 183 | //sock.send_all(buffer, sizeof(buffer)-1); |
marc1119 | 2:3fbf13ba290e | 184 | |
marc1119 | 2:3fbf13ba290e | 185 | //initSocket(); |
marc1119 | 3:fbd4b164e8ad | 186 | |
marc1119 | 3:fbd4b164e8ad | 187 | //Set ticker to blink LED at each 1 sec |
marc1119 | 3:fbd4b164e8ad | 188 | //Ticker blinkLED; |
marc1119 | 3:fbd4b164e8ad | 189 | // blinkLED.attach(&toogleLED, 1); |
benjaminroy | 6:fd7d91edcf60 | 190 | |
marc1119 | 1:ceb3f8ba8793 | 191 | while(1) { |
marc1119 | 2:3fbf13ba290e | 192 | readFrame(); |
benjaminroy | 4:393738672d08 | 193 | //wait_ms(1000); |
benjaminroy | 4:393738672d08 | 194 | //toogleLED(); |
marc1119 | 1:ceb3f8ba8793 | 195 | } |
marc1119 | 0:ec23a7ae804c | 196 | } |
marc1119 | 0:ec23a7ae804c | 197 | |
marc1119 | 2:3fbf13ba290e | 198 |