Revision 1600
wireless: xbee update. still not finished, but the major changes are in here. Also added a function for microsecond delays to time.c
wireless_send.c | ||
---|---|---|
44 | 44 |
* byte 2: frame number |
45 | 45 |
* byte 3: group code |
46 | 46 |
* bytes 4-n: data |
47 |
* (byte n+1: num retries - only saved locally in sending buffer) |
|
47 | 48 |
* |
48 | 49 |
* Definition for ack buffer |
49 | 50 |
* 2 bit system: 0=still sending |
... | ... | |
54 | 55 |
|
55 | 56 |
|
56 | 57 |
/* global variables */ |
57 |
uint8_t nextframe = 1; |
|
58 |
uint8_t ack_buf[64]; |
|
58 |
uint8_t nextframe = 1; // number of next frame |
|
59 |
uint8_t ack_buf[64]; // ack buffer (holds 255 packet return codes) |
|
60 |
uint8_t send_buf[PACKET_BUFFER_SIZE]; // sending buffer for retries |
|
61 |
uint8_t send_buf_first = 0; // first byte of data on buffer |
|
62 |
uint8_t send_buf_last = 0; // next free byte on buffer |
|
59 | 63 |
|
60 | 64 |
/* private function prototypes */ |
61 | 65 |
void setack(uint8_t num,uint8_t val); |
... | ... | |
91 | 95 |
packet[1] = group; |
92 | 96 |
memcpy(packet+2,data,length); |
93 | 97 |
|
94 |
// set options
|
|
98 |
// set scope
|
|
95 | 99 |
if (scope == GLOBAL) |
96 | 100 |
options &= XBEE_OPTIONS_BROADCAST_ALL_PANS; |
101 |
|
|
102 |
// set mode |
|
97 | 103 |
if (mode == FAST) { |
98 | 104 |
options &= XBEE_OPTIONS_DISABLE_RESPONSE; |
99 | 105 |
ret_val = 0; |
100 |
setack(nextframe,ACK_OK); // save in ack system |
|
101 |
} else if (mode == RELIABLE) { |
|
102 |
// save in ack system |
|
103 |
setack(nextframe,SENDING); // save in ack system |
|
104 |
} else { |
|
106 |
} else if (mode != RELIABLE) { |
|
105 | 107 |
WL_DEBUG_PRINT("Error - bad mode in core send function\r\n"); |
106 | 108 |
return WL_ERROR_MODE; |
107 | 109 |
} |
... | ... | |
112 | 114 |
return WL_ERROR_SEND; |
113 | 115 |
} |
114 | 116 |
|
117 |
// save in ack system |
|
118 |
if (mode == FAST) { |
|
119 |
setack(nextframe,ACK_OK); // assume the send was successful |
|
120 |
} else if (mode == RELIABLE) { |
|
121 |
setack(nextframe,SENDING); // set status to SENDING |
|
122 |
// TODO: save packet on sending buffer |
|
123 |
/* if (buffer full) { |
|
124 |
WL_DEBUG_PRINT("Error: sending buffer full\r\n"); |
|
125 |
return WL_ERROR_SENDING_BUFFER_FULL |
|
126 |
} */ |
|
127 |
} |
|
128 |
|
|
115 | 129 |
// increment frame number |
116 | 130 |
nextframe = (nextframe == 0xFF)?1:nextframe+1; |
117 |
|
|
118 | 131 |
|
119 | 132 |
return ret_val; // return frame number for ack tracking |
120 | 133 |
} |
... | ... | |
190 | 203 |
uint_8 val=0,i=1; |
191 | 204 |
|
192 | 205 |
while(1) { |
193 |
if (ack_buf[i/4]&(0x3<<(i%4)) != 0)
|
|
206 |
if (ack_buf[i/4]&(0x2<<(i%4)) != 0) // if the ack is in an error state
|
|
194 | 207 |
val++; |
195 | 208 |
if (i==255) |
196 | 209 |
break; |
... | ... | |
263 | 276 |
switch(val) { |
264 | 277 |
case 0: |
265 | 278 |
// success |
266 |
setack(num,ACK_OK); |
|
279 |
setack(num,ACK_OK); // set status code |
|
280 |
// TODO: remove from sending buffer |
|
267 | 281 |
break; |
268 | 282 |
case 1: |
269 | 283 |
// no ack |
284 |
// TODO: check resend attempts |
|
270 | 285 |
setack(num,ACK_FAILURE); |
271 | 286 |
break; |
272 | 287 |
case 2: |
273 | 288 |
// CCA failure |
289 |
// TODO: check resend attempts |
|
274 | 290 |
setack(num,CCA_FAILURE); |
275 | 291 |
break; |
276 | 292 |
} |
Also available in: Unified diff