serialqueue: Further retransmit timing fixes

The first message always has a sync byte with it, so its size should
be one larger.  Also, the idle_time should always be the minimum time
that the message could be received, so it should always be reset to
eventtime on a retransmit.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2017-07-23 19:32:42 -04:00
parent d469db84ee
commit a619aacfc6
1 changed files with 3 additions and 5 deletions

View File

@ -573,7 +573,7 @@ retransmit_event(struct serialqueue *sq, double eventtime)
memcpy(&buf[buflen], qm->msg, qm->len); memcpy(&buf[buflen], qm->msg, qm->len);
buflen += qm->len; buflen += qm->len;
if (!first_buflen) if (!first_buflen)
first_buflen = qm->len; first_buflen = qm->len + 1;
} }
ret = write(sq->serial_fd, buf, buflen); ret = write(sq->serial_fd, buf, buflen);
if (ret < 0) if (ret < 0)
@ -596,10 +596,8 @@ retransmit_event(struct serialqueue *sq, double eventtime)
} }
sq->retransmit_seq = sq->send_seq - 1; sq->retransmit_seq = sq->send_seq - 1;
sq->rtt_sample_seq = 0; sq->rtt_sample_seq = 0;
if (eventtime > sq->idle_time) sq->idle_time = eventtime + buflen * sq->baud_adjust;
sq->idle_time = eventtime; double waketime = eventtime + first_buflen * sq->baud_adjust + sq->rto;
double waketime = sq->idle_time + first_buflen * sq->baud_adjust + sq->rto;
sq->idle_time += buflen * sq->baud_adjust;
pthread_mutex_unlock(&sq->lock); pthread_mutex_unlock(&sq->lock);
return waketime; return waketime;