diff --git a/pom.xml b/pom.xml index f592f5b..c57e4f5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ info.istlab.IoTP IoTP jar - 0.33 + 0.34 IoTP http://maven.apache.org diff --git a/src/main/java/info/istlab/IoTP/Launcher.java b/src/main/java/info/istlab/IoTP/Launcher.java index 4429010..09dcfaf 100644 --- a/src/main/java/info/istlab/IoTP/Launcher.java +++ b/src/main/java/info/istlab/IoTP/Launcher.java @@ -28,7 +28,7 @@ public class Launcher extends JFrame implements MouseInputListener, KeyListener, Runnable { public static Launcher theapp; - public static String version = "0.33"; + public static String version = "0.34"; static int reboot_msec = 2000; // JPanel mainP; File root; diff --git a/src/main/java/info/istlab/IoTP/MqttWindow.java b/src/main/java/info/istlab/IoTP/MqttWindow.java index 44d871a..cea5fe6 100644 --- a/src/main/java/info/istlab/IoTP/MqttWindow.java +++ b/src/main/java/info/istlab/IoTP/MqttWindow.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; @@ -27,7 +29,7 @@ import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; -public class MqttWindow extends JFrame implements ActionListener, WindowListener, MqttCallback, Runnable { +public class MqttWindow extends JFrame implements ActionListener, WindowListener, MqttCallback, Runnable, KeyListener { static MqttWindow theMqttWindow; JTextField jtf; JTextArea jta; @@ -119,6 +121,7 @@ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); jtf.addActionListener(this); addWindowListener(this); // Xをおしたらserial closeする + addKeyListener(this); // フォーカスをあえて外す // jta.requestFocus(); @@ -319,4 +322,23 @@ throw new UnsupportedOperationException("Unimplemented method 'deliveryComplete'"); } + + @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 + closeWin(); + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + } + + } diff --git a/src/main/java/info/istlab/IoTP/SerialChecker.java b/src/main/java/info/istlab/IoTP/SerialChecker.java index 03edeb8..fd663fd 100644 --- a/src/main/java/info/istlab/IoTP/SerialChecker.java +++ b/src/main/java/info/istlab/IoTP/SerialChecker.java @@ -1,6 +1,7 @@ package info.istlab.IoTP; import java.util.ArrayList; +import java.util.Hashtable; import com.fazecast.jSerialComm.SerialPort; @@ -11,12 +12,14 @@ String last_connections; ArrayList validSerialNames; + Hashtable portHash; public SerialChecker(Launcher _launcher) { launcher = _launcher; last_connections = ""; validSerialNames = new ArrayList(); + portHash = new Hashtable(); thread = new Thread(this); thread.start(); @@ -69,11 +72,13 @@ } void updateSerialNames(){ validSerialNames.clear(); + portHash.clear(); SerialPort[] ports = SerialPort.getCommPorts(); for (SerialPort sp : ports) { String name = sp.getSystemPortName(); if (name.startsWith("cu.usbserial") || name.startsWith("COM")) { validSerialNames.add(name); + portHash.put(name, sp); } } } diff --git a/src/main/java/info/istlab/IoTP/SerialWindow.java b/src/main/java/info/istlab/IoTP/SerialWindow.java index 61c73b8..5c3e796 100644 --- a/src/main/java/info/istlab/IoTP/SerialWindow.java +++ b/src/main/java/info/istlab/IoTP/SerialWindow.java @@ -26,22 +26,23 @@ import com.fazecast.jSerialComm.SerialPortDataListener; import com.fazecast.jSerialComm.SerialPortEvent; -public class SerialWindow extends JFrame implements SerialPortDataListener, ActionListener, Runnable, WindowListener, KeyListener { +public class SerialWindow extends JFrame + implements SerialPortDataListener, ActionListener, Runnable, WindowListener, KeyListener { SerialPort sp; JTextField jtf; JTextArea jta; Thread thread; - + public static Hashtable hash; static { - hash = new Hashtable(); + hash = new Hashtable(); } /** * チェックして、App.serialName にポート名をセットするだけ。 */ - public static void check(boolean popup_if_zero){ + public static void check(boolean popup_if_zero) { SerialPort[] ports = SerialPort.getCommPorts(); ArrayList splist_valid = new ArrayList(); for (SerialPort sp : ports) { @@ -50,14 +51,15 @@ splist_valid.add(sp); } } - if (splist_valid.size()==1){ + if (splist_valid.size() == 1) { SerialPort sp = splist_valid.get(0); App.serialName = sp.getSystemPortName(); - - } else if (splist_valid.size()==0){ - if (popup_if_zero) JOptionPane.showMessageDialog(Launcher.theapp, "No available serial ports."); + + } else if (splist_valid.size() == 0) { + if (popup_if_zero) + JOptionPane.showMessageDialog(Launcher.theapp, "No available serial ports."); } else { - SerialSelector.show(splist_valid.toArray(new SerialPort[]{})); + if (App.serialName == null) SerialSelector.show(splist_valid.toArray(new SerialPort[] {})); } } @@ -70,28 +72,30 @@ splist_valid.add(sp); } } - if (splist_valid.size()==1){ + if (splist_valid.size() == 1) { SerialPort sp = splist_valid.get(0); new SerialWindow(sp); - } else if (splist_valid.size()==0){ + } else if (splist_valid.size() == 0) { JOptionPane.showMessageDialog(Launcher.theapp, "No available serial ports."); } else { - SerialSelector.show(splist_valid.toArray(new SerialPort[]{})); + if (App.serialName == null) SerialSelector.show(splist_valid.toArray(new SerialPort[] {})); + SerialPort sp = Launcher.theapp.serialChecker.portHash.get(App.serialName); + new SerialWindow(sp); } } public SerialWindow(SerialPort _sp) { - super("SerialMonitor " + _sp.getSystemPortName()+" (ボーレート:115200)"); + super("SerialMonitor " + _sp.getSystemPortName() + " (ボーレート:115200)"); sp = _sp; sp.setBaudRate(115200); sp.addDataListener(this); System.out.println(sp.getSystemPortName()); if (!sp.openPort()) { - JOptionPane.showMessageDialog(Launcher.theapp, "他のプログラムがシリアルポート "+sp.getSystemPortName()+" を使用しています。"); + JOptionPane.showMessageDialog(Launcher.theapp, "他のウィンドウまたはプログラムがシリアルポート " + sp.getSystemPortName() + " を使用しています。"); System.out.println("Unable to open the port."); return; } - hash.put(sp.getSystemPortName(), this); + hash.put(sp.getSystemPortName(), this); jtf = new JTextField("(ここをクリックして、入力して、Enterを押すと、シリアル送信します)"); jtf.setForeground(Color.GRAY); @@ -112,37 +116,30 @@ } } }); - jtf.setBackground(new Color(210,255,255)); + jtf.setBackground(new Color(210, 255, 255)); getContentPane().add(jtf, BorderLayout.NORTH); jta = new JTextArea(); getContentPane().add(new JScrollPane(jta), BorderLayout.CENTER); // compileB = new JButton("compile"); // compileB.addActionListener(e -> { - // compile(e.getActionCommand()); + // compile(e.getActionCommand()); // }); // getContentPane().add(compileB, BorderLayout.SOUTH); setSize(500, 400); setLocation(centerOfScreen(getSize())); setVisible(true); - setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // この下のWindowListenerで処理する jtf.addActionListener(this); addWindowListener(this); // Xをおしたらserial closeする - //フォーカスをあえて外す + // フォーカスをあえて外す jta.requestFocus(); jtf.addKeyListener(this); jta.addKeyListener(this); } - /** - * 再接続 - */ - public void reconnect() { - sp.openPort(); - jta.setBackground(Color.white); - } @Override public int getListeningEvents() { @@ -168,7 +165,7 @@ sp.readBytes(newData, bytesToRead); String s = new String(newData, "UTF8"); appendToJTA(s); - } else if (evt == SerialPort.LISTENING_EVENT_PORT_DISCONNECTED){ + } else if (evt == SerialPort.LISTENING_EVENT_PORT_DISCONNECTED) { System.out.println("Port disconnected."); // System.out.println(event.toString()); SerialWindow.closeAll("切断されました"); @@ -184,7 +181,7 @@ if (jta == null) return; if (s.contains("waiting for download")) { - closeSerialPort(null); //切断のみ。再接続はしない + closeSerialPort(null); // 切断のみ。再接続はしない } jta.append(s); int len = jta.getDocument().getLength(); @@ -192,26 +189,12 @@ jta.setCaretPosition(len); } - void closeSerialPort(String mes) { - if (sp != null) { - if (sp.isOpen()) { - System.out.println("close Serial Port"); - sp.closePort(); - jta.setBackground(Color.lightGray); - if (mes == null) appendToJTA("Uploadに備えて、切断しました。"); - else appendToJTA(mes); - // thread = new Thread(this); - // thread.start(); - } - // sp = null; - } - } - // ここで、画面中心にウィンドウ表示するため、いろいろ計算する public static Point centerOfScreen(Dimension winSize) { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); return new Point((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / 2); } + // ここで、画面中心にウィンドウ表示するため、いろいろ計算する public static Point leftOfScreen(Dimension winSize) { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); @@ -259,40 +242,39 @@ } } - @Override - public void windowOpened(WindowEvent e) { - } + @Override + public void windowOpened(WindowEvent e) { + } - @Override - public void windowClosing(WindowEvent e) { - disposeWin(); - // closeSerialPort("シリアルモニタウィンドウを閉じます"); - } - - @Override - public void windowClosed(WindowEvent e) { + @Override + public void windowClosing(WindowEvent e) { // closeSerialPort("シリアルモニタウィンドウを閉じます"); disposeWin(); - } + } - @Override - public void windowIconified(WindowEvent e) { - } + @Override + public void windowClosed(WindowEvent e) { + disposeWin(); + } - @Override - public void windowDeiconified(WindowEvent e) { - } + @Override + public void windowIconified(WindowEvent e) { + } - @Override - public void windowActivated(WindowEvent e) { - } + @Override + public void windowDeiconified(WindowEvent e) { + } - @Override - public void windowDeactivated(WindowEvent e) { - } + @Override + public void windowActivated(WindowEvent e) { + } + + @Override + public void windowDeactivated(WindowEvent e) { + } public static void disposeAll() { - for(String key : SerialWindow.hash.keySet()){ + for (String key : SerialWindow.hash.keySet()) { SerialWindow swin = SerialWindow.hash.get(key); if (swin != null) { swin.disposeWin(); @@ -300,16 +282,52 @@ } SerialWindow.hash.clear(); } + public static void closeAll(String mes) { - for(String key : SerialWindow.hash.keySet()){ + for (String key : SerialWindow.hash.keySet()) { SerialWindow swin = SerialWindow.hash.get(key); if (swin != null) { - if (mes == null) mes = "Uploadに備え、切断しました"; + if (mes == null) + mes = "Uploadに備え、切断しました"; swin.closeSerialPort(mes); } } } - public void disposeWin(){ + + /** + * シリアルポート接続を閉じる + * + * @param mes + */ + void closeSerialPort(String mes) { + if (sp != null) { + if (sp.isOpen()) { + System.out.println("close Serial Port"); + sp.closePort(); + jta.setBackground(Color.lightGray); + if (mes == null) + appendToJTA("Uploadに備えて、切断しました。"); + else + appendToJTA(mes); + } + } + // 再接続に備えて、sp = null はしない + } + + /** + * 再接続 + */ + public void reconnect() { + sp.openPort(); + jta.setBackground(Color.white); + } + + /** + * ウィンドウを閉じる前に、シリアルポート接続を閉じる + */ + public void disposeWin() { + closeSerialPort("シリアルモニタウィンドウを閉じます"); + SerialWindow.hash.remove(this.sp.getSystemPortName()); dispose(); }