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