BraceletUS / Mbed 2 deprecated S05APP3

Dependencies:   ConfigFile EthernetInterface mbed-rtos mbed

Fork of S05APP3 by App S5

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) {}
}