/*-------------------------------------------------------------------------
|
|
| A wrapper to convert RXTX into Linux Java Comm
|
|
| Copyright 1998 Kevin Hester, kevinh@acm.org
|
|
| Copyright 2000-2004 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
|
|
--------------------------------------------------------------------------*/
|
|
|
|
/* Martin Pool <mbp@linuxcare.com> added support for explicitly-specified
|
|
* lists of ports, October 2000. */
|
|
/* Joseph Goldstone <joseph@lp.com> reorganized to support registered ports,
|
|
* known ports, and scanned ports, July 2001 */
|
|
|
|
package gnu.io;
|
|
|
|
import java.util.*;
|
|
import java.io.*;
|
|
import java.util.StringTokenizer;
|
|
|
|
/**
|
|
This is the JavaComm for Linux driver.
|
|
*/
|
|
public class RXTXCommDriver implements CommDriver
|
|
{
|
|
|
|
private final static boolean debug = false;
|
|
private final static boolean devel = true;
|
|
|
|
static
|
|
{
|
|
|
|
if(debug ) System.out.println("RXTXCommDriver {}");
|
|
/*
|
|
System.loadLibrary( "rxtxSerial" );
|
|
*/
|
|
|
|
/*
|
|
Perform a crude check to make sure people don't mix
|
|
versions of the Jar and native lib
|
|
|
|
Mixing the libs can create a nightmare.
|
|
|
|
It could be possible to move this over to RXTXVersion
|
|
but All we want to do is warn people when first loading
|
|
the Library.
|
|
*/
|
|
String JarVersion = RXTXVersion.getVersion();
|
|
String LibVersion = nativeGetVersion();
|
|
|
|
if ( devel )
|
|
{
|
|
System.out.println("Devel Library");
|
|
System.out.println("=========================================");
|
|
System.out.println("Native lib Version = " + JarVersion );
|
|
System.out.println("Java lib Version = " + LibVersion );
|
|
}
|
|
|
|
/* FIXME static not working
|
|
if ( ! JarVersion.equals( LibVersion ) )
|
|
{
|
|
System.out.println( "WARNING: RXTX Version mismatch\n\tJar version = " + JarVersion + "\n\tnative lib Version = " + LibVersion );
|
|
}
|
|
else if ( debug )
|
|
{
|
|
System.out.println( "RXTXCommDriver:\n\tJar version = " + JarVersion + "\n\tnative lib Version = " + LibVersion );
|
|
}
|
|
*/
|
|
}
|
|
|
|
/** Get the Serial port prefixes for the running OS */
|
|
private String deviceDirectory;
|
|
private String osName;
|
|
private static native String nativeGetVersion();
|
|
private native boolean registerKnownPorts(int PortType);
|
|
private native boolean isPortPrefixValid(String dev);
|
|
private native boolean testRead(String dev, int type);
|
|
private native String getDeviceDirectory();
|
|
|
|
private final String[] getValidPortPrefixes(String CandidatePortPrefixes[])
|
|
{
|
|
/*
|
|
256 is the number of prefixes ( COM, cua, ttyS, ...) not
|
|
the number of devices (ttyS0, ttyS1, ttyS2, ...)
|
|
|
|
On a Linux system there are about 400 prefixes in
|
|
deviceDirectory.
|
|
registerScannedPorts() assigns CandidatePortPrefixes to
|
|
something less than 50 prefixes.
|
|
|
|
Trent
|
|
*/
|
|
|
|
String ValidPortPrefixes[]=new String [256];
|
|
if (debug)
|
|
System.out.println("\nRXTXCommDriver:getValidPortPrefixes()");
|
|
if(CandidatePortPrefixes==null)
|
|
{
|
|
if (debug)
|
|
System.out.println("\nRXTXCommDriver:getValidPortPrefixes() No ports prefixes known for this System.\nPlease check the port prefixes listed for " + osName + " in RXTXCommDriver:registerScannedPorts()\n");
|
|
}
|
|
int i=0;
|
|
for(int j=0;j<CandidatePortPrefixes.length;j++){
|
|
if(isPortPrefixValid(CandidatePortPrefixes[j])) {
|
|
ValidPortPrefixes[i++]=
|
|
new String(CandidatePortPrefixes[j]);
|
|
}
|
|
}
|
|
String[] returnArray=new String[i];
|
|
System.arraycopy(ValidPortPrefixes, 0, returnArray, 0, i);
|
|
if(ValidPortPrefixes[0]==null)
|
|
{
|
|
if (debug)
|
|
{
|
|
System.out.println("\nRXTXCommDriver:getValidPortPrefixes() No ports matched the list assumed for this\nSystem in the directory " + deviceDirectory + ". Please check the ports listed for \"" + osName + "\" in\nRXTXCommDriver:registerScannedPorts()\nTried:");
|
|
for(int j=0;j<CandidatePortPrefixes.length;j++){
|
|
System.out.println("\t" +
|
|
CandidatePortPrefixes[i]);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (debug)
|
|
System.out.println("\nRXTXCommDriver:getValidPortPrefixes()\nThe following port prefixes have been identified as valid on " + osName + ":\n");
|
|
/*
|
|
for(int j=0;j<returnArray.length;j++)
|
|
{
|
|
if (debug)
|
|
System.out.println("\t" + j + " " +
|
|
returnArray[j]);
|
|
}
|
|
*/
|
|
}
|
|
return returnArray;
|
|
}
|
|
|
|
/** handle solaris/sunos /dev/cua/a convention */
|
|
private void checkSolaris(String PortName, int PortType)
|
|
{
|
|
char p[] = { 91 };
|
|
for( p[0] =97 ;p[0] < 123; p[0]++ )
|
|
{
|
|
if (testRead(PortName.concat(new String(p)),PortType))
|
|
{
|
|
CommPortIdentifier.addPortName(
|
|
PortName.concat(new String(p)),
|
|
PortType,
|
|
this
|
|
);
|
|
}
|
|
}
|
|
}
|
|
private void registerValidPorts(
|
|
String CandidateDeviceNames[],
|
|
String ValidPortPrefixes[],
|
|
int PortType
|
|
) {
|
|
int i =0;
|
|
int p =0 ;
|
|
/* FIXME quick fix to get COM1-8 on windows working. The
|
|
Read test is not working properly and its crunch time...
|
|
if(osName.toLowerCase().indexOf("windows") != -1 )
|
|
{
|
|
for( i=0;i < CandidateDeviceNames.length;i++ )
|
|
{
|
|
CommPortIdentifier.addPortName( CandidateDeviceNames[i],
|
|
PortType, this );
|
|
}
|
|
return;
|
|
|
|
}
|
|
*/
|
|
if (debug)
|
|
{
|
|
System.out.println("Entering registerValidPorts()");
|
|
/* */
|
|
System.out.println(" Candidate devices:");
|
|
for (int dn=0;dn<CandidateDeviceNames.length;dn++)
|
|
System.out.println(" " +
|
|
CandidateDeviceNames[dn]);
|
|
System.out.println(" valid port prefixes:");
|
|
for (int pp=0;pp<ValidPortPrefixes.length;pp++)
|
|
System.out.println(" "+ValidPortPrefixes[pp]);
|
|
/* */
|
|
}
|
|
if ( CandidateDeviceNames!=null && ValidPortPrefixes!=null)
|
|
{
|
|
for( i = 0;i<CandidateDeviceNames.length; i++ ) {
|
|
for( p = 0;p<ValidPortPrefixes.length; p++ ) {
|
|
/* this determines:
|
|
* device file Valid ports
|
|
* /dev/ttyR[0-9]* != /dev/ttyS[0-9]*
|
|
* /dev/ttySI[0-9]* != /dev/ttyS[0-9]*
|
|
* /dev/ttyS[0-9]* == /dev/ttyS[0-9]*
|
|
|
|
* Otherwise we check some ports
|
|
* multiple times. Perl would rock
|
|
* here.
|
|
*
|
|
* If the above passes, we try to read
|
|
* from the port. If there is no err
|
|
* the port is added.
|
|
* Trent
|
|
*/
|
|
String V = ValidPortPrefixes[ p ];
|
|
int VL = V.length();
|
|
String C = CandidateDeviceNames[ i ];
|
|
if( C.length() < VL ) continue;
|
|
String CU =
|
|
C.substring(VL).toUpperCase();
|
|
String Cl =
|
|
C.substring(VL).toLowerCase();
|
|
if( !( C.regionMatches(0, V, 0, VL ) &&
|
|
CU.equals( Cl ) ) )
|
|
{
|
|
continue;
|
|
}
|
|
String PortName;
|
|
if(osName.toLowerCase().indexOf("windows") == -1 )
|
|
{
|
|
PortName =
|
|
new String(deviceDirectory +
|
|
C );
|
|
}
|
|
else
|
|
{
|
|
PortName =
|
|
new String( C );
|
|
}
|
|
if (debug)
|
|
{
|
|
System.out.println( C +
|
|
" " + V );
|
|
System.out.println( CU +
|
|
" " + Cl );
|
|
}
|
|
if( osName.equals("Solaris") ||
|
|
osName.equals("SunOS"))
|
|
checkSolaris(PortName,PortType);
|
|
else if (testRead(PortName, PortType))
|
|
{
|
|
CommPortIdentifier.addPortName(
|
|
PortName,
|
|
PortType,
|
|
this
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (debug)
|
|
System.out.println("Leaving registerValidPorts()");
|
|
}
|
|
|
|
|
|
/*
|
|
* initialize() will be called by the CommPortIdentifier's static
|
|
* initializer. The responsibility of this method is:
|
|
* 1) Ensure that that the hardware is present.
|
|
* 2) Load any required native libraries.
|
|
* 3) Register the port names with the CommPortIdentifier.
|
|
*
|
|
* <p>From the NullDriver.java CommAPI sample.
|
|
*
|
|
* added printerport stuff
|
|
* Holger Lehmann
|
|
* July 12, 1999
|
|
* IBM
|
|
|
|
* Added ttyM for Moxa boards
|
|
* Removed obsolete device cuaa
|
|
* Peter Bennett
|
|
* January 02, 2000
|
|
* Bencom
|
|
|
|
*/
|
|
|
|
/**
|
|
* Determine the OS and where the OS has the devices located
|
|
*/
|
|
public void initialize()
|
|
{
|
|
|
|
if (debug) System.out.println("RXTXCommDriver:initialize()");
|
|
|
|
osName=System.getProperty("os.name");
|
|
deviceDirectory=getDeviceDirectory();
|
|
|
|
/*
|
|
First try to register ports specified in the properties
|
|
file. If that doesn't exist, then scan for ports.
|
|
*/
|
|
for (int PortType=CommPortIdentifier.PORT_SERIAL;PortType<=CommPortIdentifier.PORT_PARALLEL;PortType++) {
|
|
if (!registerSpecifiedPorts(PortType)) {
|
|
if (!registerKnownPorts(PortType)) {
|
|
registerScannedPorts(PortType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void addSpecifiedPorts(String names, int PortType)
|
|
{
|
|
final String pathSep = System.getProperty("path.separator", ":");
|
|
final StringTokenizer tok = new StringTokenizer(names, pathSep);
|
|
|
|
if (debug)
|
|
System.out.println("\nRXTXCommDriver:addSpecifiedPorts()");
|
|
while (tok.hasMoreElements())
|
|
{
|
|
String PortName = tok.nextToken();
|
|
|
|
if (testRead(PortName, PortType))
|
|
CommPortIdentifier.addPortName(PortName,
|
|
PortType, this);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Register ports specified in the file "gnu.io.rxtx.properties"
|
|
* Key system properties:
|
|
* gnu.io.rxtx.SerialPorts
|
|
* gnu.io.rxtx.ParallelPorts
|
|
*
|
|
* Tested only with sun jdk1.3
|
|
* The file gnu.io.rxtx.properties must reside in the java extension dir
|
|
*
|
|
* Example: /usr/local/java/jre/lib/ext/gnu.io.rxtx.properties
|
|
*
|
|
* The file contains the following key properties:
|
|
*
|
|
* gnu.io.rxtx.SerialPorts=/dev/ttyS0:/dev/ttyS1:
|
|
* gnu.io.rxtx.ParallelPorts=/dev/lp0:
|
|
*
|
|
*/
|
|
private boolean registerSpecifiedPorts(int PortType)
|
|
{
|
|
String val = null;
|
|
|
|
try
|
|
{
|
|
|
|
String ext_dir=System.getProperty("java.ext.dirs")+System.getProperty("file.separator");
|
|
FileInputStream rxtx_prop=new FileInputStream(ext_dir+"gnu.io.rxtx.properties");
|
|
Properties p=new Properties(System.getProperties());
|
|
p.load(rxtx_prop);
|
|
System.setProperties(p);
|
|
}catch(Exception e){
|
|
if (debug){
|
|
System.out.println("The file: gnu.io.rxtx.properties doesn't exists.");
|
|
System.out.println(e.toString());
|
|
}//end if
|
|
}//end catch
|
|
|
|
if (debug)
|
|
System.out.println("checking for system-known ports of type "+PortType);
|
|
if (debug)
|
|
System.out.println("checking registry for ports of type "+PortType);
|
|
|
|
switch (PortType) {
|
|
case CommPortIdentifier.PORT_SERIAL:
|
|
if ((val = System.getProperty("gnu.io.rxtx.SerialPorts")) == null)
|
|
val = System.getProperty("gnu.io.SerialPorts");
|
|
break;
|
|
|
|
case CommPortIdentifier.PORT_PARALLEL:
|
|
if ((val = System.getProperty("gnu.io.rxtx.ParallelPorts")) == null)
|
|
val = System.getProperty("gnu.io.ParallelPorts");
|
|
break;
|
|
default:
|
|
if (debug)
|
|
System.out.println("unknown port type "+PortType+" passed to RXTXCommDriver.registerSpecifiedPorts()");
|
|
}
|
|
|
|
if (val != null) {
|
|
addSpecifiedPorts(val, PortType);
|
|
return true;
|
|
} else return false;
|
|
}
|
|
|
|
/*
|
|
* Look for all entries in deviceDirectory, and if they look like they should
|
|
* be serial ports on this OS and they can be opened then register
|
|
* them.
|
|
*
|
|
*/
|
|
private void registerScannedPorts(int PortType)
|
|
{
|
|
String[] CandidateDeviceNames;
|
|
if (debug)
|
|
System.out.println("scanning device directory "+deviceDirectory+" for ports of type "+PortType);
|
|
if(osName.equals("Windows CE"))
|
|
{
|
|
String[] temp =
|
|
{ "COM1:", "COM2:","COM3:","COM4:",
|
|
"COM5:", "COM6:", "COM7:", "COM8:" };
|
|
CandidateDeviceNames=temp;
|
|
}
|
|
else if(osName.toLowerCase().indexOf("windows") != -1 )
|
|
{
|
|
/*
|
|
{ "COM1:", "COM2:","COM3:","COM4:",
|
|
"COM5:", "COM6:", "COM7:", "COM8:" };
|
|
*/
|
|
/* //./name is supposed to work for port numbers > 8 */
|
|
/*
|
|
{ "//./COM1", "//./COM2", "//./COM3",
|
|
"//./COM4", "//./COM5", "//./COM6",
|
|
"//./COM7", "//./COM8" };
|
|
*/
|
|
String[] temp =
|
|
{
|
|
"COM1", "COM2", "COM3",
|
|
"COM4", "COM5", "COM6",
|
|
"COM7", "COM8",
|
|
/*
|
|
OK, you asked for it The thread gods will
|
|
not like this.
|
|
*/
|
|
"COM9", "COM10", "COM11",
|
|
"COM12", "COM13", "COM14",
|
|
"COM15", "COM16",
|
|
/*
|
|
Lets toss in LPT too!
|
|
*/
|
|
"LPT1", "LPT2", "LPT3"
|
|
};
|
|
/*
|
|
{ "COM1", "COM2","COM3","COM4",
|
|
"COM5", "COM6", "COM7", "COM8" };
|
|
*/
|
|
CandidateDeviceNames=temp;
|
|
}
|
|
else if ( osName.equals("Solaris") || osName.equals("SunOS"))
|
|
{
|
|
/* Solaris uses a few different ways to identify ports.
|
|
They could be /dev/term/a /dev/term0 /dev/cua/a /dev/cuaa
|
|
the /dev/???/a appears to be on more systems.
|
|
|
|
The uucp lock files should not cause problems.
|
|
*/
|
|
/*
|
|
File dev = new File( "/dev/term" );
|
|
String deva[] = dev.list();
|
|
dev = new File( "/dev/cua" );
|
|
String devb[] = dev.list();
|
|
String[] temp = new String[ deva.length + devb.length ];
|
|
for(int j =0;j<deva.length;j++)
|
|
deva[j] = "term/" + deva[j];
|
|
for(int j =0;j<devb.length;j++)
|
|
devb[j] = "cua/" + devb[j];
|
|
System.arraycopy( deva, 0, temp, 0, deva.length );
|
|
System.arraycopy( devb, 0, temp,
|
|
deva.length, devb.length );
|
|
if( debug ) {
|
|
for( int j = 0; j< temp.length;j++)
|
|
System.out.println( temp[j] );
|
|
}
|
|
CandidateDeviceNames=temp;
|
|
*/
|
|
|
|
/*
|
|
|
|
ok.. Look the the dirctories representing the port
|
|
kernel driver interface.
|
|
|
|
If there are entries there are possibly ports we can
|
|
use and need to enumerate.
|
|
*/
|
|
|
|
String term[] = new String[2];
|
|
int l = 0;
|
|
File dev = null;
|
|
|
|
dev = new File( "/dev/term" );
|
|
if( dev.list().length > 0 );
|
|
term[l++] = new String( "term/" );
|
|
/*
|
|
dev = new File( "/dev/cua0" );
|
|
if( dev.list().length > 0 );
|
|
term[l++] = new String( "cua/" );
|
|
*/
|
|
String[] temp = new String[l];
|
|
for(l--;l >= 0;l--)
|
|
temp[l] = term[l];
|
|
CandidateDeviceNames=temp;
|
|
}
|
|
else
|
|
{
|
|
File dev = new File( deviceDirectory );
|
|
String[] temp = dev.list();
|
|
CandidateDeviceNames=temp;
|
|
}
|
|
if (CandidateDeviceNames==null)
|
|
{
|
|
if (debug)
|
|
System.out.println("RXTXCommDriver:registerScannedPorts() no Device files to check ");
|
|
return;
|
|
}
|
|
|
|
String CandidatePortPrefixes[] = {};
|
|
switch (PortType) {
|
|
case CommPortIdentifier.PORT_SERIAL:
|
|
if (debug)
|
|
System.out.println("scanning for serial ports for os "+osName);
|
|
if(osName.equals("Linux"))
|
|
{
|
|
String[] Temp = {
|
|
"ttyS", // linux Serial Ports
|
|
"ttySA" // for the IPAQs
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.equals("Linux-all-ports"))
|
|
{
|
|
/* if you want to enumerate all ports ~5000
|
|
possible, then replace the above with this
|
|
*/
|
|
String[] Temp = {
|
|
"comx", // linux COMMX synchronous serial card
|
|
"holter", // custom card for heart monitoring
|
|
"modem", // linux symbolic link to modem.
|
|
"ttyircomm", // linux IrCommdevices (IrDA serial emu)
|
|
"ttycosa0c", // linux COSA/SRP synchronous serial card
|
|
"ttycosa1c", // linux COSA/SRP synchronous serial card
|
|
"ttyC", // linux cyclades cards
|
|
"ttyCH",// linux Chase Research AT/PCI-Fast serial card
|
|
"ttyD", // linux Digiboard serial card
|
|
"ttyE", // linux Stallion serial card
|
|
"ttyF", // linux Computone IntelliPort serial card
|
|
"ttyH", // linux Chase serial card
|
|
"ttyI", // linux virtual modems
|
|
"ttyL", // linux SDL RISCom serial card
|
|
"ttyM", // linux PAM Software's multimodem boards
|
|
// linux ISI serial card
|
|
"ttyMX",// linux Moxa Smart IO cards
|
|
"ttyP", // linux Hayes ESP serial card
|
|
"ttyR", // linux comtrol cards
|
|
// linux Specialix RIO serial card
|
|
"ttyS", // linux Serial Ports
|
|
"ttySI",// linux SmartIO serial card
|
|
"ttySR",// linux Specialix RIO serial card 257+
|
|
"ttyT", // linux Technology Concepts serial card
|
|
"ttyUSB",//linux USB serial converters
|
|
"ttyV", // linux Comtrol VS-1000 serial controller
|
|
"ttyW", // linux specialix cards
|
|
"ttyX" // linux SpecialX serial card
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.toLowerCase().indexOf("qnx") != -1 )
|
|
{
|
|
String[] Temp = {
|
|
"ser"
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.equals("Irix"))
|
|
{
|
|
String[] Temp = {
|
|
"ttyc", // irix raw character devices
|
|
"ttyd", // irix basic serial ports
|
|
"ttyf", // irix serial ports with hardware flow
|
|
"ttym", // irix modems
|
|
"ttyq", // irix pseudo ttys
|
|
"tty4d",// irix RS422
|
|
"tty4f",// irix RS422 with HSKo/HSki
|
|
"midi", // irix serial midi
|
|
"us" // irix mapped interface
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.equals("FreeBSD")) //FIXME this is probably wrong
|
|
{
|
|
String[] Temp = {
|
|
"ttyd", //general purpose serial ports
|
|
"cuaa", //dialout serial ports
|
|
"ttyA", //Specialix SI/XIO dialin ports
|
|
"cuaA", //Specialix SI/XIO dialout ports
|
|
"ttyD", //Digiboard - 16 dialin ports
|
|
"cuaD", //Digiboard - 16 dialout ports
|
|
"ttyE", //Stallion EasyIO (stl) dialin ports
|
|
"cuaE", //Stallion EasyIO (stl) dialout ports
|
|
"ttyF", //Stallion Brumby (stli) dialin ports
|
|
"cuaF", //Stallion Brumby (stli) dialout ports
|
|
"ttyR", //Rocketport dialin ports
|
|
"cuaR", //Rocketport dialout ports
|
|
"stl" //Stallion EasyIO board or Brumby N
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.equals("NetBSD")) // FIXME this is probably wrong
|
|
{
|
|
String[] Temp = {
|
|
"tty0" // netbsd serial ports
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if ( osName.equals("Solaris")
|
|
|| osName.equals("SunOS"))
|
|
{
|
|
String[] Temp = {
|
|
"term/",
|
|
"cua/"
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.equals("HP-UX"))
|
|
{
|
|
String[] Temp = {
|
|
"tty0p",// HP-UX serial ports
|
|
"tty1p" // HP-UX serial ports
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
|
|
else if(osName.equals("UnixWare") ||
|
|
osName.equals("OpenUNIX"))
|
|
{
|
|
String[] Temp = {
|
|
"tty00s", // UW7/OU8 serial ports
|
|
"tty01s",
|
|
"tty02s",
|
|
"tty03s"
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
|
|
else if (osName.equals("OpenServer"))
|
|
{
|
|
String[] Temp = {
|
|
"tty1A", // OSR5 serial ports
|
|
"tty2A",
|
|
"tty3A",
|
|
"tty4A",
|
|
"tty5A",
|
|
"tty6A",
|
|
"tty7A",
|
|
"tty8A",
|
|
"tty9A",
|
|
"tty10A",
|
|
"tty11A",
|
|
"tty12A",
|
|
"tty13A",
|
|
"tty14A",
|
|
"tty15A",
|
|
"tty16A",
|
|
"ttyu1A", // OSR5 USB-serial ports
|
|
"ttyu2A",
|
|
"ttyu3A",
|
|
"ttyu4A",
|
|
"ttyu5A",
|
|
"ttyu6A",
|
|
"ttyu7A",
|
|
"ttyu8A",
|
|
"ttyu9A",
|
|
"ttyu10A",
|
|
"ttyu11A",
|
|
"ttyu12A",
|
|
"ttyu13A",
|
|
"ttyu14A",
|
|
"ttyu15A",
|
|
"ttyu16A"
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if (osName.equals("Compaq's Digital UNIX") || osName.equals("OSF1"))
|
|
{
|
|
String[] Temp = {
|
|
"tty0" // Digital Unix serial ports
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
|
|
else if(osName.equals("BeOS"))
|
|
{
|
|
String[] Temp = {
|
|
"serial" // BeOS serial ports
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.equals("Mac OS X"))
|
|
{
|
|
String[] Temp = {
|
|
// Keyspan USA-28X adapter, USB port 1
|
|
"cu.KeyUSA28X191.",
|
|
// Keyspan USA-28X adapter, USB port 1
|
|
"tty.KeyUSA28X191.",
|
|
// Keyspan USA-28X adapter, USB port 2
|
|
"cu.KeyUSA28X181.",
|
|
// Keyspan USA-28X adapter, USB port 2
|
|
"tty.KeyUSA28X181.",
|
|
// Keyspan USA-19 adapter
|
|
"cu.KeyUSA19181.",
|
|
// Keyspan USA-19 adapter
|
|
"tty.KeyUSA19181."
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else if(osName.toLowerCase().indexOf("windows") != -1 )
|
|
{
|
|
String[] Temp = {
|
|
"COM" // win32 serial ports
|
|
//"//./COM" // win32 serial ports
|
|
};
|
|
CandidatePortPrefixes=Temp;
|
|
}
|
|
else
|
|
{
|
|
if (debug)
|
|
System.out.println("No valid prefixes for serial ports have been entered for "+osName + " in RXTXCommDriver.java. This may just be a typo in the method registerScanPorts().");
|
|
}
|
|
break;
|
|
|
|
case CommPortIdentifier.PORT_PARALLEL:
|
|
if (debug)
|
|
System.out.println("scanning for parallel ports for os "+osName);
|
|
/** Get the Parallel port prefixes for the running os
|
|
* Holger Lehmann
|
|
* July 12, 1999
|
|
* IBM
|
|
*/
|
|
if(osName.equals("Linux")
|
|
/*
|
|
|| osName.equals("NetBSD") FIXME
|
|
|| osName.equals("HP-UX") FIXME
|
|
|| osName.equals("Irix") FIXME
|
|
|| osName.equals("BeOS") FIXME
|
|
|| osName.equals("Compaq's Digital UNIX") FIXME
|
|
*/
|
|
)
|
|
{
|
|
String[] temp={
|
|
"lp" // linux printer port
|
|
};
|
|
CandidatePortPrefixes=temp;
|
|
}
|
|
else if(osName.equals("FreeBSD"))
|
|
{
|
|
String[] temp={
|
|
"lpt"
|
|
};
|
|
CandidatePortPrefixes=temp;
|
|
}
|
|
else if(osName.toLowerCase().indexOf("windows") != -1 )
|
|
{
|
|
String[] temp={
|
|
"LPT"
|
|
};
|
|
CandidatePortPrefixes=temp;
|
|
}
|
|
else /* printer support is green */
|
|
{
|
|
String [] temp={};
|
|
CandidatePortPrefixes=temp;
|
|
}
|
|
break;
|
|
default:
|
|
if (debug)
|
|
System.out.println("Unknown PortType "+PortType+" passed to RXTXCommDriver.registerScannedPorts()");
|
|
}
|
|
registerValidPorts(CandidateDeviceNames, CandidatePortPrefixes, PortType);
|
|
}
|
|
|
|
|
|
/*
|
|
* <p>From the NullDriver.java CommAPI sample.
|
|
*/
|
|
/**
|
|
* @param PortName The name of the port the OS recognizes
|
|
* @param PortType CommPortIdentifier.PORT_SERIAL or PORT_PARALLEL
|
|
* @returns CommPort
|
|
* getCommPort() will be called by CommPortIdentifier from its
|
|
* openPort() method. PortName is a string that was registered earlier
|
|
* using the CommPortIdentifier.addPortName() method. getCommPort()
|
|
* returns an object that extends either SerialPort or ParallelPort.
|
|
*/
|
|
public CommPort getCommPort( String PortName, int PortType )
|
|
{
|
|
if (debug) System.out.println("RXTXCommDriver:getCommPort("
|
|
+PortName+","+PortType+")");
|
|
try {
|
|
switch (PortType) {
|
|
case CommPortIdentifier.PORT_SERIAL:
|
|
if(osName.toLowerCase().indexOf("windows") == -1 )
|
|
{
|
|
|
|
return new RXTXPort( PortName );
|
|
}
|
|
else
|
|
{
|
|
return new RXTXPort( deviceDirectory + PortName );
|
|
}
|
|
case CommPortIdentifier.PORT_PARALLEL:
|
|
//return new LPRPort( PortName );
|
|
default:
|
|
if (debug)
|
|
System.out.println("unknown PortType "+PortType+" passed to RXTXCommDriver.getCommPort()");
|
|
}
|
|
} catch( PortInUseException e ) {
|
|
if (debug)
|
|
System.out.println(
|
|
"Port "+PortName+" in use by another application");
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/* Yikes. Trying to call println from C for odd reasons */
|
|
public void Report( String arg )
|
|
{
|
|
System.out.println(arg);
|
|
}
|
|
}
|