Subversion Repositories Code-Repo

Rev

Rev 119 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 119 Rev 127
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