Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

xbee.cpp

Committer:
Cheroukee
Date:
2017-09-30
Revision:
2:a9bb12eefc08
Parent:
1:ea1b52d0a8a3
Child:
5:9e6a09a38785

File content as of revision 2:a9bb12eefc08:


/***
*   xbee.cpp - en-tete de lib xbee - fouj1807 - mcgj2701
*/

#include "xbee.h"

DigitalOut xbee_transmit_led(LED1);
DigitalOut xbee_receive_led(LED2);
DigitalOut xbee_reset(p8);

Serial xbee(p13, p14); // tx, rx

char TransmitBuffer[2048] = {0};
char ReceiveBuffer[2048] = {0};

void xbee_init()
{
    xbee_receive_led = 0;
    
    wait_ms(400);
    
    xbee_reset = 1;
    
    wait_ms(5000);    
    
    xbee_receive_led = 1;    
}


bool set_pan_id(long pan_id)
{
    return false;
}

long get_pan_id()
{
    return 0L;
}

bool transmit_request(char* buffer, int length)
{
    // Frame Type
    /*TransmitBuffer[3] = 0x10;
    
    // Frame ID
    TransmitBuffer[4] = 0x01;
    
    // Should set address if different from coordinator
    //TransmitBuffer[5] = 
    
    // 16-bit address, broadcast address
    TransmitBuffer[13] = 0xFF;
    TransmitBuffer[14] = 0xFE;
    
    // Max hops, 0 = max
    TransmitBuffer[15] = 0x00;
    
    // Transmit options
    TransmitBuffer[16] = 0x00;
    
    // Insert buffer data
    for (int i = 0; i < length; i++)
    {
        TransmitBuffer[17 + i] = buffer[i];
    }   

    for (int i = 0; i < 17 + length + 1; i++)
    {
        xbee_transmit_led = !xbee_transmit_led;
        xbee.putc(TransmitBuffer[i]);
    }*/
    
    return false;
}


int receive_buffer(char* buffer, int max_length)
{
    int length = 0;
    
    while(xbee.readable() && length < max_length)
    {
        xbee_receive_led = !xbee_receive_led;
        buffer[length++] = xbee.getc();        
    }       
    
    for (int i = 17; i < length - 1; i++)
    {
       // pc.putc(ReceiveBuffer[i]);
    }
    return length;    
}

void build_api_frame_header(int frame_data_size)
{
    // Delimiter
    TransmitBuffer[FRAME_DELIMITER_POS] = ZIGBEE_DELIMITER;
    TransmitBuffer[FRAME_LEN_MSB_POS] = frame_data_size >> 8;
    TransmitBuffer[FRAME_LEN_LSB_POS] = frame_data_size & 0xFF;
}

void build_api_frame_checksum(int frame_data_size)
{
    // Calculate checksum
    char checksum = 0xFF;
    for (int i = 3; i < FRAME_CHEKSUM_POS; i++)
    {
        checksum -= TransmitBuffer[i];
    }
    
    // Insert checksum into buffer
    TransmitBuffer[FRAME_CHEKSUM_POS] = checksum;
}

void set_api_frame_type(frame_type_t frame_type)
{
    TransmitBuffer[API_FRAME_TYPE_POS] = frame_type;
}

void set_api_frame_id(int id)
{
    TransmitBuffer[API_FRAME_ID_POS] = id;
}

void set_at_command(int at_command)
{
// NOT IMPLEMENTED
}

void set_64_addr(zigbee_addr_64_t address)
{
    int i = 0;
    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_0;
    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_1;
    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_2;
    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_3;

    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_4;
    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_5;
    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_6;
    TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_7;
}

void set_16_addr(zigbee_addr_16_t address)
{
    TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS]         = address.addr_msb;
    TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS + 1]     = address.addr_lsb;
}

void set_broadcast_radius(int position, char radius)
{
    TransmitBuffer[position] = radius;
}

void set_transmit_request_options(int position, char options)
{
    TransmitBuffer[position] = options;
}

void set_transmit_request_data(char* data, int data_length)
{
    for (int i = 0; i < data_length; i++)
    {
        TransmitBuffer[TRANSMIT_REQ_DATA_START + i] = data[i];
    }
}

bool transmit_request_64(char* buffer, int data_length, char options, zigbee_addr_64_t destination)
{
    build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);

    set_api_frame_type(TransmitRequest);
    set_api_frame_id(0x01);

    set_64_addr(destination);
    DECLARE_ADDR16_UNKNOWN_OR_BCAST
    set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);

    set_broadcast_radius(15, 0);
    set_transmit_request_options(15, 0);

    set_transmit_request_data(buffer, data_length);

    build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);

    transmit(data_length);
    
    return false;
}

bool transmit_request_16(char* buffer, int data_length, char options, zigbee_addr_16_t destination)
{
    build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);

    set_api_frame_type(TransmitRequest);
    set_api_frame_id(0x01);
    
    DECLARE_ADDR64_BCAST
    set_64_addr(USE_ADDR64_BCAST);
    set_16_addr(destination);

    set_broadcast_radius(15, 0);
    set_transmit_request_options(15, 0);

    set_transmit_request_data(buffer, data_length);

    build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
    
    transmit(data_length);

    return false;
}

bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16)
{
    build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
    
    set_api_frame_type(TransmitRequest);
    set_api_frame_id(0x01);

    set_64_addr(destination64);
    set_16_addr(destination16);

    set_broadcast_radius(15, 0);
    set_transmit_request_options(15, 0);

    set_transmit_request_data(buffer, data_length);

    build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);

    transmit(data_length);

    return false;
}

void transmit(int packet_length)
{
    for (int i = 0; i < 18 + packet_length; i++)
    {
        xbee_transmit_led = !xbee_transmit_led;
        xbee.putc(TransmitBuffer[i]);
    }
}