Subversion Repositories Code-Repo

Rev

Rev 113 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#ifndef __xbee_h
#define __xbee_h

#include "msg_queues.h"

#define XBEE_BUFFER_SIZE MSGLEN-20
#define XBEE_START_DELIMITER 0x7E

// Expected 'next' state
#define XBEE_STATE_READ_START               10
#define XBEE_STATE_READ_LENGTH_HIGH         11
#define XBEE_STATE_READ_LENGTH_LOW          12
#define XBEE_STATE_READ_FRAME_DATA          14
#define XBEE_STATE_READ_CHECKSUM            15

// Command Frame Type
#define XBEE_TX_AT_COMMAND                  0x08
#define XBEE_TX_AT_COMMAND_QUEUE            0x09
#define XBEE_RX_AT_COMMAND_RESPONSE         0x88

#define XBEE_TX_DATA_PACKET                 0x10
#define XBEE_RX_DATA_PACKET                 0x90
#define XBEE_RX_DATA_TX_STATUS              0x8B
#define XBEE_RX_IO_DATA_SAMPLE              0x92
#define XBEE_TX_EXPLICIT_COMMAND            0x11
#define XBEE_RX_EXPLICIT_COMMAND            0x91

#define XBEE_TX_REMOTE_AT_COMMAND           0x17
#define XBEE_RX_REMOTE_AT_COMMAND_RESPONSE  0x97

#define XBEE_TX_CREATE_SOURCE_ROUTE         0x21
#define XBEE_RX_ROUTE_RECORD                0xA1
#define XBEE_RX_NODE_IDENTIFICATION         0x95
#define XBEE_RX_FRAME_MODEM_STATUS          0x8A

typedef struct {
    union {
        unsigned long long_value;
        unsigned char char_value[4]; // Little Endian!!
    } UPPER_32;
    union {
        unsigned long long_value;
        unsigned char char_value[4]; // Little Endian!!
    } LOWER_32;
} XBEE_ADDRESS_64;

typedef struct {
    union {
        unsigned int int_value;
        unsigned char char_value[2]; // Little Endian!!
    } INT_16;
} XBEE_ADDRESS_16;

// Unique Frame Components
typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    unsigned char command[2];
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_AT_COMMAND_FRAME;
#define XBEE_TX_AT_COMMAND_FRAME_SIZE 4

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    unsigned char command[2];
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_AT_COMMAND_QUEUE_FRAME;
#define XBEE_TX_AT_COMMAND_QUEUE_FRAME_SIZE 4

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    unsigned char command[2];
    unsigned char command_status;
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_RX_AT_COMMAND_RESPONSE_FRAME;
#define XBEE_RX_AT_COMMAND_RESPONSE_FRAME_SIZE 5

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    XBEE_ADDRESS_64 destination_64;
    XBEE_ADDRESS_16 destination_16;
    unsigned char broadcast_radius;
    unsigned char options;
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_DATA_PACKET_FRAME;
#define XBEE_TX_DATA_PACKET_FRAME_SIZE 14

typedef struct {
    unsigned char frame_type;
    XBEE_ADDRESS_64 source_64;
    XBEE_ADDRESS_16 source_16;
    unsigned char recieve_options;
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_RX_DATA_PACKET_FRAME;
#define XBEE_RX_DATA_PACKET_FRAME_SIZE 12

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    XBEE_ADDRESS_16 destination_16;
    unsigned char transmit_retry_count;
    unsigned char delivery_status;
    unsigned char discovery_status;
} XBEE_RX_DATA_TX_STATUS_FRAME;
#define XBEE_RX_DATA_TX_STATUS_FRAME_SIZE 7

typedef struct {
    unsigned char frame_type;
    XBEE_ADDRESS_64 source_64;
    XBEE_ADDRESS_16 source_16;
    unsigned char recieve_options;
    unsigned char number_of_samples;
    unsigned char digital_ch_mask[2];
    unsigned char analog_ch_mask;
    unsigned char digital_samples[2];
    unsigned char analog_samples[8];
} XBEE_RX_IO_DATA_SAMPLE_FRAME;
#define XBEE_RX_IO_DATA_SAMPLE_FRAME_SIZE 26

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    XBEE_ADDRESS_64 destination_64;
    XBEE_ADDRESS_16 destination_16;
    unsigned char source_endpoint;
    unsigned char destination_endpoint;
    unsigned char cluster_id[2];
    unsigned char profile_id[2];
    unsigned char broadcast_radius;
    unsigned char transmit_options;
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_EXPLICIT_COMMAND_FRAME;
#define XBEE_TX_EXPLICIT_COMMAND_FRAME_SIZE 20

