|
/*-------------------------------------------------------------------------
|
|
| rxtx is a native interface to serial ports in java.
|
|
| Copyright 1997-2004 by Trent Jarvi taj@www.linux.org.uk
|
|
|
|
|
| This library is free software; you can redistribute it and/or
|
|
| modify it under the terms of the GNU Library General Public
|
|
| License as published by the Free Software Foundation; either
|
|
| version 2 of the License, or (at your option) any later version.
|
|
|
|
|
| This library is distributed in the hope that it will be useful,
|
|
| but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
| Library General Public License for more details.
|
|
|
|
|
| You should have received a copy of the GNU Library General Public
|
|
| License along with this library; if not, write to the Free
|
|
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
--------------------------------------------------------------------------*/
|
|
/* gnu.io.SerialPort constants */
|
|
#ifdef WIN32
|
|
#include "win32termios.h"
|
|
#endif /* WIN32 */
|
|
#define JDATABITS_5 5
|
|
#define JDATABITS_6 6
|
|
#define JDATABITS_7 7
|
|
#define JDATABITS_8 8
|
|
#define JPARITY_NONE 0
|
|
#define JPARITY_ODD 1
|
|
#define JPARITY_EVEN 2
|
|
#define JPARITY_MARK 3
|
|
#define JPARITY_SPACE 4
|
|
#define STOPBITS_1 1
|
|
#define STOPBITS_2 2
|
|
#define STOPBITS_1_5 3
|
|
#define FLOWCONTROL_NONE 0
|
|
#define FLOWCONTROL_RTSCTS_IN 1
|
|
#define FLOWCONTROL_RTSCTS_OUT 2
|
|
#define FLOWCONTROL_XONXOFF_IN 4
|
|
#define FLOWCONTROL_XONXOFF_OUT 8
|
|
|
|
/* gnu.io.SerialPortEvent constants */
|
|
#define SPE_DATA_AVAILABLE 1
|
|
#define SPE_OUTPUT_BUFFER_EMPTY 2
|
|
#define SPE_CTS 3
|
|
#define SPE_DSR 4
|
|
#define SPE_RI 5
|
|
#define SPE_CD 6
|
|
#define SPE_OE 7
|
|
#define SPE_PE 8
|
|
#define SPE_FE 9
|
|
#define SPE_BI 10
|
|
|
|
#define PORT_SERIAL 1
|
|
#define PORT_PARALLEL 2
|
|
#define PORT_I2C 3
|
|
#define PORT_RS485 4
|
|
#define PORT_RAW 5
|
|
|
|
/* glue for unsupported linux speeds see also win32termios.h */
|
|
|
|
#if !defined(__APPLE__) && !defined(__FreeBSD__) /* dima */
|
|
/* this is now handled in SerialImp.c
|
|
#define B14400 1010001
|
|
#define B28800 1010002
|
|
#define B128000 1010003
|
|
#define B256000 1010004
|
|
*/
|
|
#endif /* dima */
|
|
|
|
struct preopened
|
|
{
|
|
char filename[40];
|
|
int fd;
|
|
struct preopened *next;
|
|
struct preopened *prev;
|
|
};
|
|
|
|
struct event_info_struct
|
|
{
|
|
int fd;
|
|
/* flags for events */
|
|
int eventflags[11];
|
|
|
|
int initialised;
|
|
int ret, change;
|
|
unsigned int omflags;
|
|
char message[80];
|
|
int has_tiocsergetlsr;
|
|
int has_tiocgicount;
|
|
int eventloop_interrupted;
|
|
/*
|
|
JNIEnv *env;
|
|
jobject *jobj;
|
|
jclass jclazz;
|
|
jmethodID send_event;
|
|
jmethodID checkMonitorThread;
|
|
*/
|
|
struct event_info_struct *next, *prev;
|
|
fd_set rfds;
|
|
struct timeval tv_sleep;
|
|
int closing;
|
|
#if !defined(TIOCSERGETLSR) && !defined(WIN32)
|
|
int writing;
|
|
int output_buffer_empty_flag;
|
|
#endif /* !TIOCSERGETLSR !WIN32 */
|
|
# if defined(TIOCGICOUNT)
|
|
struct serial_icounter_struct osis;
|
|
#endif /* TIOCGICOUNT */
|
|
};
|
|
|
|
/* Ports known on the OS */
|
|
#if defined(__linux__)
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR "/var/lock"
|
|
# define LOCKFILEPREFIX "LCK.."
|
|
# define FHS
|
|
#endif /* __linux__ */
|
|
#if defined(__QNX__)
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR ""
|
|
# define LOCKFILEPREFIX ""
|
|
#endif /* qnx */
|
|
#if defined(__sgi__) || defined(sgi)
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR "/usr/spool/uucp"
|
|
# define LOCKFILEPREFIX "LK."
|
|
# define UUCP
|
|
#endif /* __sgi__ || sgi */
|
|
#if defined(__FreeBSD__)
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR "/var/spool/uucp"
|
|
# define LOCKFILEPREFIX "LK."
|
|
# define UUCP
|
|
#endif
|
|
#if defined(__APPLE__)
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR "/var/spool/uucp"
|
|
# define LOCKFILEPREFIX "LK."
|
|
# define UUCP
|
|
#endif /* __FreeBSD__ */
|
|
#if defined(__NetBSD__)
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR "/usr/spool/uucp"
|
|
# define LOCKFILEPREFIX "LK."
|
|
# define UUCP
|
|
#endif /* __NetBSD__ */
|
|
#if defined(__unixware__)
|
|
# define DEVICEDIR "/dev/"
|
|
/* really this only fully works for OpenServer */
|
|
# define LOCKDIR "/var/spool/uucp/"
|
|
# define LOCKFILEPREFIX "LK."
|
|
/*
|
|
this needs work....
|
|
|
|
Jonathan Schilling <jls@caldera.com> writes:
|
|
|
|
This is complicated because as I said in my previous mail, there are
|
|
two kinds of SCO operating systems.
|
|
|
|
The one that most people want gnu.io for, including the guy who
|
|
asked the mailing list about SCO support a few days ago, is Open Server
|
|
(a/k/a "SCO UNIX"), which is SVR3-based. This uses old-style uucp locks,
|
|
of the form LCK..tty0a. That's what I implemented in the RXTX port I did,
|
|
and it works correctly.
|
|
|
|
The other SCO/Caldera OS, UnixWare/Open UNIX, uses the new-style
|
|
SVR4 locks, of the form LK.123.123.123. These OSes are a lot like
|
|
Solaris (UnixWare/Open UNIX come from AT&T SVR4 which had a joint
|
|
|
|
The other SCO/Caldera OS, UnixWare/Open UNIX, uses the new-style
|
|
SVR4 locks, of the form LK.123.123.123. These OSes are a lot like
|
|
Solaris (UnixWare/Open UNIX come from AT&T SVR4 which had a joint
|
|
heritage with Sun way back when). I saw that you added support
|
|
for this form of lock by RXTX 1.4-10 ... but it gets messy because,
|
|
as I said before, we use the same binary gnu.io files for both
|
|
UnixWare/Open UNIX and OpenServer. Thus we can't #ifdef one or the
|
|
other; it would have to be a runtime test. Your code and your macros
|
|
aren't set up for doing this (understandably!). So I didn't implement
|
|
these; the gnu.io locks won't fully work on UnixWare/Open UNIX
|
|
as a result, which I mentioned in the Release Notes.
|
|
|
|
|
|
What I would suggest is that you merge in the old-style LCK..tty0a lock
|
|
code that I used, since this will satisfy 90% of the SCO users. Then
|
|
I'll work on some way of getting UnixWare/Open UNIX locking to work
|
|
correctly, and give you those changes at a later date.
|
|
|
|
Jonathan
|
|
|
|
FIXME The lock type could be passed with -DOLDUUCP or -DUUCP based on
|
|
os.name in configure.in or perhaps system defines could determine the lock
|
|
type.
|
|
|
|
Trent
|
|
*/
|
|
# define OLDUUCP
|
|
#endif
|
|
#if defined(__hpux__)
|
|
/* modif cath */
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR "/var/spool/uucp"
|
|
# define LOCKFILEPREFIX "LCK."
|
|
# define UUCP
|
|
#endif /* __hpux__ */
|
|
#if defined(__osf__) /* Digital Unix */
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR ""
|
|
# define LOCKFILEPREFIX "LK."
|
|
# define UUCP
|
|
#endif /* __osf__ */
|
|
#if defined(__sun__) /* Solaris */
|
|
# define DEVICEDIR "/dev/"
|
|
# define LOCKDIR "/var/spool/locks"
|
|
# define LOCKFILEPREFIX "LK."
|
|
/*
|
|
# define UUCP
|
|
*/
|
|
#endif /* __sun__ */
|
|
#if defined(__BEOS__)
|
|
# define DEVICEDIR "/dev/ports/"
|
|
# define LOCKDIR ""
|
|
# define LOCKFILEPREFIX ""
|
|
# define UUCP
|
|
#endif /* __BEOS__ */
|
|
#if defined(WIN32)
|
|
# define DEVICEDIR "//./"
|
|
# define LOCKDIR ""
|
|
# define LOCKFILEPREFIX ""
|
|
# define OPEN serial_open
|
|
# define CLOSE serial_close
|
|
# define WRITE serial_write
|
|
# define READ serial_read
|
|
# define SELECT serial_select
|
|
#else /* use the system calls for Unix */
|
|
# define OPEN open
|
|
# define CLOSE close
|
|
# define WRITE write
|
|
# define READ read
|
|
# define SELECT select
|
|
struct timeval snow, enow, seloop, eeloop;
|
|
#define report_time_start_rs( ) \
|
|
{ \
|
|
gettimeofday(&snow, NULL); \
|
|
}
|
|
#define report_time_end_rs( ) \
|
|
{ \
|
|
gettimeofday(&enow, NULL); \
|
|
mexPrintf("%8i sec : %8i usec\n", enow.tv_sec - snow.tv_sec, enow.tv_sec - snow.tv_sec?snow.tv_usec-enow.tv_usec:enow.tv_usec - snow.tv_usec); \
|
|
}
|
|
#ifdef DEBUG_TIMING
|
|
struct timeval snow, enow, seloop, eeloop;
|
|
#define report_time_eventLoop( ) { \
|
|
if ( seloop.tv_sec == eeloop.tv_sec && seloop.tv_usec == eeloop.tv_usec ) \
|
|
{ \
|
|
gettimeofday(&eeloop, NULL); \
|
|
seloop.tv_sec = eeloop.tv_sec; \
|
|
seloop.tv_usec = eeloop.tv_usec; \
|
|
mexPrintf("%8i sec : %8i usec\n", eeloop.tv_sec - seloop.tv_sec, eeloop.tv_usec - seloop.tv_usec); \
|
|
} \
|
|
}
|
|
#define report_time( ) \
|
|
{ \
|
|
struct timeval now; \
|
|
gettimeofday(&now, NULL); \
|
|
mexPrintf("%8s : %5i : %8i sec : %8i usec\n", __TIME__, __LINE__, now.tv_sec, now.tv_usec); \
|
|
}
|
|
#define report_time_start( ) \
|
|
{ \
|
|
gettimeofday(&snow, NULL); \
|
|
mexPrintf("%8s : %5i : %8i sec : %8i usec", __TIME__, __LINE__, snow.tv_sec, snow.tv_usec); \
|
|
}
|
|
#define report_time_end( ) \
|
|
{ \
|
|
gettimeofday(&enow, NULL); \
|
|
mexPrintf("%8i sec : %8i usec\n", enow.tv_sec - snow.tv_sec, enow.tv_sec - snow.tv_sec?snow.tv_usec-enow.tv_usec:enow.tv_usec - snow.tv_usec); \
|
|
}
|
|
#else
|
|
#define report_time_eventLoop( ){};
|
|
#define report_time( ) {}
|
|
#define report_time_start( ) {}
|
|
#define report_time_end( ) {}
|
|
|
|
#endif /* DEBUG_TIMING */
|
|
|
|
/* #define TRACE */
|
|
#ifdef TRACE
|
|
#define ENTER(x) report("entering "x" \n");
|
|
#define LEAVE(x) report("leaving "x" \n");
|
|
#else
|
|
#define ENTER(x)
|
|
#define LEAVE(x)
|
|
#endif /* TRACE */
|
|
|
|
#endif /* WIN32 */
|
|
|
|
/* allow people to override the directories */
|
|
/* #define USER_LOCK_DIRECTORY "/home/tjarvi/1.5/build" */
|
|
#ifdef USER_LOCK_DIRECTORY
|
|
# define LOCKDIR USER_LOCK_DIRECTORY
|
|
#endif /* USER_LOCK_DIRECTORY */
|
|
|
|
#ifdef DISABLE_LOCKFILES
|
|
#undef UUCP
|
|
#undef FHS
|
|
#undef OLDUUCP
|
|
#endif /* DISABLE_LOCKFILES */
|
|
|
|
/* That should be all you need to look at in this file for porting */
|
|
#ifdef LFS /* Use a Lock File Server */
|
|
# define LOCK lfs_lock
|
|
# define UNLOCK lfs_unlock
|
|
#elif defined(UUCP)
|
|
# define LOCK uucp_lock
|
|
# define UNLOCK uucp_unlock
|
|
#elif defined(OLDUUCP)
|
|
/*
|
|
We can handle the old style if needed here see __unixware__ above.
|
|
defaulting to rxtx-1.4-8 behavior for now.
|
|
|
|
see also __sco__ in SerialImp.c when changing this for a possible
|
|
bug
|
|
|
|
FIXME
|
|
*/
|
|
# define LOCK fhs_lock
|
|
# define UNLOCK fhs_unlock
|
|
#elif defined(FHS)
|
|
# define LOCK fhs_lock
|
|
# define UNLOCK fhs_unlock
|
|
#else
|
|
# define LOCK system_does_not_lock
|
|
# define UNLOCK system_does_not_unlock
|
|
#endif /* UUCP */
|
|
|
|
/* java exception class names */
|
|
//#define UNSUPPORTED_COMM_OPERATION "gnu/io/UnsupportedCommOperationException"
|
|
#define UNSUPPORTED_COMM_OPERATION "UnsupportedCommOperationException"
|
|
#define ARRAY_INDEX_OUT_OF_BOUNDS "java/lang/ArrayIndexOutOfBoundsException"
|
|
#define OUT_OF_MEMORY "java/lang/OutOfMemoryError"
|
|
#define IO_EXCEPTION "java/io/IOException"
|
|
#define PORT_IN_USE_EXCEPTION "gnu/io/PortInUseException"
|
|
|
|
/* some popular releases of Slackware do not have SSIZE_MAX */
|
|
|
|
#ifndef SSIZE_MAX
|
|
# if defined(INT_MAX)
|
|
# define SSIZE_MAX INT_MAX
|
|
# elif defined(MAXINT)
|
|
# define SSIZE_MAX MAXINT
|
|
# else
|
|
# define SSIZE_MAX 2147483647 /* ugh */
|
|
# endif
|
|
#endif
|
|
|
|
/*
|
|
Flow Control defines inspired by reading how mgetty by Gert Doering does it
|
|
*/
|
|
|
|
#ifdef CRTSCTS
|
|
#define HARDWARE_FLOW_CONTROL CRTSCTS
|
|
#else
|
|
# ifdef CCTS_OFLOW
|
|
# define HARDWARE_FLOW_CONTROL CCTS_OFLOW|CRST_IFLOW
|
|
# else
|
|
# ifdef RTSFLOW
|
|
# define HARDWARE_FLOW_CONTROL RTSFLOW|CTSFLOW
|
|
# else
|
|
# ifdef CRTSFL
|
|
# define HARDWARE_FLOW_CONTROL CRTSFL
|
|
# else
|
|
# ifdef CTSCD
|
|
# define HARDWARE_FLOW_CONTROL CTSCD
|
|
# else
|
|
# define HARDWARE_FLOW_CONTROL 0
|
|
# endif
|
|
# endif
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
/* PROTOTYPES */
|
|
#ifdef DEBUG_MW
|
|
extern void mexWarnMsgTxt( const char * );
|
|
extern void mexErrMsgTxt( const char * );
|
|
#ifndef __APPLE__
|
|
extern int mexPrintf( const char *, ... );
|
|
# define printf mexPrintf
|
|
#endif
|
|
#endif /* DEBUG_MW */
|
|
|
|
#ifdef __APPLE__
|
|
# define mexPrintf printf
|
|
#endif
|
|
|
|
#ifdef __BEOS__
|
|
struct tpid_info_struct *add_tpid( struct tpid_info_struct * );
|
|
data_rate translate_speed( jint );
|
|
int translate_data_bits( data_bits *, jint );
|
|
int translate_stop_bits( stop_bits *, jint );
|
|
int translate_parity( parity_mode *, jint );
|
|
#else
|
|
int spawn_write_thread( int, char *, int );
|
|
int translate_speed( jint );
|
|
int translate_data_bits( tcflag_t *, jint );
|
|
int translate_stop_bits( tcflag_t *, jint );
|
|
int translate_parity( tcflag_t *, jint );
|
|
#endif
|
|
void system_wait();
|
|
void finalize_event_info_struct( struct event_info_struct * );
|
|
int read_byte_array( int, unsigned char *, int, int );
|
|
int get_java_var( char *, char * );
|
|
jboolean is_interrupted( struct event_info_struct * );
|
|
int send_event(gnu::io::RXTXPort *, struct event_info_struct *, jint, int );
|
|
void dump_termios(char *,struct termios *);
|
|
void report_verbose(char *);
|
|
void report_error(char *);
|
|
void report_warning(char *);
|
|
void report(char *);
|
|
void throw_java_exception( char *, char *, char * );
|
|
int lock_device( const char * );
|
|
void unlock_device( const char * );
|
|
int is_device_locked( const char * );
|
|
int check_lock_status( const char * );
|
|
int lfs_unlock(const char *, int );
|
|
int lfs_lock( const char *, int);
|
|
void fhs_unlock(const char *, int );
|
|
int fhs_lock( const char *, int);
|
|
void uucp_unlock( const char *, int );
|
|
int uucp_lock( const char *, int );
|
|
int system_does_not_lock( const char *, int );
|
|
void system_does_not_unlock( const char *, int );
|
|
int check_group_uucp();
|
|
int check_lock_pid( const char *, int );
|
|
int printj(wchar_t *fmt, ...);
|
|
|
|
#define UNEXPECTED_LOCK_FILE "RXTX Error: Unexpected lock file: %s\n Please report to the RXTX developers\n"
|
|
#define LINUX_KERNEL_VERSION_ERROR "\n\n\nRXTX WARNING: This library was compiled to run with OS release %s and you are currently running OS release %s. In some cases this can be a problem. Try recompiling RXTX if you notice strange behavior. If you just compiled RXTX make sure /usr/include/linux is a symbolic link to the include files that came with the kernel source and not an older copy.\n\n\npress enter to continue\n"
|
|
#define UUCP_ERROR "\n\n\nRXTX WARNING: This library requires the user running applications to be in\ngroup uucp. Please consult the INSTALL documentation. More information is\navaiable under the topic 'How can I use Lock Files with rxtx?'\n"
|