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
- Committer:
- benjaminroy
- Date:
- 2017-02-13
- Revision:
- 13:62404d7dab8d
- Parent:
- 12:42986a9c3682
- Child:
- 14:8b59a90725bc
File content as of revision 13:62404d7dab8d:
// ===================== COORDINATOR ===================== // ======================================================= #include "EthernetInterface.h" #include "ConfigFile.h" #include "mbed.h" #include "rtos.h" DigitalOut reset(p8); EthernetInterface eth; Serial xbee(p13, p14); // tx, rx Serial pc(USBTX, USBRX); // tx, rx TCPSocketConnection sock; Ticker ticker1; /* Mail */ typedef struct { char strAccelerationX[10]; char strAccelerationY[10]; char strAccelerationZ[10]; char strDryContact[10]; } mail_t; Mail<mail_t, 100> mail_box; uint8_t routerAddress[8]; uint16_t portNumber = 0; uint16_t panId = 0; char serverAddress[32]; char panIdChar[5]; char portNbr[5]; bool boolLED = false; void printBuffer(uint8_t bufferSize, uint8_t* buffer) { for(uint8_t k = 0; k <= bufferSize; k++) { pc.printf("%X-", buffer[k]); } printf("\n"); } void readConfigFile() { LocalFileSystem local("local"); ConfigFile cfg; char *serverAddressStr = "serverAddr"; char *portNumberStr = "portNb"; char *panIdStr = "panID"; if (!cfg.read("/local/input.cfg")) { error("Erreur dans la lecture du fichier de configuration.\n"); } else { cfg.getValue(panIdStr, &panIdChar[0], sizeof(panIdChar)); cfg.getValue(serverAddressStr, &serverAddress[0], sizeof(serverAddress)); cfg.getValue(portNumberStr, &portNbr[0], sizeof(portNbr)); portNumber = (uint16_t)strtol(portNbr, NULL, 10); panId = (uint16_t)strtol(panIdChar, NULL, 10); // printf("The server address is %s\n", serverAddress); // printf("The port number is %i\n", portNumber); // printf("The PAN ID is %i\n", panId); } } uint8_t calculateChecksum(uint8_t frameSize, uint8_t* buffer) { uint32_t checksum = 0; uint8_t frameTypeIndex = 3; for (int i = frameTypeIndex; i < frameSize - 1; i++) { checksum += buffer[i]; } return (uint8_t)(0xFF - (checksum & 0xFF)); } void toogleLED(uint8_t bufferSize, uint8_t* buffer) { // Addresse 64 bits = 00 13 A2 00 40 8B 41 6E //uint8_t high[20] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x05, 0x3C}; //uint8_t low[20] = {0x7E, 0x00, 0x10, 0x17, 0x02, 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x6E, 0xFF, 0xFE, 0x02, 0x44, 0x34, 0x04, 0x3C}; uint8_t command[20] = {0}; command[0] = 0x7E; command[1] = 0x00; command[2] = 0x10; command[3] = 0x17; if(boolLED) command[4] = 0x01; else command[4] = 0x02; command[5] = routerAddress[0]; command[6] = routerAddress[1]; command[7] = routerAddress[2]; command[8] = routerAddress[3]; command[9] = routerAddress[4]; command[10] = routerAddress[5]; command[11] = routerAddress[6]; command[12] = routerAddress[7]; command[13] = 0xFF; command[14] = 0xFE; command[15] = 0x02; command[16] = 0x44; command[17] = 0x34; if(boolLED) command[4] = 0x05; else command[4] = 0x04; command[19] = calculateChecksum(bufferSize, buffer); // for (uint8_t i = 0; i < 20;) { // if (xbee.writeable()) { // if (boolLED) { // xbee.putc(high[i]); // } else { // xbee.putc(low[i]); // } // i++; // } // } for (uint8_t i = 0; i < 20;) { if (xbee.writeable()) { xbee.putc(command[i]); i++; } } if (boolLED) { pc.printf("Et un haut!\n"); } else { pc.printf("Et un bas!\n"); } boolLED = !boolLED; } void sendDataToServer() { while(1) { osEvent evt = mail_box.get(); if (evt.status == osEventMail) { mail_t *mail = (mail_t*)evt.value.p; int responseSize = 0; char buffer[50] = { 0 }; for (int i = 0; i < 50; i++) { buffer[i] = 0; } sprintf(buffer, "%s, %s, %s\0", mail->strAccelerationX, mail->strAccelerationY, mail->strAccelerationZ); pc.printf("Send to server: %s\n", buffer); sock.send_all(buffer, sizeof(buffer)-1); responseSize = sock.receive(buffer, sizeof(buffer)-1); if (responseSize <= 0) { pc.printf("Error"); } buffer[responseSize] = '\0'; pc.printf("Received %d chars from server: %s\n", responseSize, buffer); mail_box.free(mail); } } } void checkForError(uint8_t* buffer) { if (buffer[0] == 0x97) { if (buffer[1] == 0x02) { pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat bas.\n"); } else if (buffer[1] == 0x01) { pc.printf("Erreur dans la remote AT command pour mettre la DEL a l'etat haut\n"); } } } bool checksumIsValid(uint8_t bufferSize, uint8_t* buffer) { uint32_t checkSum = 0; for (int i = 0; i < bufferSize; i++) { checkSum += buffer[i]; } if ((0xFF - (checkSum & 0xFF)) != buffer[bufferSize]) { pc.printf("Erreur dans la transmission de la trame. \n"); return false; } return true; } // We are storing the 64 bits address of the router. void readRouterAddress(uint8_t* buffer) { routerAddress[0] = buffer[2]; routerAddress[1] = buffer[3]; routerAddress[2] = buffer[4]; routerAddress[3] = buffer[5]; routerAddress[4] = buffer[6]; routerAddress[5] = buffer[7]; routerAddress[6] = buffer[8]; routerAddress[7] = buffer[9]; } void readRouterData(uint8_t bufferSize, uint8_t* buffer) { uint16_t acc[3] = {0}; if (buffer[0] == 0x90 && bufferSize == 18) { // Accelerations (X,Y,Z) for (uint8_t i = 12; i < bufferSize; i += 2) { acc[(i/2)-6] = (buffer[i+1] << 8 ) | (buffer[i] & 0xff); } // pc.printf("Acceleration X: %d\n", acc[0]); // pc.printf("Acceleration Y: %d\n", acc[1]); // pc.printf("Acceleration Z: %d\n", acc[2]); mail_t *mail = mail_box.alloc(); sprintf(mail->strAccelerationX, "Acc. X: %i\0", acc[0]); sprintf(mail->strAccelerationY, "Acc. Y: %i\0", acc[1]); sprintf(mail->strAccelerationZ, "Acc. Z: %i\0", acc[2]); mail_box.put(mail); } else if (buffer[0] == 0x90 && bufferSize == 13) { // Dry contact //mail_t *mail = mail_box.alloc(); //mail->data = acc[0]; //mail_box.put(mail); } } void readDataFromRouter(){ while(1) { uint8_t bufferSize = 0; uint8_t buffer[104] = { 0 }; if (xbee.readable() && xbee.getc() == 0x7E) { bufferSize = (xbee.getc() << 8 ) | (xbee.getc() & 0xff); for (uint8_t i = 0; i <= bufferSize;) { if (xbee.readable()) { buffer[i] = xbee.getc(); i++; } } printBuffer(bufferSize, buffer); if (checksumIsValid(bufferSize, buffer)) { readRouterAddress(buffer); readRouterData(bufferSize, buffer); } } } } void isr() {} int main() { pc.printf("Starting a coordinator... \n"); reset = 0; wait_ms(1); reset = 1; wait_ms(1); readConfigFile(); xbee.baud(9600); // Set baud rate xbee.printf("ATID %i\r",panId); // Set the 64-bit PAN ID xbee.printf("ATWR \r"); // Save the changes xbee.printf("ATCN \r"); // Apply changes by sending the CN command if (eth.init() != 0) { // Use DHCP pc.printf("Erreur d'initialisation du RJ45.\n"); } if (eth.connect() != 0) { pc.printf("Erreur de connection du RJ45\n"); } pc.printf("IP Address is %s\n", eth.getIPAddress()); int numberOfRetries = 0; while (sock.connect(serverAddress, portNumber) != 0) { if (numberOfRetries == 5) { error("Erreur dans la connection au socket.\n"); } numberOfRetries++; } // Démarrage des tâches: Thread _readDataFromRouter(readDataFromRouter); Thread _sendDataToServer(sendDataToServer); //Thread _toggleRouterLed(toggleLed); while(1) {} }