
gnu.io.RXTXCommDriver Maven / Gradle / Ivy
/*-------------------------------------------------------------------------
| RXTX License v 2.1 - LGPL v 2.1 + Linking Over Controlled Interface.
| RXTX is a native interface to serial ports in java.
| Copyright 1998 Kevin Hester, [email protected]
| Copyright 2000-2008 Trent Jarvi [email protected] and others who
| actually wrote it. See individual source files for more information.
|
| A copy of the LGPL v 2.1 may be found at
| http://www.gnu.org/licenses/lgpl.txt on March 4th 2007. A copy is
| here for your convenience.
|
| This library is free software; you can redistribute it and/or
| modify it under the terms of the GNU Lesser General Public
| License as published by the Free Software Foundation; either
| version 2.1 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
| Lesser General Public License for more details.
|
| An executable that contains no derivative of any portion of RXTX, but
| is designed to work with RXTX by being dynamically linked with it,
| is considered a "work that uses the Library" subject to the terms and
| conditions of the GNU Lesser General Public License.
|
| The following has been added to the RXTX License to remove
| any confusion about linking to RXTX. We want to allow in part what
| section 5, paragraph 2 of the LGPL does not permit in the special
| case of linking over a controlled interface. The intent is to add a
| Java Specification Request or standards body defined interface in the
| future as another exception but one is not currently available.
|
| http://www.fsf.org/licenses/gpl-faq.html#LinkingOverControlledInterface
|
| As a special exception, the copyright holders of RXTX give you
| permission to link RXTX with independent modules that communicate with
| RXTX solely through the Sun Microsytems CommAPI interface version 2,
| regardless of the license terms of these independent modules, and to copy
| and distribute the resulting combined work under terms of your choice,
| provided that every copy of the combined work is accompanied by a complete
| copy of the source code of RXTX (the version of RXTX used to produce the
| combined work), being distributed under the terms of the GNU Lesser General
| Public License plus this exception. An independent module is a
| module which is not derived from or based on RXTX.
|
| Note that people who make modified versions of RXTX are not obligated
| to grant this special exception for their modified versions; it is
| their choice whether to do so. The GNU Lesser General Public License
| gives permission to release a modified version without this exception; this
| exception also makes it possible to release a modified version which
| carries forward this exception.
|
| You should have received a copy of the GNU Lesser 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
| All trademarks belong to their respective owners.
--------------------------------------------------------------------------*/
/* Martin Pool added support for explicitly-specified
* lists of ports, October 2000. */
/* Joseph Goldstone reorganized to support registered ports,
* known ports, and scanned ports, July 2001 */
package gnu.io;
import java.lang.*;
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 = false;
private final static boolean noVersionOutput = "true".equals(System.getProperty("gnu.io.rxtx.NoVersionOutput"));
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;
try {
LibVersion = RXTXVersion.nativeGetVersion();
} catch (Error UnsatisfiedLinkError) {
// for rxtx prior to 2.1.7
LibVersion = nativeGetVersion();
}
if (devel) {
if (!noVersionOutput) {
System.out.println("Stable Library");
System.out.println("=========================================");
System.out.println("Native lib Version = " + LibVersion);
System.out.println("Java lib Version = " + JarVersion);
}
}
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 native boolean registerKnownPorts(int PortType);
private native boolean isPortPrefixValid(String dev);
private native boolean testRead(String dev, int type);
private native String getDeviceDirectory();
// for rxtx prior to 2.1.7
public static native String nativeGetVersion();
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++] = 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;jFrom 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;
Properties origp = System.getProperties();//save system properties
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();
p.load(rxtx_prop);
System.setProperties(p);
for (Iterator
© 2015 - 2025 Weber Informatics LLC | Privacy Policy