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:
parent
484889ea5a
commit
f42db0c6ea
3 changed files with 26 additions and 4 deletions
BIN
doc/simh.doc
BIN
doc/simh.doc
Binary file not shown.
26
sim_tmxr.c
26
sim_tmxr.c
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue