kopia lustrzana https://github.com/Hamlib/Hamlib
update from rxtx-2.1-7
git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2471 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.2.9
rodzic
60e188547d
commit
c9df61f699
102
lib/termios.c
102
lib/termios.c
|
@ -21,7 +21,7 @@
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
| rxtx is a native interface to serial ports in java.
|
| rxtx is a native interface to serial ports in java.
|
||||||
| Copyright 1997-2002 by Trent Jarvi taj@www.linux.org.uk.
|
| Copyright 1997-2002 by Trent Jarvi taj@www.linux.org.uk.
|
||||||
| Copyright 1998-2002 by Wayne roberts wroberts1@home.com
|
| Copyright 1997-2006 by Trent Jarvi taj@www.linux.org.uk.
|
||||||
|
|
|
|
||||||
| This library is free software; you can redistribute it and/or
|
| This library is free software; you can redistribute it and/or
|
||||||
| modify it under the terms of the GNU Library General Public
|
| modify it under the terms of the GNU Library General Public
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
| License along with this library; if not, write to the Free
|
| License along with this library; if not, write to the Free
|
||||||
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
|
|
||||||
| This file was taken from rxtx-2.1-7pre16 and adaptated for Hamlib.
|
| This file was taken from rxtx-2.1-7 and adaptated for Hamlib.
|
||||||
--------------------------------------------------------------------------*/
|
--------------------------------------------------------------------------*/
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -104,9 +104,20 @@ int win32_serial_test( char * filename )
|
||||||
int ret;
|
int ret;
|
||||||
hcomm = CreateFile( filename, GENERIC_READ |GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 );
|
hcomm = CreateFile( filename, GENERIC_READ |GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 );
|
||||||
if ( hcomm == INVALID_HANDLE_VALUE )
|
if ( hcomm == INVALID_HANDLE_VALUE )
|
||||||
ret = 0;
|
{
|
||||||
else
|
if (GetLastError() == ERROR_ACCESS_DENIED)
|
||||||
|
{
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
CloseHandle( hcomm );
|
CloseHandle( hcomm );
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
@ -303,24 +314,15 @@ int CBR_to_B( int Baud )
|
||||||
case CBR_2400: return( B2400 );
|
case CBR_2400: return( B2400 );
|
||||||
case CBR_4800: return( B4800 );
|
case CBR_4800: return( B4800 );
|
||||||
case CBR_9600: return( B9600 );
|
case CBR_9600: return( B9600 );
|
||||||
|
case CBR_14400: return( B14400 );
|
||||||
case CBR_19200: return( B19200 );
|
case CBR_19200: return( B19200 );
|
||||||
case CBR_28800: return( B28800 );
|
case CBR_28800: return( B28800 );
|
||||||
case CBR_38400: return( B38400 );
|
case CBR_38400: return( B38400 );
|
||||||
case CBR_57600: return( B57600 );
|
case CBR_57600: return( B57600 );
|
||||||
case CBR_115200: return( B115200 );
|
case CBR_115200: return( B115200 );
|
||||||
/* 14400, 128000 and 256000 are windows specific but need to
|
|
||||||
* work.
|
|
||||||
* hosed on my hardware....
|
|
||||||
*/
|
|
||||||
case CBR_14400: return( B14400 );
|
|
||||||
case CBR_128000: return( B128000 );
|
case CBR_128000: return( B128000 );
|
||||||
case CBR_256000: return( B256000 );
|
|
||||||
|
|
||||||
/* The following could be used on linux and should be able to
|
|
||||||
* work on windows if we get control of baud/divisor.
|
|
||||||
*/
|
|
||||||
|
|
||||||
case CBR_230400: return( B230400 );
|
case CBR_230400: return( B230400 );
|
||||||
|
case CBR_256000: return( B256000 );
|
||||||
case CBR_460800: return( B460800 );
|
case CBR_460800: return( B460800 );
|
||||||
case CBR_500000: return( B500000 );
|
case CBR_500000: return( B500000 );
|
||||||
case CBR_576000: return( B576000 );
|
case CBR_576000: return( B576000 );
|
||||||
|
@ -370,21 +372,13 @@ int B_to_CBR( int Baud )
|
||||||
case B2400: ret = CBR_2400; break;
|
case B2400: ret = CBR_2400; break;
|
||||||
case B4800: ret = CBR_4800; break;
|
case B4800: ret = CBR_4800; break;
|
||||||
case B9600: ret = CBR_9600; break;
|
case B9600: ret = CBR_9600; break;
|
||||||
|
case B14400: ret = CBR_14400; break;
|
||||||
case B19200: ret = CBR_19200; break;
|
case B19200: ret = CBR_19200; break;
|
||||||
case B38400: ret = CBR_38400; break;
|
case B38400: ret = CBR_38400; break;
|
||||||
case B57600: ret = CBR_57600; break;
|
case B57600: ret = CBR_57600; break;
|
||||||
case B115200: ret = CBR_115200; break;
|
case B115200: ret = CBR_115200; break;
|
||||||
|
|
||||||
/* 14400, 128000 and 256000 are windows specific but need to
|
|
||||||
* work.
|
|
||||||
*/
|
|
||||||
case B14400: ret = CBR_14400; break;
|
|
||||||
case B128000: ret = CBR_128000; break;
|
case B128000: ret = CBR_128000; break;
|
||||||
case B256000: ret = CBR_256000; break;
|
case B256000: ret = CBR_256000; break;
|
||||||
|
|
||||||
/* The following could be used on linux and should be able to
|
|
||||||
* work on windows if we get control of baud/divisor.
|
|
||||||
*/
|
|
||||||
case B230400: ret = CBR_230400; break;
|
case B230400: ret = CBR_230400; break;
|
||||||
case B460800: ret = CBR_460800; break;
|
case B460800: ret = CBR_460800; break;
|
||||||
case B500000: ret = CBR_500000; break;
|
case B500000: ret = CBR_500000; break;
|
||||||
|
@ -624,7 +618,7 @@ int win32_serial_close( int fd )
|
||||||
struct termios_list *index;
|
struct termios_list *index;
|
||||||
/* char message[80]; */
|
/* char message[80]; */
|
||||||
|
|
||||||
ENTER( "close" );
|
ENTER( "serial_close" );
|
||||||
if( !first_tl || !first_tl->hComm )
|
if( !first_tl || !first_tl->hComm )
|
||||||
{
|
{
|
||||||
report( "gotit!" );
|
report( "gotit!" );
|
||||||
|
@ -633,7 +627,7 @@ int win32_serial_close( int fd )
|
||||||
index = find_port( fd );
|
index = find_port( fd );
|
||||||
if ( !index )
|
if ( !index )
|
||||||
{
|
{
|
||||||
LEAVE( "close" );
|
LEAVE( "serial_close" );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -650,7 +644,7 @@ int win32_serial_close( int fd )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf( message, "close(): Invalid Port Reference for %s\n",
|
sprintf( message, "serial_ close(): Invalid Port Reference for %s\n",
|
||||||
index->filename );
|
index->filename );
|
||||||
report( message );
|
report( message );
|
||||||
}
|
}
|
||||||
|
@ -686,7 +680,7 @@ int win32_serial_close( int fd )
|
||||||
*/
|
*/
|
||||||
free( index );
|
free( index );
|
||||||
}
|
}
|
||||||
LEAVE( "close" );
|
LEAVE( "serial_close" );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -881,7 +875,7 @@ int open_port( struct termios_list *port )
|
||||||
YACK();
|
YACK();
|
||||||
set_errno( EINVAL );
|
set_errno( EINVAL );
|
||||||
/*
|
/*
|
||||||
printf( "open failed %s\n", port->filename );
|
printf( "serial_open failed %s\n", port->filename );
|
||||||
*/
|
*/
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1188,7 +1182,7 @@ int win32_serial_open( const char *filename, int flags, ... )
|
||||||
index = add_port( filename );
|
index = add_port( filename );
|
||||||
if( !index )
|
if( !index )
|
||||||
{
|
{
|
||||||
report( "open !index\n" );
|
report( "serial_open !index\n" );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1196,17 +1190,17 @@ int win32_serial_open( const char *filename, int flags, ... )
|
||||||
index->tx_happened = 0;
|
index->tx_happened = 0;
|
||||||
if ( open_port( index ) )
|
if ( open_port( index ) )
|
||||||
{
|
{
|
||||||
sprintf( message, "open(): Invalid Port Reference for %s\n",
|
sprintf( message, "serial_open(): Invalid Port Reference for %s\n",
|
||||||
filename );
|
filename );
|
||||||
report( message );
|
report( message );
|
||||||
close( index->fd );
|
win32_serial_close( index->fd );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( check_port_capabilities( index ) )
|
if( check_port_capabilities( index ) )
|
||||||
{
|
{
|
||||||
report( "check_port_capabilites!" );
|
report( "check_port_capabilites!" );
|
||||||
close( index->fd );
|
win32_serial_close( index->fd );
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1253,7 +1247,7 @@ int win32_serial_write( int fd, const char *Str, int length )
|
||||||
{
|
{
|
||||||
unsigned long nBytes;
|
unsigned long nBytes;
|
||||||
struct termios_list *index;
|
struct termios_list *index;
|
||||||
//COMSTAT Stat;
|
/* COMSTAT Stat; */
|
||||||
int old_flag;
|
int old_flag;
|
||||||
|
|
||||||
ENTER( "serial_write" );
|
ENTER( "serial_write" );
|
||||||
|
@ -1281,9 +1275,9 @@ int win32_serial_write( int fd, const char *Str, int length )
|
||||||
WaitForSingleObject( index->wol.hEvent,100 );
|
WaitForSingleObject( index->wol.hEvent,100 );
|
||||||
if ( GetLastError() != ERROR_IO_PENDING )
|
if ( GetLastError() != ERROR_IO_PENDING )
|
||||||
{
|
{
|
||||||
//ClearErrors( index, &Stat );
|
/* ClearErrors( index, &Stat ); */
|
||||||
report( "serial_write error\n" );
|
report( "serial_write error\n" );
|
||||||
//report("Condition 1 Detected in write()\n");
|
/* report("Condition 1 Detected in write()\n"); */
|
||||||
YACK();
|
YACK();
|
||||||
errno = EIO;
|
errno = EIO;
|
||||||
nBytes=-1;
|
nBytes=-1;
|
||||||
|
@ -1295,30 +1289,28 @@ int win32_serial_write( int fd, const char *Str, int length )
|
||||||
{
|
{
|
||||||
if ( GetLastError() != ERROR_IO_INCOMPLETE )
|
if ( GetLastError() != ERROR_IO_INCOMPLETE )
|
||||||
{
|
{
|
||||||
//report("Condition 2 Detected in write()\n");
|
/* report("Condition 2 Detected in write()\n"); */
|
||||||
YACK();
|
YACK();
|
||||||
errno = EIO;
|
errno = EIO;
|
||||||
nBytes = -1;
|
nBytes = -1;
|
||||||
goto end;
|
goto end;
|
||||||
//ClearErrors( index, &Stat );
|
/* ClearErrors( index, &Stat ); */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//ClearErrors( index, &Stat );
|
/* Write finished synchronously. That is ok!
|
||||||
//report("Condition 3 Detected in write()\n");
|
* I have seen this with USB to Serial
|
||||||
YACK();
|
* devices like TI's.
|
||||||
errno = EIO;
|
*/
|
||||||
//report( "serial_write bailing!\n" );
|
|
||||||
return(-1);
|
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
/* FlushFileBuffers( index->hComm ); */
|
/* FlushFileBuffers( index->hComm ); */
|
||||||
index->event_flag |= EV_TXEMPTY;
|
index->event_flag |= EV_TXEMPTY;
|
||||||
//ClearErrors( index, &Stat );
|
/* ClearErrors( index, &Stat ); */
|
||||||
SetCommMask( index->hComm, index->event_flag );
|
SetCommMask( index->hComm, index->event_flag );
|
||||||
//ClearErrors( index, &Stat );
|
/* ClearErrors( index, &Stat ); */
|
||||||
index->event_flag = old_flag;
|
index->event_flag = old_flag;
|
||||||
index->tx_happened = 1;
|
index->tx_happened = 1;
|
||||||
LEAVE( "serial_write" );
|
LEAVE( "serial_write" );
|
||||||
|
@ -1418,7 +1410,7 @@ int win32_serial_read( int fd, void *vb, int size )
|
||||||
while ( size > 0 )
|
while ( size > 0 )
|
||||||
{
|
{
|
||||||
nBytes = 0;
|
nBytes = 0;
|
||||||
//ret = ClearErrors( index, &stat);
|
/* ret = ClearErrors( index, &stat); */
|
||||||
|
|
||||||
index->rol.Offset = index->rol.OffsetHigh = 0;
|
index->rol.Offset = index->rol.OffsetHigh = 0;
|
||||||
ResetEvent( index->rol.hEvent );
|
ResetEvent( index->rol.hEvent );
|
||||||
|
@ -1592,7 +1584,7 @@ int win32_serial_read( int fd, void *vb, int size )
|
||||||
while ( size > 0 )
|
while ( size > 0 )
|
||||||
{
|
{
|
||||||
nBytes = 0;
|
nBytes = 0;
|
||||||
//ret = ClearErrors( index, &Stat);
|
/* ret = ClearErrors( index, &Stat); */
|
||||||
|
|
||||||
index->rol.Offset = index->rol.OffsetHigh = 0;
|
index->rol.Offset = index->rol.OffsetHigh = 0;
|
||||||
ResetEvent( index->rol.hEvent );
|
ResetEvent( index->rol.hEvent );
|
||||||
|
@ -2258,7 +2250,6 @@ int tcsetattr( int fd, int when, struct termios *s_termios )
|
||||||
DCB dcb;
|
DCB dcb;
|
||||||
COMMTIMEOUTS timeouts;
|
COMMTIMEOUTS timeouts;
|
||||||
struct termios_list *index;
|
struct termios_list *index;
|
||||||
char message[80];
|
|
||||||
|
|
||||||
ENTER( "tcsetattr" );
|
ENTER( "tcsetattr" );
|
||||||
if ( fd <= 0 )
|
if ( fd <= 0 )
|
||||||
|
@ -2734,7 +2725,16 @@ int win32_serial_ioctl( int fd, int request, ... )
|
||||||
|
|
||||||
va_start( ap, request );
|
va_start( ap, request );
|
||||||
|
|
||||||
ClearErrors( index, &Stat );
|
ret = ClearErrors( index, &Stat );
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
set_errno( EBADFD );
|
||||||
|
YACK();
|
||||||
|
report( "ClearError Failed! ernno EBADFD" );
|
||||||
|
arg = va_arg( ap, int * );
|
||||||
|
va_end( ap );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
switch( request )
|
switch( request )
|
||||||
{
|
{
|
||||||
case TCSBRK:
|
case TCSBRK:
|
||||||
|
@ -3030,7 +3030,7 @@ int win32_serial_ioctl( int fd, int request, ... )
|
||||||
printf( "---------------overrun\n" );
|
printf( "---------------overrun\n" );
|
||||||
*/
|
*/
|
||||||
sistruct->overrun = index->sis->overrun;
|
sistruct->overrun = index->sis->overrun;
|
||||||
//ErrCode &= ~CE_OVERRUN;
|
/* ErrCode &= ~CE_OVERRUN; */
|
||||||
}
|
}
|
||||||
if( sistruct->parity != index->sis->parity )
|
if( sistruct->parity != index->sis->parity )
|
||||||
{
|
{
|
||||||
|
|
Ładowanie…
Reference in New Issue