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_XMT TMXR_DBG_XMT /* display Transmitted 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_ASY TMXR_DBG_ASY /* display Asynchronous Activities */
@ -249,6 +250,7 @@ DEBTAB dz_debug[] = {
{"INT", DBG_INT},
{"XMT", DBG_XMT},
{"RCV", DBG_RCV},
{"MDM", DBG_MDM},
{"TRC", DBG_TRC},
{"ASY", DBG_ASY},
{0}
@ -641,6 +643,7 @@ void dz_set_rxint (int32 dz)
{
dz_rxi = dz_rxi | (1 << dz); /* set mux rcv int */
SET_INT (DZRX); /* set master intr */
sim_debug(DBG_INT, &dz_dev, "dz_set_rxint(dz=%d)\n", dz);
return;
}
@ -671,6 +674,7 @@ void dz_set_txint (int32 dz)
{
dz_txi = dz_txi | (1 << dz); /* set mux xmt int */
SET_INT (DZTX); /* set master intr */
sim_debug(DBG_INT, &dz_dev, "dz_set_txint(dz=%d)\n", dz);
return;
}
@ -778,8 +782,11 @@ return SCPE_OK;
t_stat dz_detach (UNIT *uptr)
{
t_stat r = tmxr_detach (&dz_desc, uptr);
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 */

2
scp.c
View file

@ -6641,7 +6641,7 @@ if (sim_deb && (dptr->dctrl & dbits)) {
#endif /* NO_vsnprintf */
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 (buf != stackbuf)

View file

@ -369,7 +369,15 @@
#define TNS_CRPAD 005 /* CR padding */
#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 */
@ -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)
{
int32 changed_modem_bits;
int32 before_modem_bits, incoming_state;
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_set & bits_to_clear)) /* and can't set and clear the same bits */
return SCPE_ARG;
changed_modem_bits = lp->modembits;
before_modem_bits = lp->modembits;
lp->modembits |= bits_to_set;
lp->modembits &= bits_to_clear;
changed_modem_bits ^= lp->modembits;
if (incoming_bits) {
if ((lp->sock) || (lp->serport)) {
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;
}
lp->modembits &= ~(bits_to_clear & TMXR_MDM_INCOMING);
if ((lp->sock) || (lp->serport)) {
if (lp->modembits & TMXR_MDM_DTR)
incoming_state = TMXR_MDM_DCD | TMXR_MDM_CTS | TMXR_MDM_DSR;
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 (bits_to_set | bits_to_clear) { /* Anything to do? */
if (lp->serport)
@ -2620,15 +2632,19 @@ else {
fprintf(st, ", ");
}
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++) {
lp = mp->ldsc + j;
if (mp->lines > 1) {
fprintf (st, "Line: %d", j);
if (lp->uptr && (lp->uptr != lp->mp->uptr))
fprintf (st, " - Unit: %s\n", sim_uname (lp->uptr));
else
fprintf (st, "\n");
fprintf (st, " - Unit: %s", sim_uname (lp->uptr));
fprintf (st, "\n");
}
if ((!lp->sock) && (!lp->connecting) && (!lp->serport) && (!lp->master))
continue;
@ -2977,6 +2993,15 @@ if (lp->cnms) {
else
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))
fprintf (st, " %s\n", (lp->notelnet) ? "Telnet disabled (RAW data)" : "Telnet protocol");
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_CONNECT_POLL_INTERVAL 1000 /* milliseconds between connection polls */
#define TMXR_DBG_XMT 0x10000 /* Debug Transmit Data */
#define TMXR_DBG_RCV 0x20000 /* Debug Received Data */
#define TMXR_DBG_ASY 0x40000 /* Debug Asynchronous Activities */
#define TMXR_DBG_TRC 0x80000 /* Debug trace routine calls */
#define TMXR_DBG_XMT 0x010000 /* Debug Transmit Data */
#define TMXR_DBG_RCV 0x020000 /* Debug Received Data */
#define TMXR_DBG_MDM 0x040000 /* Debug Modem Signals */
#define TMXR_DBG_ASY 0x080000 /* Debug Asynchronous Activities */
#define TMXR_DBG_TRC 0x100000 /* Debug trace routine calls */
/* Modem Control Bits */