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@12:42986a9c3682, 2017-02-13 (annotated)
- Committer:
- marc1119
- Date:
- Mon Feb 13 13:01:34 2017 +0000
- Revision:
- 12:42986a9c3682
- Parent:
- 11:205ddd5406af
- Child:
- 13:62404d7dab8d
Modifier la fonction toogle light
Who changed what in which revision?
User | Revision | Line number | New 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 | 12:42986a9c3682 | 53 | uint8_t calculateChecksum(uint8_t frameSize, uint8_t* buffer) { |
marc1119 | 12:42986a9c3682 | 54 | uint32_t checksum = 0; |
marc1119 | 12:42986a9c3682 | 55 | uint8_t frameTypeIndex = 3; |
marc1119 | 12:42986a9c3682 | 56 | |
marc1119 | 12:42986a9c3682 | 57 | for (int i = frameTypeIndex; i < frameSize - 1; i++) { |
marc1119 | 12:42986a9c3682 | 58 | checksum += buffer[i]; |
marc1119 | 12:42986a9c3682 | 59 | } |
marc1119 | 12:42986a9c3682 | 60 | |
marc1119 | 12:42986a9c3682 | 61 | return (uint8_t)(0xFF - (checksum & 0xFF)); |
marc1119 | 12:42986a9c3682 | 62 | } |
marc1119 | 12:42986a9c3682 | 63 | |
marc1119 | 3:fbd4b164e8ad | 64 | void toogleLED() { |
marc1119 | 12:42986a9c3682 | 65 | union { |
marc1119 | 12:42986a9c3682 | 66 | uint64_t u64_value; |
marc1119 | 12:42986a9c3682 | 67 | uint8_t u8_value[8]; |
marc1119 | 12:42986a9c3682 | 68 | } address; |
marc1119 | 12:42986a9c3682 | 69 | |
marc1119 | 12:42986a9c3682 | 70 | address.u64_value = routerAddress; |
marc1119 | 12:42986a9c3682 | 71 | |
benjaminroy | 4:393738672d08 | 72 | // Addresse 64 bits = 00 13 A2 00 40 8B 41 6E |
marc1119 | 12:42986a9c3682 | 73 | //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 | 12:42986a9c3682 | 74 | //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 | 12:42986a9c3682 | 75 | uint8_t command[20] = {0}; |
marc1119 | 12:42986a9c3682 | 76 | |
marc1119 | 12:42986a9c3682 | 77 | command[0] = 0x7E; |
marc1119 | 12:42986a9c3682 | 78 | command[1] = 0x00; |
marc1119 | 12:42986a9c3682 | 79 | command[2] = 0x10; |
marc1119 | 12:42986a9c3682 | 80 | command[3] = 0x17; |
marc1119 | 12:42986a9c3682 | 81 | if(boolLED) command[4] = 0x01; |
marc1119 | 12:42986a9c3682 | 82 | else command[4] = 0x02; |
marc1119 | 12:42986a9c3682 | 83 | command[5] = address.u8_value[0]; |
marc1119 | 12:42986a9c3682 | 84 | command[6] = address.u8_value[1]; |
marc1119 | 12:42986a9c3682 | 85 | command[7] = address.u8_value[2]; |
marc1119 | 12:42986a9c3682 | 86 | command[8] = address.u8_value[3]; |
marc1119 | 12:42986a9c3682 | 87 | command[9] = address.u8_value[4]; |
marc1119 | 12:42986a9c3682 | 88 | command[10] = address.u8_value[5]; |
marc1119 | 12:42986a9c3682 | 89 | command[11] = address.u8_value[6]; |
marc1119 | 12:42986a9c3682 | 90 | command[12] = address.u8_value[7]; |
marc1119 | 12:42986a9c3682 | 91 | command[13] = 0xFF; |
marc1119 | 12:42986a9c3682 | 92 | command[14] = 0xFE; |
marc1119 | 12:42986a9c3682 | 93 | command[15] = 0x02; |
marc1119 | 12:42986a9c3682 | 94 | command[16] = 0x44; |
marc1119 | 12:42986a9c3682 | 95 | command[17] = 0x34; |
marc1119 | 12:42986a9c3682 | 96 | if(boolLED) command[4] = 0x05; |
marc1119 | 12:42986a9c3682 | 97 | else command[4] = 0x04; |
marc1119 | 12:42986a9c3682 | 98 | command[19] = calculateChecksum(bufferSize, buffer); |
marc1119 | 12:42986a9c3682 | 99 | |
marc1119 | 12:42986a9c3682 | 100 | // for (uint8_t i = 0; i < 20;) { |
marc1119 | 12:42986a9c3682 | 101 | // if (xbee.writeable()) { |
marc1119 | 12:42986a9c3682 | 102 | // if (boolLED) { |
marc1119 | 12:42986a9c3682 | 103 | // xbee.putc(high[i]); |
marc1119 | 12:42986a9c3682 | 104 | // } else { |
marc1119 | 12:42986a9c3682 | 105 | // xbee.putc(low[i]); |
marc1119 | 12:42986a9c3682 | 106 | // } |
marc1119 | 12:42986a9c3682 | 107 | // i++; |
marc1119 | 12:42986a9c3682 | 108 | // } |
marc1119 | 12:42986a9c3682 | 109 | // } |
marc1119 | 12:42986a9c3682 | 110 | |
marc1119 | 8:9c34eb3cb3ef | 111 | for (uint8_t i = 0; i < 20;) { |
benjaminroy | 4:393738672d08 | 112 | if (xbee.writeable()) { |
marc1119 | 12:42986a9c3682 | 113 | xbee.putc(command[i]); |
marc1119 | 3:fbd4b164e8ad | 114 | i++; |
marc1119 | 3:fbd4b164e8ad | 115 | } |
marc1119 | 3:fbd4b164e8ad | 116 | } |
marc1119 | 3:fbd4b164e8ad | 117 | |
benjaminroy | 4:393738672d08 | 118 | if (boolLED) { |
benjaminroy | 4:393738672d08 | 119 | pc.printf("Et un haut!\n"); |
benjaminroy | 4:393738672d08 | 120 | } else { |
benjaminroy | 4:393738672d08 | 121 | pc.printf("Et un bas!\n"); |
benjaminroy | 4:393738672d08 | 122 | } |
marc1119 | 3:fbd4b164e8ad | 123 | boolLED = !boolLED; |
marc1119 | 3:fbd4b164e8ad | 124 | } |
marc1119 | 3:fbd4b164e8ad | 125 | |
benjaminroy | 11:205ddd5406af | 126 | void sendDataToServer(uint16_t data) { |
benjaminroy | 9:f6f79f136101 | 127 | /*int responseSize; |
benjaminroy | 9:f6f79f136101 | 128 | char buffer[50]; |
benjaminroy | 9:f6f79f136101 | 129 | sprintf(buffer, "Data: %i\n", data); |
marc1119 | 1:ceb3f8ba8793 | 130 | |
benjaminroy | 9:f6f79f136101 | 131 | if (sock.connect(serverAddress, portNumber) != 0) { |
benjaminroy | 9:f6f79f136101 | 132 | pc.printf("Erreur dans la connextion au socket.\n"); |
benjaminroy | 9:f6f79f136101 | 133 | } else { |
benjaminroy | 9:f6f79f136101 | 134 | sock.send_all(buffer, sizeof(buffer)-1); |
benjaminroy | 9:f6f79f136101 | 135 | responseSize = sock.receive(buffer, sizeof(buffer)-1); |
benjaminroy | 9:f6f79f136101 | 136 | |
benjaminroy | 9:f6f79f136101 | 137 | if (responseSize <= 0) { |
benjaminroy | 9:f6f79f136101 | 138 | pc.printf("Error"); |
benjaminroy | 9:f6f79f136101 | 139 | //sock.close(); |
benjaminroy | 9:f6f79f136101 | 140 | } |
benjaminroy | 9:f6f79f136101 | 141 | |
benjaminroy | 9:f6f79f136101 | 142 | buffer[responseSize] = '\0'; |
benjaminroy | 9:f6f79f136101 | 143 | pc.printf("Received %d chars from server:\n%s\n", responseSize, buffer); |
benjaminroy | 9:f6f79f136101 | 144 | }*/ |
marc1119 | 1:ceb3f8ba8793 | 145 | } |
marc1119 | 1:ceb3f8ba8793 | 146 | |
benjaminroy | 4:393738672d08 | 147 | void checkForError(uint8_t* buffer) { |
benjaminroy | 4:393738672d08 | 148 | if (buffer[0] == 0x97) { |
benjaminroy | 4:393738672d08 | 149 | if (buffer[1] == 0x02) { |
marc1119 | 3:fbd4b164e8ad | 150 | pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat bas.\n"); |
marc1119 | 3:fbd4b164e8ad | 151 | } |
benjaminroy | 4:393738672d08 | 152 | else if (buffer[1] == 0x01) { |
marc1119 | 3:fbd4b164e8ad | 153 | pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat haut\n"); |
marc1119 | 3:fbd4b164e8ad | 154 | } |
marc1119 | 3:fbd4b164e8ad | 155 | } |
marc1119 | 3:fbd4b164e8ad | 156 | } |
marc1119 | 3:fbd4b164e8ad | 157 | |
benjaminroy | 10:488877f7f56c | 158 | bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) { |
marc1119 | 2:3fbf13ba290e | 159 | uint32_t checkSum = 0; |
benjaminroy | 4:393738672d08 | 160 | |
benjaminroy | 10:488877f7f56c | 161 | for (int i = 0; i < bufferSize; i++) { |
marc1119 | 2:3fbf13ba290e | 162 | checkSum += buffer[i]; |
benjaminroy | 4:393738672d08 | 163 | } |
benjaminroy | 10:488877f7f56c | 164 | if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) { |
benjaminroy | 10:488877f7f56c | 165 | pc.printf("Erreur dans la transmission de la trame. \n"); |
benjaminroy | 10:488877f7f56c | 166 | return false; |
benjaminroy | 4:393738672d08 | 167 | } |
benjaminroy | 10:488877f7f56c | 168 | return true; |
marc1119 | 2:3fbf13ba290e | 169 | } |
marc1119 | 2:3fbf13ba290e | 170 | |
benjaminroy | 10:488877f7f56c | 171 | // We are storing the 64 bits address of the router. |
marc1119 | 8:9c34eb3cb3ef | 172 | void readRouterAddress(uint8_t* buffer) { |
marc1119 | 8:9c34eb3cb3ef | 173 | union { |
marc1119 | 8:9c34eb3cb3ef | 174 | uint64_t u64_value; |
benjaminroy | 10:488877f7f56c | 175 | uint8_t u8_value[8]; |
benjaminroy | 10:488877f7f56c | 176 | } address; |
marc1119 | 8:9c34eb3cb3ef | 177 | |
benjaminroy | 10:488877f7f56c | 178 | for(int i=0; i < 8; i++) { |
benjaminroy | 10:488877f7f56c | 179 | address.u8_value[i] = buffer[i + 2]; |
marc1119 | 8:9c34eb3cb3ef | 180 | } |
benjaminroy | 10:488877f7f56c | 181 | routerAddress = address.u64_value; |
benjaminroy | 10:488877f7f56c | 182 | |
benjaminroy | 10:488877f7f56c | 183 | //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 | 184 | pc.printf("The router address is %X\n", routerAddress); |
marc1119 | 8:9c34eb3cb3ef | 185 | } |
marc1119 | 8:9c34eb3cb3ef | 186 | |
benjaminroy | 10:488877f7f56c | 187 | void readRouterData(uint8_t bufferSize, uint8_t* buffer) { |
benjaminroy | 10:488877f7f56c | 188 | uint16_t acc[3] = {0}; |
marc1119 | 8:9c34eb3cb3ef | 189 | |
benjaminroy | 10:488877f7f56c | 190 | if (buffer[0] == 0x90 && bufferSize == 18) { // Accelerations (X,Y,Z) |
benjaminroy | 10:488877f7f56c | 191 | for (uint8_t i = 12; i < bufferSize; i += 2) { |
benjaminroy | 10:488877f7f56c | 192 | acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff); |
marc1119 | 2:3fbf13ba290e | 193 | } |
benjaminroy | 10:488877f7f56c | 194 | // pc.printf("Acceleration X: %d\n", acc[0]); |
benjaminroy | 10:488877f7f56c | 195 | // pc.printf("Acceleration Y: %d\n", acc[1]); |
benjaminroy | 10:488877f7f56c | 196 | // pc.printf("Acceleration Z: %d\n", acc[2]); |
benjaminroy | 10:488877f7f56c | 197 | |
benjaminroy | 11:205ddd5406af | 198 | sendDataToServer(acc[0]); |
benjaminroy | 10:488877f7f56c | 199 | |
benjaminroy | 10:488877f7f56c | 200 | } else if (buffer[0] == 0x90 && bufferSize == 13) { // Dry contact |
benjaminroy | 11:205ddd5406af | 201 | // sendDataToServer(buffer[12]); |
benjaminroy | 10:488877f7f56c | 202 | } |
benjaminroy | 10:488877f7f56c | 203 | } |
benjaminroy | 10:488877f7f56c | 204 | |
benjaminroy | 10:488877f7f56c | 205 | void readDataFromRouter(){ |
benjaminroy | 10:488877f7f56c | 206 | while(1) { |
benjaminroy | 10:488877f7f56c | 207 | uint8_t bufferSize = 0; |
benjaminroy | 10:488877f7f56c | 208 | uint8_t buffer[104] = { 0 }; |
benjaminroy | 10:488877f7f56c | 209 | |
benjaminroy | 10:488877f7f56c | 210 | if (xbee.readable() && xbee.getc() == 0x7E) { |
benjaminroy | 10:488877f7f56c | 211 | bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff); |
benjaminroy | 10:488877f7f56c | 212 | |
benjaminroy | 10:488877f7f56c | 213 | for (uint8_t i = 0; i <= bufferSize;) { |
benjaminroy | 10:488877f7f56c | 214 | if (xbee.readable()) { |
benjaminroy | 10:488877f7f56c | 215 | buffer[i] = xbee.getc(); |
benjaminroy | 10:488877f7f56c | 216 | i++; |
benjaminroy | 10:488877f7f56c | 217 | } |
marc1119 | 2:3fbf13ba290e | 218 | } |
benjaminroy | 10:488877f7f56c | 219 | |
benjaminroy | 10:488877f7f56c | 220 | printBuffer(bufferSize, buffer); |
benjaminroy | 10:488877f7f56c | 221 | if (checksumIsValid(bufferSize, buffer)) { |
benjaminroy | 10:488877f7f56c | 222 | readRouterAddress(buffer); |
benjaminroy | 10:488877f7f56c | 223 | readRouterData(bufferSize, buffer); |
marc1119 | 8:9c34eb3cb3ef | 224 | } |
marc1119 | 8:9c34eb3cb3ef | 225 | } |
marc1119 | 0:ec23a7ae804c | 226 | } |
marc1119 | 0:ec23a7ae804c | 227 | } |
marc1119 | 0:ec23a7ae804c | 228 | |
benjaminroy | 11:205ddd5406af | 229 | void isr() {} |
benjaminroy | 11:205ddd5406af | 230 | |
marc1119 | 0:ec23a7ae804c | 231 | int main() { |
benjaminroy | 6:fd7d91edcf60 | 232 | pc.printf("Starting a coordinator... \n"); |
benjaminroy | 10:488877f7f56c | 233 | |
marc1119 | 1:ceb3f8ba8793 | 234 | reset = 0; |
benjaminroy | 6:fd7d91edcf60 | 235 | wait_ms(1); |
marc1119 | 1:ceb3f8ba8793 | 236 | reset = 1; |
benjaminroy | 6:fd7d91edcf60 | 237 | wait_ms(1); |
marc1119 | 0:ec23a7ae804c | 238 | |
marc1119 | 2:3fbf13ba290e | 239 | readConfigFile(); |
marc1119 | 2:3fbf13ba290e | 240 | |
benjaminroy | 6:fd7d91edcf60 | 241 | xbee.baud(9600); // Set baud rate |
benjaminroy | 6:fd7d91edcf60 | 242 | xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID |
benjaminroy | 11:205ddd5406af | 243 | xbee.printf("ATWR \r"); // Save the changes |
benjaminroy | 11:205ddd5406af | 244 | xbee.printf("ATCN \r"); // Apply changes by sending the CN command |
benjaminroy | 6:fd7d91edcf60 | 245 | |
benjaminroy | 4:393738672d08 | 246 | if (eth.init() != 0) { // Use DHCP |
marc1119 | 3:fbd4b164e8ad | 247 | pc.printf("Erreur d'initialisation du RJ45.\n"); |
benjaminroy | 4:393738672d08 | 248 | } |
benjaminroy | 4:393738672d08 | 249 | if (eth.connect() != 0) { |
marc1119 | 3:fbd4b164e8ad | 250 | pc.printf("Erreur de connection du RJ45\n"); |
benjaminroy | 4:393738672d08 | 251 | } |
benjaminroy | 10:488877f7f56c | 252 | pc.printf("IP Address is %s\n", eth.getIPAddress()); |
marc1119 | 2:3fbf13ba290e | 253 | |
benjaminroy | 10:488877f7f56c | 254 | // Démarrage des tâches: |
benjaminroy | 10:488877f7f56c | 255 | Thread _readDataFromRouter(readDataFromRouter); |
benjaminroy | 10:488877f7f56c | 256 | //Thread _toggleRouterLed(toggleLed); |
benjaminroy | 10:488877f7f56c | 257 | while(1) {} |
marc1119 | 0:ec23a7ae804c | 258 | } |
marc1119 | 0:ec23a7ae804c | 259 | |
marc1119 | 2:3fbf13ba290e | 260 |