From 22d4196bed86e2101349a28e5732c207db732c10 Mon Sep 17 00:00:00 2001 From: Eiren Rain Date: Wed, 21 Jul 2021 22:06:35 +0300 Subject: [PATCH] Implement setting WiFi credentials via GUI --- build.gradle | 1 + src/main/java/io/eiren/gui/VRServerGUI.java | 10 ++ src/main/java/io/eiren/gui/WiFiWindow.java | 171 ++++++++++++++++++++ src/main/java/io/eiren/vr/Main.java | 2 +- 4 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/eiren/gui/WiFiWindow.java diff --git a/build.gradle b/build.gradle index 93b46112d5..afe36ade9f 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ dependencies { api 'net.java.dev.jna:jna:5.6.0' api 'net.java.dev.jna:jna-platform:5.6.0' api 'com.illposed.osc:javaosc-core:0.8' + api 'com.fazecast:jSerialComm:[2.0.0,3.0.0)' // This dependency is used internally, and not exposed to consumers on their own compile classpath. implementation 'com.google.guava:guava:28.2-jre' diff --git a/src/main/java/io/eiren/gui/VRServerGUI.java b/src/main/java/io/eiren/gui/VRServerGUI.java index 7f516c1d83..e327019b13 100644 --- a/src/main/java/io/eiren/gui/VRServerGUI.java +++ b/src/main/java/io/eiren/gui/VRServerGUI.java @@ -110,6 +110,16 @@ public void mouseClicked(MouseEvent e) { }); }}); add(Box.createHorizontalStrut(10)); + add(new JButton("WiFi") {{ + addMouseListener(new MouseInputAdapter() { + @SuppressWarnings("unused") + @Override + public void mouseClicked(MouseEvent e) { + new WiFiWindow(VRServerGUI.this); + } + }); + }}); + add(Box.createHorizontalStrut(10)); }}); pane.add(new EJBox(LINE_AXIS) {{ diff --git a/src/main/java/io/eiren/gui/WiFiWindow.java b/src/main/java/io/eiren/gui/WiFiWindow.java new file mode 100644 index 0000000000..70dbbf3d1c --- /dev/null +++ b/src/main/java/io/eiren/gui/WiFiWindow.java @@ -0,0 +1,171 @@ +package io.eiren.gui; + +import java.awt.Container; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.util.Timer; +import java.util.TimerTask; + +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.ScrollPaneConstants; +import javax.swing.WindowConstants; +import javax.swing.event.MouseInputAdapter; + +import com.fazecast.jSerialComm.SerialPort; + +import io.eiren.util.ann.AWTThread; + +public class WiFiWindow extends JFrame { + + private static final Timer timer = new Timer(); + private static String savedSSID = ""; + private static String savedPassword = ""; + JTextField ssidField; + JTextField passwdField; + SerialPort trackerPort = null; + JTextArea log; + TimerTask readTask; + + public WiFiWindow(VRServerGUI gui) { + super("WiFi Settings"); + getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.LINE_AXIS)); + + build(); + } + + @AWTThread + private void build() { + Container pane = getContentPane(); + + + SerialPort[] ports = SerialPort.getCommPorts(); + for(SerialPort port : ports) { + if(port.getDescriptivePortName().contains("CH340")) { + trackerPort = port; + break; + } + } + pane.add(new EJBox(BoxLayout.PAGE_AXIS) {{ + if(trackerPort == null) { + add(new JLabel("No trackers connected, connect tracker to USB and reopen window")); + timer.schedule(new TimerTask() { + @Override + public void run() { + WiFiWindow.this.dispose(); + } + }, 5000); + } else { + add(new JLabel("Tracker connected to " + trackerPort.getSystemPortName() + " (" + trackerPort.getDescriptivePortName() + ")")); + JScrollPane scroll; + add(scroll = new JScrollPane(log = new JTextArea(10, 20), ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); + log.setLineWrap(true); + scroll.setAutoscrolls(true); + if(trackerPort.openPort()) { + trackerPort.setBaudRate(115200); + log.append("[OK] Port opened\n"); + readTask = new ReadTask(); + timer.schedule(readTask, 500, 500); + } else { + log.append("ERROR: Can't open port"); + } + + add(new JLabel("Enter WiFi credentials:")); + add(new EJBox(BoxLayout.LINE_AXIS) {{ + add(new JLabel("Network name:")); + add(ssidField = new JTextField(savedSSID)); + }}); + add(new EJBox(BoxLayout.LINE_AXIS) {{ + add(new JLabel("Network password:")); + add(passwdField = new JTextField(savedPassword)); + }}); + add(new JButton("Send") {{ + addMouseListener(new MouseInputAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + send(ssidField.getText(), passwdField.getText()); + } + }); + }}); + } + }}); + + + // Pack and display + pack(); + setLocationRelativeTo(null); + setVisible(true); + java.awt.EventQueue.invokeLater(new Runnable() { + @Override + public void run() { + toFront(); + repaint(); + } + }); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent windowEvent) { + if(trackerPort != null) + trackerPort.closePort(); + if(readTask != null) + readTask.cancel(); + System.out.println("Port closed okay"); + dispose(); + } + }); + } + + protected void send(String ssid, String passwd) { + savedSSID = ssid; + savedPassword = passwd; + OutputStream os = trackerPort.getOutputStream(); + OutputStreamWriter writer = new OutputStreamWriter(os); + try { + writer.append("SET WIFI \"" + ssid + "\" \"" + passwd + "\"\n"); + writer.flush(); + } catch(IOException e) { + log.append(e.toString() + "\n"); + e.printStackTrace(); + } + } + + private class ReadTask extends TimerTask { + + final InputStream is; + final Reader reader; + StringBuffer sb = new StringBuffer(); + + public ReadTask() { + is = trackerPort.getInputStreamWithSuppressedTimeoutExceptions(); + reader = new InputStreamReader(is); + } + + @Override + public void run() { + try { + while(reader.ready()) + sb.appendCodePoint(reader.read()); + if(sb.length() > 0) + log.append(sb.toString()); + sb.setLength(0); + } catch(Exception e) { + log.append(e.toString() + "\n"); + e.printStackTrace(); + } + } + + } +} diff --git a/src/main/java/io/eiren/vr/Main.java b/src/main/java/io/eiren/vr/Main.java index f0ecee24d0..27c702f4e9 100644 --- a/src/main/java/io/eiren/vr/Main.java +++ b/src/main/java/io/eiren/vr/Main.java @@ -8,7 +8,7 @@ public class Main { - public static String VERSION = "0.0.7 DEV 1"; + public static String VERSION = "0.0.9"; public static VRServer vrServer;