📄 ulib.c
字号:
char *data = (char *) input;
hangup_needed = TRUE;
/*--------------------------------------------------------------------*/
/* Report our modem status */
/*--------------------------------------------------------------------*/
ShowModem();
/*--------------------------------------------------------------------*/
/* Introduce a little flow control - Actual line pacing is */
/* handled at a lower level */
/*--------------------------------------------------------------------*/
if ( s_count_free() < (int) len )
{
int spin = 0;
static int const max_spin = 20;
int queue_size = s_count_size();
int queue_free = s_count_free();
if ( (int) len > queue_size )
{
printmsg(0,"nswrite: Transmit buffer overflow; buffer size %d, "
"needed %d",
queue_size,len);
panic();
}
while( ((int)len > queue_free) && (spin < max_spin) )
{
int wait;
int needed;
int new_free;
needed = max(queue_size/2, ((int)len)-queue_free);
/* Minimize thrashing by requiring
big chunks */
wait = (int) ((long) needed * 10000L / (long) current_bps);
/* Compute time in milliseconds
assuming 10 bits per byte */
printmsg(4,"nswrite: Waiting %d ms for %d bytes in queue"
", pass %d",
wait, needed, spin);
ddelay( wait ); /* Actually perform the wait */
new_free = s_count_free();
if ( new_free == queue_free )
spin++; /* No progress, consider timing out */
else
queue_free = new_free;
/* Update our progress */
} /* while( (len > queue_free) && spin ) */
if ( queue_free < (int) len )
{
printmsg(0,"nswrite: Buffer overflow, needed %d bytes"
" from queue of %d",
len, queue_size);
} /* if ( queue_free < len ) */
return 0;
} /* if ( s_count_free() < len ) */
/*--------------------------------------------------------------------*/
/* Send the data to the communications package */
/*--------------------------------------------------------------------*/
for (i = 0; i < len; i++)
send_com(*data++);
traceData( input, len, TRUE );
/*--------------------------------------------------------------------*/
/* Return byte count transmitted to caller */
/*--------------------------------------------------------------------*/
return len;
} /* nswrite */
/*--------------------------------------------------------------------*/
/* n s s e n d b r k */
/* */
/* Send a break signal out the serial port */
/*--------------------------------------------------------------------*/
void nssendbrk(unsigned int duration)
{
printmsg(12, "nssendbrk: %d", duration);
break_com();
} /* nssendbrk */
/*--------------------------------------------------------------------*/
/* n c l o s e l i n e */
/* */
/* Close the serial port down */
/*--------------------------------------------------------------------*/
void ncloseline(void)
{
int far *stats;
if (!portActive)
panic();
portActive = FALSE; /* Flag port closed for error handler */
dtr_off();
ddelay(500); /* Required for V.24 */
close_com();
restore_com();
if ( bflag[F_MULTITASK] )
close( com_handle );
traceStop();
stats = com_errors();
printmsg(3, "Buffer overflows: %-4d", stats[COM_EOVFLOW]);
printmsg(3, "Receive overruns: %-4d", stats[COM_EOVRUN]);
printmsg(3, "Break characters: %-4d", stats[COM_EBREAK]);
printmsg(3, "Framing errors: %-4d", stats[COM_EFRAME]);
printmsg(3, "Parity errors: %-4d", stats[COM_EPARITY]);
printmsg(3, "Transmit errors: %-4d", stats[COM_EXMIT]);
printmsg(3, "DSR errors: %-4d", stats[COM_EDSR]);
printmsg(3, "CTS errors: %-4d", stats[COM_ECTS]);
} /*closeline*/
/*--------------------------------------------------------------------*/
/* n h a n g u p */
/* */
/* Hangup the telephone by dropping DTR. Works with HAYES and */
/* many compatibles. */
/* 14 May 89 Drew Derbyshire */
/*--------------------------------------------------------------------*/
void nhangup( void )
{
if (!hangup_needed)
return;
hangup_needed = FALSE;
dtr_off(); /* Hang the phone up */
ddelay(500); /* Really only need 250 milliseconds */
dtr_on(); /* Bring the modem back on-line */
ddelay(2000); /* Now wait for the poor thing to recover */
/* two seconds is required by V.24 */
printmsg(3,"nhangup: complete.");
carrierdetect = FALSE; /* No modem connected yet */
} /* nhangup */
/*--------------------------------------------------------------------*/
/* n S I O S p e e d */
/* */
/* Re-specify the speed of an opened serial port */
/* */
/* Dropped the DTR off/on calls because this makes a Hayes drop */
/* the line if configured properly, and we don't want the modem */
/* to drop the phone on the floor if we are performing */
/* autobaud. */
/* */
/* (Configured properly = standard method of making a Hayes */
/* hang up the telephone, especially when you can't get it into */
/* command state because it is at the wrong speed or whatever.) */
/*--------------------------------------------------------------------*/
void nSIOSpeed(BPS bps)
{
printmsg(4,"SIOSspeed: Changing port speed from %lu BPS to %lu BPS",
(unsigned long) current_bps, (unsigned long) bps);
current_bps = bps;
ioctl_com(0, current_bps);
ShowModem();
} /* nSIOSpeed */
/*--------------------------------------------------------------------*/
/* n f l o w c o n t r o l */
/* */
/* Enable/Disable in band (XON/XOFF) flow control */
/*--------------------------------------------------------------------*/
void nflowcontrol( boolean flow )
{
printmsg(4,"flowcontrol: Closing port");
close_com();
ShowModem();
printmsg(4,"flowcontrol: Opening port to %sable flow control",
flow ? "en" : "dis");
open_com(current_bps, current_direct, 'N', STOPBIT, flow ? 'E' : 'D');
ShowModem();
} /* nflowcontrol */
/*--------------------------------------------------------------------*/
/* n G e t S p e e d */
/* */
/* Report current speed of communications connection */
/*--------------------------------------------------------------------*/
BPS nGetSpeed( void )
{
return current_bps;
} /* nGetSpeed */
/*--------------------------------------------------------------------*/
/* n C D */
/* */
/* Report if we have carrier detect and lost it */
/*--------------------------------------------------------------------*/
boolean nCD( void )
{
boolean online = carrierdetect;
ShowModem();
carrierdetect = is_cd_high();
/*--------------------------------------------------------------------*/
/* If we previously had carrier detect but have lost it, we */
/* report it was lost. If we do not yet have carrier detect, */
/* we return success because we may not have connected yet. */
/*--------------------------------------------------------------------*/
if (online)
return carrierdetect && is_dsr_high();
else
return is_dsr_high();
} /* nCD */
/*--------------------------------------------------------------------*/
/* S h o w M o d e m */
/* */
/* Report current modem status */
/*--------------------------------------------------------------------*/
#define mannounce(flag, bits, text ) ((flag & bits) ? text : "" )
static void ShowModem( void )
{
static int old_status = 0xDEAD;
int status;
if ( debuglevel < 4 )
return;
status = modem_status();
if (status == old_status)
return;
printmsg(0, "ShowModem: %#02x%s%s%s%s%s%s%s%s",
status,
mannounce(MDM_CD, status, "\tCarrier Detect"),
mannounce(MDM_RI, status, "\tRing Indicator"),
mannounce(MDM_DSR, status, "\tData Set Ready"),
mannounce(MDM_CTS, status, "\tClear to Send"),
mannounce(MDM_CDC, status, "\tCD changed"),
mannounce(MDM_TRI, status, "\tRI went OFF"),
mannounce(MDM_DSRC, status, "\tDSR changed"),
mannounce(MDM_CTSC, status, "\tCTS changed"));
old_status = status;
} /* ShowModem */
#ifdef __TURBOC__
#pragma argsused
#endif
/*--------------------------------------------------------------------*/
/* s e t P r t y */
/* */
/* No operation under DOS */
/*--------------------------------------------------------------------*/
void setPrty( const KEWSHORT priorityIn, const KEWSHORT prioritydeltaIn )
{
}
/*--------------------------------------------------------------------*/
/* r e s e t P r t y */
/* */
/* No operation under DOS */
/*--------------------------------------------------------------------*/
void resetPrty( void ) { }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -