| Line 1... |
Line 1... |
| 1 |
#include "maindefs.h"
|
1 |
#include "maindefs.h"
|
| 2 |
#include "msg_queues.h"
|
- |
|
| 3 |
#include "xbee.h"
|
2 |
#include "xbee.h"
|
| 4 |
#include <usart.h>
|
3 |
#include <string.h>
|
| 5 |
#include <delays.h>
|
- |
|
| 6 |
|
4 |
|
| 7 |
static XBEE_DATA *xbee_data_ptr;
|
5 |
static XBEE_DATA xbee_data;
|
| 8 |
static void *xbee_data_array_ptr;
|
6 |
static void *xbee_data_frame;
|
| - |
|
7 |
static void *xbee_frame;
|
| 9 |
|
8 |
|
| 10 |
/* Initialize variables used by this library */
|
9 |
/* Initialize variables used by this library */
|
| 11 |
void xbee_init(XBEE_DATA *xd) {
|
10 |
void XBee_Init() {
|
| 12 |
TRISBbits.TRISB0 = 1; // RB0 is CTS, set by XBee chip
|
11 |
XBEE_CTS_TRIS = 1; // RB0 is CTS, set by XBee chip
|
| 13 |
TRISBbits.TRISB1 = 0; // RB1 is RTS, set by PIC
|
12 |
XBEE_RTS_TRIS = 0; // RB1 is RTS, set by PIC
|
| 14 |
|
13 |
|
| 15 |
LATBbits.LATB0 = 0; // Pin set high to signal stop sending data to XBee
|
14 |
XBEE_CTS_LAT = 0; // Pin set high to signal stop sending data to XBee
|
| 16 |
LATBbits.LATB1 = 0; // Pin set high to indicate stop sending data to PIC
|
15 |
XBEE_RTS_LAT = 0; // Pin set high to indicate stop sending data to PIC
|
| 17 |
|
16 |
|
| 18 |
xbee_data_ptr = xd;
|
17 |
xbee_data.dataind = 0;
|
| - |
|
18 |
xbee_data.checksum_sum = 0;
|
| 19 |
xbee_data_ptr->dataind = 0;
|
19 |
xbee_data.frame_rdy = 0;
|
| 20 |
xbee_data_ptr->checksum_sum = 0;
|
20 |
xbee_data.escape_flag = 0;
|
| 21 |
xbee_data_ptr->read_state = XBEE_STATE_READ_START;
|
21 |
xbee_data.read_state = XBEE_STATE_READ_START;
|
| 22 |
|
22 |
|
| - |
|
23 |
// memset(&xbee_data, 0, 32);
|
| - |
|
24 |
|
| 23 |
// Grab a pointer to where the unique frame array starts
|
25 |
// Grab a pointer to where the unique frame array starts
|
| 24 |
xbee_data_array_ptr = &(xbee_data_ptr->rcv_frame.FRAME);
|
26 |
xbee_data_frame = &(xbee_data.rcv_frame.FRAME);
|
| - |
|
27 |
xbee_frame = &(xbee_data.rcv_frame);
|
| 25 |
}
|
28 |
}
|
| 26 |
|
29 |
|
| 27 |
/* Here we handle the serial input from the UART interrupt */
|
30 |
/* Here we handle the serial input from the UART interrupt */
|
| 28 |
void xbee_read_serial(unsigned char c) {
|
31 |
void XBee_Serial_In(unsigned char c) {
|
| - |
|
32 |
// For some reason writing the length straight to xbee_data doesnt seem to work
|
| - |
|
33 |
// so we work around it by pointing to the length bytes directly
|
| - |
|
34 |
XBEE_ADDRESS_16 *length = xbee_frame + 1;
|
| - |
|
35 |
|
| - |
|
36 |
#ifdef XBEE_USE_ESCAPE_CHAR
|
| - |
|
37 |
if (c == XBEE_ESCAPE_CHAR) {
|
| - |
|
38 |
// Next byte needs is an escaped char
|
| - |
|
39 |
xbee_data.escape_flag = 1;
|
| - |
|
40 |
return;
|
| - |
|
41 |
}
|
| - |
|
42 |
|
| - |
|
43 |
if (xbee_data.escape_flag) {
|
| - |
|
44 |
// XOR byte with 0x20 to get escaped char
|
| - |
|
45 |
c ^= XBEE_ESCAPE_VAL;
|
| - |
|
46 |
xbee_data.escape_flag = 0;
|
| - |
|
47 |
}
|
| - |
|
48 |
#endif
|
| - |
|
49 |
|
| 29 |
// Reset on start bit and start saving data
|
50 |
// Reset on start bit and start saving data
|
| 30 |
if (c == XBEE_START_DELIMITER) {
|
51 |
if (c == XBEE_START_DELIMITER) {
|
| 31 |
// On detect start delimiter, clear out initial array
|
52 |
// On detect start delimiter, clear out initial array
|
| 32 |
xbee_data_ptr->dataind = 0;
|
53 |
xbee_data.dataind = 0;
|
| 33 |
xbee_data_ptr->checksum_sum = 0;
|
54 |
xbee_data.checksum_sum = 0;
|
| 34 |
xbee_data_ptr->rcv_frame.start_delimiter = XBEE_START_DELIMITER;
|
55 |
xbee_data.frame_rdy = 0;
|
| 35 |
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_HIGH;
|
56 |
xbee_data.read_state = XBEE_STATE_READ_LENGTH_HIGH;
|
| - |
|
57 |
*((unsigned char *)xbee_frame) = XBEE_START_DELIMITER;
|
| 36 |
} else {
|
58 |
} else {
|
| 37 |
switch(xbee_data_ptr->read_state) {
|
59 |
switch (xbee_data.read_state) {
|
| 38 |
case XBEE_STATE_READ_START:
|
60 |
case XBEE_STATE_READ_START:
|
| 39 |
// Do nothing and wait till start bit is read
|
61 |
// Do nothing and wait till start bit is read
|
| 40 |
break;
|
62 |
break;
|
| 41 |
case XBEE_STATE_READ_LENGTH_HIGH:
|
63 |
case XBEE_STATE_READ_LENGTH_HIGH:
|
| 42 |
// Read length (MSB)
|
64 |
// Read length (MSB)
|
| 43 |
xbee_data_ptr->rcv_frame.length.INT_16.char_value[1] = c;
|
65 |
length->INT_16.char_value[1] = c;
|
| 44 |
xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_LOW;
|
66 |
xbee_data.read_state = XBEE_STATE_READ_LENGTH_LOW;
|
| 45 |
break;
|
67 |
break;
|
| 46 |
case XBEE_STATE_READ_LENGTH_LOW:
|
68 |
case XBEE_STATE_READ_LENGTH_LOW:
|
| 47 |
// Read length (LSB)
|
69 |
// Read length (LSB)
|
| 48 |
xbee_data_ptr->rcv_frame.length.INT_16.char_value[0] = c;
|
70 |
length->INT_16.char_value[0] = c;
|
| 49 |
xbee_data_ptr->read_state = XBEE_STATE_READ_FRAME_DATA;
|
71 |
xbee_data.read_state = XBEE_STATE_READ_FRAME_DATA;
|
| 50 |
break;
|
72 |
break;
|
| 51 |
case XBEE_STATE_READ_FRAME_DATA:
|
73 |
case XBEE_STATE_READ_FRAME_DATA:
|
| 52 |
// Read unique frame data
|
74 |
// Read unique frame data
|
| 53 |
if (xbee_data_ptr->dataind < xbee_data_ptr->rcv_frame.length.INT_16.int_value) {
|
75 |
if (xbee_data.dataind < xbee_data.rcv_frame.length.INT_16.int_value) {
|
| 54 |
*((char*)xbee_data_array_ptr + xbee_data_ptr->dataind) = c;
|
76 |
*((char*) xbee_data_frame + xbee_data.dataind) = c;
|
| 55 |
xbee_data_ptr->checksum_sum += c;
|
77 |
xbee_data.checksum_sum += c;
|
| 56 |
xbee_data_ptr->dataind++;
|
78 |
xbee_data.dataind++;
|
| 57 |
}
|
79 |
}
|
| 58 |
// If total length is read, the next byte is the expected checksum
|
80 |
// If total length is read, the next byte is the expected checksum
|
| 59 |
if (xbee_data_ptr->dataind == xbee_data_ptr->rcv_frame.length.INT_16.int_value) {
|
81 |
if (xbee_data.dataind == xbee_data.rcv_frame.length.INT_16.int_value) {
|
| 60 |
xbee_data_ptr->read_state = XBEE_STATE_READ_CHECKSUM;
|
82 |
xbee_data.read_state = XBEE_STATE_READ_CHECKSUM;
|
| 61 |
}
|
83 |
}
|
| 62 |
break;
|
84 |
break;
|
| 63 |
case XBEE_STATE_READ_CHECKSUM:
|
85 |
case XBEE_STATE_READ_CHECKSUM:
|
| 64 |
// Calculate and compare checksum
|
86 |
// Calculate and compare checksum
|
| 65 |
if (0xFF - xbee_data_ptr->checksum_sum == c) {
|
87 |
if (0xFF - xbee_data.checksum_sum == c) {
|
| 66 |
// Frame was recieved successfully
|
88 |
// Frame was recieved successfully
|
| 67 |
xbee_process_recieved_frame();
|
89 |
xbee_data.frame_rdy = 1;
|
| 68 |
xbee_data_ptr->read_state = XBEE_STATE_READ_START;
|
90 |
// XBee_Process_Received_Frame();
|
| 69 |
} else {
|
91 |
} else {
|
| 70 |
// If checksum does not match, drop frame
|
92 |
// If checksum does not match, drop frame
|
| 71 |
DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n");
|
93 |
DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n");
|
| 72 |
xbee_data_ptr->read_state = XBEE_STATE_READ_START;
|
- |
|
| 73 |
}
|
94 |
}
|
| - |
|
95 |
xbee_data.read_state = XBEE_STATE_READ_START;
|
| 74 |
break;
|
96 |
break;
|
| 75 |
}
|
97 |
}
|
| 76 |
}
|
98 |
}
|
| 77 |
}
|
99 |
}
|
| 78 |
|
100 |
|
| 79 |
/* This is called when a full frame arrives to process the frame data */
|
101 |
/* This processes the frame data within the interrupt. Dont use this. */
|
| 80 |
void xbee_process_recieved_frame() {
|
102 |
void XBee_Process_Received_Frame() {
|
| 81 |
char ret_status;
|
- |
|
| 82 |
|
- |
|
| 83 |
// Here we want to process each frame and send the data to Main()
|
103 |
// DBG_PRINT_XBEE("Length: %d\r\n", xbee_data.rcv_frame.length.INT_16.int_value);
|
| 84 |
// Send the frame to main() with the message type depending on the frame type
|
104 |
// Here we process the received frame depending on the frame type
|
| 85 |
switch(*((unsigned char *) xbee_data_array_ptr)) {
|
105 |
switch (*((unsigned char *) xbee_data_frame)) {
|
| 86 |
case XBEE_RX_AT_COMMAND_RESPONSE:
|
106 |
case XBEE_RX_AT_COMMAND_RESPONSE:
|
| 87 |
DBG_PRINT_XBEE("XBEE: parsing recieved AT command response frame\r\n");
|
107 |
DBG_PRINT_XBEE("XBEE: parsing recieved AT command response frame\r\n");
|
| 88 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr);
|
- |
|
| 89 |
if (ret_status < 0) {
|
- |
|
| 90 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 91 |
}
|
- |
|
| 92 |
break;
|
108 |
break;
|
| 93 |
case XBEE_RX_DATA_PACKET:
|
109 |
case XBEE_RX_DATA_PACKET:
|
| 94 |
DBG_PRINT_XBEE("XBEE: parsing recieved data recieved frame\r\n");
|
110 |
DBG_PRINT_XBEE("XBEE: parsing recieved data frame\r\n");
|
| 95 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_PACKET, (void *)xbee_data_array_ptr);
|
- |
|
| 96 |
if (ret_status < 0) {
|
- |
|
| 97 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 98 |
}
|
- |
|
| 99 |
break;
|
111 |
break;
|
| 100 |
case XBEE_RX_DATA_TX_STATUS:
|
112 |
case XBEE_RX_DATA_TX_STATUS:
|
| 101 |
DBG_PRINT_XBEE("XBEE: parsing recieved TX status frame\r\n");
|
113 |
DBG_PRINT_XBEE("XBEE: parsing recieved TX status frame\r\n");
|
| 102 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_DATA_TX_STATUS, (void *)xbee_data_array_ptr);
|
- |
|
| 103 |
if (ret_status < 0) {
|
- |
|
| 104 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 105 |
}
|
- |
|
| 106 |
break;
|
114 |
break;
|
| 107 |
case XBEE_RX_IO_DATA_SAMPLE:
|
115 |
case XBEE_RX_IO_DATA_SAMPLE:
|
| 108 |
DBG_PRINT_XBEE("XBEE: parsing recieved IO data sample frame\r\n");
|
116 |
DBG_PRINT_XBEE("XBEE: parsing recieved IO data sample frame\r\n");
|
| 109 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_IO_DATA_SAMPLE, (void *)xbee_data_array_ptr);
|
- |
|
| 110 |
if (ret_status < 0) {
|
- |
|
| 111 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 112 |
}
|
- |
|
| 113 |
break;
|
117 |
break;
|
| 114 |
case XBEE_RX_EXPLICIT_COMMAND:
|
118 |
case XBEE_RX_EXPLICIT_COMMAND:
|
| 115 |
DBG_PRINT_XBEE("XBEE: parsing recieved explicit command frame\r\n");
|
119 |
DBG_PRINT_XBEE("XBEE: parsing recieved explicit command frame\r\n");
|
| 116 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_EXPLICIT_COMMAND, (void *)xbee_data_array_ptr);
|
- |
|
| 117 |
if (ret_status < 0) {
|
- |
|
| 118 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 119 |
}
|
- |
|
| 120 |
break;
|
120 |
break;
|
| 121 |
case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE:
|
121 |
case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE:
|
| 122 |
DBG_PRINT_XBEE("XBEE: parsing recieved remote AT command frame\r\n");
|
122 |
DBG_PRINT_XBEE("XBEE: parsing recieved remote AT command frame\r\n");
|
| 123 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_REMOTE_AT_COMMAND_RESPONSE, (void *)xbee_data_array_ptr);
|
- |
|
| 124 |
if (ret_status < 0) {
|
- |
|
| 125 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 126 |
}
|
- |
|
| 127 |
break;
|
123 |
break;
|
| 128 |
case XBEE_RX_ROUTE_RECORD:
|
124 |
case XBEE_RX_ROUTE_RECORD:
|
| 129 |
DBG_PRINT_XBEE("XBEE: parsing recieved route record frame\r\n");
|
125 |
DBG_PRINT_XBEE("XBEE: parsing recieved route record frame\r\n");
|
| 130 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_ROUTE_RECORD, (void *)xbee_data_array_ptr);
|
- |
|
| 131 |
if (ret_status < 0) {
|
- |
|
| 132 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 133 |
}
|
- |
|
| 134 |
break;
|
126 |
break;
|
| 135 |
case XBEE_RX_NODE_IDENTIFICATION:
|
127 |
case XBEE_RX_NODE_IDENTIFICATION:
|
| 136 |
DBG_PRINT_XBEE("XBEE: parsing recieved node identification frame\r\n");
|
128 |
DBG_PRINT_XBEE("XBEE: parsing recieved node identification frame\r\n");
|
| 137 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_NODE_IDENTIFICATION, (void *)xbee_data_array_ptr);
|
- |
|
| 138 |
if (ret_status < 0) {
|
- |
|
| 139 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 140 |
}
|
- |
|
| 141 |
break;
|
129 |
break;
|
| 142 |
case XBEE_RX_FRAME_MODEM_STATUS:
|
130 |
case XBEE_RX_FRAME_MODEM_STATUS:
|
| 143 |
DBG_PRINT_XBEE("XBEE: parsing recieved modem status frame\r\n");
|
131 |
DBG_PRINT_XBEE("XBEE: parsing recieved modem status frame\r\n");
|
| 144 |
ret_status = MQ_sendmsg_ToMainFromHigh(xbee_data_ptr->rcv_frame.length.INT_16.char_value[0], MSGTYPE_XBEE_RX_FRAME_MODEM_STATUS, (void *)xbee_data_array_ptr);
|
- |
|
| 145 |
if (ret_status < 0) {
|
- |
|
| 146 |
DBG_PRINT_XBEE("XBEE: (ERROR) send message to main failed with error %x\r\n", ret_status);
|
- |
|
| 147 |
}
|
- |
|
| 148 |
break;
|
132 |
break;
|
| 149 |
default:
|
133 |
default:
|
| 150 |
DBG_PRINT_XBEE("XBEE: (ERROR) unrecognized frame type\r\n");
|
134 |
DBG_PRINT_XBEE("XBEE: (ERROR) unrecognized frame type\r\n");
|
| 151 |
}
|
135 |
}
|
| 152 |
}
|
136 |
}
|
| 153 |
|
137 |
|
| - |
|
138 |
unsigned int XBee_Get_Received_Frame(unsigned char *frame) {
|
| 154 |
//void xbee_process_transmit_frame_interrupt(void) {
|
139 |
if (!xbee_data.frame_rdy) {
|
| 155 |
// unsigned char i;
|
140 |
return 0;
|
| 156 |
// char length;
|
141 |
} else {
|
| - |
|
142 |
memcpy(frame, xbee_data_frame, xbee_data.rcv_frame.length.INT_16.int_value);
|
| - |
|
143 |
xbee_data.frame_rdy = 0; // Reset frame ready status
|
| - |
|
144 |
return xbee_data.rcv_frame.length.INT_16.int_value;
|
| - |
|
145 |
}
|
| 157 |
//
|
146 |
}
|
| - |
|
147 |
|
| 158 |
// if (MQ_peek_FromMainToHigh() == MSGTYPE_XBEE_TX_FRAME) {
|
148 |
void XBee_Process_Transmit_Frame(unsigned char *data, unsigned char length) {
|
| - |
|
149 |
#ifdef XBEE_USE_ESCAPE_CHAR
|
| 159 |
// length = MQ_recvmsg_FromMainToHigh(MSGLEN, (unsigned char *) xbee_data_ptr->msgtype, (void *) xbee_data_array_ptr);
|
150 |
unsigned int i = 0;
|
| 160 |
// xbee_data_ptr->checksum_sum = 0;
|
151 |
unsigned char chksum = 0;
|
| - |
|
152 |
|
| - |
|
153 |
// Write the start bit and length
|
| 161 |
// Write2USART(XBEE_START_DELIMITER);
|
154 |
UART1_WriteC(XBEE_START_DELIMITER);
|
| 162 |
// while (Busy2USART());
|
155 |
UART1_WriteC(0);
|
| 163 |
// Write2USART(0x00);
|
156 |
UART1_WriteC(length);
|
| - |
|
157 |
|
| 164 |
// while (Busy2USART());
|
158 |
// Write the frame data
|
| 165 |
// Write2USART(length);
|
159 |
for (i = 0; i < length; i++) {
|
| 166 |
// while (Busy2USART());
|
160 |
chksum += data[i];
|
| - |
|
161 |
if (data[i] == XBEE_START_DELIMITER || \
|
| - |
|
162 |
data[i] == XBEE_ESCAPE_CHAR || \
|
| - |
|
163 |
data[i] == XBEE_XON || \
|
| 167 |
// for (i = 0; i < length; i++) {
|
164 |
data[i] == XBEE_XOFF) {
|
| 168 |
// Write2USART(*((unsigned char *) xbee_data_array_ptr + i));
|
165 |
UART1_WriteC(XBEE_ESCAPE_CHAR);
|
| 169 |
// xbee_data_ptr->checksum_sum += *((unsigned char *) xbee_data_array_ptr + i);
|
166 |
UART1_WriteC(data[i] ^ XBEE_ESCAPE_VAL);
|
| - |
|
167 |
} else {
|
| 170 |
// while (Busy2USART());
|
168 |
UART1_WriteC(data[i]);
|
| 171 |
// }
|
169 |
}
|
| - |
|
170 |
}
|
| - |
|
171 |
// Write the checksum
|
| - |
|
172 |
if (chksum == XBEE_START_DELIMITER || \
|
| 172 |
// Write2USART(0xFF - xbee_data_ptr->checksum_sum);
|
173 |
chksum == XBEE_ESCAPE_CHAR || \
|
| - |
|
174 |
chksum == XBEE_XON || \
|
| - |
|
175 |
chksum == XBEE_XOFF) {
|
| 173 |
// while (Busy2USART());
|
176 |
UART1_WriteC(XBEE_ESCAPE_CHAR);
|
| - |
|
177 |
UART1_WriteC(chksum ^ XBEE_ESCAPE_VAL);
|
| 174 |
// }
|
178 |
} else {
|
| - |
|
179 |
UART1_WriteC(0xFF - chksum);
|
| 175 |
//}
|
180 |
}
|
| 176 |
|
181 |
#else
|
| 177 |
void xbee_process_transmit_frame(void *data, unsigned char length) {
|
- |
|
| 178 |
unsigned char i;
|
182 |
unsigned int i = 0;
|
| 179 |
unsigned char checksum = 0;
|
183 |
unsigned char chksum = 0;
|
| 180 |
|
184 |
|
| 181 |
Write2USART(XBEE_START_DELIMITER);
|
185 |
UART1_WriteC(XBEE_START_DELIMITER);
|
| 182 |
while (Busy2USART() || xbee_read_CTS());
|
- |
|
| 183 |
Write2USART(0x00);
|
186 |
UART1_WriteC(0);
|
| 184 |
while (Busy2USART() || xbee_read_CTS());
|
- |
|
| 185 |
Write2USART(length);
|
187 |
UART1_WriteC(length);
|
| 186 |
while (Busy2USART() || xbee_read_CTS());
|
- |
|
| 187 |
for (i = 0; i < length; i++) {
|
188 |
for (i = 0; i < length; i++) {
|
| 188 |
Write2USART(*((unsigned char *) data + i));
|
- |
|
| 189 |
checksum += *((unsigned char *) data + i);
|
189 |
chksum += data[i];
|
| 190 |
while (Busy2USART() || xbee_read_CTS());
|
190 |
UART1_WriteC(data[i]);
|
| 191 |
}
|
191 |
}
|
| 192 |
Write2USART(0xFF - checksum);
|
192 |
UART1_WriteC(0xFF - chksum);
|
| 193 |
while (Busy2USART());
|
193 |
#endif
|
| 194 |
}
|
194 |
}
|
| 195 |
|
195 |
|
| 196 |
void xbee_set_RTS(unsigned char c) {
|
196 |
void XBee_Set_RTS(unsigned char c) {
|
| 197 |
if (c) {
|
197 |
if (c) {
|
| 198 |
LATBbits.LATB1 = 1; // Set high to stop receiving data
|
198 |
XBEE_RTS_LAT = 1; // Set high to stop receiving data
|
| 199 |
} else {
|
199 |
} else {
|
| 200 |
LATBbits.LATB1 = 0; // Set low to resume receiving data
|
200 |
XBEE_RTS_LAT = 0; // Set low to resume receiving data
|
| 201 |
}
|
201 |
}
|
| 202 |
}
|
202 |
}
|
| 203 |
|
203 |
|
| 204 |
unsigned char xbee_read_CTS() {
|
204 |
unsigned char XBee_Read_CTS() {
|
| 205 |
unsigned char c = PORTBbits.RB0;
|
205 |
unsigned char c = XBEE_CTS_PORT;
|
| 206 |
if (c) {
|
206 |
if (c) {
|
| 207 |
return 0x1; // High indicates stop sending data
|
207 |
return 0x1; // High indicates stop sending data
|
| 208 |
} else {
|
208 |
} else {
|
| 209 |
return 0x0; // Low indicates ok to send data
|
209 |
return 0x0; // Low indicates ok to send data
|
| 210 |
}
|
210 |
}
|
| 211 |
}
|
211 |
}
|
| - |
|
212 |
|
| - |
|
213 |
void XBee_ConvertEndian64(XBEE_ADDRESS_64 *src) {
|
| - |
|
214 |
char tmp[2];
|
| - |
|
215 |
tmp[0] = src->UPPER_32.char_value[3];
|
| - |
|
216 |
tmp[1] = src->UPPER_32.char_value[2];
|
| - |
|
217 |
src->UPPER_32.char_value[3] = src->UPPER_32.char_value[0];
|
| - |
|
218 |
src->UPPER_32.char_value[2] = src->UPPER_32.char_value[1];
|
| - |
|
219 |
src->UPPER_32.char_value[1] = tmp[1];
|
| - |
|
220 |
src->UPPER_32.char_value[0] = tmp[0];
|
| - |
|
221 |
|
| - |
|
222 |
tmp[0] = src->LOWER_32.char_value[3];
|
| - |
|
223 |
tmp[1] = src->LOWER_32.char_value[2];
|
| - |
|
224 |
src->LOWER_32.char_value[3] = src->LOWER_32.char_value[0];
|
| - |
|
225 |
src->LOWER_32.char_value[2] = src->LOWER_32.char_value[1];
|
| - |
|
226 |
src->LOWER_32.char_value[1] = tmp[1];
|
| - |
|
227 |
src->LOWER_32.char_value[0] = tmp[0];
|
| - |
|
228 |
}
|
| - |
|
229 |
|
| - |
|
230 |
void XBee_ConvertEndian16(XBEE_ADDRESS_16 *src) {
|
| - |
|
231 |
char tmp;
|
| - |
|
232 |
tmp = src->INT_16.char_value[0];
|
| - |
|
233 |
src->INT_16.char_value[0] = src->INT_16.char_value[1];
|
| - |
|
234 |
src->INT_16.char_value[1] = tmp;
|
| - |
|
235 |
}
|
| 212 |
|
236 |
|