Subversion Repositories Code-Repo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
119 Kevin 1
#include "maindefs.h"
2
#include "msg_queues.h"
3
#include "xbee.h"
4
#include <usart.h>
5
#include <delays.h>
6
 
7
static XBEE_DATA *xbee_data_ptr;
8
static void *xbee_data_array_ptr;
9
 
10
/* Initialize variables used by this library */
11
void xbee_init(XBEE_DATA *xd) {
12
    TRISBbits.TRISB0 = 1;   // RB0 is CTS, set by XBee chip
13
    TRISBbits.TRISB1 = 0;   // RB1 is RTS, set by PIC
14
 
15
    LATBbits.LATB0 = 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
17
 
18
    xbee_data_ptr = xd;
19
    xbee_data_ptr->dataind = 0;
20
    xbee_data_ptr->checksum_sum = 0;
21
    xbee_data_ptr->read_state = XBEE_STATE_READ_START;
22
 
23
    // Grab a pointer to where the unique frame array starts
24
    xbee_data_array_ptr = &(xbee_data_ptr->rcv_frame.FRAME);
25
}
26
 
27
/* Here we handle the serial input from the UART interrupt */
28
void xbee_read_serial(unsigned char c) {
29
    // Reset on start bit and start saving data
30
    if (c == XBEE_START_DELIMITER) {
31
        // On detect start delimiter, clear out initial array
32
        xbee_data_ptr->dataind = 0;
33
        xbee_data_ptr->checksum_sum = 0;
34
        xbee_data_ptr->rcv_frame.start_delimiter = XBEE_START_DELIMITER;
35
        xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_HIGH;
36
    } else {
37
        switch(xbee_data_ptr->read_state) {
38
            case XBEE_STATE_READ_START:
39
                // Do nothing and wait till start bit is read
40
                break;
41
            case XBEE_STATE_READ_LENGTH_HIGH:
42
                // Read length (MSB)
43
                xbee_data_ptr->rcv_frame.length.INT_16.char_value[1] = c;
44
                xbee_data_ptr->read_state = XBEE_STATE_READ_LENGTH_LOW;
45
                break;
46
            case XBEE_STATE_READ_LENGTH_LOW:
47
                // Read length (LSB)
48
                xbee_data_ptr->rcv_frame.length.INT_16.char_value[0] = c;
49
                xbee_data_ptr->read_state = XBEE_STATE_READ_FRAME_DATA;
50
                break;
51
            case XBEE_STATE_READ_FRAME_DATA:
52
                // Read unique frame data
53
                if (xbee_data_ptr->dataind < xbee_data_ptr->rcv_frame.length.INT_16.int_value) {
54
                    *((char*)xbee_data_array_ptr + xbee_data_ptr->dataind) = c;
55
                    xbee_data_ptr->checksum_sum += c;
56
                    xbee_data_ptr->dataind++;
57
                }
58
                // 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) {
60
                    xbee_data_ptr->read_state = XBEE_STATE_READ_CHECKSUM;
61
                }
62
                break;
63
            case XBEE_STATE_READ_CHECKSUM:
64
                // Calculate and compare checksum
65
                if (0xFF - xbee_data_ptr->checksum_sum == c) {
66
                    // Frame was recieved successfully
67
                    xbee_process_recieved_frame();
68
                    xbee_data_ptr->read_state = XBEE_STATE_READ_START;
69
                } else {
70
                // If checksum does not match, drop frame
71
                    DBG_PRINT_XBEE("XBEE: checksum mismatch\r\n");
72
                    xbee_data_ptr->read_state = XBEE_STATE_READ_START;
73
                }
74
                break;
75
        }
76
    }
77
}
78
 
79
/* This is called when a full frame arrives to process the frame data */
80
void xbee_process_recieved_frame() {
81
    char ret_status;
82
 
83
    // Here we want to process each frame and send the data to Main()
84
    // Send the frame to main() with the message type depending on the frame type
85
    switch(*((unsigned char *) xbee_data_array_ptr)) {
86
        case XBEE_RX_AT_COMMAND_RESPONSE:
87
            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;
93
        case XBEE_RX_DATA_PACKET:
94
            DBG_PRINT_XBEE("XBEE: parsing recieved data recieved 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;
100
        case XBEE_RX_DATA_TX_STATUS:
101
            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;
107
        case XBEE_RX_IO_DATA_SAMPLE:
108
            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;
114
        case XBEE_RX_EXPLICIT_COMMAND:
115
            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;
121
        case XBEE_RX_REMOTE_AT_COMMAND_RESPONSE:
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;
128
        case XBEE_RX_ROUTE_RECORD:
129
            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;
135
        case XBEE_RX_NODE_IDENTIFICATION:
136
            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;
142
        case XBEE_RX_FRAME_MODEM_STATUS:
143
            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;
149
        default:
150
            DBG_PRINT_XBEE("XBEE: (ERROR) unrecognized frame type\r\n");
151
    }
152
}
153
 
154
//void xbee_process_transmit_frame_interrupt(void) {
155
//    unsigned char i;
156
//    char length;
157
//
158
//    if (MQ_peek_FromMainToHigh() == MSGTYPE_XBEE_TX_FRAME) {
159
//        length = MQ_recvmsg_FromMainToHigh(MSGLEN, (unsigned char *) xbee_data_ptr->msgtype, (void *) xbee_data_array_ptr);
160
//        xbee_data_ptr->checksum_sum = 0;
161
//        Write2USART(XBEE_START_DELIMITER);
162
//        while (Busy2USART());
163
//        Write2USART(0x00);
164
//        while (Busy2USART());
165
//        Write2USART(length);
166
//        while (Busy2USART());
167
//        for (i = 0; i < length; i++) {
168
//            Write2USART(*((unsigned char *) xbee_data_array_ptr + i));
169
//            xbee_data_ptr->checksum_sum += *((unsigned char *) xbee_data_array_ptr + i);
170
//            while (Busy2USART());
171
//        }
172
//        Write2USART(0xFF - xbee_data_ptr->checksum_sum);
173
//        while (Busy2USART());
174
//    }
175
//}
176
 
177
void xbee_process_transmit_frame(void *data, unsigned char length) {
178
    unsigned char i;
179
    unsigned char checksum = 0;
180
 
181
    Write2USART(XBEE_START_DELIMITER);
182
    while (Busy2USART() || xbee_read_CTS());
183
    Write2USART(0x00);
184
    while (Busy2USART() || xbee_read_CTS());
185
    Write2USART(length);
186
    while (Busy2USART() || xbee_read_CTS());
187
    for (i = 0; i < length; i++) {
188
        Write2USART(*((unsigned char *) data + i));
189
        checksum += *((unsigned char *) data + i);
190
        while (Busy2USART() || xbee_read_CTS());
191
    }
192
    Write2USART(0xFF - checksum);
193
    while (Busy2USART());
194
}
195
 
196
void xbee_set_RTS(unsigned char c) {
197
    if (c) {
198
        LATBbits.LATB1 = 1; // Set high to stop receiving data
199
    } else {
200
        LATBbits.LATB1 = 0; // Set low to resume receiving data
201
    }
202
}
203
 
204
unsigned char xbee_read_CTS() {
205
    unsigned char c = PORTBbits.RB0;
206
    if (c) {
207
        return 0x1; // High indicates stop sending data
208
    } else {
209
        return 0x0; // Low indicates ok to send data
210
    }
211
}