Project

General

Profile

Statistics
| Revision:

root / branches / wireless / code / projects / libwireless / wireless_receive.c @ 1591

History | View | Annotate | Download (4.3 KB)

1
/**
2
 * Copyright (c) 2009 Colony Project
3
 *
4
 * Permission is hereby granted, free of charge, to any person
5
 * obtaining a copy of this software and associated documentation
6
 * files (the "Software"), to deal in the Software without
7
 * restriction, including without limitation the rights to use,
8
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
9
 * copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following
11
 * conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be
14
 * included in all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
 * OTHER DEALINGS IN THE SOFTWARE.
24
 **/
25

    
26
/**
27
 * @file wireless_receive.c
28
 * @brief Wireless library receive functions
29
 *
30
 * Implementation of high level wireless communication.
31
 * This is the receive functions portion of the library.
32
 *
33
 * @author Colony Project, CMU Robotics Club
34
 **/
35

    
36
#include <string.h>
37
#include "wl_defs.h"
38
#include "wireless.h"
39
#include "xbee.h"
40

    
41
/**
42
 * Definition for wireless library receive packet structure
43
 *
44
 * Basic Buffer Packet:
45
 *   byte 1: length of data
46
 *   bytes 2-3: source
47
 *   bytes 4-n: data
48
 *
49
 * Other Buffer Packet:
50
 *   byte 1: length of data
51
 *   byte 2: group number
52
 *   bytes 3-4: source
53
 *   bytes 5-n: data
54
 *
55
 **/
56

    
57
extern uint8_t xbee_basic_buf[PACKET_BUFFER_SIZE];  // buffer for basic-group packets
58
extern uint8_t xbee_other_buf[PACKET_BUFFER_SIZE];  // buffer for non-basic-group packets
59
extern uint8_t basic_buf_first;        // beginning of first packet in basic buffer
60
extern uint8_t basic_buf_last;        // end of last packet in basic buffer
61
extern uint8_t other_buf_first; // beginning of first packet in other buffer
62
extern uint8_t other_buf_last;  // end of last packet in other buffer
63
 
64
 
65
// the receive functions
66

    
67
/**
68
 * @addtogroup wireless Wireless
69
 * @{
70
 **/
71

    
72
/**
73
 * the main receive function (similar to wl_do)
74
 * 
75
 * when called, this function will receive the next packet on the default packet group
76
 * it will also dispatch registered packet handler functions for any other packet groups it has received
77
 *
78
 * @param data an already-initialized array to store the default group packet data in
79
 * @param length the length of the initialized data array
80
 *
81
 * @return the length of the used portion of data array or error (<0)
82
 **/
83
int8_t wl_get(char *data, uint8_t length) {
84
  int8_t return_code = wl_dispatch(); // run dispatch of other packet groups
85
  if (return_code != 0)
86
    return return_code; // error, so end early
87
  return wl_get_basic(data, length); // get a basic packet
88
}
89

    
90
/**
91
 * function to receive only packets on the default group
92
 * this function is only meant to receive packets sent using wl_send_basic()
93
 * 
94
 * @param data an already-initialized array to store the default group packet data in
95
 * @param length the length of the initialized data array
96
 * 
97
 * @return the length of the used portion of data array or error (<0)
98
 **/
99
int8_t wl_get_basic(char *data, uint8_t length) {
100
    uint8_t buf_pos = basic_buf_first;        // start at beginning of first (oldest) basic packet
101
    uint8_t data_length = xbee_basic_buf[buf_pos];  // get packet length
102
    uint8_t packet_num;        // number of packet (may eventually be used to weed out duplicates)
103

    
104
    if (data_length > length)        // not enough room for packet in destination
105
        return WL_ERROR_TOO_SMALL;
106
    
107
    buf_pos++;
108
    packet_num = xbee_basic_buf[buf_pos];   // get packet number
109
    buf_pos++;
110
    buf_pos++;        // ignore the group code. it will always be the same.
111

    
112
    memcpy(data, xbee_basic_buf + buf_pos, data_length);    // get the data
113
    basic_buf_first += data_length; // "free up" this packet's buffer space
114

    
115
    return 0;
116
}
117

    
118
/*
119
 * function to dispatch all registered packet handlers for received packets on non-default groups
120
 *
121
 * @return error codes (TBD)
122
 */
123
int8_t wl_dispatch(void) {
124

    
125
  return 0;
126
}
127

    
128

    
129
/**@} **/ //end defgroup
130

    
131

    
132
// Define all private functions down here
133

    
134

    
135