Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 127 → Rev 128

/PIC Stuff/PIC_27J13/xbee.c
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;
}
}