Project

General

Profile

Revision 1587

wireless: core send function and ack function done

View differences:

wireless_send.c
35 35

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

  
39 40

  
41
/* Definition for wireless library packet structure
42
 * byte 1: frame number
43
 * byte 2: group code 
44
 * bytes 3-n: data
45
 *
46
 * Definition for ack buffer
47
 * 2 bit system: 0=still sending
48
 *               1=OK
49
 *               2=ack failure
50
 *               3=CCA failure
51
 */
52

  
53

  
54
/* global variables */
55
uint8_t nextframe = 1;
56
uint8_t ack_buf[64];
57

  
58
/* private function prototypes */
59
void setack(uint8_t num,uint8_t val);
60

  
61

  
40 62
// the send functions
41 63

  
42 64
/**
......
57 79
 *
58 80
 * @return positive packet number for tracking acks, or error code (TBD)
59 81
 **/
60
int16_t wl_send(char *data, uint8_t length, uint8_t group, uint8_t scope, uint16_t dest, uint8_t mode) {
82
int16_t wl_send(uint8_t *data, uint8_t length, uint8_t group, uint8_t scope, uint16_t dest, uint8_t mode) {
83
  uint8_t packet[length+2];
84
  uint8_t options = XBEE_OPTIONS_NONE;
85
  int16_t ret_val = (int16_t)nextframe;
86
  
87
  // build packet
88
  packet[0] = nextframe;
89
  packet[1] = group;
90
  memcpy(packet+2,data,length);
91
  
92
  // set options
93
  if (scope == GLOBAL)
94
    options &= XBEE_OPTIONS_BROADCAST_ALL_PANS;
95
  if (mode == FAST) {
96
    options &= XBEE_OPTIONS_DISABLE_RESPONSE;
97
    ret_val = 0;
98
    setack(nextframe,ACK_OK); // save in ack system
99
  } else if (mode == RELIABLE) {   
100
    // save in ack system
101
    setack(nextframe,SENDING); // save in ack system
102
  } else {
103
    WL_DEBUG_PRINT("Error - bad mode in core send function\r\n");
104
    return WL_ERROR_MODE;
105
  }
61 106

  
62
  return 0;
107
  // send the packet
108
  if (xbee_send_packet(packet,length,dest,options,(uint_8)ret_val) != 0) {
109
    WL_DEBUG_PRINT("Error sending packet from core send function\r\n");
110
    return WL_ERROR_SEND;
111
  }
112
  
113
  // increment frame number
114
  nextframe = (nextframe == 0xFF)?1:nextframe+1;
115
    
116

  
117
  return ret_val; // return frame number for ack tracking
63 118
}
64 119

  
65 120
/**
......
129 184
 *
130 185
 * @return the # of packets lost (up to 255)
131 186
 **/
132
int8_t wl_ack_error(void) {
187
uint8_t wl_ack_error(void) {
188
  uint_8 val=0,i=1;
189
  
190
  while(1) {
191
    if (ack_buf[i/4]&(0x3<<(i%4)) != 0)
192
      val++;
193
    if (i==255)
194
      break;
195
    i++;
196
  }
133 197

  
134
  return 0;
198
  return val;
135 199
}
136 200

  
137 201
/**
138 202
 * acknowledgement error check
139 203
 * check if a specific packet has been lost
140
 * note: buffer will overflow ever 255 packets
204
 * note: buffer will overflow every 255 packets
141 205
 * 
142
 * @param packet number
206
 * @param packet packet number
143 207
 *
144
 * @return 0=still sending,1=ack received,-1=ack failure
208
 * @return {SENDING,ACK_OK,ACK_FAILURE,CCA_FAILURE}
145 209
 **/
146 210
int8_t wl_ack_check(uint8_t packet) {
147

  
148
	return 0;
211
  if (packet == 0) {
212
    // no ack information here
213
    WL_DEBIG_PRINT("packet number cannot be 0\r\n");
214
    return WL_ERROR_ARGUMENT;
215
  }
216
  
217
  // check ack
218
  return ack_buf[packet/4]&(0x3<<(packet%4));
149 219
}
150 220

  
151 221
/**
......
153 223
 * reset the acknowledgement buffer
154 224
 **/
155 225
void wl_ack_reset(void) {
156

  
226
  memset(ack_buf,0,64);
157 227
}
158 228

  
159 229

  
......
162 232

  
163 233
// Define all private functions down here
164 234

  
235
/*
236
 * sets 2 bits in the ack_buf
237
 *
238
 * @param num the ack number
239
 * @param val {SENDING,ACK_OK,ACK_FAILURE,CCA_FAILURE}
240
 */
241
void setack(uint8_t num,uint8_t val) {
242
  switch(num%4) {
243
  case 0:
244
    ack_buf[num/4] &= (0xFC|val);
245
    break;
246
  case 1:
247
    ack_buf[num/4] &= (0xF3|(val<<2));
248
    break;
249
  case 2:
250
    ack_buf[num/4] &= (0xCF|(val<<4));
251
    break;
252
  case 3:
253
    ack_buf[num/4] &= (0x3F|(val<<6));
254
    break;
255
  }
256
}
165 257

  
166

  

Also available in: Unified diff