Update of /cvsroot/com0com/com0com
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28310
Modified Files:
handflow.c
Log Message:
Fixed [1446861] Problems with setting DCB.fOutxCtsFlow and DCB.fRtsControl
Thanks to Brad (bdwade100 at users.sourceforge.net)
Index: handflow.c
===================================================================
RCS file: /cvsroot/com0com/com0com/handflow.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** handflow.c 17 Feb 2006 07:55:13 -0000 1.2
--- handflow.c 15 Mar 2006 13:49:15 -0000 1.3
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.3 2006/03/15 13:49:15 vfrolov
+ * Fixed [1446861] Problems with setting DCB.fOutxCtsFlow and DCB.fRtsControl
+ * Thanks to Brad (bdwade100 at users.sourceforge.net)
+ *
* Revision 1.2 2006/02/17 07:55:13 vfrolov
* Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF
***************
*** 43,49 ****
PLIST_ENTRY pQueueToComplete)
{
! ULONG bits;
PC0C_BUFFER pReadBuf;
PSERIAL_HANDFLOW pNewHandFlow;
pReadBuf = &pDevExt->pIoPortLocal->readBuf;
--- 47,54 ----
PLIST_ENTRY pQueueToComplete)
{
! ULONG bits, mask;
PC0C_BUFFER pReadBuf;
PSERIAL_HANDFLOW pNewHandFlow;
+ BOOLEAN setModemStatusHolding;
pReadBuf = &pDevExt->pIoPortLocal->readBuf;
***************
*** 62,69 ****
}
if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0)
SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON);
! bits = 0;
if (!pHandFlow ||
--- 67,85 ----
}
+ // Set local side
if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0)
SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON);
! if (!pHandFlow ||
! (pDevExt->handFlow.ControlHandShake & SERIAL_OUT_HANDSHAKEMASK) !=
! (pHandFlow->ControlHandShake & SERIAL_OUT_HANDSHAKEMASK))
! {
! setModemStatusHolding = TRUE;
! } else {
! setModemStatusHolding = FALSE;
! }
!
! // Set remote side
! bits = mask = 0;
if (!pHandFlow ||
***************
*** 71,76 ****
(pHandFlow->FlowReplace & SERIAL_RTS_MASK))
{
! if ((pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_CONTROL)
bits |= C0C_MSB_CTS;
}
--- 87,98 ----
(pHandFlow->FlowReplace & SERIAL_RTS_MASK))
{
! if ((pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) == 0) {
! mask |= C0C_MSB_CTS; // Turn off CTS on remote side if RTS is disabled
! }
! else
! if ((pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_CONTROL) {
bits |= C0C_MSB_CTS;
+ mask |= C0C_MSB_CTS;
+ }
}
***************
*** 79,84 ****
(pHandFlow->ControlHandShake & SERIAL_DTR_MASK))
{
! if ((pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_CONTROL)
bits |= C0C_MSB_DSR;
}
--- 101,112 ----
(pHandFlow->ControlHandShake & SERIAL_DTR_MASK))
{
! if ((pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) == 0) {
! mask |= C0C_MSB_DSR; // Turn off DSR on remote side if DTR is disabled
! }
! else
! if ((pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_CONTROL) {
bits |= C0C_MSB_DSR;
+ mask |= C0C_MSB_DSR;
+ }
}
***************
*** 86,91 ****
pDevExt->handFlow = *pHandFlow;
! if (bits)
! SetModemStatus(pDevExt->pIoPortRemote, bits, bits, pQueueToComplete);
SetLimit(pDevExt->pIoPortRemote->pDevExt);
--- 114,122 ----
pDevExt->handFlow = *pHandFlow;
! if (setModemStatusHolding)
! SetModemStatusHolding(pDevExt->pIoPortLocal);
!
! if (mask)
! SetModemStatus(pDevExt->pIoPortRemote, bits, mask, pQueueToComplete);
SetLimit(pDevExt->pIoPortRemote->pDevExt);
|