Revision 1791
| branches/wireless/code/projects/libwireless/wireless_send.c (revision 1791) | ||
|---|---|---|
| 99 | 99 |
packet[3] = XBEE_OPTIONS_NONE; |
| 100 | 100 |
packet[4] = nextframe; |
| 101 | 101 |
packet[5] = group; |
| 102 |
nextframe = (nextframe == 0xFF)?1:nextframe+1; // increment frame number |
|
| 102 | 103 |
|
| 103 | 104 |
// set scope |
| 104 | 105 |
if (scope == GLOBAL) |
| ... | ... | |
| 182 | 183 |
WL_DEBUG_PRINT_P("send_buf_num_packets:");
|
| 183 | 184 |
WL_DEBUG_PRINT_INT(send_buf_num_packets); |
| 184 | 185 |
|
| 185 |
nextframe = (nextframe == 0xFF)?1:nextframe+1; // increment frame number |
|
| 186 | 186 |
return (ret == WL_SUCCESS)?packet[0]:ret; // return frame number for ack tracking |
| 187 | 187 |
} |
| 188 | 188 |
return WL_ERROR_SEND; // shouldn't get here, but if it does there's a problem |
| ... | ... | |
| 345 | 345 |
uint8_t num_packet = 0; |
| 346 | 346 |
WL_DEBUG_PRINT_P("entering ackhandle function: num:");
|
| 347 | 347 |
WL_DEBUG_PRINT_HEX(num); |
| 348 |
WL_DEBUG_PRINT_P("|num_send_packets:");
|
|
| 349 |
WL_DEBUG_PRINT_INT(send_buf_num_packets); |
|
| 348 | 350 |
WL_DEBUG_PRINT_P("\r\n");
|
| 351 |
if (send_buf_num_packets == 0) |
|
| 352 |
return; |
|
| 349 | 353 |
switch(val) {
|
| 350 | 354 |
case 0: |
| 351 | 355 |
WL_DEBUG_PRINT_P("ack success\r\n");
|
| ... | ... | |
| 353 | 357 |
setack(num,ACK_OK); // set status code |
| 354 | 358 |
// remove from buffer |
| 355 | 359 |
val = send_buf_first; |
| 356 |
if (send_buf_num_packets == 0) |
|
| 357 |
return; |
|
| 358 |
WL_DEBUG_PRINT_P("|num_send_packets:");
|
|
| 359 |
WL_DEBUG_PRINT_INT(send_buf_num_packets); |
|
| 360 | 360 |
while (1) {
|
| 361 | 361 |
len = send_buf_get(&val); |
| 362 | 362 |
WL_DEBUG_PRINT_P("|send_packet_buf_pos:");
|
| ... | ... | |
| 416 | 416 |
return; |
| 417 | 417 |
} |
| 418 | 418 |
} |
| 419 |
break; |
|
| 419 |
break; |
|
| 420 |
case 2: |
|
| 421 |
WL_DEBUG_PRINT_P("CCA failure\r\n");
|
|
| 420 | 422 |
case 1: |
| 421 | 423 |
WL_DEBUG_PRINT_P("no ack\r\n");
|
| 422 | 424 |
// no ack |
| ... | ... | |
| 426 | 428 |
return; |
| 427 | 429 |
while (1) {
|
| 428 | 430 |
len = send_buf_get(&val); |
| 429 |
if (send_buf_get(&val) != num) {
|
|
| 431 |
if (send_buf[val] != num) {
|
|
| 430 | 432 |
// not the correct packet, so continue |
| 431 | 433 |
val += len; |
| 432 | 434 |
if (val >= PACKET_BUFFER_SIZE) |
| ... | ... | |
| 438 | 440 |
} |
| 439 | 441 |
} else {
|
| 440 | 442 |
// check attempts on packet |
| 441 |
if (val+len-1 >= PACKET_BUFFER_SIZE) |
|
| 442 |
num = val+len-1-PACKET_BUFFER_SIZE; |
|
| 443 |
if (val+len+1 >= PACKET_BUFFER_SIZE) |
|
| 444 |
num = val+len-PACKET_BUFFER_SIZE; |
|
| 443 | 445 |
else |
| 444 |
num = val+len-1; // set to end of packet |
|
| 446 |
num = val+len; // set to end of packet |
|
| 445 | 447 |
if (send_buf[num] < NUM_RETRIES) {
|
| 446 |
val = (val<2)?PACKET_BUFFER_SIZE+val-2:val-2; // set to start of this packet |
|
| 447 |
// retry sending |
|
| 448 |
// retry sending |
|
| 448 | 449 |
send_buf[num]++; // increment retries |
| 449 |
send_buf[val+1] = nextframe; // reset frame number |
|
| 450 |
|
|
| 451 |
setack(send_buf[val],ACK_OK); |
|
| 452 |
send_buf[val] = nextframe; // reset frame number |
|
| 453 |
setack(nextframe,SENDING); |
|
| 450 | 454 |
nextframe = (nextframe == 0xFF)?1:nextframe+1; // increment frame number |
| 451 | 455 |
|
| 452 |
val = (val==0)?PACKET_BUFFER_SIZE-1:val-1; // go back one byte |
|
| 456 |
val = (val>0)?PACKET_BUFFER_SIZE+val-1:val-1; // set to start of this packet |
|
| 453 | 457 |
if (xbee_send_header(len+1) != WL_SUCCESS) {
|
| 454 | 458 |
WL_DEBUG_PRINT_P("Error sending packet from ackhandle function\r\n");
|
| 455 | 459 |
return; |
| ... | ... | |
| 458 | 462 |
while(val!=num) {
|
| 459 | 463 |
// compute checksum |
| 460 | 464 |
len += send_buf[val]; |
| 461 |
if (xbee_putc(send_buf_get(&val)) != WL_SUCCESS) { // send byte
|
|
| 465 |
if (xbee_sendc(send_buf_get(&val)) != WL_SUCCESS) { // send byte
|
|
| 462 | 466 |
WL_DEBUG_PRINT_P("Error sending packet from ackhandle function\r\n");
|
| 463 | 467 |
return; |
| 464 | 468 |
} |
| 465 | 469 |
} |
| 466 | 470 |
len = 0xFF - len; |
| 467 |
if (xbee_putc(len) != WL_SUCCESS) { // send
|
|
| 471 |
if (xbee_sendc(len) != WL_SUCCESS) { // send
|
|
| 468 | 472 |
WL_DEBUG_PRINT_P("Error sending packet from ackhandle function\r\n");
|
| 469 | 473 |
return; |
| 470 | 474 |
} |
| 471 | 475 |
return; |
| 472 | 476 |
} else {
|
| 473 | 477 |
// done sending, mark as failed send |
| 474 |
val = (val==0)?PACKET_BUFFER_SIZE-1:val-1; // set to frame num |
|
| 475 |
setack(send_buf[val],ACK_FAILURE); |
|
| 478 |
setack(send_buf[num],ACK_FAILURE); |
|
| 476 | 479 |
val = (val==0)?PACKET_BUFFER_SIZE-1:val-1; // set to start of this packet |
| 480 |
num = (num+1==PACKET_BUFFER_SIZE)?0:num+1; // set to end of this packet |
|
| 477 | 481 |
// remove packet |
| 478 | 482 |
while(num != send_buf_last) {
|
| 479 | 483 |
if (send_buf_add(&val,send_buf_get(&num)) != WL_SUCCESS) |
| ... | ... | |
| 484 | 488 |
} |
| 485 | 489 |
} |
| 486 | 490 |
break; // shouldn't get here, but just in case |
| 487 |
case 2: |
|
| 488 |
WL_DEBUG_PRINT_P("CCA failure\r\n");
|
|
| 489 |
// CCA failure |
|
| 490 |
// check resend attempts |
|
| 491 |
val = send_buf_first; |
|
| 492 |
if (send_buf_num_packets == 0) |
|
| 493 |
return; |
|
| 494 |
while (1) {
|
|
| 495 |
len = send_buf_get(&val); |
|
| 496 |
if (send_buf_get(&val) != num) {
|
|
| 497 |
// not the correct packet, so continue |
|
| 498 |
val += len; |
|
| 499 |
if (val >= PACKET_BUFFER_SIZE) |
|
| 500 |
val -= PACKET_BUFFER_SIZE; |
|
| 501 |
if (val == send_buf_last) {
|
|
| 502 |
// reached end of bufer, so assume not present |
|
| 503 |
setack(num,CCA_FAILURE); // mark as failed send |
|
| 504 |
return; |
|
| 505 |
} |
|
| 506 |
} else {
|
|
| 507 |
// check attempts on packet |
|
| 508 |
num = val+len-1; // set to end of packet |
|
| 509 |
if (num >= PACKET_BUFFER_SIZE) |
|
| 510 |
num -= PACKET_BUFFER_SIZE; |
|
| 511 |
if (send_buf[num] < NUM_RETRIES) {
|
|
| 512 |
val = (val<2)?PACKET_BUFFER_SIZE+val-2:val-2; // set to start of this packet |
|
| 513 |
// retry sending |
|
| 514 |
send_buf[num]++; // increment retries |
|
| 515 |
val = (val==0)?PACKET_BUFFER_SIZE-1:val-1; // go back one byte |
|
| 516 |
if (xbee_send_header(len+1) != WL_SUCCESS) {
|
|
| 517 |
WL_DEBUG_PRINT_P("Error sending packet from ackhandle function\r\n");
|
|
| 518 |
return; |
|
| 519 |
} |
|
| 520 |
len = XBEE_FRAME_TX_REQUEST_16; |
|
| 521 |
while(val!=num) {
|
|
| 522 |
// compute checksum |
|
| 523 |
len += send_buf[val]; |
|
| 524 |
if (xbee_putc(send_buf_get(&val)) != WL_SUCCESS) { // send byte
|
|
| 525 |
WL_DEBUG_PRINT_P("Error sending packet from ackhandle function\r\n");
|
|
| 526 |
return; |
|
| 527 |
} |
|
| 528 |
} |
|
| 529 |
len = 0xFF - len; |
|
| 530 |
if (xbee_putc(len) != WL_SUCCESS) { // send
|
|
| 531 |
WL_DEBUG_PRINT_P("Error sending packet from ackhandle function\r\n");
|
|
| 532 |
return; |
|
| 533 |
} |
|
| 534 |
return; |
|
| 535 |
} else {
|
|
| 536 |
// done sending, mark as failed send |
|
| 537 |
val = (val==0)?PACKET_BUFFER_SIZE-1:val-1; // set to frame num |
|
| 538 |
setack(send_buf[val],CCA_FAILURE); |
|
| 539 |
val = (val==0)?PACKET_BUFFER_SIZE-1:val-1; // set to start of this packet |
|
| 540 |
// remove packet |
|
| 541 |
while(num != send_buf_last) {
|
|
| 542 |
if (send_buf_add(&val,send_buf_get(&num)) != WL_SUCCESS) |
|
| 543 |
return; // error |
|
| 544 |
} |
|
| 545 |
return; |
|
| 546 |
} |
|
| 547 |
} |
|
| 548 |
} |
|
| 549 |
break; // shouldn't get here, but just in case |
|
| 550 | 491 |
} |
| 551 | 492 |
} |
| 552 | 493 |
|
Also available in: Unified diff