Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

main.cpp

Committer:
Cheroukee
Date:
2017-10-02
Revision:
19:75e600a40741
Parent:
17:8abdbfa6019c
Child:
21:04fae6a95131
Child:
22:7edae38d0758

File content as of revision 19:75e600a40741:

#include "mbed.h"

#include "rtos.h"

#include "xbee.h"
#include "parser.h"
#include "sensors.h"

#define IS_COORDINATOR 1

#define PAN_ID 0xC0FFEE

#define BUFFER_SIZE 64

char recv_buff[BUFFER_SIZE] = {0};
DigitalOut loop_led(LED4);

void set_remote_xbee_dio4(bool set);

void set_pan_id(long pan_id);

int process_frame(frame_t* frame);

#if IS_COORDINATOR   
void coordinator();
#else
void routeur();
#endif

int main() {

    xbee_init();

#if IS_COORDINATOR    
    coordinator();
#else
    routeur();
#endif
}

void set_remote_xbee_dio4(bool set)
{
    if (set)
    {
        remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
            AT_COMMAND_DIO_OUT_LOW, 0x02);
    }
    else
    {
        remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
            AT_COMMAND_DIO_OUT_HIGH, 0x02);
    }
}

#if IS_COORDINATOR
void coordinator()
{    

    coordinator_config_t config = read_coordinator_config();
    
    set_pan_id(config.pan_id);

    frame_t current_frame;

    bool toggle_led = false;
    while(1)
    {
        bool finished_packet = receive(&current_frame, BUFFER_SIZE);
        
        if (finished_packet)
        {
            
            process_frame(&current_frame);
            
            
            //remote_at_command_query('N', 'D', 0x02);
        }
        
        set_remote_xbee_dio4(toggle_led);
        toggle_led = !toggle_led;

        loop_led = !loop_led;
        wait(1);
    }
}
#else
void routeur()
{    
    router_config_t config = read_router_config();
    set_pan_id(config.pan_id);
    char sensor_buffer[64] = {};
    initialize_sensors();
    DECLARE_ADDR64_COORD
    DECLARE_ADDR16_UNKNOWN_OR_BCAST

    while(1)
    {
        SENSOR accel = (*p[0])();
        
        sprintf(sensor_buffer, "%3.2f%3.2f%3.2f", accel.Accelerometre.x, accel.Accelerometre.y, accel.Accelerometre.z);

        transmit_request(sensor_buffer, 15, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
        
        loop_led = !loop_led;
        wait(config.refresh_freq);
    }
}
#endif

void set_pan_id(long pan_id)
{
    char pan_id_buffer[8] = {0};
    for (int i = 0; i < 8; i++)
    {
        pan_id_buffer[i] = 0xFF & (pan_id >> 8 * (7 - i));
    }
    at_command_set('I', 'D', pan_id_buffer, 8);
}

int process_frame(frame_t* frame)
{
    Serial pc(USBTX, USBRX); // tx, rx
    if (frame->length <= 0)
    {
        return -1;
    }
    /*for (int i = 0; i < frame->length; i++)
    {
        char current = frame->buffer[i];        
    }    */
    if (frame->buffer[0] == 0x90)
    {
        // Manage source address
        // Detect the source address and list it dynamically
        
        //Data starts at 12
        for (int i = 12; i <  frame->length; i++)
        {
            pc.putc(frame->buffer[i]);   
        }        
    }    
    return 0;
}