diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f114ff4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/command-terminal/CommandTerminal/nbproject/private/ +/command-terminal/CommandTerminal/build/ \ No newline at end of file diff --git a/command-terminal/CommandTerminal/build.xml b/command-terminal/CommandTerminal/build.xml new file mode 100644 index 0000000..e14409b --- /dev/null +++ b/command-terminal/CommandTerminal/build.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + Builds, tests, and runs the project CommandTerminal. + + + diff --git a/command-terminal/CommandTerminal/manifest.mf b/command-terminal/CommandTerminal/manifest.mf new file mode 100644 index 0000000..328e8e5 --- /dev/null +++ b/command-terminal/CommandTerminal/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/command-terminal/CommandTerminal/nbproject/build-impl.xml b/command-terminal/CommandTerminal/nbproject/build-impl.xml new file mode 100644 index 0000000..c50f26c --- /dev/null +++ b/command-terminal/CommandTerminal/nbproject/build-impl.xml @@ -0,0 +1,1413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/command-terminal/CommandTerminal/nbproject/genfiles.properties b/command-terminal/CommandTerminal/nbproject/genfiles.properties new file mode 100644 index 0000000..b22b9e6 --- /dev/null +++ b/command-terminal/CommandTerminal/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=fdad8e2e +build.xml.script.CRC32=1cd81838 +build.xml.stylesheet.CRC32=8064a381@1.74.1.48 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=fdad8e2e +nbproject/build-impl.xml.script.CRC32=95faf5a3 +nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.74.1.48 diff --git a/command-terminal/CommandTerminal/nbproject/project.properties b/command-terminal/CommandTerminal/nbproject/project.properties new file mode 100644 index 0000000..9645bed --- /dev/null +++ b/command-terminal/CommandTerminal/nbproject/project.properties @@ -0,0 +1,73 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processor.options= +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# Files in build.classes.dir which should be excluded from distribution jar +dist.archive.excludes= +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/CommandTerminal.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath= +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.8 +javac.target=1.8 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class=commandterminal.CommandTerminal +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/command-terminal/CommandTerminal/nbproject/project.xml b/command-terminal/CommandTerminal/nbproject/project.xml new file mode 100644 index 0000000..30bb371 --- /dev/null +++ b/command-terminal/CommandTerminal/nbproject/project.xml @@ -0,0 +1,15 @@ + + + org.netbeans.modules.java.j2seproject + + + CommandTerminal + + + + + + + + + diff --git a/command-terminal/CommandTerminal/src/DatagramSocket/AsynchronousDatagramSocket.java b/command-terminal/CommandTerminal/src/DatagramSocket/AsynchronousDatagramSocket.java new file mode 100644 index 0000000..86f45e3 --- /dev/null +++ b/command-terminal/CommandTerminal/src/DatagramSocket/AsynchronousDatagramSocket.java @@ -0,0 +1,75 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package DatagramSocket; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.SocketException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author lmascaro + */ +public class AsynchronousDatagramSocket implements Runnable, AutoCloseable{ + + private final static int MAX_MESSAGE_SIZE = 300; + + private SynchronizedBuffer buf; + private DatagramSocket socket; + + public AsynchronousDatagramSocket() throws SocketException{ + this.buf = new SynchronizedBuffer<>(); + this.socket = new DatagramSocket(); + new Thread(this).start(); + } + + public AsynchronousDatagramSocket(int port) throws SocketException{ + this.buf = new SynchronizedBuffer<>(); + this.socket = new DatagramSocket(port); + new Thread(this).start(); + } + + public void send(DatagramPacket dp) throws IOException{ + this.socket.send(dp); + } + + public boolean asynchronousReceive(DatagramPacket dp){ + if(this.buf.available() == 0){ + return false; + }else{ + dp = this.buf.removeElement(false); + return true; + } + } + + public void synchronousReceive(DatagramPacket dp){ + dp = this.buf.removeElement(true); + } + + public boolean available(){ + return this.buf.available()>0; + } + + @Override + public void close(){ + this.socket.close(); + } + + @Override + public void run() { + DatagramPacket packet = new DatagramPacket(new byte[MAX_MESSAGE_SIZE],MAX_MESSAGE_SIZE); + try { + this.socket.receive(packet); + this.buf.addElement(packet); + } catch (IOException ex) { + Logger.getLogger(AsynchronousDatagramSocket.class.getName()).log(Level.SEVERE, null, ex); + } + } +} diff --git a/command-terminal/CommandTerminal/src/DatagramSocket/SynchronizedBuffer.java b/command-terminal/CommandTerminal/src/DatagramSocket/SynchronizedBuffer.java new file mode 100644 index 0000000..2f28f9c --- /dev/null +++ b/command-terminal/CommandTerminal/src/DatagramSocket/SynchronizedBuffer.java @@ -0,0 +1,46 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package DatagramSocket; + +import java.util.LinkedList; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author lmascaro + */ +public class SynchronizedBuffer{ + + private LinkedList elements = new LinkedList(); + + public synchronized T removeElement(boolean sync){ + if(!sync && this.elements.isEmpty()){ + return null; + } + + while(this.elements.isEmpty()){ + try { + this.wait(); + } catch (InterruptedException ex) { + Logger.getLogger(SynchronizedBuffer.class.getName()).log(Level.SEVERE, null, ex); + } + } + + return this.elements.removeFirst(); + } + + public synchronized void addElement(T elem){ + this.elements.add(elem); + this.notifyAll(); + } + + public synchronized int available(){ + return this.elements.size(); + } + +} diff --git a/command-terminal/CommandTerminal/src/commandterminal/CommandTerminal.java b/command-terminal/CommandTerminal/src/commandterminal/CommandTerminal.java new file mode 100644 index 0000000..eedb010 --- /dev/null +++ b/command-terminal/CommandTerminal/src/commandterminal/CommandTerminal.java @@ -0,0 +1,122 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package commandterminal; + +import DatagramSocket.AsynchronousDatagramSocket; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InterfaceAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Iterator; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author lmascaro + */ +public class CommandTerminal { + + private final static int SGCA_BROADCAST_PORT = 9999; + private final static int MAX_MESSAGE_SIZE = 300; + private static AsynchronousDatagramSocket socket; + + /** + * @param args the command line arguments + */ + public static void main(String[] args){ + + //the following code go through every interfaces to get broadcasts addresses in order to contact the sgca + HashSet listOfBroadcasts = new HashSet(); + Enumeration list; + try { + list = NetworkInterface.getNetworkInterfaces(); + + while(list.hasMoreElements()) { + NetworkInterface iface = (NetworkInterface) list.nextElement(); + + if(iface == null) continue; + //if the interface is not loopback + if(!iface.isLoopback() && iface.isUp()) { + + Iterator it = iface.getInterfaceAddresses().iterator(); + while (it.hasNext()) { + InterfaceAddress address = (InterfaceAddress) it.next(); + if(address == null) continue; + InetAddress broadcast = address.getBroadcast(); + if(broadcast != null) + { + //we found it ! + listOfBroadcasts.add(broadcast); + } + } + } + } + } catch (SocketException ex) { + System.err.println("Error while getting network interfaces"); + return; + } + + Integer sgcaPort; + InetAddress sgcaAddress; + DatagramPacket packet; + try { + //try to send a request to all the broadcasts (usually there is only one) and wait for the response of the sgca + DatagramSocket broadcastSocket = new DatagramSocket(); + byte[] data; + for(InetAddress adr : listOfBroadcasts){ + data = new byte[1]; + Integer clientType = 1; + data[0] = clientType.byteValue(); + packet = new DatagramPacket(data,data.length,adr,SGCA_BROADCAST_PORT); + broadcastSocket.send(packet); + + } + data = new byte[1]; + packet = new DatagramPacket(data,data.length); + broadcastSocket.receive(packet); + sgcaAddress = packet.getAddress(); + Byte b = new Byte(packet.getData()[0]); + sgcaPort = b.intValue(); + } catch (Exception ex) { + Logger.getLogger(CommandTerminal.class.getName()).log(Level.SEVERE, null, ex); + return; + } + + //from now we assume that the network discovery part went well and we have the port/address of the sgca + //send a ISALIVE to ensure the sgca is ready to receive commands + DatagramSocket comSock; + ByteBuffer buf = ByteBuffer.allocate(1); + try { + comSock = new DatagramSocket(sgcaPort); + buf.putInt(OpCode.ISALIVE.ordinal()); + packet = new DatagramPacket(buf.array(),buf.arrayOffset(),sgcaAddress,sgcaPort); + comSock.send(packet); + + //receive response + comSock.receive(packet); + Byte response = new Byte(packet.getData()[0]); + OpCode success = OpCode.values()[response.intValue()]; + + if(success != OpCode.SUCCESS){ + System.out.println("SGCA Not ready, exiting"); + return; + } + } catch (Exception ex) { + Logger.getLogger(CommandTerminal.class.getName()).log(Level.SEVERE, null, ex); + } + + //now the sgca is connected and ready, let's start the real work + + } + +} diff --git a/command-terminal/CommandTerminal/src/commandterminal/OpCode.java b/command-terminal/CommandTerminal/src/commandterminal/OpCode.java new file mode 100644 index 0000000..3183b8c --- /dev/null +++ b/command-terminal/CommandTerminal/src/commandterminal/OpCode.java @@ -0,0 +1,20 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +package commandterminal; + +/** + * + * @author lmascaro + */ +public enum OpCode { + ISALIVE, + CAP, + ALT, + SPEED, + SUCCESS, + ERROR +} diff --git a/command-terminal/java-code b/command-terminal/java-code deleted file mode 100644 index e69de29..0000000