1,16 → 1,17 |
#include <xc.h> |
#include <stdio.h> |
#include <string.h> |
#include "defines.h" |
#include "xbee.h" |
#include <string.h> |
#include "uart.h" |
|
#pragma udata XBEE_BUFFER |
static XBEE_DATA xbee_data; |
#pragma udata |
static XBEE_DATA *xbee_data_p = &xbee_data; |
static XBEE_DATA *xbee_data_p; |
static void *xbee_data_frame; |
static void *xbee_frame; |
|
/* Initialize variables used by this library */ |
void XBee_Init() { |
void XBee_Init(XBEE_DATA *data) { |
xbee_data_p = data; |
XBEE_CTS_TRIS = 1; // RB0 is CTS, set by XBee chip |
XBEE_RTS_TRIS = 0; // RB1 is RTS, set by PIC |
|
31,7 → 32,7 |
} |
|
/* Here we handle the serial input from the UART interrupt */ |
void XBee_Serial_In(unsigned char c) { |
void XBee_Serial_In(char c) { |
// 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; |
56,7 → 57,7 |
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; |
*((char *)xbee_frame) = XBEE_START_DELIMITER; |
} else { |
switch (xbee_data_p->read_state) { |
case XBEE_STATE_READ_START: |
92,7 → 93,9 |
// XBee_Process_Received_Frame(); |
} else { |
// If checksum does not match, drop frame |
DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n"); |
char output[32]; |
sprintf(output, "XBEE: checksum mismatch\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
} |
xbee_data_p->read_state = XBEE_STATE_READ_START; |
break; |
104,40 → 107,51 |
void XBee_Process_Received_Frame() { |
// 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)) { |
char output[64]; |
switch (*((char *) xbee_data_frame)) { |
case XBEE_RX_AT_COMMAND_RESPONSE: |
DBG_PRINT_XBEE("XBEE: parsing recieved AT command response frame\r\n"); |
sprintf(output, "XBEE: parsing recieved AT command response frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_DATA_PACKET: |
DBG_PRINT_XBEE("XBEE: parsing recieved data frame\r\n"); |
sprintf(output, "XBEE: parsing recieved data frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_DATA_TX_STATUS: |
DBG_PRINT_XBEE("XBEE: parsing recieved TX status frame\r\n"); |
sprintf(output, "XBEE: parsing recieved TX status frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_IO_DATA_SAMPLE: |
DBG_PRINT_XBEE("XBEE: parsing recieved IO data sample frame\r\n"); |
sprintf(output, "XBEE: parsing recieved IO data sample frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_EXPLICIT_COMMAND: |
DBG_PRINT_XBEE("XBEE: parsing recieved explicit command frame\r\n"); |
sprintf(output, "XBEE: parsing recieved explicit command frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE: |
DBG_PRINT_XBEE("XBEE: parsing recieved remote AT command frame\r\n"); |
sprintf(output, "XBEE: parsing recieved remote AT command frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_ROUTE_RECORD: |
DBG_PRINT_XBEE("XBEE: parsing recieved route record frame\r\n"); |
sprintf(output, "XBEE: parsing recieved route record frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_NODE_IDENTIFICATION: |
DBG_PRINT_XBEE("XBEE: parsing recieved node identification frame\r\n"); |
sprintf(output, "XBEE: parsing recieved node identification frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
case XBEE_RX_FRAME_MODEM_STATUS: |
DBG_PRINT_XBEE("XBEE: parsing recieved modem status frame\r\n"); |
sprintf(output, "XBEE: parsing recieved modem status frame\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
break; |
default: |
DBG_PRINT_XBEE("XBEE: (ERROR) unrecognized frame type\r\n"); |
sprintf(output, "XBEE: (ERROR) unrecognized frame type\r\n"); |
DBG_PRINT_XBEE(output, strlen(output)); |
} |
} |
|
unsigned int XBee_Get_Received_Frame(unsigned char *frame) { |
unsigned int XBee_Get_Received_Frame(char *frame) { |
if (!xbee_data_p->frame_rdy) { |
return 0; |
} else { |
147,10 → 161,10 |
} |
} |
|
void XBee_Process_Transmit_Frame(unsigned char *data, unsigned char length) { |
void XBee_Process_Transmit_Frame(char *data, char length) { |
#ifdef XBEE_USE_ESCAPE_CHAR |
unsigned int i = 0; |
unsigned char chksum = 0; |
char chksum = 0; |
|
// Write the start bit and length |
UART1_WriteC(XBEE_START_DELIMITER); |
182,7 → 196,7 |
} |
#else |
unsigned int i = 0; |
unsigned char chksum = 0; |
char chksum = 0; |
|
UART1_WriteC(XBEE_START_DELIMITER); |
UART1_WriteC(0); |
195,7 → 209,7 |
#endif |
} |
|
void XBee_Set_RTS(unsigned char c) { |
void XBee_Set_RTS(char c) { |
if (c) { |
XBEE_RTS_LAT = 1; // Set high to stop receiving data |
} else { |
203,8 → 217,8 |
} |
} |
|
unsigned char XBee_Read_CTS() { |
unsigned char c = XBEE_CTS_PORT; |
char XBee_Read_CTS() { |
char c = XBEE_CTS_PORT; |
if (c) { |
return 0x1; // High indicates stop sending data |
} else { |