diff --git a/src/main/java/info/istlab/IoTP/SerialChecker.java b/src/main/java/info/istlab/IoTP/SerialChecker.java index 64c6b34..95bec76 100644 --- a/src/main/java/info/istlab/IoTP/SerialChecker.java +++ b/src/main/java/info/istlab/IoTP/SerialChecker.java @@ -1,5 +1,8 @@ package info.istlab.IoTP; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Hashtable; @@ -12,6 +15,8 @@ String last_connections; ArrayList validSerialNames; + Hashtable invalidSerialNames; // WindowsではBluetoothシリアルが表示されてしまうので、起動時のみ arduino-cli board list + // の結果をつかって判定する。 Hashtable portHash; public SerialChecker(Launcher _launcher) { @@ -19,12 +24,39 @@ last_connections = ""; validSerialNames = new ArrayList(); + invalidSerialNames = new Hashtable(); + getBoardListForInvalid(); portHash = new Hashtable(); thread = new Thread(this); thread.start(); } + private void getBoardListForInvalid() { + ProcessBuilder processBuilder = new ProcessBuilder("arduino-cli", "board", "list"); + Process process; + ArrayList out = new ArrayList(); + try { + process = processBuilder.start(); + + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + if (line.indexOf("(USB)") == -1) + out.add(line); + } + process.waitFor(); + } catch (IOException | InterruptedException e1) { + e1.printStackTrace(); + } + for (String s : out) { + String[] a = s.split(" "); + if (a[0].indexOf("シリアル") == -1){ + invalidSerialNames.put(a[0], a[0]); // (USB)ではないものをすべて登録 valはべつにa[0]じゃなくてもよい。 + } + } + } + @Override public void run() { while (thread != null) { @@ -48,39 +80,44 @@ launcher.updateTitle(currentString); launcher.updateSerialMenu(validSerialNames); - if (last_connections.length() > currentString.length()){ - //どれが減ったか調べて、なくなったものを切断する + if (last_connections.length() > currentString.length()) { + // どれが減ったか調べて、なくなったものを切断する String sep[] = last_connections.split(" "); - Hashtable currentHash = new Hashtable(); - for(String t: validSerialNames) currentHash.put(t,t); - for(String s: sep){ //過去の接続リスト - if (currentHash.get(s) == null){ + Hashtable currentHash = new Hashtable(); + for (String t : validSerialNames) + currentHash.put(t, t); + for (String s : sep) { // 過去の接続リスト + if (currentHash.get(s) == null) { SerialWindow deadWin = SerialWindow.hash.get(s); - if (deadWin != null) deadWin.disposeWin(); + if (deadWin != null) + deadWin.disposeWin(); } } // SerialWindow.closeAll("切断されました"); } else { String key = currentString; - if (SerialWindow.hash.get(key)!= null){ + if (SerialWindow.hash.get(key) != null) { SerialWindow.hash.get(key).reconnect(); } } } last_connections = currentString; } - String getCurrentSerialNames(){ + + String getCurrentSerialNames() { SerialPort[] ports = SerialPort.getCommPorts(); StringBuffer sb = new StringBuffer(); for (SerialPort sp : ports) { String name = sp.getSystemPortName(); if (name.startsWith("cu.usbserial") || name.startsWith("COM")) { - sb.append(name+" "); + if (invalidSerialNames.containsKey(name)) continue; + sb.append(name + " "); } } return sb.toString().trim(); } - void updateSerialNames(){ + + void updateSerialNames() { validSerialNames.clear(); portHash.clear(); SerialPort[] ports = SerialPort.getCommPorts();