typedef struct {
    unsigned char frame_type;
    XBEE_ADDRESS_64 source_64;
    XBEE_ADDRESS_16 source_16;
    unsigned char source_endpoint;
    unsigned char destination_endpoint;
    unsigned char cluster_id[2];
    unsigned char profile_id[2];
    unsigned char recieve_options;
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_RX_EXPLICIT_COMMAND_FRAME;
#define XBEE_RX_EXPLICIT_COMMAND_FRAME_SIZE 18

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    XBEE_ADDRESS_64 destination_64;
    XBEE_ADDRESS_16 destination_16;
    unsigned char remote_options;
    unsigned char command[2];
    unsigned char data[XBEE_BUFFER_SIZE];
} XBEE_TX_REMOTE_AT_COMMAND_FRAME;
#define XBEE_TX_REMOTE_AT_COMMAND_FRAME_SIZE 15

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    XBEE_ADDRESS_64 source_64;
    XBEE_ADDRESS_16 source_16;
    unsigned char command[2];
    unsigned char command_status;
    unsigned char command_data[4];
} XBEE_RX_REMOTE_AT_COMMAND_FRAME;
#define XBEE_RX_REMOTE_AT_COMMAND_FRAME_SIZE 19

typedef struct {
    unsigned char frame_type;
    unsigned char frame_id;
    XBEE_ADDRESS_64 destination_64;
    XBEE_ADDRESS_16 destination_16;
    unsigned char route_options;
    unsigned char num_of_addresses;
    unsigned char addresses[XBEE_BUFFER_SIZE];
} XBEE_TX_CREATE_SOURCE_ROUTE_FRAME;
#define XBEE_TX_CREATE_SOURCE_ROUTE_FRAME_SIZE 14

typedef struct {
    unsigned char frame_type;
    XBEE_ADDRESS_64 source_64;
    XBEE_ADDRESS_16 source_16;
    unsigned char recieve_options;
    unsigned char num_of_addresses;
    unsigned char addresses[XBEE_BUFFER_SIZE];
} XBEE_RX_ROUTE_RECORD_FRAME;
#define XBEE_RX_ROUTE_RECORD_FRAME_SIZE 13

typedef struct {
    unsigned char frame_type;
    XBEE_ADDRESS_64 source_64;
    XBEE_ADDRESS_16 source_16;
    unsigned char recieve_options;
    XBEE_ADDRESS_16 remote_16;
    XBEE_ADDRESS_64 remote_64;
    unsigned char NI_string[2];
    XBEE_ADDRESS_16 parent_16;
    unsigned char device_type;
    unsigned char source_event;
    unsigned char profile_id[2];
    unsigned char manufacturer_id[2];
} XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME;
#define XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME_SIZE 32

typedef struct {
    unsigned char frame_type;
    unsigned char status;
} XBEE_RX_MODEM_STATUS_FRAME;
#define XBEE_RX_MODEM_STATUS_FRAME_SIZE 2

typedef union __XBEE_FRAME {
    XBEE_TX_AT_COMMAND_FRAME            TX_AT_COMMAND;
    XBEE_TX_AT_COMMAND_QUEUE_FRAME      TX_AT_COMMAND_QUEUE;
    XBEE_RX_AT_COMMAND_RESPONSE_FRAME   RX_AT_COMMAND_RESPONSE;
    XBEE_TX_DATA_PACKET_FRAME           TX_DATA_PACKET;
    XBEE_RX_DATA_PACKET_FRAME           RX_DATA_PACKET;
    XBEE_RX_DATA_TX_STATUS_FRAME        RX_DATA_TX_STATUS;
    XBEE_RX_IO_DATA_SAMPLE_FRAME        RX_IO_DATA_SAMPLE;
    XBEE_TX_EXPLICIT_COMMAND_FRAME      TX_EXPLICIT_COMMAND;
    XBEE_RX_EXPLICIT_COMMAND_FRAME      RX_EXPLICIT_COMMAND;
    XBEE_TX_REMOTE_AT_COMMAND_FRAME     TX_REMOTE_AT_COMMAND;
    XBEE_RX_REMOTE_AT_COMMAND_FRAME     RX_REMOTE_AT_COMMAND;
    XBEE_TX_CREATE_SOURCE_ROUTE_FRAME   TX_CREATE_SOURCE_ROUTE;
    XBEE_RX_ROUTE_RECORD_FRAME          RX_ROUTE_RECORD;
    XBEE_RX_NODE_IDENTIFICATION_INDICATOR_FRAME     RX_NODE_IDENTIFICATION;
    XBEE_RX_MODEM_STATUS_FRAME          RX_MODEM_STATUS;
} XBEE_FRAME;

// Common Frame Components
typedef struct __XBEE_FULL_FRAME {
    unsigned char start_delimiter;
    XBEE_ADDRESS_16 length;
    XBEE_FRAME *FRAME;
} XBEE_FULL_FRAME; // 5 bytes overhead

// Overall Data Structure
typedef struct __xbee_data {
    XBEE_FULL_FRAME rcv_frame;
    unsigned char dataind;
    unsigned char checksum_sum;
    unsigned char read_state;
    unsigned char msgtype;
} XBEE_DATA; // 9 bytes overhead


void xbee_init(XBEE_DATA *);
void xbee_read_serial(unsigned char);
void xbee_process_recieved_frame(void);
//void xbee_process_transmit_frame_interrupt(void);
void xbee_process_transmit_frame(void *data, unsigned char length);

void xbee_set_RTS(unsigned char);
unsigned char xbee_read_CTS(void);
void xbee_sleep(void);
void xbee_wake(void);

void ConvertEndian64(XBEE_ADDRESS_64 *src);
void ConvertEndian16(XBEE_ADDRESS_16 *src);

#endif