From 63f36252ea1c4294b9940c439b9dcafc1dfde28b Mon Sep 17 00:00:00 2001 From: David S Date: Tue, 28 Jul 2015 12:40:25 -0500 Subject: [PATCH 01/37] Start work on porting the connection to TCP --- .../java/com/ftdi.j2xx/NetworkManager.java | 11 ++++--- .../hagerty/simulator/BrickListGenerator.java | 11 ++++--- .../hagerty/simulator/CoppeliaApiClient.java | 4 +-- .../src/hagerty/simulator/RobotSimulator.java | 32 ++++++++++++++++--- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/Android/App/FtcRobotController/src/main/java/com/ftdi.j2xx/NetworkManager.java b/Android/App/FtcRobotController/src/main/java/com/ftdi.j2xx/NetworkManager.java index 58ea15b..9158697 100644 --- a/Android/App/FtcRobotController/src/main/java/com/ftdi.j2xx/NetworkManager.java +++ b/Android/App/FtcRobotController/src/main/java/com/ftdi.j2xx/NetworkManager.java @@ -31,8 +31,7 @@ public NetworkManager(String ipAddress, int port) { mSimulatorSocket = new DatagramSocket(PHONE_PORT); Log.v("D2xx::", "Local Port " + mSimulatorSocket.getLocalPort()); NetworkSender myNetworkSender = new NetworkSender(mWriteToPcQueue, - mSimulatorSocket, - PC_IP_ADDRESS); // Runnable + PC_IP_ADDRESS, mSimulatorSocket, SENDING_PORT); // Runnable Thread networkSenderThread = new Thread(myNetworkSender); networkSenderThread.start(); @@ -116,10 +115,10 @@ public NetworkSender(LinkedBlockingQueue queue, String ipAddress, DatagramSocket this.mDestPort = destPort; try { - this.IPAddress = InetAddress.getByName(ip); + this.IPAddress = InetAddress.getByName(ipAddress); } catch (IOException e) { Log.e("FTC Controller", "The following ip address is not invalid: " + - ip + "Details: " + e.getMessage(), e); + ipAddress + "Details: " + e.getMessage(), e); throw new AssertionError("IP Address is invalid!"); } @@ -139,6 +138,10 @@ public void run() { } } } + + public void buildConnection() { + + } } diff --git a/PC/Java/RobotSimulator/src/hagerty/simulator/BrickListGenerator.java b/PC/Java/RobotSimulator/src/hagerty/simulator/BrickListGenerator.java index 1eee2bc..ffbe1aa 100644 --- a/PC/Java/RobotSimulator/src/hagerty/simulator/BrickListGenerator.java +++ b/PC/Java/RobotSimulator/src/hagerty/simulator/BrickListGenerator.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; +import java.util.logging.Level; import java.util.logging.Logger; public class BrickListGenerator implements Runnable { @@ -71,7 +72,7 @@ private byte[] receivePacketFromPhone() { // Get the port and address of the sender from the incoming packet and set some global variables // to be used when we reply back. // TODO: do we need to set this every time? - RobotSimulator.GetPhoneConnectionDetails(receivePacket.getPort(), receivePacket.getAddress()); + RobotSimulator.setPhoneConnectionDetails(receivePacket.getPort(), receivePacket.getAddress()); // Make a copy of the packet. Not sure if we need to do this. Might not hold on to it for long. // byte[] myPacket = new byte[receivePacket.getLength()]; @@ -84,7 +85,8 @@ private void sendPacketToPhone(byte[] sendData) { DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, RobotSimulator.getPhoneIPAddress(), RobotSimulator.getPhonePort()); mServerSocket.send(sendPacket); - System.out.println("sendPacketToPhone: (" + Utils.bufferToHexString(sendData,0,sendData.length) + ") len=" + sendData.length); + logger.log(Level.FINER, "sendPacketToPhone: (" + Utils.bufferToHexString(sendData, 0, sendData.length) + + ") len=" + sendData.length); } catch (IOException e) { e.printStackTrace(); } @@ -101,8 +103,9 @@ public void handleIncomingPacket(byte[] data, boolean wait) private byte[] getXmlModuleList(ObservableList mBrickList) { try { - JAXBContext context = JAXBContext.newInstance(BrickListWrapper.class, LegacyBrickSimulator.class, MotorBrickSimulator.class, ServoBrickSimulator.class ); - Marshaller m = context.createMarshaller(); + JAXBContext context = JAXBContext.newInstance(BrickListWrapper.class, LegacyBrickSimulator.class, + MotorBrickSimulator.class, ServoBrickSimulator.class); + Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // Wrapping our controller data. diff --git a/PC/Java/RobotSimulator/src/hagerty/simulator/CoppeliaApiClient.java b/PC/Java/RobotSimulator/src/hagerty/simulator/CoppeliaApiClient.java index e36a018..51af8b8 100644 --- a/PC/Java/RobotSimulator/src/hagerty/simulator/CoppeliaApiClient.java +++ b/PC/Java/RobotSimulator/src/hagerty/simulator/CoppeliaApiClient.java @@ -86,8 +86,8 @@ public void run() /* * Read the current list of modules from the GUI MainApp class */ - SimData simData=null; - List brickList = mMainApp.getBrickData(); + SimData simData = null; + List brickList = mMainApp.getBrickData(); for (BrickSimulator currentBrick : brickList) { simData = currentBrick.findSimDataName("Wheels"); if (simData != null) break; diff --git a/PC/Java/RobotSimulator/src/hagerty/simulator/RobotSimulator.java b/PC/Java/RobotSimulator/src/hagerty/simulator/RobotSimulator.java index 4a1c0f8..526a206 100644 --- a/PC/Java/RobotSimulator/src/hagerty/simulator/RobotSimulator.java +++ b/PC/Java/RobotSimulator/src/hagerty/simulator/RobotSimulator.java @@ -2,9 +2,13 @@ import hagerty.simulator.modules.BrickSimulator; +import java.net.DatagramPacket; +import java.net.DatagramSocket; import java.net.InetAddress; +import java.nio.charset.StandardCharsets; import java.util.LinkedList; import java.util.List; +import java.util.logging.Level; import java.util.logging.Logger; public class RobotSimulator { @@ -21,6 +25,25 @@ public class RobotSimulator { static public void startSimulator(hagerty.gui.MainApp mainApp) { simulatorStarted = true; + try { + System.out.println("Waiting for Robot Controller seeker..."); + DatagramSocket mSeekerSocket = new DatagramSocket(7000); + + byte[] seekerBytes = new byte[1024]; + DatagramPacket mSeekerPacket = new DatagramPacket(seekerBytes, seekerBytes.length); + mSeekerSocket.receive(mSeekerPacket); + System.out.println("Robot Controller discovered at " + mSeekerPacket.getAddress()); + + System.out.println("Replying back..."); + byte[] handShakeBytes = InetAddress.getLocalHost().toString().getBytes(StandardCharsets.US_ASCII); + + DatagramPacket mHandshake = new DatagramPacket(handShakeBytes, handShakeBytes.length); + mSeekerSocket.send(mHandshake); + mSeekerSocket.close(); + } catch (Exception ex) { + System.err.println(ex.toString()); + logger.log(Level.SEVERE, ex.toString()); + } // Start the module info server System.out.println("Starting Module Lister..."); @@ -33,8 +56,8 @@ static public void startSimulator(hagerty.gui.MainApp mainApp) { List brickList = mainApp.getBrickData(); for (BrickSimulator temp : brickList) { - Thread t = new Thread(temp,temp.getAlias()); // Make a thread from the object and also set the process name - t.start(); + Thread t = new Thread(temp, temp.getAlias()); // Make a thread from the object and also set the process name + t.start(); threadLinkedList.add(t); System.out.println(temp.getAlias() + " " + temp.getName()); } @@ -45,8 +68,7 @@ static public boolean simulatorStarted() { } static public void startVisualizer(hagerty.gui.MainApp mainApp) { - - visualizerStarted = true; + visualizerStarted = true; // Start the module info server System.out.println("Starting Visualizer..."); @@ -86,7 +108,7 @@ public static InetAddress getPhoneIPAddress() { return gPhoneIPAddress; } - public static void GetPhoneConnectionDetails(int phonePort, InetAddress phoneIpAddress) { + public static void setPhoneConnectionDetails(int phonePort, InetAddress phoneIpAddress) { gPhonePort = phonePort; gPhoneIPAddress = phoneIpAddress; } From 4df1447d5bd77637f97cef95e61bb195a96f6dc6 Mon Sep 17 00:00:00 2001 From: David S Date: Thu, 30 Jul 2015 00:20:09 -0500 Subject: [PATCH 02/37] Build a basic mirror server --- .../FtcRobotController/FtcRobotController.iml | 7 + Android/App/FtcRobotController/build.gradle | 18 +- .../main/java/com/ftdi.j2xx/D2xxManager.java | 6 +- .../org/ftccommunity/simulator/Server.java | 63 + .../ftccommunity/simulator/ServerHandler.java | 51 + .../simulator/protobuf/Data.proto | 48 + PC/Java/RobotSimulator/lib/guava-18.0.jar | Bin 0 -> 2256213 bytes .../lib/netty-all-4.0.30.Final.jar | Bin 0 -> 2057506 bytes PC/Java/RobotSimulator/lib/protobuf.jar | Bin 0 -> 718682 bytes .../src/hagerty/gui/MainApp.java | 2 +- .../hagerty/simulator/BrickListGenerator.java | 3 + .../src/hagerty/simulator/NetworkManager.java | 56 + .../src/hagerty/simulator/RobotSimulator.java | 5 +- .../src/hagerty/simulator/io/Client.java | 40 + .../hagerty/simulator/io/ClientHandler.java | 34 + .../src/hagerty/simulator/io/Decoder.java | 38 + .../simulator/protobuf/Data.proto | 48 + .../simulator/protobuf/SimulatorData.java | 4193 +++++++++++++++++ 18 files changed, 4601 insertions(+), 11 deletions(-) create mode 100644 Android/App/FtcRobotController/src/main/java/org/ftccommunity/simulator/Server.java create mode 100644 Android/App/FtcRobotController/src/main/java/org/ftccommunity/simulator/ServerHandler.java create mode 100644 Android/App/FtcRobotController/src/main/java/org/ftccommunity/simulator/protobuf/Data.proto create mode 100644 PC/Java/RobotSimulator/lib/guava-18.0.jar create mode 100644 PC/Java/RobotSimulator/lib/netty-all-4.0.30.Final.jar create mode 100644 PC/Java/RobotSimulator/lib/protobuf.jar create mode 100644 PC/Java/RobotSimulator/src/hagerty/simulator/NetworkManager.java create mode 100644 PC/Java/RobotSimulator/src/hagerty/simulator/io/Client.java create mode 100644 PC/Java/RobotSimulator/src/hagerty/simulator/io/ClientHandler.java create mode 100644 PC/Java/RobotSimulator/src/hagerty/simulator/io/Decoder.java create mode 100644 PC/Java/RobotSimulator/src/org/ftccommunity/simulator/protobuf/Data.proto create mode 100644 PC/Java/RobotSimulator/src/org/ftccommunity/simulator/protobuf/SimulatorData.java diff --git a/Android/App/FtcRobotController/FtcRobotController.iml b/Android/App/FtcRobotController/FtcRobotController.iml index 48f1737..9f518c2 100644 --- a/Android/App/FtcRobotController/FtcRobotController.iml +++ b/Android/App/FtcRobotController/FtcRobotController.iml @@ -25,6 +25,11 @@