00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "pic_packet.h"
00014
00015 static seen_packet pkt_seen_list[PKT_SEEN_LIST_SIZE];
00016 static sending_item pkt_tx_queue[PKT_TX_QUEUE_SIZE];
00017
00018 uns8 pkt_seen_list_last = 0;
00019 uns16 pkt_my_addr = 0x66;
00020 uns16 pkt_my_next_pkt_id = 0;
00021
00022
00023 uns8 pkt_seen(uns16 pkt_id, uns16 source_addr) {
00024
00025 uns8 count;
00026
00027 for (count = 0; count < PKT_SEEN_LIST_SIZE; count++ ) {
00028 if ((pkt_seen_list[count].pkt_id == pkt_id) &&
00029 (pkt_seen_list[count].source_addr == source_addr)) {
00030 return 1;
00031 }
00032 }
00033 return 0;
00034 }
00035
00036
00037
00038 uns8 pkt_load_rx(rf_packet *pkt_in) {
00039
00040 uns8 status = 0;
00041 uns8 count;
00042 uns16 orig_pkt_id;
00043 uns8 ack_payload[4] = { 0xff, 0xff, 0xff, 0xff };
00044
00045 rf_packet packet;
00046
00047 memcpy( (void *)&packet,
00048 (void *)pkt_in,
00049 PKT_PACKET_SIZE);
00050
00051
00052 #ifdef PKT_DEBUG_HIGH
00053 serial_print_str("r");
00054 pkt_print_packet(&packet);
00055 #endif
00056 if (!pkt_check_check_byte(&packet)) {
00057 #ifdef PKT_DEBUG_HIGH
00058 serial_print_str("CF! ");
00059 #endif
00060 return PKT_STATUS_CHECK_FAIL;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 if (packet.d.dest_addr == pkt_my_addr) {
00074 status = PKT_STATUS_PKT_IS_FOR_ME;
00075
00076 if ((packet.d.payload[0] != 0xff) ||
00077 (packet.d.payload[1] != 0xff)) {
00078
00079 ack_payload[2] = packet.d.pkt_id & 0xff;
00080 ack_payload[3] = packet.d.pkt_id >> 8;
00081 pkt_send(packet.d.source_addr, ack_payload, PKT_FLAG_NO_RESEND);
00082 } else {
00083 status = PKT_STATUS_PKT_IS_ACK_FOR_ME;
00084 orig_pkt_id = packet.d.payload[3];
00085 orig_pkt_id <<= 8;
00086 orig_pkt_id += packet.d.payload[2];
00087
00088
00089 for (count = 0; count < PKT_TX_QUEUE_SIZE; count++) {
00090
00091
00092
00093
00094
00095
00096
00097 if ((pkt_tx_queue[count].flag != PKT_FLAG_DELETED) &&
00098 (pkt_tx_queue[count].packet.d.pkt_id == orig_pkt_id)) {
00099
00100 status = PKT_STATUS_PKT_IS_FACK_FOR_ME;
00101 pkt_tx_queue[count].flag = PKT_FLAG_DELETED;
00102 }
00103 }
00104 }
00105
00106
00107
00108 if (!pkt_seen(packet.d.pkt_id, packet.d.source_addr)) {
00109
00110
00111 pkt_process_payload(packet.d.source_addr, packet.d.pkt_id, packet.d.payload);
00112
00113 pkt_seen_list_last++;
00114 if (pkt_seen_list_last == PKT_SEEN_LIST_SIZE) {
00115 pkt_seen_list_last = 0;
00116 }
00117 pkt_seen_list[pkt_seen_list_last].pkt_id = packet.d.pkt_id;
00118 pkt_seen_list[pkt_seen_list_last].source_addr = packet.d.source_addr;
00119 } else {
00120 serial_print_str(" seen ");
00121 }
00122 }
00123 else
00124
00125 if (pkt_seen(packet.d.pkt_id, packet.d.source_addr)) {
00126
00127 status = PKT_STATUS_SEEN_BEFORE;
00128 } else
00129
00130 if (packet.d.source_addr == pkt_my_addr) {
00131 status = PKT_STATUS_I_AM_SENDER;
00132 } else
00133
00134 if (packet.d.r1_addr == 0xffff) {
00135 status = PKT_STATUS_DIRECT_SEND;
00136 } else
00137
00138 if ((packet.d.r1_addr == pkt_my_addr) || (packet.d.r2_addr == pkt_my_addr) ||
00139 (packet.d.r3_addr == pkt_my_addr)) {
00140 status = PKT_STATUS_PREVIOUS_ROUTED_VIA_ME;
00141 } else
00142
00143 if (packet.d.r3_addr != 0) {
00144 status = PKT_STATUS_ROUTING_FULL;
00145 } else {
00146 status = PKT_STATUS_NEED_TO_REBROADCAST;
00147
00148 if (packet.d.r1_addr == 0) {
00149 packet.d.r1_addr = pkt_my_addr;
00150 } else if (packet.d.r2_addr == 0) {
00151 packet.d.r2_addr = pkt_my_addr;
00152 } else {
00153 packet.d.r3_addr = pkt_my_addr;
00154 }
00155
00156 pkt_calc_check_byte(&packet);
00157
00158 pkt_queue_packet(&packet, PKT_FLAG_NO_RESEND);
00159
00160
00161 }
00162
00163 return status;
00164 }
00165
00166
00167
00168 uns8 pkt_queue_packet(rf_packet *packet, uns8 resend)
00169 {
00170 uns8 count, found;
00171
00172 found = 0;
00173 for (count = 0; count < PKT_TX_QUEUE_SIZE; count++) {
00174 if (pkt_tx_queue[count].flag == PKT_FLAG_DELETED) {
00175 found = 1;
00176 break;
00177 }
00178 }
00179 if (found) {
00180 #ifdef PKT_DEBUG_HIGH
00181 serial_print_str(" Qin ");
00182 serial_print_int(count);
00183 #endif
00184 memcpy( (void *)&pkt_tx_queue[count],
00185 (void *)packet,
00186 PKT_PACKET_SIZE);
00187
00188
00189
00190
00191
00192 if ((packet->d.r1_addr == 0)
00193 || (packet->d.r1_addr = 0xffff)) {
00194 found = 0;
00195 } else {
00196 found = 2;
00197 }
00198 pkt_tx_queue[count].sent_count = found;
00199
00200 pkt_tx_queue[count].flag = resend;
00201 return PKT_STATUS_QUEUED;
00202 } else {
00203 return PKT_STATUS_TX_QUEUE_FULL;
00204 }
00205
00206 }
00207
00208 void pkt_process_tx_queue() {
00209
00210 uns8 count;
00211 uns16 current_tick;
00212 uns8 sent_count;
00213 uns8 flag;
00214
00215 current_tick = tick_get_count();
00216
00217 for (count = 0; count < PKT_TX_QUEUE_SIZE; count++) {
00218 flag = pkt_tx_queue[count].flag;
00219 if (flag != PKT_FLAG_DELETED) {
00220 #ifdef PKT_DEBUG_HIGH
00221 serial_print_str(" SQ: ");
00222 serial_print_int(count);
00223 #endif
00224 sent_count = pkt_tx_queue[count].sent_count;
00225 if ((sent_count == 0)
00226 || (tick_calc_diff(pkt_tx_queue[count].tick_sent, current_tick)
00227 > PKT_RESEND_TICK_DELAY*sent_count)) {
00228
00229
00230 pkt_tx_queue[count].tick_sent = current_tick;
00231 pkt_send_packet((rf_packet*)&pkt_tx_queue[count]);
00232 if (flag == PKT_FLAG_NO_RESEND) {
00233 pkt_tx_queue[count].flag = PKT_FLAG_DELETED;
00234 #ifdef PKT_DEBUG_HIGH
00235 serial_print_str(" SNR ");
00236 pkt_print_packet((rf_packet*)&pkt_tx_queue[count]);
00237 #endif
00238
00239 } else {
00240 pkt_tx_queue[count].sent_count++;
00241 #ifdef PKT_DEBUG_HIGH
00242 printf("SC %d ", pkt_tx_queue[count].sent_count);
00243 #endif
00244
00245 if (sent_count +1 >= PKT_SEND_MAX_TRIES) {
00246 pkt_tx_queue[count].flag = PKT_FLAG_DELETED;
00247 #ifdef PKT_DEBUG
00248 serial_print_str(" SF!\n ");
00249 #endif
00250 }
00251 else {
00252 if (pkt_tx_queue[count].packet.d.r1_addr == 0xffff) {
00253 pkt_tx_queue[count].packet.d.r1_addr = 0;
00254 }
00255 }
00256 }
00257 }
00258 }
00259 }
00260 }
00261
00262
00263 void pkt_init(uns16 my_addr) {
00264
00265 uns8 count;
00266 uns16 current_tick;
00267
00268 pkt_my_addr = my_addr;
00269
00270 for (count = 0; count < PKT_TX_QUEUE_SIZE; count++) {
00271 pkt_tx_queue[count].flag = PKT_FLAG_DELETED;
00272 }
00273
00274 for (count = 0; count < PKT_SEEN_LIST_SIZE; count++ ) {
00275 pkt_seen_list[count].source_addr = 0xffff;
00276 }
00277 }
00278
00279
00280 uns8 pkt_send(uns16 dest_addr, uns8 *payload, uns8 resend) {
00281
00282 rf_packet my_packet;
00283 uns8 result;
00284 uns8 count;
00285
00286
00287
00288
00289
00290 my_packet.d.source_addr = pkt_my_addr;
00291 my_packet.d.pkt_id = pkt_my_next_pkt_id++;
00292 my_packet.d.dest_addr = dest_addr;
00293 my_packet.d.r1_addr = 0xffff;
00294 my_packet.d.r2_addr = 0;
00295 my_packet.d.r3_addr = 0;
00296 for (count = 0; count < 8; count++) {
00297 my_packet.d.payload[count] = payload[count];
00298 }
00299 pkt_calc_check_byte(&my_packet);
00300
00301 #ifdef PKT_DEBUG_HIGH
00302 serial_print_str(" PS");
00303 pkt_print_packet(&my_packet);
00304 #endif
00305
00306 result = pkt_queue_packet(&my_packet, resend);
00307
00308 }
00309
00310 void pkt_calc_check_byte(rf_packet *packet) {
00311
00312 uns8 calc, count;
00313
00314 calc = 0;
00315 for (count = 0; count < PKT_PACKET_SIZE -1; count++) {
00316 calc ^= packet->a[count];
00317 }
00318 packet->d.check_byte = calc;
00319 }
00320
00321 uns8 pkt_check_check_byte(rf_packet *packet) {
00322
00323 uns8 calc, count;
00324
00325 calc = 0;
00326 for (count = 0; count < PKT_PACKET_SIZE -1; count++) {
00327 calc ^= packet->a[count];
00328 }
00329
00330 if (calc == packet->d.check_byte) {
00331 return 1;
00332 } else
00333 return 0;
00334 }
00335
00336
00337
00338 uns8 pkt_print_packet(rf_packet *my_packet) {
00339
00340 serial_print_str("[Pkt: s:");
00341 serial_print_int(my_packet->d.source_addr);
00342 serial_print_str(" i:");
00343 serial_print_int(my_packet->d.pkt_id);
00344 serial_print_str(" d:");
00345 serial_print_int(my_packet->d.dest_addr);
00346 serial_print_str(" r1:");
00347 serial_print_int(my_packet->d.r1_addr);
00348 serial_print_str(" r2:");
00349 serial_print_int(my_packet->d.r2_addr);
00350 serial_print_str(" r3:");
00351 serial_print_int(my_packet->d.r3_addr);
00352 serial_print_str(" p:");
00353 serial_print_int(my_packet->d.payload[0]);
00354 serial_putc(' ');
00355 serial_print_int(my_packet->d.payload[1]);
00356 serial_putc(' ');
00357 serial_print_int(my_packet->d.payload[2]);
00358 serial_putc(' ');
00359 serial_print_int(my_packet->d.payload[3]);
00360 serial_print_str("] ");
00361 }
00362