diff --git a/src/main/java/info/istlab/IoTP/Launcher.java b/src/main/java/info/istlab/IoTP/Launcher.java index a643438..4429010 100644 --- a/src/main/java/info/istlab/IoTP/Launcher.java +++ b/src/main/java/info/istlab/IoTP/Launcher.java @@ -2,6 +2,7 @@ import java.awt.BorderLayout; import java.awt.Desktop; +import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; @@ -13,6 +14,7 @@ import java.util.Enumeration; import java.util.Hashtable; +import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; @@ -33,6 +35,7 @@ JTree tree; Hashtable file2editor; SerialChecker serialChecker; + JMenu serialMenu; public static ArrayList allProcs = new ArrayList(); @@ -96,12 +99,8 @@ mi.addActionListener(ae -> System.exit(0)); menu.add(mi); - menu = new JMenu("Serial"); /**************************************************** */ - menuBar.add(menu); - - mi = new JMenuItem("シリアルモニタを開く"); - mi.addActionListener(ae -> SerialWindow.invoke(true)); - menu.add(mi); + serialMenu = new JMenu("Serial"); /**************************************************** */ + menuBar.add(serialMenu); menu = new JMenu("File"); /**************************************************** */ menuBar.add(menu); @@ -158,6 +157,45 @@ } + void updateSerialMenu(ArrayList validSerialNames){ + serialMenu.removeAll(); + JMenuItem mi = new JMenuItem("シリアルモニタを開く"); + mi.addActionListener(ae -> SerialWindow.invoke(true)); + serialMenu.add(mi); + + if (validSerialNames.size()>0){ + serialMenu.addSeparator(); + } + // App.serialName があるかチェック。なければ nullにする。 + boolean hasCurrent = false; // 以前の設定があるので、変更しない + if (validSerialNames.size()==0){ + App.serialName = null; + } else if (validSerialNames.size()==1){ + App.serialName = validSerialNames.get(0); + } else { + String currentName = App.serialName; + for(String s: validSerialNames){ + if (s.equals(currentName)) hasCurrent = true; + } + if (!hasCurrent) App.serialName = validSerialNames.get(0);//以前のSerialがなくなってたら、最初(0)に再設定する + } + + for(String s: validSerialNames){ + JCheckBoxMenuItem jcbmi = new JCheckBoxMenuItem(s); + serialMenu.add(jcbmi); + if (s.equals(App.serialName)){ + jcbmi.setSelected(true); + jcbmi.setEnabled(false); + } else { + jcbmi.addActionListener(e -> chooseSerial(e)); + } + } + } + void chooseSerial(ActionEvent e){ + App.serialName = e.getActionCommand(); + updateSerialMenu(serialChecker.validSerialNames); + } + public void renameOrDeleteNWPFolder() { int res = JOptionPane.showConfirmDialog(this, "NWPフォルダを削除するなら「いいえ」、『NWP_日付_時刻』にフォルダ名を変更するなら「はい」を押してください。"); if (res == JOptionPane.YES_OPTION) { diff --git a/src/main/java/info/istlab/IoTP/SerialChecker.java b/src/main/java/info/istlab/IoTP/SerialChecker.java index 2083d0e..03edeb8 100644 --- a/src/main/java/info/istlab/IoTP/SerialChecker.java +++ b/src/main/java/info/istlab/IoTP/SerialChecker.java @@ -1,5 +1,7 @@ package info.istlab.IoTP; +import java.util.ArrayList; + import com.fazecast.jSerialComm.SerialPort; public class SerialChecker implements Runnable { @@ -8,9 +10,13 @@ Thread thread; String last_connections; + ArrayList validSerialNames; + public SerialChecker(Launcher _launcher) { launcher = _launcher; last_connections = ""; + + validSerialNames = new ArrayList(); thread = new Thread(this); thread.start(); @@ -24,11 +30,33 @@ } catch (InterruptedException e) { e.printStackTrace(); } - update_menu(); + check_update(); } } - void update_menu() { + void check_update() { + String currentString = getCurrentSerialNames(); + + // check if state changed + if (!last_connections.equals(currentString)) { + System.out.println("Serial state changed"); + System.out.println(currentString); + updateSerialNames(); + launcher.updateTitle(currentString); + launcher.updateSerialMenu(validSerialNames); + + if (last_connections.length() > currentString.length()){ + SerialWindow.closeAll("切断されました"); + } else { + String key = currentString; + if (SerialWindow.hash.get(key)!= null){ + SerialWindow.hash.get(key).reconnect(); + } + } + } + last_connections = currentString; + } + String getCurrentSerialNames(){ SerialPort[] ports = SerialPort.getCommPorts(); StringBuffer sb = new StringBuffer(); for (SerialPort sp : ports) { @@ -37,25 +65,17 @@ sb.append(name+" "); } } - - // check if state changed - if (!last_connections.equals(sb.toString())) { - System.out.println("Serial state changed"); - System.out.println(sb.toString()); - launcher.updateTitle(sb.toString()); - - if (last_connections.length() > sb.length()){ - SerialWindow.closeAll("切断されました"); - } else { - String key = sb.toString().trim(); - if (SerialWindow.hash.get(key)!= null){ - SerialWindow.hash.get(key).reconnect(); - } + return sb.toString().trim(); + } + void updateSerialNames(){ + validSerialNames.clear(); + SerialPort[] ports = SerialPort.getCommPorts(); + for (SerialPort sp : ports) { + String name = sp.getSystemPortName(); + if (name.startsWith("cu.usbserial") || name.startsWith("COM")) { + validSerialNames.add(name); } } - - last_connections = sb.toString(); - } } diff --git a/src/main/java/info/istlab/IoTP/SerialWindow.java b/src/main/java/info/istlab/IoTP/SerialWindow.java index 98f709e..61c73b8 100644 --- a/src/main/java/info/istlab/IoTP/SerialWindow.java +++ b/src/main/java/info/istlab/IoTP/SerialWindow.java @@ -9,6 +9,8 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.ArrayList; @@ -24,7 +26,7 @@ import com.fazecast.jSerialComm.SerialPortDataListener; import com.fazecast.jSerialComm.SerialPortEvent; -public class SerialWindow extends JFrame implements SerialPortDataListener, ActionListener, Runnable, WindowListener { +public class SerialWindow extends JFrame implements SerialPortDataListener, ActionListener, Runnable, WindowListener, KeyListener { SerialPort sp; JTextField jtf; @@ -124,12 +126,15 @@ setSize(500, 400); setLocation(centerOfScreen(getSize())); setVisible(true); - setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); jtf.addActionListener(this); addWindowListener(this); // Xをおしたらserial closeする //フォーカスをあえて外す jta.requestFocus(); + + jtf.addKeyListener(this); + jta.addKeyListener(this); } /** * 再接続 @@ -260,12 +265,14 @@ @Override public void windowClosing(WindowEvent e) { - closeSerialPort(null); + disposeWin(); + // closeSerialPort("シリアルモニタウィンドウを閉じます"); } @Override public void windowClosed(WindowEvent e) { - closeSerialPort(null); + // closeSerialPort("シリアルモニタウィンドウを閉じます"); + disposeWin(); } @Override @@ -288,7 +295,7 @@ for(String key : SerialWindow.hash.keySet()){ SerialWindow swin = SerialWindow.hash.get(key); if (swin != null) { - swin.dispose(); + swin.disposeWin(); } } SerialWindow.hash.clear(); @@ -302,5 +309,27 @@ } } } + public void disposeWin(){ + SerialWindow.hash.remove(this.sp.getSystemPortName()); + dispose(); + } + + @Override + public void keyTyped(KeyEvent e) { + } + + @Override + public void keyPressed(KeyEvent e) { + if (e.isControlDown() || e.isAltDown() || e.isAltGraphDown() || e.isMetaDown()) { + if (e.getKeyCode() == 87) { // W + closeSerialPort("シリアルモニタウィンドウを閉じます"); + disposeWin(); + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + } }