kopia lustrzana https://github.com/Hamlib/Hamlib
Fixes for BRK/RTS/DTR handling under win32
git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@1782 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.2.2
rodzic
7bac83a841
commit
c08cc78724
|
@ -457,6 +457,7 @@ int termios_to_bytesize( int cflag )
|
|||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*----------------------------------------------------------
|
||||
get_dos_port()
|
||||
|
||||
|
@ -478,6 +479,7 @@ const char *get_dos_port( char const *name )
|
|||
LEAVE( "get_dos_port" );
|
||||
return( ( const char * ) name );
|
||||
}
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------
|
||||
ClearErrors()
|
||||
|
@ -2667,10 +2669,13 @@ fstat()
|
|||
comments: this is just to keep the eventLoop happy.
|
||||
----------------------------------------------------------*/
|
||||
|
||||
#if 0
|
||||
int fstat( int fd, ... )
|
||||
{
|
||||
return( 0 );
|
||||
}
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------
|
||||
ioctl()
|
||||
|
||||
|
@ -2697,7 +2702,7 @@ ioctl()
|
|||
|
||||
----------------------------------------------------------*/
|
||||
|
||||
int ioctl( int fd, int request, ... )
|
||||
int win32_serial_ioctl( int fd, int request, ... )
|
||||
{
|
||||
unsigned long dwStatus = 0;
|
||||
va_list ap;
|
||||
|
@ -2749,6 +2754,17 @@ int ioctl( int fd, int request, ... )
|
|||
va_end( ap );
|
||||
return -ENOIOCTLCMD;
|
||||
|
||||
case TIOCCBRK:
|
||||
case TIOCSBRK:
|
||||
arg = va_arg( ap, int * );
|
||||
if ( EscapeCommFunction( index->hComm,
|
||||
( request == TIOCSBRK ) ? SETBREAK :
|
||||
CLRBREAK ) )
|
||||
report( "EscapeCommFunction: True\n" );
|
||||
else
|
||||
report( "EscapeCommFunction: False\n" );
|
||||
break;
|
||||
|
||||
case TIOCMGET:
|
||||
arg = va_arg( ap, int * );
|
||||
/* DORITOS */
|
||||
|
@ -2782,15 +2798,50 @@ int ioctl( int fd, int request, ... )
|
|||
*/
|
||||
va_end( ap );
|
||||
return( 0 );
|
||||
/* TIOCMIS, TIOCMBIC and TIOCMSET all do the same thing... */
|
||||
case TIOCMBIS:
|
||||
arg = va_arg( ap, int * );
|
||||
va_end( ap );
|
||||
return -ENOIOCTLCMD;
|
||||
if ( *arg & TIOCM_DTR )
|
||||
{
|
||||
index->MSR |= TIOCM_DTR;
|
||||
|
||||
if (EscapeCommFunction( index->hComm, SETDTR))
|
||||
report( "EscapeCommFunction: True\n" );
|
||||
else
|
||||
report( "EscapeCommFunction: False\n" );
|
||||
}
|
||||
|
||||
if ( *arg & TIOCM_RTS )
|
||||
{
|
||||
index->MSR |= TIOCM_RTS;
|
||||
|
||||
if(EscapeCommFunction( index->hComm, SETRTS))
|
||||
report( "EscapeCommFunction: True\n" );
|
||||
else
|
||||
report( "EscapeCommFunction: False\n" );
|
||||
}
|
||||
break;
|
||||
|
||||
case TIOCMBIC:
|
||||
arg = va_arg( ap, int * );
|
||||
va_end( ap );
|
||||
return -ENOIOCTLCMD;
|
||||
if ( *arg & TIOCM_DTR )
|
||||
{
|
||||
index->MSR &= ~TIOCM_DTR;
|
||||
if ( EscapeCommFunction( index->hComm, CLRDTR))
|
||||
report( "EscapeCommFunction: True\n" );
|
||||
else
|
||||
report( "EscapeCommFunction: False\n" );
|
||||
}
|
||||
|
||||
if ( *arg & TIOCM_RTS )
|
||||
{
|
||||
index->MSR &= ~TIOCM_RTS;
|
||||
if( EscapeCommFunction( index->hComm, CLRRTS))
|
||||
report( "EscapeCommFunction: True\n" );
|
||||
else
|
||||
report( "EscapeCommFunction: False\n" );
|
||||
}
|
||||
break;
|
||||
|
||||
case TIOCMSET:
|
||||
arg = va_arg( ap, int * );
|
||||
if (( *arg & TIOCM_DTR) == (index->MSR & TIOCM_DTR) )
|
||||
|
@ -3204,7 +3255,7 @@ int win32_serial_select( int n, fd_set *readfds, fd_set *writefds,
|
|||
int timeout_usec = timeout ? timeout->tv_sec*1000000 + timeout->tv_usec : INT_MAX;
|
||||
|
||||
while (timeout_usec > 0) {
|
||||
sprintf( message, "wait for data in read buffer%d\n", Stat.cbInQue );
|
||||
sprintf( message, "wait for data in read buffer%d\n", (int)Stat.cbInQue );
|
||||
report( message );
|
||||
|
||||
if (Stat.cbInQue != 0) {
|
||||
|
|
|
@ -119,6 +119,7 @@ int win32_serial_open(const char *File, int flags, ... );
|
|||
int win32_serial_close(int fd);
|
||||
int win32_serial_read(int fd, void *b, int size);
|
||||
int win32_serial_write(int fd, const char *Str, int length);
|
||||
int win32_serial_ioctl(int fd, int request, ... );
|
||||
/*
|
||||
* lcc winsock.h conflicts
|
||||
*/
|
||||
|
@ -131,6 +132,7 @@ int win32_serial_select(int, struct fd_set *, struct fd_set *, struct fd_set *,
|
|||
#define CLOSE win32_serial_close
|
||||
#define READ win32_serial_read
|
||||
#define WRITE win32_serial_write
|
||||
#define IOCTL win32_serial_ioctl
|
||||
|
||||
void termios_interrupt_event_loop( int , int );
|
||||
void termios_setflags( int , int[] );
|
||||
|
@ -146,7 +148,6 @@ int termios_to_bytesize(int);
|
|||
int bytesize_to_termios(int);
|
||||
int tcgetattr(int Fd, struct termios *s_termios);
|
||||
int tcsetattr(int Fd, int when, struct termios *);
|
||||
int win32_serial_close(int );
|
||||
speed_t cfgetospeed(struct termios *s_termios);
|
||||
speed_t cfgetispeed(struct termios *s_termios);
|
||||
int cfsetspeed(struct termios *, speed_t speed);
|
||||
|
@ -158,7 +159,6 @@ int tcsetpgrp ( int , int );
|
|||
int tcdrain ( int );
|
||||
int tcflow ( int , int );
|
||||
int tcsendbreak ( int , int );
|
||||
int ioctl(int fd, int request, ... );
|
||||
/*
|
||||
int fstat(int fd, ... );
|
||||
*/
|
||||
|
@ -396,6 +396,8 @@ void termiosSetParityError( int, char );
|
|||
|
||||
/* unused ioctls */
|
||||
#define TCSBRK 0x5409
|
||||
#define TIOCCBRK 0x540a
|
||||
#define TIOCSBRK 0x540b
|
||||
#define TIOCOUTQ 0x5411
|
||||
#define TIOCMGET 0x5415
|
||||
#define TIOCMBIS 0x5416
|
||||
|
|
114
src/serial.c
114
src/serial.c
|
@ -1,10 +1,10 @@
|
|||
/*
|
||||
* Hamlib Interface - serial communication low-level support
|
||||
* Copyright (c) 2000-2003 by Stephane Fillod and Frank Singleton
|
||||
* Copyright (c) 2000-2004 by Stephane Fillod and Frank Singleton
|
||||
* Parts of the PTT handling are derived from soundmodem, an excellent
|
||||
* ham packet softmodem written by Thomas Sailer, HB9JNX.
|
||||
*
|
||||
* $Id: serial.c,v 1.39 2004-04-16 20:04:11 fillods Exp $
|
||||
* $Id: serial.c,v 1.40 2004-08-01 23:13:17 fillods Exp $
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Library General Public License as
|
||||
|
@ -72,6 +72,7 @@
|
|||
#else
|
||||
#define OPEN open
|
||||
#define CLOSE close
|
||||
#define IOCTL ioctl
|
||||
#endif
|
||||
|
||||
#include <hamlib/rig.h>
|
||||
|
@ -177,9 +178,9 @@ int serial_setup(port_t *rp)
|
|||
#if defined(HAVE_TERMIOS_H) || defined(WIN32)
|
||||
tcgetattr(fd, &options);
|
||||
#elif defined(HAVE_TERMIO_H)
|
||||
ioctl (fd, TCGETA, &options);
|
||||
IOCTL (fd, TCGETA, &options);
|
||||
#else /* sgtty */
|
||||
ioctl (fd, TIOCGETP, &sg);
|
||||
IOCTL (fd, TIOCGETP, &sg);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CFMAKERAW
|
||||
|
@ -368,14 +369,14 @@ int serial_setup(port_t *rp)
|
|||
return -RIG_ECONF; /* arg, so close! */
|
||||
}
|
||||
#elif defined(HAVE_TERMIO_H)
|
||||
if (ioctl(fd, TCSETA, &options) == -1) {
|
||||
if (IOCTL(fd, TCSETA, &options) == -1) {
|
||||
rig_debug(RIG_DEBUG_ERR, "open_serial: ioctl(TCSETA) failed: %s\n",
|
||||
strerror(errno));
|
||||
CLOSE(fd);
|
||||
return -RIG_ECONF; /* arg, so close! */
|
||||
}
|
||||
#else /* sgtty */
|
||||
if (ioctl(fd, TIOCSETP, &sg) == -1) {
|
||||
if (IOCTL(fd, TIOCSETP, &sg) == -1) {
|
||||
rig_debug(RIG_DEBUG_ERR, "open_serial: ioctl(TIOCSETP) failed: %s\n",
|
||||
strerror(errno));
|
||||
CLOSE(fd);
|
||||
|
@ -398,74 +399,31 @@ int serial_flush( port_t *p )
|
|||
return RIG_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* ser_ptt_set and par_ptt_set
|
||||
* ser_ptt_open/ser_ptt_close & par_ptt_open/par_ptt_close
|
||||
*
|
||||
* ser_open/ser_close,par_open/par_close to be used for PTT and DCD
|
||||
*
|
||||
* assumes: p is not NULL
|
||||
*/
|
||||
|
||||
#if defined(WIN32)
|
||||
int ser_open(port_t *p)
|
||||
{
|
||||
const char *path = p->pathname;
|
||||
HANDLE h;
|
||||
DCB dcb;
|
||||
|
||||
h = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, NULL,
|
||||
OPEN_EXISTING, 0, NULL);
|
||||
if (h == INVALID_HANDLE_VALUE) {
|
||||
rig_debug(RIG_DEBUG_ERR, "Cannot open PTT device \"%s\"\n", path);
|
||||
return -1;
|
||||
}
|
||||
/* Check if it is a comm device */
|
||||
if (!GetCommState(h, &dcb)) {
|
||||
rig_debug(RIG_DEBUG_ERR, "Device \"%s\" not a COM device\n", path);
|
||||
CloseHandle(h);
|
||||
return -1;
|
||||
}
|
||||
p->handle = h;
|
||||
return 0;
|
||||
return (p->fd = OPEN(p->pathname, O_RDWR | O_NOCTTY | O_NDELAY));
|
||||
}
|
||||
#else
|
||||
int ser_open(port_t *p)
|
||||
{
|
||||
return (p->fd = open(p->pathname, O_RDWR | O_NOCTTY));
|
||||
}
|
||||
#endif
|
||||
|
||||
int ser_close(port_t *p)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
return CloseHandle(p->handle);
|
||||
#else
|
||||
return close(p->fd);
|
||||
#endif
|
||||
return CLOSE(p->fd);
|
||||
}
|
||||
|
||||
int ser_set_rts(port_t *p, int state)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
/*
|
||||
* TODO: log error with 0x%lx GetLastError()
|
||||
*/
|
||||
return !EscapeCommFunction(p->handle, state ? SETRTS : CLRRTS);
|
||||
#else
|
||||
unsigned int y = TIOCM_RTS;
|
||||
|
||||
#if defined(TIOCMBIS) && defined(TIOCMBIC)
|
||||
return ioctl(p->fd, state ? TIOCMBIS : TIOCMBIC, &y);
|
||||
return IOCTL(p->fd, state ? TIOCMBIS : TIOCMBIC, &y);
|
||||
#else
|
||||
if (ioctl(p->fd, TIOCMGET, &y) < 0) {
|
||||
if (IOCTL(p->fd, TIOCMGET, &y) < 0) {
|
||||
return -RIG_EIO;
|
||||
}
|
||||
if (state)
|
||||
y |= TIOCM_RTS;
|
||||
else
|
||||
y &= ~TIOCM_RTS;
|
||||
return ioctl(p->fd, TIOCMSET, &y);
|
||||
#endif
|
||||
return IOCTL(p->fd, TIOCMSET, &y);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -475,64 +433,47 @@ int ser_set_rts(port_t *p, int state)
|
|||
*/
|
||||
int ser_get_rts(port_t *p, int *state)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
/* TODO... */
|
||||
return -RIG_ENIMPL;
|
||||
#else
|
||||
int status;
|
||||
unsigned int y;
|
||||
status = ioctl(p->fd, TIOCMGET, &y);
|
||||
status = IOCTL(p->fd, TIOCMGET, &y);
|
||||
*state = (y & TIOCM_RTS) ? RIG_PTT_ON:RIG_PTT_OFF;
|
||||
return RIG_OK;
|
||||
#endif
|
||||
}
|
||||
|
||||
int ser_set_dtr(port_t *p, int state)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
return !EscapeCommFunction(p->handle, state ? SETDTR : CLRDTR);
|
||||
#else
|
||||
unsigned int y = TIOCM_DTR;
|
||||
|
||||
#if defined(TIOCMBIS) && defined(TIOCMBIC)
|
||||
return ioctl(p->fd, state ? TIOCMBIS : TIOCMBIC, &y);
|
||||
return IOCTL(p->fd, state ? TIOCMBIS : TIOCMBIC, &y);
|
||||
#else
|
||||
if (ioctl(p->fd, TIOCMGET, &y) < 0) {
|
||||
if (IOCTL(p->fd, TIOCMGET, &y) < 0) {
|
||||
return -RIG_EIO;
|
||||
}
|
||||
if (state)
|
||||
y |= TIOCM_DTR;
|
||||
else
|
||||
y &= ~TIOCM_DTR;
|
||||
return ioctl(p->fd, TIOCMSET, &y);
|
||||
#endif
|
||||
return IOCTL(p->fd, TIOCMSET, &y);
|
||||
#endif
|
||||
}
|
||||
|
||||
int ser_get_dtr(port_t *p, int *state)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
/* TODO... */
|
||||
return -RIG_ENIMPL;
|
||||
#else
|
||||
int status;
|
||||
unsigned int y;
|
||||
status = ioctl(p->fd, TIOCMGET, &y);
|
||||
status = IOCTL(p->fd, TIOCMGET, &y);
|
||||
*state = (y & TIOCM_DTR) ? RIG_PTT_ON:RIG_PTT_OFF;
|
||||
return status;
|
||||
#endif
|
||||
}
|
||||
|
||||
int ser_set_brk(port_t *p, int state)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
return !EscapeCommFunction(p->handle, state ? SETBREAK : CLRBREAK);
|
||||
#else
|
||||
#if defined(TIOCSBRK) && defined(TIOCCBRK)
|
||||
return ioctl(p->fd, state ? TIOCSBRK : TIOCCBRK, 0 );
|
||||
return IOCTL(p->fd, state ? TIOCSBRK : TIOCCBRK, 0 );
|
||||
#else
|
||||
return -RIG_ENIMPL;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -541,16 +482,11 @@ int ser_set_brk(port_t *p, int state)
|
|||
*/
|
||||
int ser_get_dcd(port_t *p, int *state)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
/* TODO... */
|
||||
return -RIG_ENIMPL;
|
||||
#else
|
||||
int status;
|
||||
unsigned int y;
|
||||
status = ioctl(p->fd, TIOCMGET, &y);
|
||||
status = IOCTL(p->fd, TIOCMGET, &y);
|
||||
*state = (y & TIOCM_CAR) ? RIG_DCD_ON:RIG_DCD_OFF;
|
||||
return RIG_OK;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -598,15 +534,12 @@ int ser_dcd_get(port_t *p, dcd_t *dcdx)
|
|||
{
|
||||
|
||||
switch(p->type.dcd) {
|
||||
#if defined(WIN32)
|
||||
/* TODO... */
|
||||
#else
|
||||
case RIG_DCD_SERIAL_CTS:
|
||||
{
|
||||
unsigned int y;
|
||||
int status;
|
||||
|
||||
status = ioctl(p->fd, TIOCMGET, &y);
|
||||
status = IOCTL(p->fd, TIOCMGET, &y);
|
||||
*dcdx = y & TIOCM_CTS ? RIG_DCD_ON:RIG_DCD_OFF;
|
||||
return status;
|
||||
}
|
||||
|
@ -616,11 +549,10 @@ int ser_dcd_get(port_t *p, dcd_t *dcdx)
|
|||
unsigned int y;
|
||||
int status;
|
||||
|
||||
status = ioctl(p->fd, TIOCMGET, &y);
|
||||
status = IOCTL(p->fd, TIOCMGET, &y);
|
||||
*dcdx = y & TIOCM_DSR ? RIG_DCD_ON:RIG_DCD_OFF;
|
||||
return status;
|
||||
}
|
||||
#endif
|
||||
case RIG_DCD_SERIAL_CAR:
|
||||
return ser_get_dcd(p, &dcdx);
|
||||
default:
|
||||
|
|
Ładowanie…
Reference in New Issue