TMXR: Rework modem signaling support

- Fix ineffective setting of RNG modem bit when line with DTR isn't available
- Fix logic clearing modem signal bits
- Add API to set/clear modem control behavior fo a specific line.
- return -2 status from tmxr_poll_conn when RNG has been enabled
This commit is contained in:
Mark Pizzolato 2018-08-24 11:54:42 -07:00
parent b2ff00ab87
commit af173b7b6e
2 changed files with 12 additions and 3 deletions

View file

@ -1000,6 +1000,7 @@ SOCKET newsock;
TMLN *lp; TMLN *lp;
int32 *op; int32 *op;
int32 i, j; int32 i, j;
int32 ringing = -1;
char *address; char *address;
char msg[512]; char msg[512];
uint32 poll_time = sim_os_msec (); uint32 poll_time = sim_os_msec ();
@ -1094,11 +1095,12 @@ if (mp->master) {
(lp->ser_connect_pending == FALSE) && (lp->ser_connect_pending == FALSE) &&
((lp->modembits & TMXR_MDM_DTR) == 0)) { ((lp->modembits & TMXR_MDM_DTR) == 0)) {
++ringable_count; ++ringable_count;
tmxr_set_get_modem_bits (lp, TMXR_MDM_RNG, 0, NULL); lp->modembits |= TMXR_MDM_RNG;
tmxr_debug_connect_line (lp, "tmxr_poll_conn() - Ringing line"); tmxr_debug_connect_line (lp, "tmxr_poll_conn() - Ringing line");
} }
} }
if (ringable_count > 0) { if (ringable_count > 0) {
ringing = -2;
if (mp->ring_start_time == 0) { if (mp->ring_start_time == 0) {
mp->ring_start_time = poll_time; mp->ring_start_time = poll_time;
mp->ring_sock = newsock; mp->ring_sock = newsock;
@ -1285,7 +1287,7 @@ for (i = 0; i < mp->lines; i++) { /* check each line in se
} }
return -1; /* no new connections made */ return ringing; /* no new connections made */
} }
/* Reset a line. /* Reset a line.
@ -1546,7 +1548,7 @@ if ((bits_to_set & ~(TMXR_MDM_OUTGOING)) || /* Assure only settable bits
return SCPE_ARG; return SCPE_ARG;
before_modem_bits = lp->modembits; before_modem_bits = lp->modembits;
lp->modembits |= bits_to_set; lp->modembits |= bits_to_set;
lp->modembits &= ~(bits_to_clear | TMXR_MDM_INCOMING); lp->modembits &= ~bits_to_clear;
if ((lp->sock) || (lp->serport) || (lp->loopback)) { if ((lp->sock) || (lp->serport) || (lp->loopback)) {
if (lp->modembits & TMXR_MDM_DTR) { if (lp->modembits & TMXR_MDM_DTR) {
incoming_state = TMXR_MDM_DSR; incoming_state = TMXR_MDM_DSR;
@ -2500,6 +2502,12 @@ while (1) {
return -1; return -1;
} }
t_stat tmxr_set_line_modem_control (TMLN *lp, t_bool enab_disab)
{
lp->modem_control = enab_disab;
return SCPE_OK;
}
t_stat tmxr_set_line_speed (TMLN *lp, CONST char *speed) t_stat tmxr_set_line_speed (TMLN *lp, CONST char *speed)
{ {
UNIT *uptr; UNIT *uptr;

View file

@ -260,6 +260,7 @@ t_stat tmxr_set_line_halfduplex (TMLN *lp, t_bool enable_loopback);
t_bool tmxr_get_line_halfduplex (TMLN *lp); t_bool tmxr_get_line_halfduplex (TMLN *lp);
t_stat tmxr_set_line_speed (TMLN *lp, CONST char *speed); t_stat tmxr_set_line_speed (TMLN *lp, CONST char *speed);
t_stat tmxr_set_config_line (TMLN *lp, CONST char *config); t_stat tmxr_set_config_line (TMLN *lp, CONST char *config);
t_stat tmxr_set_line_modem_control (TMLN *lp, t_bool enabled);
t_stat tmxr_set_line_unit (TMXR *mp, int line, UNIT *uptr_poll); t_stat tmxr_set_line_unit (TMXR *mp, int line, UNIT *uptr_poll);
t_stat tmxr_set_line_output_unit (TMXR *mp, int line, UNIT *uptr_poll); t_stat tmxr_set_line_output_unit (TMXR *mp, int line, UNIT *uptr_poll);
t_stat tmxr_set_console_units (UNIT *rxuptr, UNIT *txuptr); t_stat tmxr_set_console_units (UNIT *rxuptr, UNIT *txuptr);