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@15:4c748df01e5b, 2017-02-13 (annotated)
- Committer:
- benjaminroy
- Date:
- Mon Feb 13 20:14:12 2017 +0000
- Revision:
- 15:4c748df01e5b
- Parent:
- 14:8b59a90725bc
- Child:
- 16:cede55e5b075
Gestion des erreurs...
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 | |
benjaminroy | 15:4c748df01e5b | 8 | AnalogOut errorLed(p18); |
marc1119 | 0:ec23a7ae804c | 9 | DigitalOut reset(p8); |
benjaminroy | 15:4c748df01e5b | 10 | DigitalOut led1(LED1); |
benjaminroy | 9:f6f79f136101 | 11 | EthernetInterface eth; |
marc1119 | 8:9c34eb3cb3ef | 12 | Serial xbee(p13, p14); // tx, rx |
marc1119 | 1:ceb3f8ba8793 | 13 | Serial pc(USBTX, USBRX); // tx, rx |
benjaminroy | 9:f6f79f136101 | 14 | TCPSocketConnection sock; |
benjaminroy | 11:205ddd5406af | 15 | Ticker ticker1; |
benjaminroy | 14:8b59a90725bc | 16 | Thread *t1; |
marc1119 | 0:ec23a7ae804c | 17 | |
benjaminroy | 13:62404d7dab8d | 18 | /* Mail */ |
benjaminroy | 13:62404d7dab8d | 19 | typedef struct { |
benjaminroy | 14:8b59a90725bc | 20 | uint8_t type; |
benjaminroy | 14:8b59a90725bc | 21 | char strAccelerationX[15]; |
benjaminroy | 14:8b59a90725bc | 22 | char strAccelerationY[15]; |
benjaminroy | 14:8b59a90725bc | 23 | char strAccelerationZ[15]; |
benjaminroy | 14:8b59a90725bc | 24 | char strDryContact[15]; |
benjaminroy | 13:62404d7dab8d | 25 | } mail_t; |
benjaminroy | 13:62404d7dab8d | 26 | |
benjaminroy | 13:62404d7dab8d | 27 | Mail<mail_t, 100> mail_box; |
benjaminroy | 13:62404d7dab8d | 28 | |
benjaminroy | 14:8b59a90725bc | 29 | uint8_t routerAddress[8] = { 0 }; // Should be 00 13 A2 00 40 8B 41 6E |
benjaminroy | 6:fd7d91edcf60 | 30 | uint16_t portNumber = 0; |
benjaminroy | 6:fd7d91edcf60 | 31 | uint16_t panId = 0; |
benjaminroy | 6:fd7d91edcf60 | 32 | char serverAddress[32]; |
marc1119 | 8:9c34eb3cb3ef | 33 | char panIdChar[5]; |
benjaminroy | 9:f6f79f136101 | 34 | char portNbr[5]; |
benjaminroy | 15:4c748df01e5b | 35 | bool led = false; |
marc1119 | 3:fbd4b164e8ad | 36 | |
benjaminroy | 6:fd7d91edcf60 | 37 | void printBuffer(uint8_t bufferSize, uint8_t* buffer) { |
marc1119 | 8:9c34eb3cb3ef | 38 | for(uint8_t k = 0; k <= bufferSize; k++) { |
benjaminroy | 6:fd7d91edcf60 | 39 | pc.printf("%X-", buffer[k]); |
benjaminroy | 6:fd7d91edcf60 | 40 | } |
benjaminroy | 6:fd7d91edcf60 | 41 | printf("\n"); |
benjaminroy | 6:fd7d91edcf60 | 42 | } |
benjaminroy | 6:fd7d91edcf60 | 43 | |
benjaminroy | 15:4c748df01e5b | 44 | void toggleErrorLed() { |
benjaminroy | 15:4c748df01e5b | 45 | errorLed.write(3.3); |
benjaminroy | 15:4c748df01e5b | 46 | wait(1); |
benjaminroy | 15:4c748df01e5b | 47 | errorLed.write(0); |
benjaminroy | 15:4c748df01e5b | 48 | } |
benjaminroy | 15:4c748df01e5b | 49 | |
benjaminroy | 6:fd7d91edcf60 | 50 | void readConfigFile() { |
benjaminroy | 6:fd7d91edcf60 | 51 | LocalFileSystem local("local"); |
benjaminroy | 6:fd7d91edcf60 | 52 | ConfigFile cfg; |
benjaminroy | 6:fd7d91edcf60 | 53 | char *serverAddressStr = "serverAddr"; |
benjaminroy | 6:fd7d91edcf60 | 54 | char *portNumberStr = "portNb"; |
benjaminroy | 6:fd7d91edcf60 | 55 | char *panIdStr = "panID"; |
benjaminroy | 6:fd7d91edcf60 | 56 | |
benjaminroy | 6:fd7d91edcf60 | 57 | if (!cfg.read("/local/input.cfg")) { |
benjaminroy | 6:fd7d91edcf60 | 58 | error("Erreur dans la lecture du fichier de configuration.\n"); |
benjaminroy | 6:fd7d91edcf60 | 59 | } else { |
benjaminroy | 6:fd7d91edcf60 | 60 | cfg.getValue(panIdStr, &panIdChar[0], sizeof(panIdChar)); |
benjaminroy | 6:fd7d91edcf60 | 61 | cfg.getValue(serverAddressStr, &serverAddress[0], sizeof(serverAddress)); |
benjaminroy | 6:fd7d91edcf60 | 62 | cfg.getValue(portNumberStr, &portNbr[0], sizeof(portNbr)); |
benjaminroy | 6:fd7d91edcf60 | 63 | |
benjaminroy | 6:fd7d91edcf60 | 64 | portNumber = (uint16_t)strtol(portNbr, NULL, 10); |
benjaminroy | 6:fd7d91edcf60 | 65 | panId = (uint16_t)strtol(panIdChar, NULL, 10); |
benjaminroy | 6:fd7d91edcf60 | 66 | |
benjaminroy | 10:488877f7f56c | 67 | // printf("The server address is %s\n", serverAddress); |
benjaminroy | 10:488877f7f56c | 68 | // printf("The port number is %i\n", portNumber); |
benjaminroy | 10:488877f7f56c | 69 | // printf("The PAN ID is %i\n", panId); |
benjaminroy | 6:fd7d91edcf60 | 70 | } |
benjaminroy | 6:fd7d91edcf60 | 71 | } |
benjaminroy | 6:fd7d91edcf60 | 72 | |
benjaminroy | 15:4c748df01e5b | 73 | uint8_t calculateChecksum(uint8_t frameTypeIndex, uint8_t frameSize, uint8_t* buffer) { |
benjaminroy | 14:8b59a90725bc | 74 | char checksum = 0; |
marc1119 | 12:42986a9c3682 | 75 | |
marc1119 | 12:42986a9c3682 | 76 | for (int i = frameTypeIndex; i < frameSize - 1; i++) { |
marc1119 | 12:42986a9c3682 | 77 | checksum += buffer[i]; |
marc1119 | 12:42986a9c3682 | 78 | } |
marc1119 | 12:42986a9c3682 | 79 | |
benjaminroy | 14:8b59a90725bc | 80 | return (0xFF - checksum); |
marc1119 | 12:42986a9c3682 | 81 | } |
marc1119 | 12:42986a9c3682 | 82 | |
benjaminroy | 14:8b59a90725bc | 83 | void toggleLed() { |
benjaminroy | 14:8b59a90725bc | 84 | // uint8_t high[20] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3C}; |
benjaminroy | 14:8b59a90725bc | 85 | // uint8_t low[20] = {0x7E, 0x00, 0x10, 0x17, 0x02, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3C}; |
benjaminroy | 15:4c748df01e5b | 86 | Thread::signal_wait(0x2); |
benjaminroy | 15:4c748df01e5b | 87 | |
benjaminroy | 14:8b59a90725bc | 88 | while(1) { |
benjaminroy | 14:8b59a90725bc | 89 | Thread::signal_wait(0x1); |
benjaminroy | 14:8b59a90725bc | 90 | |
benjaminroy | 14:8b59a90725bc | 91 | uint8_t command[20] = {0}; |
benjaminroy | 14:8b59a90725bc | 92 | |
benjaminroy | 14:8b59a90725bc | 93 | command[0] = 0x7E; |
benjaminroy | 14:8b59a90725bc | 94 | command[1] = 0x00; |
benjaminroy | 14:8b59a90725bc | 95 | command[2] = 0x10; |
benjaminroy | 14:8b59a90725bc | 96 | command[3] = 0x17; |
benjaminroy | 15:4c748df01e5b | 97 | if (led) { |
benjaminroy | 14:8b59a90725bc | 98 | command[4] = 0x01; |
benjaminroy | 14:8b59a90725bc | 99 | } |
benjaminroy | 14:8b59a90725bc | 100 | else { |
benjaminroy | 14:8b59a90725bc | 101 | command[4] = 0x02; |
benjaminroy | 14:8b59a90725bc | 102 | } |
benjaminroy | 14:8b59a90725bc | 103 | command[5] = routerAddress[0]; |
benjaminroy | 14:8b59a90725bc | 104 | command[6] = routerAddress[1]; |
benjaminroy | 14:8b59a90725bc | 105 | command[7] = routerAddress[2]; |
benjaminroy | 14:8b59a90725bc | 106 | command[8] = routerAddress[3]; |
benjaminroy | 14:8b59a90725bc | 107 | command[9] = routerAddress[4]; |
benjaminroy | 14:8b59a90725bc | 108 | command[10] = routerAddress[5]; |
benjaminroy | 14:8b59a90725bc | 109 | command[11] = routerAddress[6]; |
benjaminroy | 14:8b59a90725bc | 110 | command[12] = routerAddress[7]; |
benjaminroy | 14:8b59a90725bc | 111 | command[13] = 0xFF; |
benjaminroy | 14:8b59a90725bc | 112 | command[14] = 0xFE; |
benjaminroy | 14:8b59a90725bc | 113 | command[15] = 0x02; |
benjaminroy | 14:8b59a90725bc | 114 | command[16] = 0x44; |
benjaminroy | 14:8b59a90725bc | 115 | command[17] = 0x34; |
benjaminroy | 15:4c748df01e5b | 116 | if (led) { |
benjaminroy | 14:8b59a90725bc | 117 | command[18] = 0x05; |
benjaminroy | 14:8b59a90725bc | 118 | } |
benjaminroy | 14:8b59a90725bc | 119 | else { |
benjaminroy | 14:8b59a90725bc | 120 | command[18] = 0x04; |
benjaminroy | 14:8b59a90725bc | 121 | } |
benjaminroy | 15:4c748df01e5b | 122 | command[19] = calculateChecksum(3, 20, command); |
benjaminroy | 14:8b59a90725bc | 123 | |
benjaminroy | 14:8b59a90725bc | 124 | for (uint8_t i = 0; i < 20;) { |
benjaminroy | 14:8b59a90725bc | 125 | if (xbee.writeable()) { |
benjaminroy | 14:8b59a90725bc | 126 | xbee.putc(command[i]); |
benjaminroy | 14:8b59a90725bc | 127 | i++; |
benjaminroy | 14:8b59a90725bc | 128 | } |
benjaminroy | 14:8b59a90725bc | 129 | } |
benjaminroy | 15:4c748df01e5b | 130 | led = !led; |
benjaminroy | 15:4c748df01e5b | 131 | led1 = !led1; |
marc1119 | 3:fbd4b164e8ad | 132 | } |
marc1119 | 3:fbd4b164e8ad | 133 | } |
marc1119 | 3:fbd4b164e8ad | 134 | |
benjaminroy | 13:62404d7dab8d | 135 | void sendDataToServer() { |
benjaminroy | 13:62404d7dab8d | 136 | while(1) { |
benjaminroy | 13:62404d7dab8d | 137 | osEvent evt = mail_box.get(); |
benjaminroy | 9:f6f79f136101 | 138 | |
benjaminroy | 13:62404d7dab8d | 139 | if (evt.status == osEventMail) { |
benjaminroy | 13:62404d7dab8d | 140 | mail_t *mail = (mail_t*)evt.value.p; |
benjaminroy | 13:62404d7dab8d | 141 | |
benjaminroy | 13:62404d7dab8d | 142 | int responseSize = 0; |
benjaminroy | 13:62404d7dab8d | 143 | char buffer[50] = { 0 }; |
benjaminroy | 14:8b59a90725bc | 144 | |
benjaminroy | 14:8b59a90725bc | 145 | if (mail->type == 0) { |
benjaminroy | 14:8b59a90725bc | 146 | sprintf(buffer, "%s, %s, %s\0", mail->strAccelerationX, mail->strAccelerationY, mail->strAccelerationZ); |
benjaminroy | 14:8b59a90725bc | 147 | } else { |
benjaminroy | 14:8b59a90725bc | 148 | sprintf(buffer, "%s\0", mail->strDryContact); |
benjaminroy | 13:62404d7dab8d | 149 | } |
benjaminroy | 14:8b59a90725bc | 150 | |
benjaminroy | 13:62404d7dab8d | 151 | sock.send_all(buffer, sizeof(buffer)-1); |
benjaminroy | 13:62404d7dab8d | 152 | responseSize = sock.receive(buffer, sizeof(buffer)-1); |
benjaminroy | 13:62404d7dab8d | 153 | |
benjaminroy | 13:62404d7dab8d | 154 | if (responseSize <= 0) { |
benjaminroy | 13:62404d7dab8d | 155 | pc.printf("Error"); |
benjaminroy | 13:62404d7dab8d | 156 | } |
benjaminroy | 13:62404d7dab8d | 157 | |
benjaminroy | 13:62404d7dab8d | 158 | buffer[responseSize] = '\0'; |
benjaminroy | 13:62404d7dab8d | 159 | pc.printf("Received %d chars from server: %s\n", responseSize, buffer); |
benjaminroy | 13:62404d7dab8d | 160 | |
benjaminroy | 13:62404d7dab8d | 161 | mail_box.free(mail); |
benjaminroy | 9:f6f79f136101 | 162 | } |
benjaminroy | 13:62404d7dab8d | 163 | } |
marc1119 | 1:ceb3f8ba8793 | 164 | } |
marc1119 | 1:ceb3f8ba8793 | 165 | |
benjaminroy | 15:4c748df01e5b | 166 | void readATCommandResponse(uint8_t* buffer) { |
benjaminroy | 15:4c748df01e5b | 167 | if (!buffer[4] == 0x00) toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 168 | |
benjaminroy | 15:4c748df01e5b | 169 | if (buffer[4] == 0x01) pc.printf("AT Command Response: Error.\n"); |
benjaminroy | 15:4c748df01e5b | 170 | else if (buffer[4] == 0x02) pc.printf("AT Command Response: Invalid Command.\n"); |
benjaminroy | 15:4c748df01e5b | 171 | else if (buffer[4] == 0x03) pc.printf("AT Command Response: Invalid Parameter.\n"); |
benjaminroy | 15:4c748df01e5b | 172 | else if (buffer[4] == 0x04) pc.printf("AT Command Response: Tx Failure.\n"); |
benjaminroy | 15:4c748df01e5b | 173 | } |
benjaminroy | 15:4c748df01e5b | 174 | |
benjaminroy | 15:4c748df01e5b | 175 | void readRemoteATCommandResponse(uint8_t* buffer) { |
benjaminroy | 15:4c748df01e5b | 176 | if (!buffer[14] == 0x00) toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 177 | |
benjaminroy | 15:4c748df01e5b | 178 | if (buffer[14] == 0x01) pc.printf("Remote AT Command Response: Error.\n"); |
benjaminroy | 15:4c748df01e5b | 179 | else if (buffer[14] == 0x02) pc.printf("Remote AT Command Response: Invalid Command.\n"); |
benjaminroy | 15:4c748df01e5b | 180 | else if (buffer[14] == 0x03) pc.printf("Remote AT Command Response: Invalid Parameter.\n"); |
benjaminroy | 15:4c748df01e5b | 181 | else if (buffer[14] == 0x04) pc.printf("Remote AT Command Response: Tx Failure.\n"); |
benjaminroy | 15:4c748df01e5b | 182 | } |
benjaminroy | 15:4c748df01e5b | 183 | |
benjaminroy | 15:4c748df01e5b | 184 | void readTransmitStatus(uint8_t* buffer) { |
benjaminroy | 15:4c748df01e5b | 185 | if (buffer[5] == 0x01) pc.printf("Transmit Status: An expedted MAC acknowledgement never occured. \n"); |
benjaminroy | 15:4c748df01e5b | 186 | else if (buffer[5] == 0x02) pc.printf("Transmit Status: CCA failure. \n"); |
benjaminroy | 15:4c748df01e5b | 187 | else if (buffer[5] == 0x03) pc.printf("Transmit Status: Packet was purgedwithoutbeing transmitted. \n"); |
benjaminroy | 15:4c748df01e5b | 188 | else if (buffer[5] == 0x04) pc.printf("Transmit Status: Physical error on the interface with the WiFi transceiver. \n"); |
benjaminroy | 15:4c748df01e5b | 189 | else if (buffer[5] == 0x18) pc.printf("Transmit Status: No buffers. \n"); |
benjaminroy | 15:4c748df01e5b | 190 | else if (buffer[5] == 0x21) pc.printf("Transmit Status: Expected networkacknowledgement never occured. \n"); |
benjaminroy | 15:4c748df01e5b | 191 | else if (buffer[5] == 0x22) pc.printf("Transmit Status: Not joined to network. \n"); |
benjaminroy | 15:4c748df01e5b | 192 | else if (buffer[5] == 0x23) pc.printf("Transmit Status: Self-addressed. \n"); |
benjaminroy | 15:4c748df01e5b | 193 | else if (buffer[5] == 0x24) pc.printf("Transmit Status: Address not found. \n"); |
benjaminroy | 15:4c748df01e5b | 194 | else if (buffer[5] == 0x25) pc.printf("Transmit Status: Route not found. \n"); |
benjaminroy | 15:4c748df01e5b | 195 | else if (buffer[5] == 0x26) pc.printf("Transmit Status: Broadcast relay was not heard. \n"); |
benjaminroy | 15:4c748df01e5b | 196 | else if (buffer[5] == 0x2B) pc.printf("Transmit Status: Invalid binding table index. \n"); |
benjaminroy | 15:4c748df01e5b | 197 | else if (buffer[5] == 0x2C) pc.printf("Transmit Status: Invalid Endpoint. \n"); |
benjaminroy | 15:4c748df01e5b | 198 | else if (buffer[5] == 0x31) pc.printf("Transmit Status: A software error occurred. \n"); |
benjaminroy | 15:4c748df01e5b | 199 | else if (buffer[5] == 0x32) pc.printf("Transmit Status: Resource Error. \n"); |
benjaminroy | 15:4c748df01e5b | 200 | else if (buffer[5] == 0x74) pc.printf("Transmit Status: Data payload too large. \n"); |
benjaminroy | 15:4c748df01e5b | 201 | else if (buffer[5] == 0x76) pc.printf("Transmit Status: Client socket creationat attempt failed. \n"); |
benjaminroy | 15:4c748df01e5b | 202 | } |
benjaminroy | 15:4c748df01e5b | 203 | |
benjaminroy | 15:4c748df01e5b | 204 | void readModemStatus(uint8_t* buffer) { |
benjaminroy | 15:4c748df01e5b | 205 | if (buffer[1] == 0x00) { |
benjaminroy | 15:4c748df01e5b | 206 | pc.printf("Modem status: Hardware reset.\n"); |
benjaminroy | 15:4c748df01e5b | 207 | } |
benjaminroy | 15:4c748df01e5b | 208 | else if (buffer[1] == 0x01) { |
benjaminroy | 15:4c748df01e5b | 209 | pc.printf("Modem status: Watchdog timer reset.\n"); |
benjaminroy | 15:4c748df01e5b | 210 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 211 | } |
benjaminroy | 15:4c748df01e5b | 212 | else if (buffer[1] == 0x02) { |
benjaminroy | 15:4c748df01e5b | 213 | pc.printf("Modem status: Joined network.\n"); |
benjaminroy | 15:4c748df01e5b | 214 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 215 | } |
benjaminroy | 15:4c748df01e5b | 216 | else if (buffer[1] == 0x03) { |
benjaminroy | 15:4c748df01e5b | 217 | pc.printf("Modem status: Disassociated.\n"); |
benjaminroy | 15:4c748df01e5b | 218 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 219 | } |
benjaminroy | 15:4c748df01e5b | 220 | else if (buffer[1] == 0x04) { |
benjaminroy | 15:4c748df01e5b | 221 | pc.printf("Modem status: Configuration error/synchronization.\n"); |
benjaminroy | 15:4c748df01e5b | 222 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 223 | } |
benjaminroy | 15:4c748df01e5b | 224 | else if (buffer[1] == 0x05) { |
benjaminroy | 15:4c748df01e5b | 225 | pc.printf("Modem status: Coordinator realignment.\n"); |
benjaminroy | 15:4c748df01e5b | 226 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 227 | } |
benjaminroy | 15:4c748df01e5b | 228 | else if (buffer[1] == 0x06) { |
benjaminroy | 15:4c748df01e5b | 229 | pc.printf("Modem status: Coordinator started.\n"); |
benjaminroy | 15:4c748df01e5b | 230 | } |
benjaminroy | 15:4c748df01e5b | 231 | else if (buffer[1] == 0x07) { |
benjaminroy | 15:4c748df01e5b | 232 | pc.printf("Modem status: Network security key updated.\n"); |
benjaminroy | 15:4c748df01e5b | 233 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 234 | } |
benjaminroy | 15:4c748df01e5b | 235 | else if (buffer[1] == 0x08) { |
benjaminroy | 15:4c748df01e5b | 236 | pc.printf("Modem status: Network woke up.\n"); |
benjaminroy | 15:4c748df01e5b | 237 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 238 | } |
benjaminroy | 15:4c748df01e5b | 239 | else if (buffer[1] == 0x0C) { |
benjaminroy | 15:4c748df01e5b | 240 | pc.printf("Modem status: Network went to sleep.\n"); |
benjaminroy | 15:4c748df01e5b | 241 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 242 | } |
benjaminroy | 15:4c748df01e5b | 243 | else if (buffer[1] == 0x0E) { |
benjaminroy | 15:4c748df01e5b | 244 | pc.printf("Modem status: Device cloud connected.\n"); |
benjaminroy | 15:4c748df01e5b | 245 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 246 | } |
benjaminroy | 15:4c748df01e5b | 247 | else if (buffer[1] == 0x0F) { |
benjaminroy | 15:4c748df01e5b | 248 | pc.printf("Modem status: Device cloud disconnected.\n"); |
benjaminroy | 15:4c748df01e5b | 249 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 250 | } |
benjaminroy | 15:4c748df01e5b | 251 | else if (buffer[1] == 0x11) { |
benjaminroy | 15:4c748df01e5b | 252 | pc.printf("Modem status: Modem configurationchanged while join in progress.\n"); |
benjaminroy | 15:4c748df01e5b | 253 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 254 | } |
benjaminroy | 15:4c748df01e5b | 255 | else if (buffer[1] == 0x80) { |
benjaminroy | 15:4c748df01e5b | 256 | pc.printf("Modem status: Stack error (80+).\n"); |
benjaminroy | 15:4c748df01e5b | 257 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 258 | } |
benjaminroy | 15:4c748df01e5b | 259 | else if (buffer[1] == 0x82) { |
benjaminroy | 15:4c748df01e5b | 260 | pc.printf("Modem status: Send/join command issuedwithout connecting from AP.\n"); |
benjaminroy | 15:4c748df01e5b | 261 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 262 | } |
benjaminroy | 15:4c748df01e5b | 263 | else if (buffer[1] == 0x83) { |
benjaminroy | 15:4c748df01e5b | 264 | pc.printf("Modem status: Access point not found.\n"); |
benjaminroy | 15:4c748df01e5b | 265 | toggleErrorLed(); |
benjaminroy | 15:4c748df01e5b | 266 | } |
benjaminroy | 15:4c748df01e5b | 267 | else if (buffer[1] == 0x84) { |
benjaminroy | 15:4c748df01e5b | 268 | pc.printf("Modem status: PSK not configured.\n"); |
benjaminroy | 15:4c748df01e5b | 269 | toggleErrorLed(); |
marc1119 | 3:fbd4b164e8ad | 270 | } |
marc1119 | 3:fbd4b164e8ad | 271 | } |
marc1119 | 3:fbd4b164e8ad | 272 | |
benjaminroy | 10:488877f7f56c | 273 | bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) { |
marc1119 | 2:3fbf13ba290e | 274 | uint32_t checkSum = 0; |
benjaminroy | 4:393738672d08 | 275 | |
benjaminroy | 10:488877f7f56c | 276 | for (int i = 0; i < bufferSize; i++) { |
marc1119 | 2:3fbf13ba290e | 277 | checkSum += buffer[i]; |
benjaminroy | 4:393738672d08 | 278 | } |
benjaminroy | 10:488877f7f56c | 279 | if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) { |
benjaminroy | 10:488877f7f56c | 280 | pc.printf("Erreur dans la transmission de la trame. \n"); |
benjaminroy | 10:488877f7f56c | 281 | return false; |
benjaminroy | 4:393738672d08 | 282 | } |
benjaminroy | 10:488877f7f56c | 283 | return true; |
marc1119 | 2:3fbf13ba290e | 284 | } |
marc1119 | 2:3fbf13ba290e | 285 | |
marc1119 | 8:9c34eb3cb3ef | 286 | void readRouterAddress(uint8_t* buffer) { |
benjaminroy | 14:8b59a90725bc | 287 | routerAddress[0] = buffer[1]; |
benjaminroy | 14:8b59a90725bc | 288 | routerAddress[1] = buffer[2]; |
benjaminroy | 14:8b59a90725bc | 289 | routerAddress[2] = buffer[3]; |
benjaminroy | 14:8b59a90725bc | 290 | routerAddress[3] = buffer[4]; |
benjaminroy | 14:8b59a90725bc | 291 | routerAddress[4] = buffer[5]; |
benjaminroy | 14:8b59a90725bc | 292 | routerAddress[5] = buffer[6]; |
benjaminroy | 14:8b59a90725bc | 293 | routerAddress[6] = buffer[7]; |
benjaminroy | 14:8b59a90725bc | 294 | routerAddress[7] = buffer[8]; |
benjaminroy | 15:4c748df01e5b | 295 | t1->signal_set(0x02); |
marc1119 | 8:9c34eb3cb3ef | 296 | } |
marc1119 | 8:9c34eb3cb3ef | 297 | |
benjaminroy | 10:488877f7f56c | 298 | void readRouterData(uint8_t bufferSize, uint8_t* buffer) { |
benjaminroy | 10:488877f7f56c | 299 | uint16_t acc[3] = {0}; |
marc1119 | 8:9c34eb3cb3ef | 300 | |
benjaminroy | 10:488877f7f56c | 301 | if (buffer[0] == 0x90 && bufferSize == 18) { // Accelerations (X,Y,Z) |
benjaminroy | 10:488877f7f56c | 302 | for (uint8_t i = 12; i < bufferSize; i += 2) { |
benjaminroy | 10:488877f7f56c | 303 | acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff); |
marc1119 | 2:3fbf13ba290e | 304 | } |
benjaminroy | 10:488877f7f56c | 305 | // pc.printf("Acceleration X: %d\n", acc[0]); |
benjaminroy | 10:488877f7f56c | 306 | // pc.printf("Acceleration Y: %d\n", acc[1]); |
benjaminroy | 10:488877f7f56c | 307 | // pc.printf("Acceleration Z: %d\n", acc[2]); |
benjaminroy | 13:62404d7dab8d | 308 | |
benjaminroy | 13:62404d7dab8d | 309 | mail_t *mail = mail_box.alloc(); |
benjaminroy | 14:8b59a90725bc | 310 | mail->type = 0; |
benjaminroy | 13:62404d7dab8d | 311 | sprintf(mail->strAccelerationX, "Acc. X: %i\0", acc[0]); |
benjaminroy | 13:62404d7dab8d | 312 | sprintf(mail->strAccelerationY, "Acc. Y: %i\0", acc[1]); |
benjaminroy | 13:62404d7dab8d | 313 | sprintf(mail->strAccelerationZ, "Acc. Z: %i\0", acc[2]); |
benjaminroy | 13:62404d7dab8d | 314 | mail_box.put(mail); |
benjaminroy | 13:62404d7dab8d | 315 | |
benjaminroy | 10:488877f7f56c | 316 | } else if (buffer[0] == 0x90 && bufferSize == 13) { // Dry contact |
benjaminroy | 14:8b59a90725bc | 317 | mail_t *mail = mail_box.alloc(); |
benjaminroy | 14:8b59a90725bc | 318 | mail->type = 1; |
benjaminroy | 14:8b59a90725bc | 319 | sprintf(mail->strDryContact, "Dry Contact: %i\0", buffer[12]); |
benjaminroy | 14:8b59a90725bc | 320 | mail_box.put(mail); |
benjaminroy | 10:488877f7f56c | 321 | } |
benjaminroy | 10:488877f7f56c | 322 | } |
benjaminroy | 10:488877f7f56c | 323 | |
benjaminroy | 10:488877f7f56c | 324 | void readDataFromRouter(){ |
benjaminroy | 10:488877f7f56c | 325 | while(1) { |
benjaminroy | 10:488877f7f56c | 326 | uint8_t bufferSize = 0; |
benjaminroy | 10:488877f7f56c | 327 | uint8_t buffer[104] = { 0 }; |
benjaminroy | 10:488877f7f56c | 328 | |
benjaminroy | 10:488877f7f56c | 329 | if (xbee.readable() && xbee.getc() == 0x7E) { |
benjaminroy | 10:488877f7f56c | 330 | bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff); |
benjaminroy | 10:488877f7f56c | 331 | |
benjaminroy | 10:488877f7f56c | 332 | for (uint8_t i = 0; i <= bufferSize;) { |
benjaminroy | 10:488877f7f56c | 333 | if (xbee.readable()) { |
benjaminroy | 10:488877f7f56c | 334 | buffer[i] = xbee.getc(); |
benjaminroy | 10:488877f7f56c | 335 | i++; |
benjaminroy | 10:488877f7f56c | 336 | } |
marc1119 | 2:3fbf13ba290e | 337 | } |
benjaminroy | 10:488877f7f56c | 338 | |
benjaminroy | 10:488877f7f56c | 339 | printBuffer(bufferSize, buffer); |
benjaminroy | 10:488877f7f56c | 340 | if (checksumIsValid(bufferSize, buffer)) { |
benjaminroy | 14:8b59a90725bc | 341 | if (buffer[0] == 0x90) { |
benjaminroy | 14:8b59a90725bc | 342 | readRouterAddress(buffer); |
benjaminroy | 14:8b59a90725bc | 343 | readRouterData(bufferSize, buffer); |
benjaminroy | 14:8b59a90725bc | 344 | |
benjaminroy | 15:4c748df01e5b | 345 | } else if (buffer[0] == 0x8A) { // Modem Status |
benjaminroy | 15:4c748df01e5b | 346 | readModemStatus(buffer); |
benjaminroy | 15:4c748df01e5b | 347 | } else if (buffer[0] == 0x8B) { // Transmit Status |
benjaminroy | 15:4c748df01e5b | 348 | // Should never occur... |
benjaminroy | 15:4c748df01e5b | 349 | } else if (buffer[0] == 0x97) { // Remote AT Command Response |
benjaminroy | 15:4c748df01e5b | 350 | readRemoteATCommandResponse(buffer); |
benjaminroy | 15:4c748df01e5b | 351 | } else if (buffer[0] == 0x09) { // AT Command Response |
benjaminroy | 15:4c748df01e5b | 352 | printf("AT COMMAND RESPONSE"); |
benjaminroy | 15:4c748df01e5b | 353 | |
benjaminroy | 15:4c748df01e5b | 354 | } |
benjaminroy | 15:4c748df01e5b | 355 | } else { |
benjaminroy | 15:4c748df01e5b | 356 | |
benjaminroy | 15:4c748df01e5b | 357 | // HERE: Try to resend the frame... |
marc1119 | 8:9c34eb3cb3ef | 358 | } |
marc1119 | 8:9c34eb3cb3ef | 359 | } |
marc1119 | 0:ec23a7ae804c | 360 | } |
marc1119 | 0:ec23a7ae804c | 361 | } |
marc1119 | 0:ec23a7ae804c | 362 | |
benjaminroy | 15:4c748df01e5b | 363 | void setCoordinatorPanId(uint16_t panId) { |
benjaminroy | 15:4c748df01e5b | 364 | char _8bitsPanId[2]; |
benjaminroy | 15:4c748df01e5b | 365 | _8bitsPanId[0] = (panId >> 8) & 0xFF; |
benjaminroy | 15:4c748df01e5b | 366 | _8bitsPanId[1] = panId & 0xFF; |
benjaminroy | 15:4c748df01e5b | 367 | uint8_t setPanIdBuffer[10] = {0x07, 0x00, 0x06, 0x09, 0x01, 0x49, 0x44, _8bitsPanId[0], _8bitsPanId[1], 0x00}; |
benjaminroy | 15:4c748df01e5b | 368 | setPanIdBuffer[10] = calculateChecksum(0, 10, setPanIdBuffer); |
benjaminroy | 15:4c748df01e5b | 369 | |
benjaminroy | 15:4c748df01e5b | 370 | for (uint8_t i = 0; i < 10;) { |
benjaminroy | 15:4c748df01e5b | 371 | if (xbee.writeable()) { |
benjaminroy | 15:4c748df01e5b | 372 | xbee.putc(setPanIdBuffer[i]); |
benjaminroy | 15:4c748df01e5b | 373 | i++; |
benjaminroy | 15:4c748df01e5b | 374 | } |
benjaminroy | 15:4c748df01e5b | 375 | } |
benjaminroy | 15:4c748df01e5b | 376 | |
benjaminroy | 15:4c748df01e5b | 377 | uint8_t saveChangesBuffer[8] = {0x7E, 0x00, 0x04, 0x09, 0x02, 0x57, 0x52, 0x4B}; |
benjaminroy | 15:4c748df01e5b | 378 | |
benjaminroy | 15:4c748df01e5b | 379 | for (uint8_t i = 0; i < 8;) { |
benjaminroy | 15:4c748df01e5b | 380 | if (xbee.writeable()) { |
benjaminroy | 15:4c748df01e5b | 381 | xbee.putc(saveChangesBuffer[i]); |
benjaminroy | 15:4c748df01e5b | 382 | i++; |
benjaminroy | 15:4c748df01e5b | 383 | } |
benjaminroy | 15:4c748df01e5b | 384 | } |
benjaminroy | 15:4c748df01e5b | 385 | |
benjaminroy | 15:4c748df01e5b | 386 | |
benjaminroy | 15:4c748df01e5b | 387 | uint8_t applyChangesBuffer[8] = {0x7E, 0x00, 0x04, 0x09, 0x03, 0x41, 0x43, 0x6F}; |
benjaminroy | 15:4c748df01e5b | 388 | |
benjaminroy | 15:4c748df01e5b | 389 | for (uint8_t i = 0; i < 8;) { |
benjaminroy | 15:4c748df01e5b | 390 | if (xbee.writeable()) { |
benjaminroy | 15:4c748df01e5b | 391 | xbee.putc(saveChangesBuffer[i]); |
benjaminroy | 15:4c748df01e5b | 392 | i++; |
benjaminroy | 15:4c748df01e5b | 393 | } |
benjaminroy | 15:4c748df01e5b | 394 | } |
benjaminroy | 15:4c748df01e5b | 395 | } |
benjaminroy | 15:4c748df01e5b | 396 | |
benjaminroy | 14:8b59a90725bc | 397 | void isr() { |
benjaminroy | 14:8b59a90725bc | 398 | t1->signal_set(0x1); |
benjaminroy | 14:8b59a90725bc | 399 | } |
benjaminroy | 11:205ddd5406af | 400 | |
marc1119 | 0:ec23a7ae804c | 401 | int main() { |
benjaminroy | 6:fd7d91edcf60 | 402 | pc.printf("Starting a coordinator... \n"); |
benjaminroy | 10:488877f7f56c | 403 | |
marc1119 | 1:ceb3f8ba8793 | 404 | reset = 0; |
benjaminroy | 6:fd7d91edcf60 | 405 | wait_ms(1); |
marc1119 | 1:ceb3f8ba8793 | 406 | reset = 1; |
benjaminroy | 6:fd7d91edcf60 | 407 | wait_ms(1); |
marc1119 | 0:ec23a7ae804c | 408 | |
marc1119 | 2:3fbf13ba290e | 409 | readConfigFile(); |
marc1119 | 2:3fbf13ba290e | 410 | |
benjaminroy | 6:fd7d91edcf60 | 411 | xbee.baud(9600); // Set baud rate |
benjaminroy | 15:4c748df01e5b | 412 | //xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID |
benjaminroy | 15:4c748df01e5b | 413 | //xbee.printf("ATWR \r"); // Save the changes |
benjaminroy | 15:4c748df01e5b | 414 | //xbee.printf("ATCN \r"); // Apply changes by sending the CN command |
benjaminroy | 15:4c748df01e5b | 415 | setCoordinatorPanId(panId); |
benjaminroy | 15:4c748df01e5b | 416 | |
benjaminroy | 4:393738672d08 | 417 | if (eth.init() != 0) { // Use DHCP |
marc1119 | 3:fbd4b164e8ad | 418 | pc.printf("Erreur d'initialisation du RJ45.\n"); |
benjaminroy | 4:393738672d08 | 419 | } |
benjaminroy | 4:393738672d08 | 420 | if (eth.connect() != 0) { |
marc1119 | 3:fbd4b164e8ad | 421 | pc.printf("Erreur de connection du RJ45\n"); |
benjaminroy | 4:393738672d08 | 422 | } |
benjaminroy | 10:488877f7f56c | 423 | pc.printf("IP Address is %s\n", eth.getIPAddress()); |
marc1119 | 2:3fbf13ba290e | 424 | |
benjaminroy | 15:4c748df01e5b | 425 | /*int numberOfRetries = 0; |
benjaminroy | 13:62404d7dab8d | 426 | while (sock.connect(serverAddress, portNumber) != 0) { |
benjaminroy | 13:62404d7dab8d | 427 | if (numberOfRetries == 5) { |
benjaminroy | 13:62404d7dab8d | 428 | error("Erreur dans la connection au socket.\n"); |
benjaminroy | 13:62404d7dab8d | 429 | } |
benjaminroy | 13:62404d7dab8d | 430 | numberOfRetries++; |
benjaminroy | 15:4c748df01e5b | 431 | }*/ |
benjaminroy | 13:62404d7dab8d | 432 | |
benjaminroy | 10:488877f7f56c | 433 | // Démarrage des tâches: |
benjaminroy | 10:488877f7f56c | 434 | Thread _readDataFromRouter(readDataFromRouter); |
benjaminroy | 15:4c748df01e5b | 435 | //Thread _sendDataToServer(sendDataToServer); |
benjaminroy | 14:8b59a90725bc | 436 | Thread _toggleRouterLed(toggleLed); |
benjaminroy | 14:8b59a90725bc | 437 | t1 = &_toggleRouterLed; |
benjaminroy | 13:62404d7dab8d | 438 | |
benjaminroy | 14:8b59a90725bc | 439 | ticker1.attach(&isr, 1); |
benjaminroy | 14:8b59a90725bc | 440 | |
benjaminroy | 10:488877f7f56c | 441 | while(1) {} |
marc1119 | 0:ec23a7ae804c | 442 | } |
marc1119 | 0:ec23a7ae804c | 443 | |
marc1119 | 2:3fbf13ba290e | 444 |