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@21:37a11c3659cc, 2017-02-14 (annotated)
- Committer:
- benjaminroy
- Date:
- Tue Feb 14 19:17:13 2017 +0000
- Revision:
- 21:37a11c3659cc
- Parent:
- 20:e96c9acfd2ea
Final commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
benjaminroy | 16:cede55e5b075 | 1 | // Titre: S05APP3 |
benjaminroy | 16:cede55e5b075 | 2 | // Auteurs: Benjamin Roy et Marc-Antoine Beaudoin |
benjaminroy | 16:cede55e5b075 | 3 | // Date: 14 février 2017 |
benjaminroy | 16:cede55e5b075 | 4 | // ======================================================= |
benjaminroy | 9:f6f79f136101 | 5 | // ===================== COORDINATOR ===================== |
benjaminroy | 9:f6f79f136101 | 6 | // ======================================================= |
marc1119 | 0:ec23a7ae804c | 7 | #include "EthernetInterface.h" |
marc1119 | 0:ec23a7ae804c | 8 | #include "ConfigFile.h" |
marc1119 | 0:ec23a7ae804c | 9 | #include "mbed.h" |
benjaminroy | 9:f6f79f136101 | 10 | #include "rtos.h" |
marc1119 | 0:ec23a7ae804c | 11 | |
benjaminroy | 15:4c748df01e5b | 12 | AnalogOut errorLed(p18); |
marc1119 | 0:ec23a7ae804c | 13 | DigitalOut reset(p8); |
benjaminroy | 9:f6f79f136101 | 14 | EthernetInterface eth; |
benjaminroy | 19:19caa5f5c5f5 | 15 | Mutex mutex; |
marc1119 | 8:9c34eb3cb3ef | 16 | Serial xbee(p13, p14); // tx, rx |
marc1119 | 1:ceb3f8ba8793 | 17 | Serial pc(USBTX, USBRX); // tx, rx |
benjaminroy | 18:0c71241eab4f | 18 | TCPSocketConnection socket; |
benjaminroy | 11:205ddd5406af | 19 | Ticker ticker1; |
benjaminroy | 14:8b59a90725bc | 20 | Thread *t1; |
marc1119 | 0:ec23a7ae804c | 21 | |
benjaminroy | 16:cede55e5b075 | 22 | /* Boîte aux lettres */ |
benjaminroy | 13:62404d7dab8d | 23 | typedef struct { |
benjaminroy | 14:8b59a90725bc | 24 | uint8_t type; |
benjaminroy | 14:8b59a90725bc | 25 | char strAccelerationX[15]; |
benjaminroy | 14:8b59a90725bc | 26 | char strAccelerationY[15]; |
benjaminroy | 14:8b59a90725bc | 27 | char strAccelerationZ[15]; |
benjaminroy | 14:8b59a90725bc | 28 | char strDryContact[15]; |
benjaminroy | 13:62404d7dab8d | 29 | } mail_t; |
benjaminroy | 13:62404d7dab8d | 30 | |
benjaminroy | 19:19caa5f5c5f5 | 31 | Mail<mail_t, 20> mail_box; |
benjaminroy | 13:62404d7dab8d | 32 | |
benjaminroy | 14:8b59a90725bc | 33 | uint8_t routerAddress[8] = { 0 }; // Should be 00 13 A2 00 40 8B 41 6E |
benjaminroy | 18:0c71241eab4f | 34 | uint8_t startDelimiter = 0x7E; |
benjaminroy | 6:fd7d91edcf60 | 35 | uint16_t portNumber = 0; |
benjaminroy | 6:fd7d91edcf60 | 36 | uint16_t panId = 0; |
benjaminroy | 6:fd7d91edcf60 | 37 | char serverAddress[32]; |
marc1119 | 8:9c34eb3cb3ef | 38 | char panIdChar[5]; |
benjaminroy | 9:f6f79f136101 | 39 | char portNbr[5]; |
marc1119 | 3:fbd4b164e8ad | 40 | |
benjaminroy | 16:cede55e5b075 | 41 | /* |
benjaminroy | 16:cede55e5b075 | 42 | * Imprime le buffer à l'écran pour des fins de déboguage: |
benjaminroy | 16:cede55e5b075 | 43 | */ |
benjaminroy | 6:fd7d91edcf60 | 44 | void printBuffer(uint8_t bufferSize, uint8_t* buffer) { |
marc1119 | 8:9c34eb3cb3ef | 45 | for(uint8_t k = 0; k <= bufferSize; k++) { |
benjaminroy | 6:fd7d91edcf60 | 46 | pc.printf("%X-", buffer[k]); |
benjaminroy | 6:fd7d91edcf60 | 47 | } |
benjaminroy | 6:fd7d91edcf60 | 48 | printf("\n"); |
benjaminroy | 6:fd7d91edcf60 | 49 | } |
benjaminroy | 6:fd7d91edcf60 | 50 | |
benjaminroy | 16:cede55e5b075 | 51 | /* |
benjaminroy | 16:cede55e5b075 | 52 | * Envoyer et recevoir des données via le protocole Xbee: |
benjaminroy | 16:cede55e5b075 | 53 | */ |
benjaminroy | 17:7ae8f91f46a2 | 54 | uint8_t* readDataFromXbee(uint8_t bufferSize) { |
benjaminroy | 19:19caa5f5c5f5 | 55 | mutex.lock(); |
benjaminroy | 17:7ae8f91f46a2 | 56 | uint8_t buffer[104] = { 0 }; |
benjaminroy | 17:7ae8f91f46a2 | 57 | for (uint8_t i = 0; i <= bufferSize;) { |
benjaminroy | 17:7ae8f91f46a2 | 58 | if (xbee.readable()) { |
benjaminroy | 17:7ae8f91f46a2 | 59 | buffer[i] = xbee.getc(); |
benjaminroy | 17:7ae8f91f46a2 | 60 | i++; |
benjaminroy | 17:7ae8f91f46a2 | 61 | } |
benjaminroy | 17:7ae8f91f46a2 | 62 | } |
benjaminroy | 19:19caa5f5c5f5 | 63 | mutex.unlock(); |
benjaminroy | 17:7ae8f91f46a2 | 64 | return buffer; |
benjaminroy | 17:7ae8f91f46a2 | 65 | } |
benjaminroy | 16:cede55e5b075 | 66 | void sendDataToXbee(uint8_t bufferSize, uint8_t* buffer) { |
benjaminroy | 16:cede55e5b075 | 67 | for (uint8_t i = 0; i < bufferSize;) { |
benjaminroy | 16:cede55e5b075 | 68 | if (xbee.writeable()) { |
benjaminroy | 16:cede55e5b075 | 69 | xbee.putc(buffer[i]); |
benjaminroy | 16:cede55e5b075 | 70 | i++; |
benjaminroy | 16:cede55e5b075 | 71 | } |
benjaminroy | 16:cede55e5b075 | 72 | } |
benjaminroy | 15:4c748df01e5b | 73 | } |
benjaminroy | 15:4c748df01e5b | 74 | |
benjaminroy | 16:cede55e5b075 | 75 | /* |
benjaminroy | 16:cede55e5b075 | 76 | * Lecture du fichier de configuration: |
benjaminroy | 16:cede55e5b075 | 77 | */ |
benjaminroy | 6:fd7d91edcf60 | 78 | void readConfigFile() { |
benjaminroy | 6:fd7d91edcf60 | 79 | LocalFileSystem local("local"); |
benjaminroy | 6:fd7d91edcf60 | 80 | ConfigFile cfg; |
benjaminroy | 6:fd7d91edcf60 | 81 | char *serverAddressStr = "serverAddr"; |
benjaminroy | 6:fd7d91edcf60 | 82 | char *portNumberStr = "portNb"; |
benjaminroy | 6:fd7d91edcf60 | 83 | char *panIdStr = "panID"; |
benjaminroy | 6:fd7d91edcf60 | 84 | |
benjaminroy | 6:fd7d91edcf60 | 85 | if (!cfg.read("/local/input.cfg")) { |
benjaminroy | 16:cede55e5b075 | 86 | error("Erreur dans la lecture du fichier de configuration...\n"); |
benjaminroy | 6:fd7d91edcf60 | 87 | } else { |
benjaminroy | 6:fd7d91edcf60 | 88 | cfg.getValue(panIdStr, &panIdChar[0], sizeof(panIdChar)); |
benjaminroy | 6:fd7d91edcf60 | 89 | cfg.getValue(serverAddressStr, &serverAddress[0], sizeof(serverAddress)); |
benjaminroy | 6:fd7d91edcf60 | 90 | cfg.getValue(portNumberStr, &portNbr[0], sizeof(portNbr)); |
benjaminroy | 6:fd7d91edcf60 | 91 | |
benjaminroy | 6:fd7d91edcf60 | 92 | portNumber = (uint16_t)strtol(portNbr, NULL, 10); |
benjaminroy | 6:fd7d91edcf60 | 93 | panId = (uint16_t)strtol(panIdChar, NULL, 10); |
benjaminroy | 10:488877f7f56c | 94 | // printf("The server address is %s\n", serverAddress); |
benjaminroy | 10:488877f7f56c | 95 | // printf("The port number is %i\n", portNumber); |
benjaminroy | 10:488877f7f56c | 96 | // printf("The PAN ID is %i\n", panId); |
benjaminroy | 6:fd7d91edcf60 | 97 | } |
benjaminroy | 6:fd7d91edcf60 | 98 | } |
benjaminroy | 6:fd7d91edcf60 | 99 | |
benjaminroy | 16:cede55e5b075 | 100 | /* |
benjaminroy | 16:cede55e5b075 | 101 | * Détection et gestion des erreurs (allumer une LED pendant 1 seconde lorsqu'une erreur est détectée): |
benjaminroy | 16:cede55e5b075 | 102 | */ |
benjaminroy | 17:7ae8f91f46a2 | 103 | void printError(char* buffer) { |
benjaminroy | 17:7ae8f91f46a2 | 104 | pc.printf(buffer); |
benjaminroy | 16:cede55e5b075 | 105 | errorLed.write(3.3); |
benjaminroy | 16:cede55e5b075 | 106 | wait(1); |
benjaminroy | 16:cede55e5b075 | 107 | errorLed.write(0); |
marc1119 | 12:42986a9c3682 | 108 | } |
marc1119 | 1:ceb3f8ba8793 | 109 | |
benjaminroy | 15:4c748df01e5b | 110 | void readATCommandResponse(uint8_t* buffer) { |
benjaminroy | 18:0c71241eab4f | 111 | if (buffer[4] == 0x01) printError("AT Command Response: Error.\n"); |
benjaminroy | 16:cede55e5b075 | 112 | else if (buffer[4] == 0x02) printError("AT Command Response: Invalid Command.\n"); |
benjaminroy | 16:cede55e5b075 | 113 | else if (buffer[4] == 0x03) printError("AT Command Response: Invalid Parameter.\n"); |
benjaminroy | 16:cede55e5b075 | 114 | else if (buffer[4] == 0x04) printError("AT Command Response: Tx Failure.\n"); |
benjaminroy | 15:4c748df01e5b | 115 | } |
benjaminroy | 15:4c748df01e5b | 116 | |
benjaminroy | 15:4c748df01e5b | 117 | void readRemoteATCommandResponse(uint8_t* buffer) { |
benjaminroy | 18:0c71241eab4f | 118 | if (buffer[14] == 0x01) printError("Remote AT Command Response: Error.\n"); |
benjaminroy | 16:cede55e5b075 | 119 | else if (buffer[14] == 0x02) printError("Remote AT Command Response: Invalid Command.\n"); |
benjaminroy | 16:cede55e5b075 | 120 | else if (buffer[14] == 0x03) printError("Remote AT Command Response: Invalid Parameter.\n"); |
benjaminroy | 16:cede55e5b075 | 121 | else if (buffer[14] == 0x04) printError("Remote AT Command Response: Tx Failure.\n"); |
benjaminroy | 15:4c748df01e5b | 122 | } |
benjaminroy | 15:4c748df01e5b | 123 | |
benjaminroy | 15:4c748df01e5b | 124 | void readTransmitStatus(uint8_t* buffer) { |
benjaminroy | 18:0c71241eab4f | 125 | if (buffer[5] == 0x01) pc.printf("Transmit Status: An expedted MAC acknowledgement never occured. \n"); |
benjaminroy | 15:4c748df01e5b | 126 | else if (buffer[5] == 0x02) pc.printf("Transmit Status: CCA failure. \n"); |
benjaminroy | 15:4c748df01e5b | 127 | else if (buffer[5] == 0x03) pc.printf("Transmit Status: Packet was purgedwithoutbeing transmitted. \n"); |
benjaminroy | 15:4c748df01e5b | 128 | else if (buffer[5] == 0x04) pc.printf("Transmit Status: Physical error on the interface with the WiFi transceiver. \n"); |
benjaminroy | 15:4c748df01e5b | 129 | else if (buffer[5] == 0x18) pc.printf("Transmit Status: No buffers. \n"); |
benjaminroy | 15:4c748df01e5b | 130 | else if (buffer[5] == 0x21) pc.printf("Transmit Status: Expected networkacknowledgement never occured. \n"); |
benjaminroy | 15:4c748df01e5b | 131 | else if (buffer[5] == 0x22) pc.printf("Transmit Status: Not joined to network. \n"); |
benjaminroy | 15:4c748df01e5b | 132 | else if (buffer[5] == 0x23) pc.printf("Transmit Status: Self-addressed. \n"); |
benjaminroy | 15:4c748df01e5b | 133 | else if (buffer[5] == 0x24) pc.printf("Transmit Status: Address not found. \n"); |
benjaminroy | 15:4c748df01e5b | 134 | else if (buffer[5] == 0x25) pc.printf("Transmit Status: Route not found. \n"); |
benjaminroy | 15:4c748df01e5b | 135 | else if (buffer[5] == 0x26) pc.printf("Transmit Status: Broadcast relay was not heard. \n"); |
benjaminroy | 15:4c748df01e5b | 136 | else if (buffer[5] == 0x2B) pc.printf("Transmit Status: Invalid binding table index. \n"); |
benjaminroy | 15:4c748df01e5b | 137 | else if (buffer[5] == 0x2C) pc.printf("Transmit Status: Invalid Endpoint. \n"); |
benjaminroy | 15:4c748df01e5b | 138 | else if (buffer[5] == 0x31) pc.printf("Transmit Status: A software error occurred. \n"); |
benjaminroy | 15:4c748df01e5b | 139 | else if (buffer[5] == 0x32) pc.printf("Transmit Status: Resource Error. \n"); |
benjaminroy | 15:4c748df01e5b | 140 | else if (buffer[5] == 0x74) pc.printf("Transmit Status: Data payload too large. \n"); |
benjaminroy | 15:4c748df01e5b | 141 | else if (buffer[5] == 0x76) pc.printf("Transmit Status: Client socket creationat attempt failed. \n"); |
benjaminroy | 15:4c748df01e5b | 142 | } |
benjaminroy | 15:4c748df01e5b | 143 | |
benjaminroy | 15:4c748df01e5b | 144 | void readModemStatus(uint8_t* buffer) { |
benjaminroy | 18:0c71241eab4f | 145 | if (buffer[1] == 0x00) pc.printf("Modem status: Hardware reset.\n"); |
benjaminroy | 16:cede55e5b075 | 146 | else if (buffer[1] == 0x01) printError("Modem status: Watchdog timer reset.\n"); |
benjaminroy | 16:cede55e5b075 | 147 | else if (buffer[1] == 0x02) printError("Modem status: Joined network.\n"); |
benjaminroy | 16:cede55e5b075 | 148 | else if (buffer[1] == 0x03) printError("Modem status: Disassociated.\n"); |
benjaminroy | 16:cede55e5b075 | 149 | else if (buffer[1] == 0x04) printError("Modem status: Configuration error/synchronization.\n"); |
benjaminroy | 16:cede55e5b075 | 150 | else if (buffer[1] == 0x05) printError("Modem status: Coordinator realignment.\n"); |
benjaminroy | 16:cede55e5b075 | 151 | else if (buffer[1] == 0x06) pc.printf("Modem status: Coordinator started.\n"); |
benjaminroy | 16:cede55e5b075 | 152 | else if (buffer[1] == 0x07) printError("Modem status: Network security key updated.\n"); |
benjaminroy | 16:cede55e5b075 | 153 | else if (buffer[1] == 0x08) printError("Modem status: Network woke up.\n"); |
benjaminroy | 16:cede55e5b075 | 154 | else if (buffer[1] == 0x0C) printError("Modem status: Network went to sleep.\n"); |
benjaminroy | 16:cede55e5b075 | 155 | else if (buffer[1] == 0x0E) printError("Modem status: Device cloud connected.\n"); |
benjaminroy | 16:cede55e5b075 | 156 | else if (buffer[1] == 0x0F) printError("Modem status: Device cloud disconnected.\n"); |
benjaminroy | 16:cede55e5b075 | 157 | else if (buffer[1] == 0x11) printError("Modem status: Modem configurationchanged while join in progress.\n"); |
benjaminroy | 16:cede55e5b075 | 158 | else if (buffer[1] == 0x80) printError("Modem status: Stack error (80+).\n"); |
benjaminroy | 16:cede55e5b075 | 159 | else if (buffer[1] == 0x82) printError("Modem status: Send/join command issuedwithout connecting from AP.\n"); |
benjaminroy | 16:cede55e5b075 | 160 | else if (buffer[1] == 0x83) printError("Modem status: Access point not found.\n"); |
benjaminroy | 16:cede55e5b075 | 161 | else if (buffer[1] == 0x84) printError("Modem status: PSK not configured.\n"); |
benjaminroy | 16:cede55e5b075 | 162 | } |
benjaminroy | 16:cede55e5b075 | 163 | |
benjaminroy | 16:cede55e5b075 | 164 | /* |
benjaminroy | 16:cede55e5b075 | 165 | * Calculer et vérifier le checksum des trames reçues: |
benjaminroy | 16:cede55e5b075 | 166 | */ |
benjaminroy | 16:cede55e5b075 | 167 | uint8_t calculateChecksum(uint8_t frameTypeIndex, uint8_t frameSize, uint8_t* buffer) { |
benjaminroy | 16:cede55e5b075 | 168 | char checksum = 0; |
benjaminroy | 16:cede55e5b075 | 169 | |
benjaminroy | 16:cede55e5b075 | 170 | for (int i = frameTypeIndex; i < frameSize - 1; i++) { |
benjaminroy | 16:cede55e5b075 | 171 | checksum += buffer[i]; |
benjaminroy | 15:4c748df01e5b | 172 | } |
benjaminroy | 16:cede55e5b075 | 173 | return (0xFF - checksum); |
marc1119 | 3:fbd4b164e8ad | 174 | } |
marc1119 | 3:fbd4b164e8ad | 175 | |
benjaminroy | 10:488877f7f56c | 176 | bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) { |
marc1119 | 2:3fbf13ba290e | 177 | uint32_t checkSum = 0; |
benjaminroy | 4:393738672d08 | 178 | |
benjaminroy | 10:488877f7f56c | 179 | for (int i = 0; i < bufferSize; i++) { |
marc1119 | 2:3fbf13ba290e | 180 | checkSum += buffer[i]; |
benjaminroy | 4:393738672d08 | 181 | } |
benjaminroy | 10:488877f7f56c | 182 | if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) { |
benjaminroy | 17:7ae8f91f46a2 | 183 | pc.printf("Erreur dans la transmission de la trame --> "); |
benjaminroy | 17:7ae8f91f46a2 | 184 | printBuffer(bufferSize, buffer); |
benjaminroy | 10:488877f7f56c | 185 | return false; |
benjaminroy | 4:393738672d08 | 186 | } |
benjaminroy | 10:488877f7f56c | 187 | return true; |
marc1119 | 2:3fbf13ba290e | 188 | } |
marc1119 | 2:3fbf13ba290e | 189 | |
benjaminroy | 16:cede55e5b075 | 190 | /* |
benjaminroy | 18:0c71241eab4f | 191 | * Faire allumer une DEL, reliée à un des ports du XBEE (DIO) du Routeur, en utilisant une commande de configuration à distance provenant du Coordinateur |
benjaminroy | 18:0c71241eab4f | 192 | * HIGH: {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3C}; |
benjaminroy | 18:0c71241eab4f | 193 | * LOW: {0x7E, 0x00, 0x10, 0x17, 0x02, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3C}; |
benjaminroy | 16:cede55e5b075 | 194 | */ |
benjaminroy | 16:cede55e5b075 | 195 | void toggleRouterLed() { |
benjaminroy | 16:cede55e5b075 | 196 | bool led = false; |
benjaminroy | 18:0c71241eab4f | 197 | uint8_t command[20] = { 0 }; |
benjaminroy | 16:cede55e5b075 | 198 | |
benjaminroy | 18:0c71241eab4f | 199 | Thread::signal_wait(0x2); // Attendre que l'adresse du noeud rooteur soit connue |
benjaminroy | 18:0c71241eab4f | 200 | command[0] = startDelimiter; |
benjaminroy | 16:cede55e5b075 | 201 | command[1] = 0x00; |
benjaminroy | 16:cede55e5b075 | 202 | command[2] = 0x10; |
benjaminroy | 16:cede55e5b075 | 203 | command[3] = 0x17; |
benjaminroy | 18:0c71241eab4f | 204 | for (uint8_t i = 0; i < sizeof(routerAddress); i++) { |
benjaminroy | 18:0c71241eab4f | 205 | command[i + 5] = routerAddress[i]; |
benjaminroy | 18:0c71241eab4f | 206 | } |
benjaminroy | 16:cede55e5b075 | 207 | command[13] = 0xFF; |
benjaminroy | 16:cede55e5b075 | 208 | command[14] = 0xFE; |
benjaminroy | 16:cede55e5b075 | 209 | command[15] = 0x02; |
benjaminroy | 16:cede55e5b075 | 210 | command[16] = 0x44; |
benjaminroy | 16:cede55e5b075 | 211 | command[17] = 0x34; |
benjaminroy | 16:cede55e5b075 | 212 | |
benjaminroy | 16:cede55e5b075 | 213 | while(1) { |
benjaminroy | 16:cede55e5b075 | 214 | Thread::signal_wait(0x1); // Période: 1 Hz |
benjaminroy | 16:cede55e5b075 | 215 | |
benjaminroy | 16:cede55e5b075 | 216 | if (led) { |
benjaminroy | 16:cede55e5b075 | 217 | command[4] = 0x01; |
benjaminroy | 16:cede55e5b075 | 218 | command[18] = 0x05; |
benjaminroy | 16:cede55e5b075 | 219 | } else { |
benjaminroy | 16:cede55e5b075 | 220 | command[4] = 0x02; |
benjaminroy | 16:cede55e5b075 | 221 | command[18] = 0x04; |
benjaminroy | 16:cede55e5b075 | 222 | } |
benjaminroy | 18:0c71241eab4f | 223 | command[19] = calculateChecksum(3, sizeof(command), command); |
benjaminroy | 16:cede55e5b075 | 224 | |
benjaminroy | 18:0c71241eab4f | 225 | sendDataToXbee(sizeof(command), command); |
benjaminroy | 16:cede55e5b075 | 226 | led = !led; |
benjaminroy | 16:cede55e5b075 | 227 | } |
benjaminroy | 16:cede55e5b075 | 228 | } |
benjaminroy | 16:cede55e5b075 | 229 | |
benjaminroy | 16:cede55e5b075 | 230 | void sendDataToServer() { |
benjaminroy | 16:cede55e5b075 | 231 | while(1) { |
benjaminroy | 16:cede55e5b075 | 232 | osEvent evt = mail_box.get(); |
benjaminroy | 16:cede55e5b075 | 233 | |
benjaminroy | 16:cede55e5b075 | 234 | if (evt.status == osEventMail) { |
benjaminroy | 16:cede55e5b075 | 235 | mail_t *mail = (mail_t*)evt.value.p; |
benjaminroy | 16:cede55e5b075 | 236 | |
benjaminroy | 16:cede55e5b075 | 237 | int responseSize = 0; |
benjaminroy | 16:cede55e5b075 | 238 | char buffer[50] = { 0 }; |
benjaminroy | 16:cede55e5b075 | 239 | |
benjaminroy | 16:cede55e5b075 | 240 | if (mail->type == 0) { |
benjaminroy | 16:cede55e5b075 | 241 | sprintf(buffer, "%s, %s, %s\0", mail->strAccelerationX, mail->strAccelerationY, mail->strAccelerationZ); |
benjaminroy | 16:cede55e5b075 | 242 | } else { |
benjaminroy | 16:cede55e5b075 | 243 | sprintf(buffer, "%s\0", mail->strDryContact); |
benjaminroy | 16:cede55e5b075 | 244 | } |
benjaminroy | 16:cede55e5b075 | 245 | |
benjaminroy | 21:37a11c3659cc | 246 | printf("Envoye des serveurs: "); |
benjaminroy | 20:e96c9acfd2ea | 247 | printBuffer(buffer, sizeof(buffer)-1); |
benjaminroy | 18:0c71241eab4f | 248 | socket.send_all(buffer, sizeof(buffer)-1); |
benjaminroy | 18:0c71241eab4f | 249 | responseSize = socket.receive(buffer, sizeof(buffer)-1); |
benjaminroy | 16:cede55e5b075 | 250 | buffer[responseSize] = '\0'; |
benjaminroy | 19:19caa5f5c5f5 | 251 | pc.printf("Server: %s\n", buffer); |
benjaminroy | 16:cede55e5b075 | 252 | |
benjaminroy | 16:cede55e5b075 | 253 | mail_box.free(mail); |
benjaminroy | 16:cede55e5b075 | 254 | } |
benjaminroy | 16:cede55e5b075 | 255 | } |
benjaminroy | 16:cede55e5b075 | 256 | } |
benjaminroy | 16:cede55e5b075 | 257 | |
benjaminroy | 16:cede55e5b075 | 258 | /* |
benjaminroy | 17:7ae8f91f46a2 | 259 | * Lire et décomposer les trames reçues (adresse, données, status): |
benjaminroy | 16:cede55e5b075 | 260 | */ |
benjaminroy | 18:0c71241eab4f | 261 | void readRouterAddress(uint8_t* buffer) { |
benjaminroy | 18:0c71241eab4f | 262 | for (uint8_t i = 0; i < 8; i++) { |
benjaminroy | 18:0c71241eab4f | 263 | routerAddress[i] = buffer[i + 1]; |
benjaminroy | 18:0c71241eab4f | 264 | } |
benjaminroy | 15:4c748df01e5b | 265 | t1->signal_set(0x02); |
marc1119 | 8:9c34eb3cb3ef | 266 | } |
marc1119 | 8:9c34eb3cb3ef | 267 | |
benjaminroy | 10:488877f7f56c | 268 | void readRouterData(uint8_t bufferSize, uint8_t* buffer) { |
benjaminroy | 10:488877f7f56c | 269 | uint16_t acc[3] = {0}; |
marc1119 | 8:9c34eb3cb3ef | 270 | |
benjaminroy | 16:cede55e5b075 | 271 | if (buffer[0] == 0x90 && bufferSize == 18) { // Ajouter les données reçues par l'accéléromètre à la boîte aux lettres: |
benjaminroy | 10:488877f7f56c | 272 | for (uint8_t i = 12; i < bufferSize; i += 2) { |
benjaminroy | 10:488877f7f56c | 273 | acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff); |
marc1119 | 2:3fbf13ba290e | 274 | } |
benjaminroy | 13:62404d7dab8d | 275 | mail_t *mail = mail_box.alloc(); |
benjaminroy | 14:8b59a90725bc | 276 | mail->type = 0; |
benjaminroy | 19:19caa5f5c5f5 | 277 | sprintf(mail->strAccelerationX, "X:%i\0", acc[0]); |
benjaminroy | 19:19caa5f5c5f5 | 278 | sprintf(mail->strAccelerationY, "Y:%i\0", acc[1]); |
benjaminroy | 19:19caa5f5c5f5 | 279 | sprintf(mail->strAccelerationZ, "Z:%i\0", acc[2]); |
benjaminroy | 13:62404d7dab8d | 280 | mail_box.put(mail); |
benjaminroy | 13:62404d7dab8d | 281 | |
benjaminroy | 16:cede55e5b075 | 282 | } else if (buffer[0] == 0x90 && bufferSize == 13) { // Ajouter les données reçues par le contact sec à la boîte aux lettres: |
benjaminroy | 14:8b59a90725bc | 283 | mail_t *mail = mail_box.alloc(); |
benjaminroy | 14:8b59a90725bc | 284 | mail->type = 1; |
benjaminroy | 19:19caa5f5c5f5 | 285 | sprintf(mail->strDryContact, "Contact: %i\0", buffer[12]); |
benjaminroy | 14:8b59a90725bc | 286 | mail_box.put(mail); |
benjaminroy | 10:488877f7f56c | 287 | } |
benjaminroy | 10:488877f7f56c | 288 | } |
benjaminroy | 10:488877f7f56c | 289 | |
benjaminroy | 10:488877f7f56c | 290 | void readDataFromRouter(){ |
benjaminroy | 10:488877f7f56c | 291 | while(1) { |
benjaminroy | 18:0c71241eab4f | 292 | if (xbee.readable() && xbee.getc() == startDelimiter) { |
benjaminroy | 17:7ae8f91f46a2 | 293 | uint8_t buffer[104] = { 0 }; |
benjaminroy | 17:7ae8f91f46a2 | 294 | uint8_t bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff); |
benjaminroy | 17:7ae8f91f46a2 | 295 | memcpy(buffer, readDataFromXbee(bufferSize), bufferSize + 1); |
benjaminroy | 10:488877f7f56c | 296 | |
benjaminroy | 10:488877f7f56c | 297 | if (checksumIsValid(bufferSize, buffer)) { |
benjaminroy | 16:cede55e5b075 | 298 | if (buffer[0] == 0x90) { // Frame Type: |
benjaminroy | 16:cede55e5b075 | 299 | printBuffer(bufferSize, buffer); |
benjaminroy | 14:8b59a90725bc | 300 | readRouterAddress(buffer); |
benjaminroy | 14:8b59a90725bc | 301 | readRouterData(bufferSize, buffer); |
benjaminroy | 16:cede55e5b075 | 302 | } else if (buffer[0] == 0x8A) { // Frame Type: Modem Status |
benjaminroy | 15:4c748df01e5b | 303 | readModemStatus(buffer); |
benjaminroy | 17:7ae8f91f46a2 | 304 | } else if (buffer[0] == 0x8B) { // Frame Type: Transmit Status |
benjaminroy | 16:cede55e5b075 | 305 | } else if (buffer[0] == 0x97) { // Frame Type: Remote AT Command Response |
benjaminroy | 15:4c748df01e5b | 306 | readRemoteATCommandResponse(buffer); |
benjaminroy | 16:cede55e5b075 | 307 | } else if (buffer[0] == 0x09) { // Frame Type: AT Command Response |
benjaminroy | 17:7ae8f91f46a2 | 308 | readATCommandResponse(buffer); |
benjaminroy | 15:4c748df01e5b | 309 | } |
marc1119 | 8:9c34eb3cb3ef | 310 | } |
marc1119 | 8:9c34eb3cb3ef | 311 | } |
marc1119 | 0:ec23a7ae804c | 312 | } |
marc1119 | 0:ec23a7ae804c | 313 | } |
marc1119 | 0:ec23a7ae804c | 314 | |
benjaminroy | 16:cede55e5b075 | 315 | /* |
benjaminroy | 16:cede55e5b075 | 316 | * Poser le ID du réseau PAN à rejoindre: |
benjaminroy | 16:cede55e5b075 | 317 | */ |
benjaminroy | 15:4c748df01e5b | 318 | void setCoordinatorPanId(uint16_t panId) { |
benjaminroy | 18:0c71241eab4f | 319 | char _8bitsPanId[2] = { (panId >> 8) & 0xFF, panId & 0xFF }; |
benjaminroy | 16:cede55e5b075 | 320 | |
benjaminroy | 18:0c71241eab4f | 321 | uint8_t setPanIdBuffer[] = { startDelimiter, 0x00, 0x06, 0x09, 0x01, 0x49, 0x44, _8bitsPanId[0], _8bitsPanId[1], 0x00 }; |
benjaminroy | 18:0c71241eab4f | 322 | uint8_t saveChangesBuffer[] = { startDelimiter, 0x00, 0x04, 0x09, 0x02, 0x57, 0x52, 0x4B }; |
benjaminroy | 18:0c71241eab4f | 323 | uint8_t applyChangesBuffer[] = { startDelimiter, 0x00, 0x04, 0x09, 0x03, 0x41, 0x43, 0x6F }; |
benjaminroy | 18:0c71241eab4f | 324 | setPanIdBuffer[sizeof(setPanIdBuffer) - 1] = calculateChecksum(0, sizeof(setPanIdBuffer), setPanIdBuffer); // Calculate the checksum |
benjaminroy | 18:0c71241eab4f | 325 | |
benjaminroy | 18:0c71241eab4f | 326 | sendDataToXbee(sizeof(setPanIdBuffer), setPanIdBuffer); // Set the 64-bit PAN ID |
benjaminroy | 18:0c71241eab4f | 327 | sendDataToXbee(sizeof(saveChangesBuffer), saveChangesBuffer); // Save the changes |
benjaminroy | 18:0c71241eab4f | 328 | sendDataToXbee(sizeof(applyChangesBuffer), applyChangesBuffer); // Apply changes by sending the CN command |
benjaminroy | 15:4c748df01e5b | 329 | } |
benjaminroy | 15:4c748df01e5b | 330 | |
benjaminroy | 16:cede55e5b075 | 331 | /* |
benjaminroy | 16:cede55e5b075 | 332 | * Envoyer un signal au thread qui fait clignoter la DEL du noeud routeur: |
benjaminroy | 16:cede55e5b075 | 333 | */ |
benjaminroy | 18:0c71241eab4f | 334 | void isr() { t1->signal_set(0x1); } |
benjaminroy | 11:205ddd5406af | 335 | |
benjaminroy | 16:cede55e5b075 | 336 | // -------------------------------------------------------------------------------------------- |
benjaminroy | 16:cede55e5b075 | 337 | // -------------------------------------------------------------------------------------------- |
benjaminroy | 16:cede55e5b075 | 338 | // -------------------------------------------------------------------------------------------- |
benjaminroy | 16:cede55e5b075 | 339 | // -------------------------------------------------------------------------------------------- |
marc1119 | 0:ec23a7ae804c | 340 | int main() { |
benjaminroy | 6:fd7d91edcf60 | 341 | pc.printf("Starting a coordinator... \n"); |
benjaminroy | 10:488877f7f56c | 342 | |
marc1119 | 1:ceb3f8ba8793 | 343 | reset = 0; |
benjaminroy | 6:fd7d91edcf60 | 344 | wait_ms(1); |
marc1119 | 1:ceb3f8ba8793 | 345 | reset = 1; |
benjaminroy | 6:fd7d91edcf60 | 346 | wait_ms(1); |
marc1119 | 0:ec23a7ae804c | 347 | |
benjaminroy | 16:cede55e5b075 | 348 | readConfigFile(); |
benjaminroy | 15:4c748df01e5b | 349 | setCoordinatorPanId(panId); |
benjaminroy | 15:4c748df01e5b | 350 | |
benjaminroy | 4:393738672d08 | 351 | if (eth.init() != 0) { // Use DHCP |
marc1119 | 3:fbd4b164e8ad | 352 | pc.printf("Erreur d'initialisation du RJ45.\n"); |
benjaminroy | 4:393738672d08 | 353 | } |
benjaminroy | 4:393738672d08 | 354 | if (eth.connect() != 0) { |
marc1119 | 3:fbd4b164e8ad | 355 | pc.printf("Erreur de connection du RJ45\n"); |
benjaminroy | 17:7ae8f91f46a2 | 356 | } else { |
benjaminroy | 17:7ae8f91f46a2 | 357 | pc.printf("IP Address is %s\n", eth.getIPAddress()); |
benjaminroy | 4:393738672d08 | 358 | } |
marc1119 | 2:3fbf13ba290e | 359 | |
benjaminroy | 19:19caa5f5c5f5 | 360 | int numberOfRetries = 0; |
benjaminroy | 18:0c71241eab4f | 361 | while (socket.connect(serverAddress, portNumber) != 0) { |
benjaminroy | 13:62404d7dab8d | 362 | if (numberOfRetries == 5) { |
benjaminroy | 13:62404d7dab8d | 363 | error("Erreur dans la connection au socket.\n"); |
benjaminroy | 13:62404d7dab8d | 364 | } |
benjaminroy | 13:62404d7dab8d | 365 | numberOfRetries++; |
benjaminroy | 19:19caa5f5c5f5 | 366 | } |
benjaminroy | 13:62404d7dab8d | 367 | |
benjaminroy | 10:488877f7f56c | 368 | // Démarrage des tâches: |
benjaminroy | 10:488877f7f56c | 369 | Thread _readDataFromRouter(readDataFromRouter); |
benjaminroy | 16:cede55e5b075 | 370 | Thread _toggleRouterLed(toggleRouterLed); |
benjaminroy | 19:19caa5f5c5f5 | 371 | Thread _sendDataToServer(sendDataToServer); |
benjaminroy | 14:8b59a90725bc | 372 | t1 = &_toggleRouterLed; |
benjaminroy | 13:62404d7dab8d | 373 | |
benjaminroy | 14:8b59a90725bc | 374 | ticker1.attach(&isr, 1); |
benjaminroy | 10:488877f7f56c | 375 | while(1) {} |
marc1119 | 0:ec23a7ae804c | 376 | } |
marc1119 | 0:ec23a7ae804c | 377 | |
marc1119 | 2:3fbf13ba290e | 378 |