From 7e17b5c3184ab1d1191c5c7eea7f5755578b80b0 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 18 Dec 2015 18:16:38 +0100 Subject: [PATCH] Move vid/pid resolving to cross platform jni lib --- .../serial/SerialBoardsLister.java | 4 +- arduino-core/src/processing/app/Platform.java | 25 ++++++++++--- .../src/processing/app/linux/Platform.java | 26 ------------- .../src/processing/app/macosx/Platform.java | 35 ------------------ .../src/processing/app/windows/Platform.java | 37 ------------------- build/build.xml | 34 +++++++++++++---- build/liblistSerials-1.0.4.zip.sha | 1 + 7 files changed, 50 insertions(+), 112 deletions(-) create mode 100644 build/liblistSerials-1.0.4.zip.sha diff --git a/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java b/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java index c239d9a30..5ca99819b 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java @@ -47,7 +47,7 @@ public class SerialBoardsLister extends TimerTask { } public void start(Timer timer) { - timer.schedule(this, 0, 3000); + timer.schedule(this, 0, 1000); } @Override @@ -75,7 +75,7 @@ public class SerialBoardsLister extends TimerTask { } for (String port : ports) { - Map boardData = platform.resolveDeviceAttachedTo(port, BaseNoGui.packages, devicesListOutput); + Map boardData = platform.resolveDeviceByVendorIdProductId(port, BaseNoGui.packages, devicesListOutput); BoardPort boardPort = new BoardPort(); boardPort.setAddress(port); diff --git a/arduino-core/src/processing/app/Platform.java b/arduino-core/src/processing/app/Platform.java index c6d62c8d7..29e5e733d 100644 --- a/arduino-core/src/processing/app/Platform.java +++ b/arduino-core/src/processing/app/Platform.java @@ -144,15 +144,30 @@ public class Platform { } } - public Map resolveDeviceAttachedTo(String serial, Map packages, String devicesListOutput) { - return null; + static { + loadLib(new File(BaseNoGui.getContentFile("lib"), System.mapLibraryName("listSerialsj"))); + }; + + private static void loadLib(File lib) { + try { + System.load(lib.getAbsolutePath()); + } catch (UnsatisfiedLinkError e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + System.out.println("Cannot load native library " + lib.getAbsolutePath()); + System.out.println("The program has terminated!"); + System.exit(1); + } } + public native String resolveDeviceAttachedToNative(String serial); + public String preListAllCandidateDevices() { return null; } - protected Map resolveDeviceByVendorIdProductId(Map packages, String readVIDPID) { + public Map resolveDeviceByVendorIdProductId(String serial, Map packages, String devicesListOutput) { + String vid_pid_iSerial = resolveDeviceAttachedToNative(serial); for (TargetPackage targetPackage : packages.values()) { for (TargetPlatform targetPlatform : targetPackage.getPlatforms().values()) { for (TargetBoard board : targetPlatform.getBoards().values()) { @@ -161,12 +176,12 @@ public class Platform { List pids = new LinkedList(board.getPreferences().subTree("pid", 1).values()); for (int i = 0; i < vids.size(); i++) { String vidPid = vids.get(i) + "_" + pids.get(i); - if (readVIDPID.contains(vidPid.toUpperCase())) { + if (vid_pid_iSerial.toUpperCase().contains(vidPid.toUpperCase())) { Map boardData = new HashMap(); boardData.put("board", board); boardData.put("vid", vids.get(i)); boardData.put("pid", pids.get(i)); - boardData.put("iserial", readVIDPID.substring(vidPid.length()+1)); + boardData.put("iserial", vid_pid_iSerial.substring(vidPid.length()+1)); return boardData; } } diff --git a/arduino-core/src/processing/app/linux/Platform.java b/arduino-core/src/processing/app/linux/Platform.java index 7a8024f46..f28df3555 100644 --- a/arduino-core/src/processing/app/linux/Platform.java +++ b/arduino-core/src/processing/app/linux/Platform.java @@ -120,30 +120,4 @@ public class Platform extends processing.app.Platform { public String getName() { return PConstants.platformNames[PConstants.LINUX]; } - - @Override - public Map resolveDeviceAttachedTo(String serial, Map packages, String devicesListOutput) { - assert packages != null; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Executor executor = new DefaultExecutor(); - executor.setStreamHandler(new PumpStreamHandler(baos, null)); - - try { - CommandLine toDevicePath = CommandLine.parse("udevadm info -q path -n " + serial); - executor.execute(toDevicePath); - String devicePath = new String(baos.toByteArray()); - baos.reset(); - CommandLine commandLine = CommandLine.parse("udevadm info --query=property -p " + devicePath); - executor.execute(commandLine); - String vidPid = new UDevAdmParser().extractVIDAndPID(new String(baos.toByteArray())); - - if (vidPid == null) { - return super.resolveDeviceAttachedTo(serial, packages, devicesListOutput); - } - - return super.resolveDeviceByVendorIdProductId(packages, vidPid); - } catch (IOException e) { - return super.resolveDeviceAttachedTo(serial, packages, devicesListOutput); - } - } } diff --git a/arduino-core/src/processing/app/macosx/Platform.java b/arduino-core/src/processing/app/macosx/Platform.java index 102291cd4..7c0768823 100644 --- a/arduino-core/src/processing/app/macosx/Platform.java +++ b/arduino-core/src/processing/app/macosx/Platform.java @@ -164,41 +164,6 @@ public class Platform extends processing.app.Platform { return PConstants.platformNames[PConstants.MACOSX]; } - @Override - public Map resolveDeviceAttachedTo(String serial, Map packages, String devicesListOutput) { - assert packages != null; - if (devicesListOutput == null) { - return super.resolveDeviceAttachedTo(serial, packages, null); - } - - try { - String vidPid = new SystemProfilerParser().extractVIDAndPID(devicesListOutput, serial); - - if (vidPid == null) { - return super.resolveDeviceAttachedTo(serial, packages, devicesListOutput); - } - - return super.resolveDeviceByVendorIdProductId(packages, vidPid); - } catch (IOException e) { - return super.resolveDeviceAttachedTo(serial, packages, devicesListOutput); - } - } - - @Override - public String preListAllCandidateDevices() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Executor executor = new DefaultExecutor(); - executor.setStreamHandler(new PumpStreamHandler(baos, null)); - - try { - CommandLine toDevicePath = CommandLine.parse("/usr/sbin/system_profiler SPUSBDataType"); - executor.execute(toDevicePath); - return new String(baos.toByteArray()); - } catch (Throwable e) { - return super.preListAllCandidateDevices(); - } - } - @Override public java.util.List filterPorts(java.util.List ports, boolean showAll) { if (showAll) { diff --git a/arduino-core/src/processing/app/windows/Platform.java b/arduino-core/src/processing/app/windows/Platform.java index c2f7bf710..1783a1760 100644 --- a/arduino-core/src/processing/app/windows/Platform.java +++ b/arduino-core/src/processing/app/windows/Platform.java @@ -183,43 +183,6 @@ public class Platform extends processing.app.Platform { return PConstants.platformNames[PConstants.WINDOWS]; } - @Override - public Map resolveDeviceAttachedTo(String serial, Map packages, String devicesListOutput) { - assert packages != null; - if (devicesListOutput == null) { - return super.resolveDeviceAttachedTo(serial, packages, devicesListOutput); - } - - try { - String vidPid = new ListComPortsParser().extractVIDAndPID(devicesListOutput, serial); - - if (vidPid == null) { - return super.resolveDeviceAttachedTo(serial, packages, devicesListOutput); - } - - return super.resolveDeviceByVendorIdProductId(packages, vidPid); - } catch (IOException e) { - return super.resolveDeviceAttachedTo(serial, packages, devicesListOutput); - } - } - - @Override - public String preListAllCandidateDevices() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Executor executor = new DefaultExecutor(); - executor.setStreamHandler(new PumpStreamHandler(baos, null)); - - try { - String listComPorts = BaseNoGui.getContentFile("hardware/tools/listComPorts.exe").getCanonicalPath(); - - CommandLine toDevicePath = CommandLine.parse(listComPorts); - executor.execute(toDevicePath); - return new String(baos.toByteArray()); - } catch (Throwable e) { - return super.preListAllCandidateDevices(); - } - } - @Override public void fixPrefsFilePermissions(File prefsFile) throws IOException { //noop diff --git a/build/build.xml b/build/build.xml index 9e955d92c..e7d8cf3f2 100644 --- a/build/build.xml +++ b/build/build.xml @@ -393,6 +393,15 @@ + + + + + + + + + @@ -585,6 +594,16 @@ + + + + + + + + + + @@ -845,13 +864,14 @@ - - - - - - - + + + + + + + + diff --git a/build/liblistSerials-1.0.4.zip.sha b/build/liblistSerials-1.0.4.zip.sha new file mode 100644 index 000000000..998f2872e --- /dev/null +++ b/build/liblistSerials-1.0.4.zip.sha @@ -0,0 +1 @@ +4e8ef727d7dc3903c37002f38f8aba87796b787c