Restore DZ modem control state to default on device detach. Properly clear modem bits when modem control enabled. Better display of modem control status.

This commit is contained in:
Mark Pizzolato 2013-04-16 05:33:29 -07:00
parent 2c941c86d2
commit 93c9f35948
4 changed files with 56 additions and 23 deletions

View file

@ -241,6 +241,7 @@ TMXR dz_desc = { DZ_MUXES * DZ_LINES, 0, 0, NULL }; /* mux descriptor */
#define DBG_INT 0x0002 /* display transfer requests */ #define DBG_INT 0x0002 /* display transfer requests */
#define DBG_XMT TMXR_DBG_XMT /* display Transmitted Data */ #define DBG_XMT TMXR_DBG_XMT /* display Transmitted Data */
#define DBG_RCV TMXR_DBG_RCV /* display Received Data */ #define DBG_RCV TMXR_DBG_RCV /* display Received Data */
#define DBG_MDM TMXR_DBG_MDM /* display Modem Signals */
#define DBG_TRC TMXR_DBG_TRC /* display trace routine calls */ #define DBG_TRC TMXR_DBG_TRC /* display trace routine calls */
#define DBG_ASY TMXR_DBG_ASY /* display Asynchronous Activities */ #define DBG_ASY TMXR_DBG_ASY /* display Asynchronous Activities */
@ -249,6 +250,7 @@ DEBTAB dz_debug[] = {
{"INT", DBG_INT}, {"INT", DBG_INT},
{"XMT", DBG_XMT}, {"XMT", DBG_XMT},
{"RCV", DBG_RCV}, {"RCV", DBG_RCV},
{"MDM", DBG_MDM},
{"TRC", DBG_TRC}, {"TRC", DBG_TRC},
{"ASY", DBG_ASY}, {"ASY", DBG_ASY},
{0} {0}
@ -641,6 +643,7 @@ void dz_set_rxint (int32 dz)
{ {
dz_rxi = dz_rxi | (1 << dz); /* set mux rcv int */ dz_rxi = dz_rxi | (1 << dz); /* set mux rcv int */
SET_INT (DZRX); /* set master intr */ SET_INT (DZRX); /* set master intr */
sim_debug(DBG_INT, &dz_dev, "dz_set_rxint(dz=%d)\n", dz);
return; return;
} }
@ -671,6 +674,7 @@ void dz_set_txint (int32 dz)
{ {
dz_txi = dz_txi | (1 << dz); /* set mux xmt int */ dz_txi = dz_txi | (1 << dz); /* set mux xmt int */
SET_INT (DZTX); /* set master intr */ SET_INT (DZTX); /* set master intr */
sim_debug(DBG_INT, &dz_dev, "dz_set_txint(dz=%d)\n", dz);
return; return;
} }
@ -778,8 +782,11 @@ return SCPE_OK;
t_stat dz_detach (UNIT *uptr) t_stat dz_detach (UNIT *uptr)
{ {
t_stat r = tmxr_detach (&dz_desc, uptr);
dz_mctl = dz_auto = 0; /* modem ctl off */ dz_mctl = dz_auto = 0; /* modem ctl off */
return tmxr_detach (&dz_desc, uptr); tmxr_clear_modem_control_passthru (&dz_desc);
return r;
} }
/* SET LINES processor */ /* SET LINES processor */

2
scp.c
View file

@ -6641,7 +6641,7 @@ if (sim_deb && (dptr->dctrl & dbits)) {
#endif /* NO_vsnprintf */ #endif /* NO_vsnprintf */
va_end (arglist); va_end (arglist);
/* If it didn't fit into the buffer, then grow it and try again */ /* If the formatted result didn't fit into the buffer, then grow the buffer and try again */
if ((len < 0) || (len >= bufsize-1)) { if ((len < 0) || (len >= bufsize-1)) {
if (buf != stackbuf) if (buf != stackbuf)

View file

@ -369,7 +369,15 @@
#define TNS_CRPAD 005 /* CR padding */ #define TNS_CRPAD 005 /* CR padding */
#define TNS_DO 006 /* DO request pending rejection */ #define TNS_DO 006 /* DO request pending rejection */
static BITFIELD tmxr_modem_bits[] = {
BIT(DTR), /* Data Terminal Ready */
BIT(RTS), /* Request To Send */
BIT(DCD), /* Data Carrier Detect */
BIT(RNG), /* Ring Indicator */
BIT(CTS), /* Clear To Send */
BIT(DSR), /* Data Set Ready */
ENDBITS
};
/* Local routines */ /* Local routines */
@ -1055,7 +1063,7 @@ return SCPE_OK;
*/ */
t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits) t_stat tmxr_set_get_modem_bits (TMLN *lp, int32 bits_to_set, int32 bits_to_clear, int32 *incoming_bits)
{ {
int32 changed_modem_bits; int32 before_modem_bits, incoming_state;
tmxr_debug_trace_line (lp, "tmxr_set_get_modem_bits()"); tmxr_debug_trace_line (lp, "tmxr_set_get_modem_bits()");
@ -1063,20 +1071,24 @@ if ((bits_to_set & ~(TMXR_MDM_OUTGOING)) || /* Assure only settable bits
(bits_to_clear & ~(TMXR_MDM_OUTGOING)) || (bits_to_clear & ~(TMXR_MDM_OUTGOING)) ||
(bits_to_set & bits_to_clear)) /* and can't set and clear the same bits */ (bits_to_set & bits_to_clear)) /* and can't set and clear the same bits */
return SCPE_ARG; return SCPE_ARG;
changed_modem_bits = lp->modembits; before_modem_bits = lp->modembits;
lp->modembits |= bits_to_set; lp->modembits |= bits_to_set;
lp->modembits &= bits_to_clear; lp->modembits &= ~(bits_to_clear & TMXR_MDM_INCOMING);
changed_modem_bits ^= lp->modembits; if ((lp->sock) || (lp->serport)) {
if (incoming_bits) { if (lp->modembits & TMXR_MDM_DTR)
if ((lp->sock) || (lp->serport)) { incoming_state = TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR;
if (lp->modembits & TMXR_MDM_DTR)
*incoming_bits = TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR;
else
*incoming_bits = TMXR_MDM_RNG | TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR;
}
else else
*incoming_bits = (lp->mp && lp->mp->master) ? (TMXR_MDM_CTS | TMXR_MDM_DSR) : 0; incoming_state = TMXR_MDM_RNG | TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR;
} }
else
incoming_state = (lp->mp && lp->mp->master) ? (TMXR_MDM_CTS | TMXR_MDM_DSR) : 0;
lp->modembits |= incoming_state;
if (sim_deb && lp->mp && lp->mp->dptr) {
sim_debug_bits (TMXR_DBG_MDM, lp->mp->dptr, tmxr_modem_bits, before_modem_bits, lp->modembits, FALSE);
sim_debug (TMXR_DBG_MDM, lp->mp->dptr, " - Line %d\n", (int)(lp-lp->mp->ldsc));
}
if (incoming_bits)
*incoming_bits = incoming_state;
if (lp->mp && lp->mp->modem_control) { /* This API ONLY works on modem_control enabled multiplexers */ if (lp->mp && lp->mp->modem_control) { /* This API ONLY works on modem_control enabled multiplexers */
if (bits_to_set | bits_to_clear) { /* Anything to do? */ if (bits_to_set | bits_to_clear) { /* Anything to do? */
if (lp->serport) if (lp->serport)
@ -2620,15 +2632,19 @@ else {
fprintf(st, ", "); fprintf(st, ", ");
} }
tmxr_show_summ(st, NULL, 0, mp); tmxr_show_summ(st, NULL, 0, mp);
fprintf(st, ", sessions=%d\n", mp->sessions); fprintf(st, ", sessions=%d", mp->sessions);
if (mp->modem_control)
fprintf(st, ", ModemControl=enabled");
if (mp->notelnet)
fprintf(st, ", Telnet=disabled");
fprintf(st, "\n");
for (j = 0; j < mp->lines; j++) { for (j = 0; j < mp->lines; j++) {
lp = mp->ldsc + j; lp = mp->ldsc + j;
if (mp->lines > 1) { if (mp->lines > 1) {
fprintf (st, "Line: %d", j); fprintf (st, "Line: %d", j);
if (lp->uptr && (lp->uptr != lp->mp->uptr)) if (lp->uptr && (lp->uptr != lp->mp->uptr))
fprintf (st, " - Unit: %s\n", sim_uname (lp->uptr)); fprintf (st, " - Unit: %s", sim_uname (lp->uptr));
else fprintf (st, "\n");
fprintf (st, "\n");
} }
if ((!lp->sock) && (!lp->connecting) && (!lp->serport) && (!lp->master)) if ((!lp->sock) && (!lp->connecting) && (!lp->serport) && (!lp->master))
continue; continue;
@ -2977,6 +2993,15 @@ if (lp->cnms) {
else else
fprintf (st, " Line disconnected\n"); fprintf (st, " Line disconnected\n");
if (lp->mp->modem_control) {
fprintf (st, " Modem Bits: %s%s%s%s%s%s\n", (lp->modembits & TMXR_MDM_DTR) ? "DTR " : "",
(lp->modembits & TMXR_MDM_RTS) ? "RTS " : "",
(lp->modembits & TMXR_MDM_DCD) ? "DCD " : "",
(lp->modembits & TMXR_MDM_RNG) ? "RNG " : "",
(lp->modembits & TMXR_MDM_CTS) ? "CTS " : "",
(lp->modembits & TMXR_MDM_DSR) ? "DSR " : "");
}
if ((lp->serport == 0) && (lp->sock)) if ((lp->serport == 0) && (lp->sock))
fprintf (st, " %s\n", (lp->notelnet) ? "Telnet disabled (RAW data)" : "Telnet protocol"); fprintf (st, " %s\n", (lp->notelnet) ? "Telnet disabled (RAW data)" : "Telnet protocol");
if (lp->txlog) if (lp->txlog)

View file

@ -66,10 +66,11 @@ typedef int SERHANDLE;
#define TMXR_DTR_DROP_TIME 500 /* milliseconds to drop DTR for 'pseudo' modem control */ #define TMXR_DTR_DROP_TIME 500 /* milliseconds to drop DTR for 'pseudo' modem control */
#define TMXR_CONNECT_POLL_INTERVAL 1000 /* milliseconds between connection polls */ #define TMXR_CONNECT_POLL_INTERVAL 1000 /* milliseconds between connection polls */
#define TMXR_DBG_XMT 0x10000 /* Debug Transmit Data */ #define TMXR_DBG_XMT 0x010000 /* Debug Transmit Data */
#define TMXR_DBG_RCV 0x20000 /* Debug Received Data */ #define TMXR_DBG_RCV 0x020000 /* Debug Received Data */
#define TMXR_DBG_ASY 0x40000 /* Debug Asynchronous Activities */ #define TMXR_DBG_MDM 0x040000 /* Debug Modem Signals */
#define TMXR_DBG_TRC 0x80000 /* Debug trace routine calls */ #define TMXR_DBG_ASY 0x080000 /* Debug Asynchronous Activities */
#define TMXR_DBG_TRC 0x100000 /* Debug trace routine calls */
/* Modem Control Bits */ /* Modem Control Bits */