- implemented GetCommModemStatus

- fixed the DTR, CTS and COMMBREAK related subfunctions of EscapeCommFunction
- added more verbose TRACEing
This commit is contained in:
Uwe Bonnes 1999-08-14 15:53:50 +00:00 committed by Alexandre Julliard
parent 594af0de05
commit 684ee2ce21

View File

@ -568,9 +568,11 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
TRACE("cid=%d, function=%d\n", cid, nFunction); TRACE("cid=%d, function=%d\n", cid, nFunction);
if ((nFunction != GETMAXCOM) && (nFunction != GETMAXLPT)) { if ((nFunction != GETMAXCOM) && (nFunction != GETMAXLPT)) {
if ((ptr = GetDeviceStruct(cid)) == NULL) { if ((ptr = GetDeviceStruct(cid)) == NULL) {
TRACE("GetDeviceStruct failed\n");
return -1; return -1;
} }
if (tcgetattr(ptr->fd,&port) == -1) { if (tcgetattr(ptr->fd,&port) == -1) {
TRACE("tcgetattr failed\n");
ptr->commerror=WinError(); ptr->commerror=WinError();
return -1; return -1;
} }
@ -578,21 +580,25 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
switch (nFunction) { switch (nFunction) {
case RESETDEV: case RESETDEV:
TRACE("RESETDEV\n");
break; break;
case GETMAXCOM: case GETMAXCOM:
TRACE("GETMAXCOM\n");
for (max = MAX_PORTS;!COM[max].devicename;max--) for (max = MAX_PORTS;!COM[max].devicename;max--)
; ;
return max; return max;
break; break;
case GETMAXLPT: case GETMAXLPT:
TRACE("GETMAXLPT\n");
for (max = MAX_PORTS;!LPT[max].devicename;max--) for (max = MAX_PORTS;!LPT[max].devicename;max--)
; ;
return FLAG_LPT + max; return FLAG_LPT + max;
break; break;
case GETBASEIRQ: case GETBASEIRQ:
TRACE("GETBASEIRQ\n");
/* FIXME: use tables */ /* FIXME: use tables */
/* just fake something for now */ /* just fake something for now */
if (cid & FLAG_LPT) { if (cid & FLAG_LPT) {
@ -605,30 +611,36 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
} }
break; break;
#ifdef TIOCM_DTR
case CLRDTR: case CLRDTR:
TRACE("CLRDTR\n");
#ifdef TIOCM_DTR
return COMM_WhackModem(ptr->fd, ~TIOCM_DTR, 0); return COMM_WhackModem(ptr->fd, ~TIOCM_DTR, 0);
#endif #endif
#ifdef TIOCM_RTS
case CLRRTS: case CLRRTS:
TRACE("CLRRTS\n");
#ifdef TIOCM_RTS
return COMM_WhackModem(ptr->fd, ~TIOCM_RTS, 0); return COMM_WhackModem(ptr->fd, ~TIOCM_RTS, 0);
#endif #endif
#ifdef TIOCM_DTR
case SETDTR: case SETDTR:
TRACE("SETDTR\n");
#ifdef TIOCM_DTR
return COMM_WhackModem(ptr->fd, 0, TIOCM_DTR); return COMM_WhackModem(ptr->fd, 0, TIOCM_DTR);
#endif #endif
#ifdef TIOCM_RTS
case SETRTS: case SETRTS:
TRACE("SETRTS\n");
#ifdef TIOCM_RTS
return COMM_WhackModem(ptr->fd, 0, TIOCM_RTS); return COMM_WhackModem(ptr->fd, 0, TIOCM_RTS);
#endif #endif
case SETXOFF: case SETXOFF:
TRACE("SETXOFF\n");
port.c_iflag |= IXOFF; port.c_iflag |= IXOFF;
break; break;
case SETXON: case SETXON:
TRACE("SETXON\n");
port.c_iflag |= IXON; port.c_iflag |= IXON;
break; break;
@ -1517,8 +1529,28 @@ int commerror=0,eventmask=0;
*/ */
BOOL WINAPI SetCommBreak(HANDLE handle) BOOL WINAPI SetCommBreak(HANDLE handle)
{ {
FIXME("handle %d, stub!\n", handle); #if defined(TIOCSBRK) && defined(TIOCCBRK) /* check if available for compilation */
int fd,result;
fd = COMM_GetWriteFd(handle);
if(fd<0) {
TRACE("COMM_GetWriteFd failed\n");
return FALSE;
}
result = ioctl(fd,TIOCSBRK,0);
close(fd);
if (result ==-1)
{
TRACE("ioctl failed\n");
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
return TRUE; return TRUE;
#else
FIXME("ioctl not available\n");
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
#endif
} }
/***************************************************************************** /*****************************************************************************
@ -1526,8 +1558,28 @@ BOOL WINAPI SetCommBreak(HANDLE handle)
*/ */
BOOL WINAPI ClearCommBreak(HANDLE handle) BOOL WINAPI ClearCommBreak(HANDLE handle)
{ {
FIXME("handle %d, stub!\n", handle); #if defined(TIOCSBRK) && defined(TIOCCBRK) /* check if available for compilation */
int fd,result;
fd = COMM_GetWriteFd(handle);
if(fd<0) {
TRACE("COMM_GetWriteFd failed\n");
return FALSE;
}
result = ioctl(fd,TIOCCBRK,0);
close(fd);
if (result ==-1)
{
TRACE("ioctl failed\n");
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
return TRUE; return TRUE;
#else
FIXME("ioctl not available\n");
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
#endif
} }
/***************************************************************************** /*****************************************************************************
@ -1535,7 +1587,7 @@ BOOL WINAPI ClearCommBreak(HANDLE handle)
*/ */
BOOL WINAPI EscapeCommFunction(HANDLE handle,UINT nFunction) BOOL WINAPI EscapeCommFunction(HANDLE handle,UINT nFunction)
{ {
int fd; int fd,direct=FALSE,result=FALSE;
struct termios port; struct termios port;
TRACE("handle %d, function=%d\n", handle, nFunction); TRACE("handle %d, function=%d\n", handle, nFunction);
@ -1551,60 +1603,89 @@ BOOL WINAPI EscapeCommFunction(HANDLE handle,UINT nFunction)
switch (nFunction) { switch (nFunction) {
case RESETDEV: case RESETDEV:
TRACE("\n");
break; break;
#ifdef TIOCM_DTR
case CLRDTR: case CLRDTR:
port.c_cflag &= TIOCM_DTR; TRACE("CLRDTR\n");
#ifdef TIOCM_DTR
direct=TRUE;
result= COMM_WhackModem(fd, ~TIOCM_DTR, 0);
break; break;
#endif #endif
#ifdef TIOCM_RTS
case CLRRTS: case CLRRTS:
port.c_cflag &= TIOCM_RTS; TRACE("CLRRTS\n");
#ifdef TIOCM_RTS
direct=TRUE;
result= COMM_WhackModem(fd, ~TIOCM_RTS, 0);
break; break;
#endif #endif
#ifdef CRTSCTS
case SETDTR: case SETDTR:
port.c_cflag |= CRTSCTS; TRACE("SETDTR\n");
#ifdef TIOCM_DTR
direct=TRUE;
result= COMM_WhackModem(fd, 0, TIOCM_DTR);
break; break;
#endif
case SETRTS: case SETRTS:
port.c_cflag |= CRTSCTS; TRACE("SETRTS\n");
#ifdef TIOCM_DTR
direct=TRUE;
result= COMM_WhackModem(fd, 0, TIOCM_RTS);
break; break;
#endif #endif
case SETXOFF: case SETXOFF:
TRACE("SETXOFF\n");
port.c_iflag |= IXOFF; port.c_iflag |= IXOFF;
break; break;
case SETXON: case SETXON:
TRACE("SETXON\n");
port.c_iflag |= IXON; port.c_iflag |= IXON;
break; break;
case SETBREAK: case SETBREAK:
FIXME("setbreak, stub\n"); TRACE("setbreak\n");
/* ptr->suspended = 1; */ #ifdef TIOCSBRK
direct=TRUE;
result = ioctl(fd,TIOCSBRK,0);
break; break;
#endif
case CLRBREAK: case CLRBREAK:
FIXME("clrbreak, stub\n"); TRACE("clrbreak\n");
/* ptr->suspended = 0; */ #ifdef TIOCSBRK
direct=TRUE;
result = ioctl(fd,TIOCCBRK,0);
break; break;
#endif
default: default:
WARN("(handle=%d,nFunction=%d): Unknown function\n", WARN("(handle=%d,nFunction=%d): Unknown function\n",
handle, nFunction); handle, nFunction);
break; break;
} }
if (tcsetattr(fd, TCSADRAIN, &port) == -1) { if (!direct)
if (tcsetattr(fd, TCSADRAIN, &port) == -1) {
commerror = WinError(); commerror = WinError();
close(fd); close(fd);
return FALSE; return FALSE;
} else { } else
commerror = 0; result= TRUE;
close(fd); else
return TRUE; {
} if (result == -1)
{
result= FALSE;
commerror=WinError();
}
else
result = TRUE;
}
close(fd);
return result;
} }
/******************************************************************** /********************************************************************
@ -2258,8 +2339,38 @@ BOOL WINAPI SetCommTimeouts(INT cid,LPCOMMTIMEOUTS lptimeouts) {
*/ */
BOOL WINAPI GetCommModemStatus(HANDLE hFile,LPDWORD lpModemStat ) BOOL WINAPI GetCommModemStatus(HANDLE hFile,LPDWORD lpModemStat )
{ {
FIXME("(%d %p)\n",hFile,lpModemStat ); int fd,mstat, result=FALSE;
*lpModemStat=0;
#ifdef TIOCMGET
fd = COMM_GetWriteFd(hFile);
if(fd<0)
return FALSE;
result = ioctl(fd, TIOCMGET, &mstat);
close(fd);
if (result == -1)
{
TRACE("ioctl failed\n");
return FALSE;
}
if (mstat & TIOCM_CTS)
*lpModemStat |= MS_CTS_ON;
if (mstat & TIOCM_DSR)
*lpModemStat |= MS_DSR_ON;
if (mstat & TIOCM_RNG)
*lpModemStat |= MS_RING_ON;
/*FIXME: Not really sure about RLSD UB 990810*/
if (mstat & TIOCM_CAR)
*lpModemStat |= MS_RLSD_ON;
TRACE("%s%s%s%s\n",
(*lpModemStat &MS_RLSD_ON)?"MS_RLSD_ON ":"",
(*lpModemStat &MS_RING_ON)?"MS_RING_ON ":"",
(*lpModemStat &MS_DSR_ON)?"MS_DSR_ON ":"",
(*lpModemStat &MS_CTS_ON)?"MS_CTS_ON ":"");
return TRUE; return TRUE;
#else
return FALSE;
#endif
} }
/*********************************************************************** /***********************************************************************
* WaitCommEvent (KERNEL32.719) * WaitCommEvent (KERNEL32.719)