Subversion Repositories Code-Repo

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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