TMXR: Add tmxr_txdone_ln() to provide precise completion speed timing

Multi line TMXR devices can simplify state maintenance and better leverage
output scheduling when they use this API
This commit is contained in:
Mark Pizzolato 2018-07-12 10:12:49 -07:00
parent 484889ea5a
commit f42db0c6ea
3 changed files with 26 additions and 4 deletions

Binary file not shown.

View file

@ -721,6 +721,7 @@ else {
written = sim_write_sock (lp->sock, &(lp->txb[i]), length); written = sim_write_sock (lp->sock, &(lp->txb[i]), length);
if (written == SOCKET_ERROR) { /* did an error occur? */ if (written == SOCKET_ERROR) { /* did an error occur? */
lp->txdone = TRUE;
if (lp->datagram) if (lp->datagram)
return written; /* ignore errors on datagram sockets */ return written; /* ignore errors on datagram sockets */
else else
@ -736,8 +737,11 @@ else {
} }
} }
} }
if ((written > 0) && (lp->txbps) && (sim_is_running)) if (written > 0) {
lp->txdone = FALSE;
if ((lp->txbps) && (sim_is_running))
lp->txnexttime = floor (sim_gtime () + ((written * lp->txdeltausecs * sim_timer_inst_per_sec ()) / USECS_PER_SECOND)); lp->txnexttime = floor (sim_gtime () + ((written * lp->txdeltausecs * sim_timer_inst_per_sec ()) / USECS_PER_SECOND));
}
return written; return written;
} }
@ -2372,6 +2376,22 @@ t_bool tmxr_tpbusyln (const TMLN *lp)
return (0 != (lp->txppsize - lp->txppoffset)); return (0 != (lp->txppsize - lp->txppoffset));
} }
/* Return transmitted data complete status */
/* 0 not done, 1 just now done, -1 previously done. */
int32 tmxr_txdone_ln (TMLN *lp)
{
if (lp->txdone)
return -1; /* previously done */
if ((lp->conn == 0) ||
(lp->txbps == 0) ||
(lp->txnexttime <= sim_gtime ())) {
lp->txdone = TRUE; /* done now */
return 1;
}
return 0; /* not done */
}
static void _mux_detach_line (TMLN *lp, t_bool close_listener, t_bool close_connecting) static void _mux_detach_line (TMLN *lp, t_bool close_listener, t_bool close_connecting)
{ {
if (close_listener && lp->master) { if (close_listener && lp->master) {
@ -5370,9 +5390,9 @@ if ((dptr) && (dbits & dptr->dctrl)) {
} }
if ((lp->rxnexttime != 0.0) || (lp->txnexttime != 0.0)) { if ((lp->rxnexttime != 0.0) || (lp->txnexttime != 0.0)) {
if (lp->rxnexttime != 0.0) if (lp->rxnexttime != 0.0)
sim_debug (dbits, dptr, " rxnexttime=%.0f", lp->rxnexttime); sim_debug (dbits, dptr, " rxnexttime=%.0f (%.0f usecs)", lp->rxnexttime, ((lp->rxnexttime - sim_gtime ()) / sim_timer_inst_per_sec ()) * 1000000.0);
if (lp->txnexttime != 0.0) if (lp->txnexttime != 0.0)
sim_debug (dbits, dptr, " txnexttime=%.0f", lp->txnexttime); sim_debug (dbits, dptr, " txnexttime=%.0f (%.0f usecs)", lp->txnexttime, ((lp->txnexttime - sim_gtime ()) / sim_timer_inst_per_sec ()) * 1000000.0);
sim_debug (dbits, dptr, "\n"); sim_debug (dbits, dptr, "\n");
} }
} }

View file

@ -176,6 +176,7 @@ struct tmln {
uint32 txbps; /* xmt bps speed (0 - unlimited) */ uint32 txbps; /* xmt bps speed (0 - unlimited) */
uint32 txdeltausecs; /* xmt inter character min time (usecs) */ uint32 txdeltausecs; /* xmt inter character min time (usecs) */
double txnexttime; /* min time for next transmit character */ double txnexttime; /* min time for next transmit character */
t_bool txdone; /* sent data complete indicator - private */
uint8 *txpb; /* xmt packet buffer */ uint8 *txpb; /* xmt packet buffer */
uint32 txpbsize; /* xmt packet buffer size */ uint32 txpbsize; /* xmt packet buffer size */
uint32 txppsize; /* xmt packet packet size */ uint32 txppsize; /* xmt packet packet size */
@ -277,6 +278,7 @@ t_stat tmxr_dscln (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
int32 tmxr_rqln (const TMLN *lp); int32 tmxr_rqln (const TMLN *lp);
int32 tmxr_tqln (const TMLN *lp); int32 tmxr_tqln (const TMLN *lp);
int32 tmxr_tpqln (const TMLN *lp); int32 tmxr_tpqln (const TMLN *lp);
int32 tmxr_txdone_ln (TMLN *lp);
t_bool tmxr_tpbusyln (const TMLN *lp); t_bool tmxr_tpbusyln (const TMLN *lp);
t_stat tmxr_set_lnorder (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat tmxr_set_lnorder (UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat tmxr_show_lnorder (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat tmxr_show_lnorder (FILE *st, UNIT *uptr, int32 val, CONST void *desc);