diff --git a/src/java/jssc/SerialPortList.java b/src/java/jssc/SerialPortList.java index 74a256f..3297531 100644 --- a/src/java/jssc/SerialPortList.java +++ b/src/java/jssc/SerialPortList.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.TreeSet; +import java.util.regex.Pattern; /** * @@ -40,9 +41,33 @@ import java.util.TreeSet; public class SerialPortList { private static SerialNativeInterface serialInterface; + private static final Pattern PORTNAMES_REGEXP; + private static final String PORTNAMES_PATH; static { serialInterface = new SerialNativeInterface(); + switch (SerialNativeInterface.getOsType()) { + case SerialNativeInterface.OS_LINUX: { + PORTNAMES_REGEXP = Pattern.compile("(ttyS|ttyUSB|ttyACM|ttyAMA)[0-9]{1,3}"); + PORTNAMES_PATH = "/dev/"; + break; + } + case SerialNativeInterface.OS_SOLARIS: { + PORTNAMES_REGEXP = Pattern.compile("[0-9]*|[a-z]*"); + PORTNAMES_PATH = "/dev/term/"; + break; + } + case SerialNativeInterface.OS_MAC_OS_X: { + PORTNAMES_REGEXP = Pattern.compile("tty.(serial|usbserial|usbmodem).*"); + PORTNAMES_PATH = "/dev/"; + break; + } + default: { + PORTNAMES_REGEXP = null; + PORTNAMES_PATH = null; + break; + } + } } //since 2.1.0 -> Fully rewrited port name comparator @@ -138,7 +163,12 @@ public class SerialPortList { * with zero length will be returned (since jSSC-0.8 in previous versions null will be returned) */ public static String[] getPortNames() { - if(SerialNativeInterface.getOsType() == SerialNativeInterface.OS_LINUX){ + //since 2.1.0 -> + if(PORTNAMES_PATH != null){ + return getUnixBasedPortNames(); + } + //<- since 2.1.0 + /*if(SerialNativeInterface.getOsType() == SerialNativeInterface.OS_LINUX){ return getLinuxPortNames(); } else if(SerialNativeInterface.getOsType() == SerialNativeInterface.OS_SOLARIS){//since 0.9.0 -> @@ -146,7 +176,7 @@ public class SerialPortList { } else if(SerialNativeInterface.getOsType() == SerialNativeInterface.OS_MAC_OS_X){ return getMacOSXPortNames(); - }//<-since 0.9.0 + }//<-since 0.9.0*/ String[] portNames = serialInterface.getSerialPortNames(); if(portNames == null){ return new String[]{}; @@ -156,6 +186,44 @@ public class SerialPortList { return ports.toArray(new String[ports.size()]); } + /** + * Universal method for getting port names of _nix based systems + * + * @return + */ + private static String[] getUnixBasedPortNames() { + String[] returnArray = new String[]{}; + File dir = new File(PORTNAMES_PATH); + if(dir.exists() && dir.isDirectory()){ + File[] files = dir.listFiles(); + if(files.length > 0){ + TreeSet portsTree = new TreeSet(comparator); + for(File file : files){ + String fileName = file.getName(); + if(!file.isDirectory() && !file.isFile() && PORTNAMES_REGEXP.matcher(fileName).find()){ + String portName = PORTNAMES_PATH + fileName; + if(SerialNativeInterface.getOsType() == SerialNativeInterface.OS_LINUX){ + SerialPort serialPort = new SerialPort(portName); + try { + serialPort.openPort(); + } + catch (SerialPortException ex) { + if(!ex.getExceptionType().equals(SerialPortException.TYPE_PORT_BUSY)){ + continue; + } + } + } + portsTree.add(portName); + } + } + returnArray = portsTree.toArray(returnArray); + } + } + return returnArray; + } + + + /** * Get serial port names in Linux OS (This method was completely rewrited in 0.8-tb4) *