3,6 → 3,7 |
#include <string.h> |
|
static XBEE_DATA xbee_data; |
static XBEE_DATA *xbee_data_p = &xbee_data; |
static void *xbee_data_frame; |
static void *xbee_frame; |
|
14,17 → 15,17 |
XBEE_CTS_LAT = 0; // Pin set high to signal stop sending data to XBee |
XBEE_RTS_LAT = 0; // Pin set high to indicate stop sending data to PIC |
|
xbee_data.dataind = 0; |
xbee_data.checksum_sum = 0; |
xbee_data.frame_rdy = 0; |
xbee_data.escape_flag = 0; |
xbee_data.read_state = XBEE_STATE_READ_START; |
xbee_data_p->dataind = 0; |
xbee_data_p->checksum_sum = 0; |
xbee_data_p->frame_rdy = 0; |
xbee_data_p->escape_flag = 0; |
xbee_data_p->read_state = XBEE_STATE_READ_START; |
|
// memset(&xbee_data, 0, 32); |
|
// Grab a pointer to where the unique frame array starts |
xbee_data_frame = &(xbee_data.rcv_frame.FRAME); |
xbee_frame = &(xbee_data.rcv_frame); |
xbee_data_frame = &(xbee_data_p->rcv_frame.FRAME); |
xbee_frame = &(xbee_data_p->rcv_frame); |
} |
|
/* Here we handle the serial input from the UART interrupt */ |
32,31 → 33,30 |
// For some reason writing the length straight to xbee_data doesnt seem to work |
// so we work around it by pointing to the length bytes directly |
XBEE_ADDRESS_16 *length = xbee_frame + 1; |
|
|
#ifdef XBEE_USE_ESCAPE_CHAR |
if (c == XBEE_ESCAPE_CHAR) { |
// Next byte needs is an escaped char |
xbee_data.escape_flag = 1; |
xbee_data_p->escape_flag = 1; |
return; |
} |
|
if (xbee_data.escape_flag) { |
if (xbee_data_p->escape_flag) { |
// XOR byte with 0x20 to get escaped char |
c ^= XBEE_ESCAPE_VAL; |
xbee_data.escape_flag = 0; |
xbee_data_p->escape_flag = 0; |
} |
#endif |
|
// Reset on start bit and start saving data |
if (c == XBEE_START_DELIMITER) { |
// On detect start delimiter, clear out initial array |
xbee_data.dataind = 0; |
xbee_data.checksum_sum = 0; |
xbee_data.frame_rdy = 0; |
xbee_data.read_state = XBEE_STATE_READ_LENGTH_HIGH; |
xbee_data_p->dataind = 0; |
xbee_data_p->checksum_sum = 0; |
xbee_data_p->frame_rdy = 0; |
xbee_data_p->read_state = XBEE_STATE_READ_LENGTH_HIGH; |
*((unsigned char *)xbee_frame) = XBEE_START_DELIMITER; |
} else { |
switch (xbee_data.read_state) { |
switch (xbee_data_p->read_state) { |
case XBEE_STATE_READ_START: |
// Do nothing and wait till start bit is read |
break; |
63,36 → 63,36 |
case XBEE_STATE_READ_LENGTH_HIGH: |
// Read length (MSB) |
length->INT_16.char_value[1] = c; |
xbee_data.read_state = XBEE_STATE_READ_LENGTH_LOW; |
xbee_data_p->read_state = XBEE_STATE_READ_LENGTH_LOW; |
break; |
case XBEE_STATE_READ_LENGTH_LOW: |
// Read length (LSB) |
length->INT_16.char_value[0] = c; |
xbee_data.read_state = XBEE_STATE_READ_FRAME_DATA; |
xbee_data_p->read_state = XBEE_STATE_READ_FRAME_DATA; |
break; |
case XBEE_STATE_READ_FRAME_DATA: |
// Read unique frame data |
if (xbee_data.dataind < xbee_data.rcv_frame.length.INT_16.int_value) { |
*((char*) xbee_data_frame + xbee_data.dataind) = c; |
xbee_data.checksum_sum += c; |
xbee_data.dataind++; |
if (xbee_data_p->dataind < xbee_data_p->rcv_frame.length.INT_16.int_value) { |
*((char*) xbee_data_frame + xbee_data_p->dataind) = c; |
xbee_data_p->checksum_sum += c; |
xbee_data_p->dataind++; |
} |
// If total length is read, the next byte is the expected checksum |
if (xbee_data.dataind == xbee_data.rcv_frame.length.INT_16.int_value) { |
xbee_data.read_state = XBEE_STATE_READ_CHECKSUM; |
if (xbee_data_p->dataind == xbee_data_p->rcv_frame.length.INT_16.int_value) { |
xbee_data_p->read_state = XBEE_STATE_READ_CHECKSUM; |
} |
break; |
case XBEE_STATE_READ_CHECKSUM: |
// Calculate and compare checksum |
if (0xFF - xbee_data.checksum_sum == c) { |
if (0xFF - xbee_data_p->checksum_sum == c) { |
// Frame was recieved successfully |
xbee_data.frame_rdy = 1; |
xbee_data_p->frame_rdy = 1; |
// XBee_Process_Received_Frame(); |
} else { |
// If checksum does not match, drop frame |
DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n"); |
} |
xbee_data.read_state = XBEE_STATE_READ_START; |
xbee_data_p->read_state = XBEE_STATE_READ_START; |
break; |
} |
} |
100,7 → 100,7 |
|
/* This processes the frame data within the interrupt. Dont use this. */ |
void XBee_Process_Received_Frame() { |
// DBG_PRINT_XBEE("Length: %d\r\n", xbee_data.rcv_frame.length.INT_16.int_value); |
// DBG_PRINT_XBEE("Length: %d\r\n", xbee_data_p->rcv_frame.length.INT_16.int_value); |
// Here we process the received frame depending on the frame type |
switch (*((unsigned char *) xbee_data_frame)) { |
case XBEE_RX_AT_COMMAND_RESPONSE: |
136,12 → 136,12 |
} |
|
unsigned int XBee_Get_Received_Frame(unsigned char *frame) { |
if (!xbee_data.frame_rdy) { |
if (!xbee_data_p->frame_rdy) { |
return 0; |
} else { |
memcpy(frame, xbee_data_frame, xbee_data.rcv_frame.length.INT_16.int_value); |
xbee_data.frame_rdy = 0; // Reset frame ready status |
return xbee_data.rcv_frame.length.INT_16.int_value; |
memcpy(frame, xbee_data_frame, xbee_data_p->rcv_frame.length.INT_16.int_value); |
xbee_data_p->frame_rdy = 0; // Reset frame ready status |
return xbee_data_p->rcv_frame.length.INT_16.int_value; |
} |
} |
|