From f683890daa58bc2395e519b5ec004e70d7c6d1bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Sat, 1 Jun 2019 15:43:12 +0200 Subject: [PATCH 01/58] add first server tests for traci comm. --- VadereManager/pom.xml | 151 ++++++++++++++++++ VadereManager/resources/log4j2.properties | 32 ++++ .../src/org/vadere/manager/ClientHandler.java | 67 ++++++++ .../org/vadere/manager/CommandExecutor.java | 33 ++++ .../src/org/vadere/manager/Manager.java | 23 +++ .../src/org/vadere/manager/TestClient.java | 50 ++++++ .../src/org/vadere/manager/TraCISocket.java | 88 ++++++++++ .../src/org/vadere/manager/VadereServer.java | 48 ++++++ .../commandHandler/CommandHandler.java | 16 ++ .../commandHandler/GetVersionCmdHandler.java | 28 ++++ pom.xml | 1 + 11 files changed, 537 insertions(+) create mode 100644 VadereManager/pom.xml create mode 100644 VadereManager/resources/log4j2.properties create mode 100644 VadereManager/src/org/vadere/manager/ClientHandler.java create mode 100644 VadereManager/src/org/vadere/manager/CommandExecutor.java create mode 100644 VadereManager/src/org/vadere/manager/Manager.java create mode 100644 VadereManager/src/org/vadere/manager/TestClient.java create mode 100644 VadereManager/src/org/vadere/manager/TraCISocket.java create mode 100644 VadereManager/src/org/vadere/manager/VadereServer.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java diff --git a/VadereManager/pom.xml b/VadereManager/pom.xml new file mode 100644 index 000000000..039b577d8 --- /dev/null +++ b/VadereManager/pom.xml @@ -0,0 +1,151 @@ + + + + vadere + org.vadere + 0.1-SNAPSHOT + ../pom.xml + + 4.0.0 + + manager + Vadere Manager + + + src + tests + + + src + + **/*.java + + + + resources + + + + + testResources + + + tests + + **/*.java + + + + + + com.nativelibs4java + maven-javacl-plugin + 1.0.0-RC4 + + + generate-sources + + compile + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + write-version-control-info-to-file + generate-resources + + exec + + + + + + git + + rev-parse + HEAD + + resources/current_commit_hash.txt + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler.version} + + ${maven-compiler.source.version} + ${maven-compiler.target.version} + + + org.vadere + annotation + 0.1-SNAPSHOT + + + + + + + maven-assembly-plugin + 2.4 + + + build-vadere-console + package + + single + + + + + org.vadere.simulator.entrypoints.cmd.VadereConsole + + + + jar-with-dependencies + + vadere-console + false + false + + + + + + + + + + + ${project.groupId} + state + ${project.version} + + + ${project.groupId} + utils + ${project.version} + + + ${project.groupId} + annotation + ${project.version} + + + + + de.tudresden + traas + 1.0 + + + + + \ No newline at end of file diff --git a/VadereManager/resources/log4j2.properties b/VadereManager/resources/log4j2.properties new file mode 100644 index 000000000..5099ddeef --- /dev/null +++ b/VadereManager/resources/log4j2.properties @@ -0,0 +1,32 @@ +name=PropertiesConfig +property.logname = log.out +property.loglevel = INFO + +appenders = console, file + +appender.console.type = Console +appender.console.name = CONSOLE +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %d{ABSOLUTE} %6p %c{1}:%L - %m%n + +appender.file.type = RollingFile +appender.file.name = FILE +appender.file.fileName = ${main:logname} +appender.file.filePattern = ${main:logname}-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz +appender.file.layout.type = PatternLayout +appender.file.layout.pattern = %d{ABSOLUTE} %6p %c{1}:%L - %m%n +appender.file.policies.type = Policies +appender.file.policies.size.type = SizeBasedTriggeringPolicy +appender.file.policies.size.size = 10000KB + +loggers = stdOutErr +logger.stdOutErr.name = STDOUTERR +logger.stdOutErr.level = ${main:loglevel} +logger.stdOutErr.appenderRefs = file +logger.stdOutErr.appenderRef.file.ref = FILE +logger.stdOutErr.additivity = false + +rootLogger.level = ${main:loglevel} +rootLogger.appenderRefs = console, file +rootLogger.appenderRef.console.ref = CONSOLE +rootLogger.appenderRef.file.ref = FILE \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java new file mode 100644 index 000000000..eabe2a7df --- /dev/null +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -0,0 +1,67 @@ +package org.vadere.manager; + +import de.tudresden.sumo.config.Constants; +import de.uniluebeck.itm.tcpip.Storage; + +import it.polito.appeal.traci.protocol.Command; + +import org.vadere.util.logging.Logger; + +import java.io.IOException; +import java.net.ServerSocket; + +public class ClientHandler implements Runnable{ + + private static Logger logger = Logger.getLogger(ClientHandler.class); + + private final ServerSocket serverSocket; + private final TraCISocket traCISocket; + private final CommandExecutor cmdExecutor; + + public ClientHandler(ServerSocket serverSocket, TraCISocket traCISocket) { + this.serverSocket = serverSocket; + this.traCISocket = traCISocket; + this.cmdExecutor = new CommandExecutor(); + } + + Storage copy(Storage s){ + byte[] data = new byte[s.size() - s.position()]; + for(int i=s.position(); i cmdMap; + + public CommandExecutor() { + cmdMap = new HashMap<>(); + cmdMap.put(Constants.CMD_GETVERSION, new GetVersionCmdHandler()); + } + + boolean execute(int cmd, Storage in, Storage out){ + CommandHandler handler = cmdMap.get(cmd); + if (handler == null){ + logger.errorf("No CommandHandler found for command: %02X", cmd); + return false; + } + + return handler.handelCommand(in, out); + + } +} diff --git a/VadereManager/src/org/vadere/manager/Manager.java b/VadereManager/src/org/vadere/manager/Manager.java new file mode 100644 index 000000000..5db86fc40 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/Manager.java @@ -0,0 +1,23 @@ +package org.vadere.manager; + + +import java.io.IOException; +import java.net.ServerSocket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class Manager { + + + public static void main(String[] args) throws IOException { + + ExecutorService pool = Executors.newFixedThreadPool(4); + ServerSocket serverSocket = new ServerSocket(9999); + + VadereServer server = new VadereServer(serverSocket, pool); + server.run(); + + } + + +} diff --git a/VadereManager/src/org/vadere/manager/TestClient.java b/VadereManager/src/org/vadere/manager/TestClient.java new file mode 100644 index 000000000..58beffe72 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TestClient.java @@ -0,0 +1,50 @@ +package org.vadere.manager; + +import de.tudresden.sumo.util.CommandProcessor; + +import java.io.IOException; +import java.net.ConnectException; +import java.net.InetSocketAddress; +import java.net.Socket; + +public class TestClient { + + private int port; + private Socket socket; + private CommandProcessor cmdProcessor; + + + public TestClient(int port) throws IOException, InterruptedException { + this.port = port; + + socket = new Socket(); + socket.setTcpNoDelay(true); + int waitTime = 500; //ms + for(int i=0; i < 14; i++){ + try { + socket.connect(new InetSocketAddress("127.0.0.1", this.port)); + break; + } catch (ConnectException ex){ + Thread.sleep(waitTime); + waitTime *= 2; + } + } + + if (!socket.isConnected()){ + throw new IOException("can't connect to Server!"); + } else { + cmdProcessor = new CommandProcessor(socket); + } + System.out.println("connected..."); + } + + public static void main(String[] args) throws IOException, InterruptedException { + + TestClient testClient = new TestClient(9999); + + testClient.cmdProcessor.do_setOrder(99); + + } + + +} diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java new file mode 100644 index 000000000..7386da474 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -0,0 +1,88 @@ +package org.vadere.manager; + +import de.uniluebeck.itm.tcpip.Storage; + +import java.io.Closeable; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; + +public class TraCISocket implements Closeable { + + private final static int TRACI_LEN_LENGTH = 4; + + private final Socket socket; + private final DataOutputStream outStream; + private final DataInputStream inStream; + + + public TraCISocket(Socket socket) throws IOException { + this.socket = socket; + this.outStream = new DataOutputStream(socket.getOutputStream()); + this.inStream = new DataInputStream(socket.getInputStream()); + } + + public int getPort(){ + return socket.getPort(); + } + + public boolean hasClientConnection(){ + return socket.isConnected(); + } + + public void send(final byte[] buf) throws IOException { + outStream.write(buf); + } + + public void sendExact(final Storage storage) throws IOException{ + int totalLength = TRACI_LEN_LENGTH + storage.size(); + Storage length_storage = new Storage(); + length_storage.writeInt(totalLength); + + byte[] data = new byte[totalLength]; + int n = 0; + // write length of total package + for(Byte b : length_storage.getStorageList()){ + data[n++] = b; + } + // write data + for(Byte b : storage.getStorageList()){ + data[n++] = b; + } + + send(data); + } + + + + public void receiveComplete(byte[] buf, int len) throws IOException { + inStream.readFully(buf, 0, len); + } + + public byte[] receive (int bufSize) throws IOException{ + byte[] buf = new byte[bufSize]; + receiveComplete(buf, bufSize); + return buf; + } + + public boolean receiveExact(Storage msg) throws IOException{ + + Storage length_Storage = new Storage(receive(TRACI_LEN_LENGTH)); + int data_length = length_Storage.readInt() - TRACI_LEN_LENGTH; + assert (data_length > 0); + + // copy message content into msg. + byte[] data = receive(data_length); + msg.reset(); + for(byte b : data) + msg.writeByte(b); + + return true; + } + + @Override + public void close() throws IOException { + socket.close(); + } +} diff --git a/VadereManager/src/org/vadere/manager/VadereServer.java b/VadereManager/src/org/vadere/manager/VadereServer.java new file mode 100644 index 000000000..018e50fe4 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/VadereServer.java @@ -0,0 +1,48 @@ +package org.vadere.manager; + +import org.vadere.util.logging.Logger; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; + +public class VadereServer implements Runnable{ + + private static Logger logger = Logger.getLogger(VadereServer.class); + + private final ServerSocket serverSocket; + private final ExecutorService handlerPool; + + public VadereServer(ServerSocket serverSocket, ExecutorService handlerPool) { + this.serverSocket = serverSocket; + this.handlerPool = handlerPool; + } + + @Override + public void run() { + try { + while (true) { + Socket clientSocket = serverSocket.accept(); + + handlerPool.execute(new ClientHandler(serverSocket, new TraCISocket(clientSocket))); + } + } catch (IOException e) { + e.printStackTrace(); + logger.warn("Interrupt Vadere Server"); + } finally { + logger.info("Shutdown Vadere Server ..."); + handlerPool.shutdown(); + try { + handlerPool.awaitTermination(4L, TimeUnit.SECONDS); + if (!serverSocket.isClosed()){ + serverSocket.close(); + } + } catch (InterruptedException | IOException e) { + logger.error(e); + } + } + + } +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java new file mode 100644 index 000000000..5eab87f38 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -0,0 +1,16 @@ +package org.vadere.manager.commandHandler; + +import de.uniluebeck.itm.tcpip.Storage; + +public interface CommandHandler { + + boolean handelCommand(Storage inputStorage, Storage outputStorage); + + default void writeStatusCmd(Storage storage, final int commandId, final int status, final String description){ + // cmd length (Byte) + commandId (Byte) + status (Byte) + String LenField (Integer) + dataLen (i.e. description) + storage.writeUnsignedByte( 1 + 1 + 1 + 4 + description.length()); + storage.writeUnsignedByte(commandId); + storage.writeUnsignedByte(status); + storage.writeStringASCII(description); + } +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java new file mode 100644 index 000000000..fa6809fb5 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java @@ -0,0 +1,28 @@ +package org.vadere.manager.commandHandler; + + +import de.tudresden.sumo.config.Constants; +import de.uniluebeck.itm.tcpip.Storage; + +public class GetVersionCmdHandler implements CommandHandler{ + + + @Override + public boolean handelCommand(Storage inputStorage, Storage outputStorage) { + + + writeStatusCmd(outputStorage, Constants.CMD_GETVERSION, Constants.RTYPE_OK, ""); + + Storage tmp = new Storage(); + tmp.writeInt(Constants.TRACI_VERSION); + tmp.writeStringASCII("Vaderer TraCI Server" ); + + // cmdLen + cmdID + data (Int + String) + outputStorage.writeUnsignedByte(1 + 1 + tmp.size()); + outputStorage.writeUnsignedByte(Constants.CMD_GETVERSION); + for (Byte b : tmp.getStorageList()) + outputStorage.writeByte(b); + + return true; + } +} diff --git a/pom.xml b/pom.xml index 7a4152815..c92e38606 100644 --- a/pom.xml +++ b/pom.xml @@ -112,6 +112,7 @@ ./VadereMeshing ./VadereUtils ./VadereAnnotation + ./VadereManager -- GitLab From 447067aa3d37904076d538db977656b20c1cc2d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Sun, 2 Jun 2019 19:14:38 +0200 Subject: [PATCH 02/58] add TraCI{Reader,Writer}, some tests and sumo objects. --- .../src/org/vadere/manager/ClientHandler.java | 28 +- .../org/vadere/manager/CommandExecutor.java | 7 +- .../src/org/vadere/manager/TraCISocket.java | 20 +- .../vadere/manager/TraCiCommandBuilder.java | 42 ++ .../org/vadere/manager/TraCiException.java | 12 + .../vadere/manager/TraCiMessageBuilder.java | 65 ++++ .../src/org/vadere/manager/TraciCommand.java | 45 +++ .../vadere/manager/TraciMessageBuffer.java | 50 +++ .../commandHandler/CommandHandler.java | 15 +- .../commandHandler/GetVersionCmdHandler.java | 25 +- .../org/vadere/manager/stsc/ByteReader.java | 22 ++ .../org/vadere/manager/stsc/ByteWriter.java | 35 ++ .../vadere/manager/stsc/TraCIDataTypes.java | 33 ++ .../org/vadere/manager/stsc/TraCIReader.java | 176 +++++++++ .../org/vadere/manager/stsc/TraCIWriter.java | 137 +++++++ .../vadere/manager/stsc/sumo/LightPhase.java | 25 ++ .../manager/stsc/sumo/RoadMapPosition.java | 64 ++++ .../manager/stsc/sumo/TrafficLightPhase.java | 65 ++++ VadereManager/testResources/getVersionTest | 1 + VadereManager/testResources/testTCP | 2 + .../org/vadere/manager/TraCISocketTest.java | 19 + .../vadere/manager/stsc/TraCIReaderTest.java | 238 ++++++++++++ .../vadere/manager/stsc/TraCIWriterTest.java | 358 ++++++++++++++++++ 23 files changed, 1436 insertions(+), 48 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java create mode 100644 VadereManager/src/org/vadere/manager/TraCiException.java create mode 100644 VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java create mode 100644 VadereManager/src/org/vadere/manager/TraciCommand.java create mode 100644 VadereManager/src/org/vadere/manager/TraciMessageBuffer.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/ByteReader.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/ByteWriter.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIDataTypes.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIReader.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/sumo/RoadMapPosition.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/sumo/TrafficLightPhase.java create mode 100644 VadereManager/testResources/getVersionTest create mode 100644 VadereManager/testResources/testTCP create mode 100644 VadereManager/tests/org/vadere/manager/TraCISocketTest.java create mode 100644 VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java create mode 100644 VadereManager/tests/org/vadere/manager/stsc/TraCIWriterTest.java diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index eabe2a7df..6c537c7bf 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -1,14 +1,13 @@ package org.vadere.manager; -import de.tudresden.sumo.config.Constants; import de.uniluebeck.itm.tcpip.Storage; -import it.polito.appeal.traci.protocol.Command; - import org.vadere.util.logging.Logger; import java.io.IOException; import java.net.ServerSocket; +import java.util.ArrayDeque; +import java.util.Queue; public class ClientHandler implements Runnable{ @@ -36,26 +35,21 @@ public class ClientHandler implements Runnable{ public void run() { try{ - Storage myInputStorage = new Storage(); - Storage myOutputStorage = new Storage(); + Queue receivedCommands = new ArrayDeque<>(); + TraCiMessageBuilder msgBuilder = new TraCiMessageBuilder(); while (true){ - traCISocket.receiveExact(myInputStorage); - Storage copy = copy(myInputStorage); - Command cmd = new Command(copy); - logger.infof("Recieved Command: 0x%02X", cmd.id()); - boolean status =false; - if (cmd.id() == Constants.CMD_GETVERSION) - status = cmdExecutor.execute(cmd.id(), myInputStorage, myOutputStorage); + traCISocket.receiveExact(receivedCommands); - if (status){ - traCISocket.sendExact(myOutputStorage); + for(TraciCommand cmd: receivedCommands){ + logger.infof("Recieved Command: 0x%02X", cmd.getId()); + boolean status = cmdExecutor.execute(cmd, msgBuilder); + if (status){ + traCISocket.send(msgBuilder.build()); + } } - myInputStorage.reset(); - myOutputStorage.reset(); - } } catch (IOException e) { System.out.println("Exception caught when trying to listen on port " diff --git a/VadereManager/src/org/vadere/manager/CommandExecutor.java b/VadereManager/src/org/vadere/manager/CommandExecutor.java index a36e4cfe8..aa2938ba6 100644 --- a/VadereManager/src/org/vadere/manager/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/CommandExecutor.java @@ -1,7 +1,6 @@ package org.vadere.manager; import de.tudresden.sumo.config.Constants; -import de.uniluebeck.itm.tcpip.Storage; import org.vadere.manager.commandHandler.CommandHandler; import org.vadere.manager.commandHandler.GetVersionCmdHandler; @@ -20,14 +19,14 @@ public class CommandExecutor { cmdMap.put(Constants.CMD_GETVERSION, new GetVersionCmdHandler()); } - boolean execute(int cmd, Storage in, Storage out){ - CommandHandler handler = cmdMap.get(cmd); + boolean execute(TraciCommand cmd, TraCiMessageBuilder builder){ + CommandHandler handler = cmdMap.get(cmd.getId()); if (handler == null){ logger.errorf("No CommandHandler found for command: %02X", cmd); return false; } - return handler.handelCommand(in, out); + return handler.handelCommand(cmd, builder); } } diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index 7386da474..32945bc5c 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -7,6 +7,8 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; +import java.nio.ByteBuffer; +import java.util.Queue; public class TraCISocket implements Closeable { @@ -35,6 +37,10 @@ public class TraCISocket implements Closeable { outStream.write(buf); } + public void send(ByteBuffer buf) throws IOException { + outStream.write(buf.array(), buf.arrayOffset(), buf.array().length); + } + public void sendExact(final Storage storage) throws IOException{ int totalLength = TRACI_LEN_LENGTH + storage.size(); Storage length_storage = new Storage(); @@ -66,21 +72,19 @@ public class TraCISocket implements Closeable { return buf; } - public boolean receiveExact(Storage msg) throws IOException{ + public boolean receiveExact(Queue queue) throws IOException{ - Storage length_Storage = new Storage(receive(TRACI_LEN_LENGTH)); - int data_length = length_Storage.readInt() - TRACI_LEN_LENGTH; + ByteBuffer msgLength = ByteBuffer.wrap(receive(TRACI_LEN_LENGTH)); + int data_length = msgLength.getInt() - TRACI_LEN_LENGTH; assert (data_length > 0); // copy message content into msg. - byte[] data = receive(data_length); - msg.reset(); - for(byte b : data) - msg.writeByte(b); - + TraciMessageBuffer commands = TraciMessageBuffer.wrap(receive(data_length)); + TraciCommand.extractCommandsFromByteBuffer(queue, commands); return true; } + @Override public void close() throws IOException { socket.close(); diff --git a/VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java b/VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java new file mode 100644 index 000000000..d3052dbc4 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java @@ -0,0 +1,42 @@ +package org.vadere.manager; + +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; + +public class TraCiCommandBuilder extends TraCiMessageBuilder { + + public TraCiCommandBuilder(){ + reset(); + } + + @Override + void reset() { + byteArrayOutput = new ByteArrayOutputStream(); + // add 5 byte at the beginning as a placeholder for message size. + writeUnsignedByte(0); + writeInt(0); + } + + @Override + public ByteBuffer build(){ + byte[] msg = byteArrayOutput.toByteArray(); + reset(); + + ByteBuffer buffer; + if ((msg.length - 4 ) > 255){ + // use extended + buffer = ByteBuffer.wrap(msg); + buffer.put((byte) 0); + buffer.putInt(msg.length); + buffer.position(0); + } else { + buffer = ByteBuffer.wrap(msg,4, msg.length-4); + buffer.put((byte) (msg.length-4)); + buffer.position(4); + } + + return buffer; + } + + +} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/TraCiException.java b/VadereManager/src/org/vadere/manager/TraCiException.java new file mode 100644 index 000000000..35be9235a --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraCiException.java @@ -0,0 +1,12 @@ +package org.vadere.manager; + +public class TraCiException extends RuntimeException { + + public TraCiException(String message) { + super(message); + } + + public TraCiException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java b/VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java new file mode 100644 index 000000000..5282f074a --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java @@ -0,0 +1,65 @@ +package org.vadere.manager; + +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +public class TraCiMessageBuilder { + + protected ByteArrayOutputStream byteArrayOutput; + TraCiMessageBuilder(){ + reset(); + } + + void reset() { + byteArrayOutput = new ByteArrayOutputStream(); + // add 4 byte at the beginning as a placeholder for message size. + writeInt(0); + } + + public ByteBuffer build(){ + // prepend size of message. + ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutput.toByteArray()); + buffer.putInt(byteArrayOutput.size()); + buffer.position(0); + return buffer; + } + + public TraCiMessageBuilder writeUnsignedByte(int b) { + + if(b >= 0 && b <= 255){ + byteArrayOutput.write(b); + } else { + throw new IllegalArgumentException("unsigned byte must be within 0..255"); + } + + return this; + } + + public TraCiMessageBuilder writeInt(int i){ + byteArrayOutput.writeBytes(ByteBuffer.allocate(4).putInt(i).array()); + return this; + } + + + public TraCiMessageBuilder writeBytes(ByteBuffer data){ + byteArrayOutput.write(data.array(), data.arrayOffset(), data.array().length); + return this; + } + + public TraCiMessageBuilder writeBytes(byte[] data){ + byteArrayOutput.writeBytes(data); + return this; + } + + public TraCiMessageBuilder writeStringASCII(String s){ + byte[] stringBytes; + stringBytes = s.getBytes(StandardCharsets.US_ASCII); + + writeInt(stringBytes.length); + writeBytes(stringBytes); + return this; + } + + +} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/TraciCommand.java b/VadereManager/src/org/vadere/manager/TraciCommand.java new file mode 100644 index 000000000..8faafb380 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraciCommand.java @@ -0,0 +1,45 @@ +package org.vadere.manager; + +import java.nio.ByteBuffer; +import java.util.Queue; + +public class TraciCommand { + + private int id; + private ByteBuffer data; + + public TraciCommand(int id, ByteBuffer data) { + this.id = id; + this.data = data; + } + + static void extractCommandsFromByteBuffer(Queue queue, TraciMessageBuffer buf){ + + while (!buf.reachedEnd()){ + int dataLen = buf.readUnsignedByte(); + if (dataLen == 0) { // extended command length field used. + if (!buf.ensureBytes(4)) + throw new TraCiException("expected extended command format but TraciMessageBuffer is empty."); + dataLen = buf.readInt(); + dataLen -= 6; // (1 + 4) + 1 (ext. command length + id) + } else { + dataLen -= 2; // 1 + 1 (command length field + id) + } + + int cmdId = buf.readUnsignedByte(); + ByteBuffer data = dataLen > 0 ? buf.readBytes(dataLen) : null; + + queue.add(new TraciCommand(cmdId, data)); + } + } + + + public int getId() { + return id; + } + + public ByteBuffer getData() { + return data; + } + +} diff --git a/VadereManager/src/org/vadere/manager/TraciMessageBuffer.java b/VadereManager/src/org/vadere/manager/TraciMessageBuffer.java new file mode 100644 index 000000000..596c55e83 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraciMessageBuffer.java @@ -0,0 +1,50 @@ +package org.vadere.manager; + +import java.nio.ByteBuffer; + +public class TraciMessageBuffer { + + ByteBuffer data; + + + public static TraciMessageBuffer wrap(byte[] buf){ + TraciMessageBuffer msgBuf = new TraciMessageBuffer(); + msgBuf.data = ByteBuffer.wrap(buf); + return msgBuf; + } + + private TraciMessageBuffer() { } + + + /** + * Ensure that at least n bytes can be read from the Buffer. + * @param n number of bytes + */ + public boolean ensureBytes(int n){ + return (data.limit() - data.position()) >= n; + } + + public boolean reachedEnd(){ + return data.position() == data.limit(); + } + + + public ByteBuffer readBytes(int n){ + return data.get(new byte[n]); + } + + public byte readByte(){ + return data.get(); + } + + public int readUnsignedByte(){ + return data.get() & 0xff; // get byte, cast to int and return the last byte (unsigned) + } + + public int readInt(){ + return data.getInt(); + } + + + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 5eab87f38..c6da17c66 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,16 +1,17 @@ package org.vadere.manager.commandHandler; -import de.uniluebeck.itm.tcpip.Storage; +import org.vadere.manager.TraCiMessageBuilder; +import org.vadere.manager.TraciCommand; public interface CommandHandler { - boolean handelCommand(Storage inputStorage, Storage outputStorage); + boolean handelCommand(TraciCommand cmd, TraCiMessageBuilder msgBuilder); - default void writeStatusCmd(Storage storage, final int commandId, final int status, final String description){ + default void writeStatusCmd(TraCiMessageBuilder msgBuilder, final int commandId, final int status, final String description){ // cmd length (Byte) + commandId (Byte) + status (Byte) + String LenField (Integer) + dataLen (i.e. description) - storage.writeUnsignedByte( 1 + 1 + 1 + 4 + description.length()); - storage.writeUnsignedByte(commandId); - storage.writeUnsignedByte(status); - storage.writeStringASCII(description); +// msgBuilder.writeUnsignedByte( 1 + 1 + 1 + 4 + description.length()); + msgBuilder.writeUnsignedByte(0x11); + msgBuilder.writeUnsignedByte(0x22); + msgBuilder.writeStringASCII(description); } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java index fa6809fb5..d7f65510a 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java @@ -2,27 +2,28 @@ package org.vadere.manager.commandHandler; import de.tudresden.sumo.config.Constants; -import de.uniluebeck.itm.tcpip.Storage; + +import org.vadere.manager.TraCiCommandBuilder; +import org.vadere.manager.TraCiMessageBuilder; +import org.vadere.manager.TraciCommand; public class GetVersionCmdHandler implements CommandHandler{ @Override - public boolean handelCommand(Storage inputStorage, Storage outputStorage) { + public boolean handelCommand(TraciCommand cmd, TraCiMessageBuilder builder) { + + writeStatusCmd(builder, Constants.CMD_GETVERSION, Constants.RTYPE_OK, ""); - writeStatusCmd(outputStorage, Constants.CMD_GETVERSION, Constants.RTYPE_OK, ""); + TraCiCommandBuilder b = new TraCiCommandBuilder(); - Storage tmp = new Storage(); - tmp.writeInt(Constants.TRACI_VERSION); - tmp.writeStringASCII("Vaderer TraCI Server" ); +// b.writeUnsignedByte(Constants.CMD_GETVERSION); + b.writeUnsignedByte(0x33); + b.writeStringASCII("Vaderer TraCI Server"); - // cmdLen + cmdID + data (Int + String) - outputStorage.writeUnsignedByte(1 + 1 + tmp.size()); - outputStorage.writeUnsignedByte(Constants.CMD_GETVERSION); - for (Byte b : tmp.getStorageList()) - outputStorage.writeByte(b); + builder.writeBytes(b.build()); return true; } -} +} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/stsc/ByteReader.java b/VadereManager/src/org/vadere/manager/stsc/ByteReader.java new file mode 100644 index 000000000..e7c48b6b4 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/ByteReader.java @@ -0,0 +1,22 @@ +package org.vadere.manager.stsc; + +import java.nio.ByteBuffer; + +public interface ByteReader { + + + byte readByte(); + default int readUnsignedByte(){ + // (signed)byte --cast--> (signed)int --(& 0xff)--> cut highest three bytes. + // This result represents the an unsigned byte value (0..255) as an int. + return (int)readByte() & 0xff; + } + + byte[] readBytes(int num); + default ByteBuffer readByteBuffer(int num){ + return ByteBuffer.wrap(readBytes(num)); + } + + int readInt(); + double readDouble(); +} diff --git a/VadereManager/src/org/vadere/manager/stsc/ByteWriter.java b/VadereManager/src/org/vadere/manager/stsc/ByteWriter.java new file mode 100644 index 000000000..1f6548fa0 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/ByteWriter.java @@ -0,0 +1,35 @@ +package org.vadere.manager.stsc; + +import java.nio.ByteBuffer; + +public interface ByteWriter { + + void writeByte(int val); + + default void writeUnsignedByte(int val){ + if (val>= 0 && val<=255){ + writeByte(val); + } else { + throw new IllegalArgumentException( + "unsignedByte must be within (including) 0..255 but was: " + val); + } + } + void writeBytes(byte[] buf); + void writeBytes(byte[] buf, int offset, int len); + + default void writeBytes(ByteBuffer buf, int offset, int len){ + writeBytes(buf.array(), offset, len); + } + default void writeBytes(ByteBuffer buf){ + writeBytes(buf, 0, buf.array().length); + } + + default void writeInt(int val){ + writeBytes(ByteBuffer.allocate(4).putInt(val).array()); + } + + default void writeDouble(double val){ + writeBytes(ByteBuffer.allocate(8).putDouble(val).array()); + } + +} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIDataTypes.java b/VadereManager/src/org/vadere/manager/stsc/TraCIDataTypes.java new file mode 100644 index 000000000..b23a5f29d --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIDataTypes.java @@ -0,0 +1,33 @@ +package org.vadere.manager.stsc; + +public enum TraCIDataTypes { + U_BYTE(0x07, 1, true), + BYTE(0x08, 1, true), + INTEGER(0x09,4,true), + DOUBLE(0x0B,8,true), + STRING(0x0C,-1,true), + STRING_LIST(0x0E,-1,true), + COMPOUND_OBJECT(0x0F,-1,true), + POS_2D(0x01,17,false), + POS_3D(0x03,25,false), + POS_ROAD_MAP(0x04, -1,false), + POS_LON_LAT(0x00,17,false), + POS_LON_LAT_ALT(0x02, 25,false), + POLYGON(0x06,-1,false), + TRAFFIC_LIGHT_PHASE_LIST(0x0D,-1,false), + COLOR(0x11,5,false); + + + + int identifier; + int size_in_byte; + boolean isAtomar; + + + TraCIDataTypes(int identifier, int size_in_byte, boolean isAtomar){ + this.identifier = identifier; + this.size_in_byte = size_in_byte; + this.isAtomar = isAtomar; + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java new file mode 100644 index 000000000..ae20e2a61 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java @@ -0,0 +1,176 @@ +package org.vadere.manager.stsc; + +import org.vadere.manager.TraCiException; +import org.vadere.manager.stsc.sumo.LightPhase; +import org.vadere.manager.stsc.sumo.RoadMapPosition; +import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.GeometryUtils; +import org.vadere.util.geometry.Vector3D; +import org.vadere.util.geometry.shapes.IPoint; +import org.vadere.util.geometry.shapes.VPoint; +import org.vadere.util.geometry.shapes.VPolygon; + +import java.awt.*; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +public class TraCIReader implements ByteReader { + + private ByteBuffer buf; + + static TraCIReader wrap(byte[] data){ + TraCIReader traCIReader = new TraCIReader(); + traCIReader.buf = ByteBuffer.wrap(data); + return traCIReader; + } + + private TraCIReader(){ } + + @Override + public byte readByte() { + return buf.get(); + } + + @Override + public byte[] readBytes(int num) { + byte[] data = new byte[num]; + buf.get(data, 0, data.length); + return data; + } + + @Override + public int readInt() { + return buf.getInt(); + } + + @Override + public double readDouble() { + return buf.getDouble(); + } + + public String readString(){ + ensureBytes(4); + int len = buf.getInt(); + + ensureBytes(len); + byte[] stringBytes = new byte[len]; + buf.get(stringBytes, 0, stringBytes.length); + + return new String(stringBytes, StandardCharsets.US_ASCII); + } + + public List readStringList(){ + ensureBytes(4); // 1x int + int numOfStrings = buf.getInt(); + + ArrayList stringList = new ArrayList<>(); + for(int i=0; i < numOfStrings; i++){ + stringList.add(readString()); + } + + return stringList; + } + + public VPoint read2DPosition(){ + // identifier already consumed + ensureBytes(16); // 2x double + double x = buf.getDouble(); + double y = buf.getDouble(); + return new VPoint(x,y); + } + + public Vector3D read3DPosition(){ + // identifier already consumed + ensureBytes(24); // 3x double + double x = buf.getDouble(); + double y = buf.getDouble(); + double z = buf.getDouble(); + return new Vector3D(x, y, z); + } + + public RoadMapPosition readRoadMapPosition(){ + // identifier already consumed + String roadId = readString(); + ensureBytes(9); // double + ubyte + double pos = readDouble(); + int laneId = readUnsignedByte(); + return new RoadMapPosition(roadId, pos, laneId); + } + + public VPoint readLonLatPosition(){ + // identifier already consumed + ensureBytes(16); // 2x double + double lon = buf.getDouble(); + double lat = buf.getDouble(); + return new VPoint(lon, lat); + } + + public Vector3D readLonLatAltPosition(){ + // identifier already consumed + ensureBytes(24); // 3x double + double lon = buf.getDouble(); + double lat = buf.getDouble(); + double alt = buf.getDouble(); + return new Vector3D(lon, lat, alt); + } + + public VPolygon readPolygon(){ + // identifier already consumed + ensureBytes(1); // ubyte + int numberOfPoints = readUnsignedByte(); + + ensureBytes(numberOfPoints * 16); // 2x double values for each numberOfPoints + IPoint[] points = new IPoint[numberOfPoints]; + for (int i = 0; i < points.length; i++) { + double x = buf.getDouble(); + double y = buf.getDouble(); + points[i] = new VPoint(x, y); + } + return GeometryUtils.polygonFromPoints2D(points); + } + + public List readTrafficLightPhaseList(){ + // identifier already consumed + ensureBytes(1); // 1x ubyte + int numberOfPhases = readUnsignedByte(); + + ArrayList phases = new ArrayList<>(); + for (int i=0; i < numberOfPhases; i++){ + String precRoad = readString(); + String succRoad = readString(); + ensureBytes(1); // 1x ubyte + int lightPhaseId = readUnsignedByte(); + phases.add(new TrafficLightPhase(precRoad, succRoad, LightPhase.fromId(lightPhaseId))); + } + + return phases; + } + + public Color readColor(){ + // identifier already consumed + ensureBytes(4); // 4x ubyte (RGBA) + + int r = readUnsignedByte(); + int g = readUnsignedByte(); + int b = readUnsignedByte(); + int a = readUnsignedByte(); + + return new Color(r, g, b, a); + } + + + public boolean hasRemaining(){ + return buf.hasRemaining(); + } + + private void ensureBytes(int num){ + int bytesLeft = buf.limit() - buf.position(); + if (bytesLeft < num) + throw new TraCiException("Not enough bytes left." + "Expected " + num + "Bytes but only " + bytesLeft + " found."); + } + + + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java new file mode 100644 index 000000000..1d49eebe1 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java @@ -0,0 +1,137 @@ +package org.vadere.manager.stsc; + +import org.vadere.manager.TraCiException; +import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.shapes.VPoint; + +import java.awt.*; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; + +public class TraCIWriter implements ByteWriter { + + ByteArrayOutputStream data; + + + + public TraCIWriter() { + data = new ByteArrayOutputStream(); + } + + ByteBuffer asByteBuffer(){ + return ByteBuffer.wrap(data.toByteArray()); + } + + byte[] asByteArray(){ + return data.toByteArray(); + } + + void rest(){ + data.reset(); + } + + @Override + public void writeByte(int val) { + data.write(val); + } + + @Override + public void writeBytes(byte[] buf) { + data.writeBytes(buf); + } + + @Override + public void writeBytes(byte[] buf, int offset, int len) { + data.write(buf, offset, len); + } + + + public void writeString(String val){ + writeString(val, StandardCharsets.US_ASCII); + } + + public void writeStringList(List val){ + writeInt(val.size()); + val.forEach(this::writeString); + } + + private void writeString(String val, Charset c){ + byte[] byteString = val.getBytes(c); + writeInt(byteString.length); + writeBytes(byteString); + } + + public void write2DPosition(double x, double y){ + writeUnsignedByte(TraCIDataTypes.POS_2D.identifier); + writeDouble(x); + writeDouble(y); + } + + public void write3DPosition(double x, double y, double z){ + writeUnsignedByte(TraCIDataTypes.POS_3D.identifier); + writeDouble(x); + writeDouble(y); + writeDouble(z); + } + + + public void writeRoadMapPosition(String roadId, double pos, int laneId){ + writeUnsignedByte(TraCIDataTypes.POS_ROAD_MAP.identifier); + writeString(roadId); + writeDouble(pos); + writeUnsignedByte(laneId); + } + + public void writeLonLatPosition(double lon, double lat){ + writeUnsignedByte(TraCIDataTypes.POS_LON_LAT.identifier); + writeDouble(lon); + writeDouble(lat); + } + + public void writeLonLatAltPosition(double lon, double lat, double alt){ + writeUnsignedByte(TraCIDataTypes.POS_LON_LAT_ALT.identifier); + writeDouble(lon); + writeDouble(lat); + writeDouble(alt); + } + + public void writePolygon(VPoint... points){ + writePolygon(Arrays.asList(points)); + } + + public void writePolygon(List points){ + writeUnsignedByte(TraCIDataTypes.POLYGON.identifier); + if(points.size() > 255) + throw new TraCiException("Polygon to big. TraCI only supports polygon up to 255 points."); + writeUnsignedByte(points.size()); + points.forEach(p -> { + writeDouble(p.getX()); + writeDouble(p.getY()); + }); + } + + public void writeTrafficLightPhaseList(List phases){ + writeUnsignedByte(TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); + if(phases.size() > 255) + throw new TraCiException("Traffic Light Phase List to big. TraCI only supports list up to 255 elements."); + writeUnsignedByte(phases.size()); + phases.forEach( phase -> { + writeString(phase.getPrecRoad()); + writeString(phase.getSuccRoad()); + writeUnsignedByte(phase.getPhase().id); + }); + } + + public void writeColor(Color color){ + writeUnsignedByte(TraCIDataTypes.COLOR.identifier); + writeUnsignedByte(color.getRed()); + writeUnsignedByte(color.getGreen()); + writeUnsignedByte(color.getBlue()); + writeUnsignedByte(color.getAlpha()); + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java b/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java new file mode 100644 index 000000000..10cc70224 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java @@ -0,0 +1,25 @@ +package org.vadere.manager.stsc.sumo; + +public enum LightPhase { + + RED (0x01), + YELLOW (0x02), + GREEN (0x03), + OFF_BLINK (0x04), + OFF (0x05); + + + public int id; + LightPhase(int id){ + this.id = id; + } + + public static LightPhase fromId(int id){ + for (LightPhase value : values()) { + if (value.id == id) + return value; + } + throw new IllegalArgumentException("No LightPhase for id: " + id); + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/sumo/RoadMapPosition.java b/VadereManager/src/org/vadere/manager/stsc/sumo/RoadMapPosition.java new file mode 100644 index 000000000..853e848a7 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/sumo/RoadMapPosition.java @@ -0,0 +1,64 @@ +package org.vadere.manager.stsc.sumo; + +import java.util.Objects; + +public class RoadMapPosition { + + private String roadId; + private double pos; + private int laneId; + + public RoadMapPosition(String roadId, double pos, int laneId) { + this.roadId = roadId; + this.pos = pos; + this.laneId = laneId; + } + + public String getRoadId() { + return roadId; + } + + public void setRoadId(String roadId) { + this.roadId = roadId; + } + + public double getPos() { + return pos; + } + + public void setPos(double pos) { + this.pos = pos; + } + + public int getLaneId() { + return laneId; + } + + public void setLaneId(int laneId) { + this.laneId = laneId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RoadMapPosition that = (RoadMapPosition) o; + return Double.compare(that.pos, pos) == 0 && + laneId == that.laneId && + roadId.equals(that.roadId); + } + + @Override + public int hashCode() { + return Objects.hash(roadId, pos, laneId); + } + + @Override + public String toString() { + return "RoadMapPosition{" + + "roadId='" + roadId + '\'' + + ", pos=" + pos + + ", laneId=" + laneId + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/sumo/TrafficLightPhase.java b/VadereManager/src/org/vadere/manager/stsc/sumo/TrafficLightPhase.java new file mode 100644 index 000000000..0c3e68dbd --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/sumo/TrafficLightPhase.java @@ -0,0 +1,65 @@ +package org.vadere.manager.stsc.sumo; + +import java.util.Objects; + +public class TrafficLightPhase { + + private String PrecRoad; + private String SuccRoad; + private LightPhase phase; + + + public TrafficLightPhase(String precRoad, String succRoad, LightPhase phase) { + PrecRoad = precRoad; + SuccRoad = succRoad; + this.phase = phase; + } + + public String getPrecRoad() { + return PrecRoad; + } + + public void setPrecRoad(String precRoad) { + PrecRoad = precRoad; + } + + public String getSuccRoad() { + return SuccRoad; + } + + public void setSuccRoad(String succRoad) { + SuccRoad = succRoad; + } + + public LightPhase getPhase() { + return phase; + } + + public void setPhase(LightPhase phase) { + this.phase = phase; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TrafficLightPhase that = (TrafficLightPhase) o; + return PrecRoad.equals(that.PrecRoad) && + SuccRoad.equals(that.SuccRoad) && + phase == that.phase; + } + + @Override + public int hashCode() { + return Objects.hash(PrecRoad, SuccRoad, phase); + } + + @Override + public String toString() { + return "TrafficLightPhase{" + + "PrecRoad='" + PrecRoad + '\'' + + ", SuccRoad='" + SuccRoad + '\'' + + ", phase=" + phase + + '}'; + } +} diff --git a/VadereManager/testResources/getVersionTest b/VadereManager/testResources/getVersionTest new file mode 100644 index 000000000..125694dde --- /dev/null +++ b/VadereManager/testResources/getVersionTest @@ -0,0 +1 @@ +00 00 00 06 02 00 diff --git a/VadereManager/testResources/testTCP b/VadereManager/testResources/testTCP new file mode 100644 index 000000000..b3e0bd841 --- /dev/null +++ b/VadereManager/testResources/testTCP @@ -0,0 +1,2 @@ +cat getVersionTest | xxd -r -p | nc -p 9998 -o out.txt '127.0.0.1' 9999 + diff --git a/VadereManager/tests/org/vadere/manager/TraCISocketTest.java b/VadereManager/tests/org/vadere/manager/TraCISocketTest.java new file mode 100644 index 000000000..11f965b49 --- /dev/null +++ b/VadereManager/tests/org/vadere/manager/TraCISocketTest.java @@ -0,0 +1,19 @@ +package org.vadere.manager; + +import org.junit.Test; + +public class TraCISocketTest { + + @Test + public void unisgnedChar(){ + int a = 130; + byte b = (byte)a; + byte c = (byte)(a - 256); + + System.out.printf("%032X %d\n", a, a); + System.out.printf("%032X %d\n", b, b); + System.out.printf("%032X %d\n", c, c); + System.out.println("xxx"); + } + +} \ No newline at end of file diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java new file mode 100644 index 000000000..bd5e1fc00 --- /dev/null +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java @@ -0,0 +1,238 @@ +package org.vadere.manager.stsc; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.vadere.manager.stsc.sumo.LightPhase; +import org.vadere.manager.stsc.sumo.RoadMapPosition; +import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.GeometryUtils; +import org.vadere.util.geometry.Vector3D; +import org.vadere.util.geometry.shapes.VPoint; +import org.vadere.util.geometry.shapes.VPolygon; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + +public class TraCIReaderTest { + + TraCIWriter writer; + TraCIReader reader; + + @Before + public void before(){ + writer = new TraCIWriter(); + } + + @After + public void after(){ + writer.rest(); + } + + private void createReader(){ + reader = TraCIReader.wrap(writer.asByteArray()); + } + + private void checkEmpty(){ + assertThat("TraCIReader must be empty at this point", reader.hasRemaining(), equalTo(false)); + } + + private void checkIdentifier( int matchWith){ + int identifier = reader.readUnsignedByte(); + assertThat("Wrong Identifer", identifier, equalTo(matchWith)); + } + + @Test + public void readByte() { + writer.writeByte(33); + createReader(); + + assertThat(reader.readByte(), equalTo((byte)33)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readBytes() { + byte[] data = new byte[]{22, 33, 44}; + writer.writeBytes(data); + createReader(); + + assertThat(reader.readBytes(3), equalTo(data)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readInt() { + writer.writeInt(3); + writer.writeInt(99); + createReader(); + + assertThat(reader.readInt(), equalTo(3)); + assertThat(reader.readInt(), equalTo(99)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readDouble() { + writer.writeDouble(3.1415); + createReader(); + + assertThat(reader.readDouble(), equalTo(3.1415)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readString() { + writer.writeString("Hello World from Vadere"); + createReader(); + + assertThat(reader.readString(), equalTo("Hello World from Vadere")); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readStringList() { + List strList = new ArrayList<>(); + strList.add("Hello World!"); + strList.add("Goodbye World."); + writer.writeStringList(strList); + createReader(); + + List strListOut = reader.readStringList(); + assertThat(strListOut, equalTo(strList)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void read2DPosition() { + writer.write2DPosition(22.3, 4.0); + createReader(); + + checkIdentifier(TraCIDataTypes.POS_2D.identifier); + VPoint p = reader.read2DPosition(); + assertThat(p.x, equalTo(22.3)); + assertThat(p.y, equalTo(4.0)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void read3DPosition() { + writer.write3DPosition(11.1, 22.2, 33.3); + createReader(); + + checkIdentifier(TraCIDataTypes.POS_3D.identifier); + Vector3D vec = reader.read3DPosition(); + assertThat(vec.x, equalTo(11.1)); + assertThat(vec.y, equalTo(22.2)); + assertThat(vec.z, equalTo(33.3)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readRoadMapPosition() { + writer.writeRoadMapPosition("road_001", 12.5, 0); + createReader(); + + checkIdentifier(TraCIDataTypes.POS_ROAD_MAP.identifier); + RoadMapPosition roadMapPosition = reader.readRoadMapPosition(); + assertThat(roadMapPosition.getRoadId(), equalTo("road_001")); + assertThat(roadMapPosition.getPos(), equalTo(12.5)); + assertThat(roadMapPosition.getLaneId(), equalTo(0)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readLonLatPosition() { + writer.writeLonLatPosition(23.3, 11.9); + createReader(); + + checkIdentifier(TraCIDataTypes.POS_LON_LAT.identifier); + VPoint lonLat = reader.readLonLatPosition(); + assertThat(lonLat.x, equalTo(23.3)); + assertThat(lonLat.y, equalTo(11.9)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readLonLatAltPosition() { + writer.writeLonLatAltPosition(34.5, 34.0, 11.3436); + createReader(); + + checkIdentifier(TraCIDataTypes.POS_LON_LAT_ALT.identifier); + Vector3D lonlatalt = reader.readLonLatAltPosition(); + assertThat(lonlatalt.x, equalTo(34.5)); + assertThat(lonlatalt.y, equalTo(34.0)); + assertThat(lonlatalt.z, equalTo(11.3436)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readPolygon() { + VPoint[] points = new VPoint[]{new VPoint(4.4, 2.4), new VPoint(11.3, 34.0)}; + writer.writePolygon(points); + createReader(); + + VPolygon match = GeometryUtils.polygonFromPoints2D(points); + checkIdentifier(TraCIDataTypes.POLYGON.identifier); + VPolygon actual = reader.readPolygon(); + assertThat(actual, equalTo(match)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readTrafficLightPhaseList() { + List phases = new ArrayList<>(); + phases.add(new TrafficLightPhase("r001", "r002", LightPhase.OFF_BLINK)); + phases.add(new TrafficLightPhase("r004", "r099", LightPhase.RED)); + writer.writeTrafficLightPhaseList(phases); + createReader(); + + checkIdentifier(TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); + List actualPhases = reader.readTrafficLightPhaseList(); + assertThat(actualPhases, equalTo(phases)); + + // buf must be empty + checkEmpty(); + } + + @Test + public void readColor() { + Color color = new Color(3,4,5,9); + writer.writeColor(color); + createReader(); + + checkIdentifier(TraCIDataTypes.COLOR.identifier); + assertThat(reader.readColor(), equalTo(color)); + + // buf must be empty + checkEmpty(); + } +} \ No newline at end of file diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterTest.java new file mode 100644 index 000000000..fd568415b --- /dev/null +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterTest.java @@ -0,0 +1,358 @@ +package org.vadere.manager.stsc; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.vadere.manager.TraCiException; +import org.vadere.manager.stsc.sumo.LightPhase; +import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.shapes.VPoint; + +import java.awt.*; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.stream.IntStream; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + +public class TraCIWriterTest { + + TraCIWriter writer; + + @Before + public void before(){ + writer = new TraCIWriter(); + } + + @After + public void after(){ + writer.rest(); + } + + @Test + public void getAsByteBuffer() { + ByteBuffer buf = writer.asByteBuffer(); + assertThat(buf.limit(), equalTo(0)); + } + + @Test + public void getAsByteArray() { + byte[] buf = writer.asByteArray(); + assertThat(buf.length, equalTo(0)); + + } + + @Test + public void writeByte() { + writer.writeByte(33); + writer.writeByte(-33); + writer.writeByte(0); + + byte[] buf = writer.asByteArray(); + + assertThat(buf.length, equalTo(3)); + assertThat(buf[0], equalTo((byte)33)); + assertThat(buf[1], equalTo((byte)-33)); + assertThat(buf[2], equalTo((byte)0)); + } + + + @Test + public void writeUnsignedByte() { + writer.writeUnsignedByte(33); + writer.writeUnsignedByte(200); + writer.writeUnsignedByte(0); + + byte[] buf = writer.asByteArray(); + + assertThat(buf.length, equalTo(3)); + assertThat((int)buf[0] & 0xff, equalTo(33)); + assertThat((int)buf[1] & 0xff, equalTo(200)); + assertThat((int)buf[2] & 0xff, equalTo(0)); + } + + @Test(expected = IllegalArgumentException.class) + public void writeUnsignedByte1() { + writer.writeUnsignedByte(999); + } + + @Test + public void writeBytes() { + byte[] dataIn = new byte[]{18,19, 20}; + + writer.writeBytes(dataIn); + + byte[] dataOut = writer.asByteArray(); + assertThat(dataOut, equalTo(dataIn)); + } + + @Test + public void writeBytes1() { + byte[] dataIn = new byte[]{18, 19, 20, 21, 22}; + + writer.writeBytes(dataIn, 1, 2); + + byte[] dataOut = writer.asByteArray(); + assertThat(dataOut, equalTo(new byte[]{19, 20} )); + + } + + @Test + public void writeString() { + String str = "Hello World !"; + int strLen = str.getBytes(StandardCharsets.US_ASCII).length; + + + writer.writeString(str); + ByteBuffer buf = writer.asByteBuffer(); + + // preceding int value holding length of string + assertThat(buf.capacity(), equalTo(4 + strLen)); + + checkString(buf, str); + + // buf must be empty + checkEmpty(buf); + } + + @Test + public void writeStringList() { + String s1 = "Hello World."; + int strLen1 = s1.getBytes(StandardCharsets.US_ASCII).length; + String s2 = "Hello TraCI from Vadere."; + int strLen2 = s2.getBytes(StandardCharsets.US_ASCII).length; + + ArrayList stringList = new ArrayList<>(); + stringList.add(s1); + stringList.add(s2); + + writer.writeStringList(stringList); + + ByteBuffer buf = writer.asByteBuffer(); + + assertThat(buf.capacity(), equalTo(4 + 4 + strLen1 + 4 + strLen2)); + // number of strings + assertThat(buf.getInt(), equalTo(2)); + + // check first string + checkString(buf, s1); + + // check second string + checkString(buf, s2); + + // must be empty + checkEmpty(buf); + } + + @Test + public void write2DPosition() { + writer.write2DPosition(23.456,3.3); + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.POS_2D.identifier); + + // check x, y + assertThat(buf.getDouble(), equalTo(23.456)); + assertThat(buf.getDouble(), equalTo(3.3)); + + // buf must be empty + checkEmpty(buf); + } + + @Test + public void write3DPosition() { + writer.write3DPosition(3.34, 12.33, 56.8889); + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.POS_3D.identifier); + + // check x, y, z + assertThat(buf.getDouble(), equalTo(3.34)); + assertThat(buf.getDouble(), equalTo(12.33)); + assertThat(buf.getDouble(), equalTo(56.8889)); + + // buf must be empty + checkEmpty(buf); + } + + @Test + public void writeRoadMapPosition() { + + writer.writeRoadMapPosition("r001", 12.4, 3); + int roadIdLen = "r001".getBytes(StandardCharsets.US_ASCII).length; + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.POS_ROAD_MAP.identifier); + + // check roadId + checkString(buf, "r001"); + + // check pos + assertThat(buf.getDouble(), equalTo(12.4)); + + // check laneId (ubyte) + assertThat(buf.get() & 0xff, equalTo(3)); + + // buf must be empty + checkEmpty(buf); + } + + @Test + public void writeLonLatPosition() { + writer.writeLonLatPosition(49.3345, 10.10453); + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.POS_LON_LAT.identifier); + + // check lon, lat + assertThat(buf.getDouble(), equalTo(49.3345)); + assertThat(buf.getDouble(), equalTo(10.10453)); + + // buf must be empty + checkEmpty(buf); + } + + @Test + public void writeLonLatAltPosition() { + writer.writeLonLatAltPosition(49.33, 15.223, 12.33); + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.POS_LON_LAT_ALT.identifier); + + // check lon, lat, alt + assertThat(buf.getDouble(), equalTo(49.33)); + assertThat(buf.getDouble(), equalTo(15.223)); + assertThat(buf.getDouble(), equalTo(12.33)); + + // buf must be empty + checkEmpty(buf); + } + + @Test(expected = TraCiException.class) + public void writePolygonWithError(){ + ArrayList points = new ArrayList<>(); + IntStream.range(0, 300).forEach( i -> points.add(new VPoint(i,i))); + + writer.writePolygon(points); + } + + @Test + public void writePolygon() { + ArrayList points = new ArrayList<>(); + points.add(new VPoint(3.3, 4.4)); + points.add(new VPoint(5.0, 10.0)); + points.add(new VPoint(10.1, 1.0)); + + writer.writePolygon(points); + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.POLYGON.identifier); + + // check number of points (ubyte) + assertThat(buf.get() & 0xff, equalTo(3)); + + // check x,y for each point + assertThat(buf.getDouble(), equalTo(3.3)); + assertThat(buf.getDouble(), equalTo(4.4)); + + assertThat(buf.getDouble(), equalTo(5.0)); + assertThat(buf.getDouble(), equalTo(10.0)); + + assertThat(buf.getDouble(), equalTo(10.1)); + assertThat(buf.getDouble(), equalTo(1.0)); + + // buf must be empty + checkEmpty(buf); + } + + + @Test(expected = TraCiException.class) + public void writeTrafficLightPhaseListError(){ + ArrayList phases = new ArrayList<>(); + IntStream.range(0, 256) + .forEach( i -> phases.add( + new TrafficLightPhase("", "", + LightPhase.GREEN))); + writer.writeTrafficLightPhaseList(phases); + } + + @Test + public void writeTrafficLightPhaseList() { + ArrayList phases = new ArrayList<>(); + + phases.add(new TrafficLightPhase("road001", "road002", + LightPhase.GREEN)); + writer.writeTrafficLightPhaseList(phases); + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); + + // check number of phases + assertThat(buf.get() & 0xff, equalTo(1)); + + // check precRoad and succRoad + checkString(buf, "road001"); + checkString(buf, "road002"); + + // check phase + assertThat(buf.get() & 0xff, equalTo(LightPhase.GREEN.id)); + + // buf must be empty + checkEmpty(buf); + } + + @Test + public void writeColor() { + writer.writeColor(new Color(10, 20, 40, 50)); + ByteBuffer buf = writer.asByteBuffer(); + + // identifier (ubyte) + checkIdentifier(buf.get(), TraCIDataTypes.COLOR.identifier); + + // check color rgba + assertThat(buf.get() & 0xff, equalTo(10) ); + assertThat(buf.get() & 0xff, equalTo(20) ); + assertThat(buf.get() & 0xff, equalTo(40) ); + assertThat(buf.get() & 0xff, equalTo(50) ); + + // buf must be empty + checkEmpty(buf); + } + + + private void checkString(ByteBuffer buf, String str){ + + int byteLen = str.getBytes(StandardCharsets.US_ASCII).length; + byte[] matchWith = str.getBytes(StandardCharsets.US_ASCII); + + // string length + assertThat("String length wrong", buf.getInt(), equalTo(byteLen)); + + byte[] actual = getBytes(buf, byteLen); + assertThat("String bytes do not match", actual, equalTo(matchWith)); + } + + private byte[] getBytes(ByteBuffer buf, int len){ + byte[] bytes = new byte[len]; + buf.get(bytes, 0, bytes.length); + return bytes; + } + + + private void checkIdentifier(byte actual, int matchWith){ + assertThat("Wrong Identifer", (int)actual & 0xff, equalTo(matchWith)); + } + + private void checkEmpty(ByteBuffer buf){ + assertThat("Buffer must be empty at this point",buf.hasRemaining(), equalTo(false)); + } +} \ No newline at end of file -- GitLab From 28b3fe6eeab941d42868ad4220c1f3f6bb3326b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Mon, 3 Jun 2019 16:15:14 +0200 Subject: [PATCH 03/58] add TraCI Buffers --- VadereManager/resources/log4j2.properties | 2 +- .../src/org/vadere/manager/ClientHandler.java | 103 +++++++--- .../org/vadere/manager/CommandExecutor.java | 7 +- .../src/org/vadere/manager/TraCICommand.java | 20 ++ .../src/org/vadere/manager/TraCISocket.java | 45 ++--- .../src/org/vadere/manager/TraciCommand.java | 45 ----- .../commandHandler/CommandHandler.java | 13 +- .../commandHandler/GetVersionCmdHandler.java | 24 +-- .../src/org/vadere/manager/stsc/Packet.java | 8 + .../org/vadere/manager/stsc/TraCIBuffer.java | 21 +++ .../manager/stsc/TraCICommandBuffer.java | 37 ++++ .../manager/stsc/TraCIOutputWriter.java | 177 ++++++++++++++++++ .../org/vadere/manager/stsc/TraCIPacket.java | 95 ++++++++++ .../manager/stsc/TraCIPacketBuffer.java | 52 +++++ .../org/vadere/manager/stsc/TraCIReader.java | 7 + .../manager/stsc/TraCIStatusResponse.java | 15 ++ .../org/vadere/manager/stsc/TraCIWriter.java | 154 +++------------ ...erTest.java => TraCIOutputWriterTest.java} | 20 +- .../vadere/manager/stsc/TraCIReaderTest.java | 4 +- 19 files changed, 596 insertions(+), 253 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/TraCICommand.java delete mode 100644 VadereManager/src/org/vadere/manager/TraciCommand.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/Packet.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIOutputWriter.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java rename VadereManager/tests/org/vadere/manager/stsc/{TraCIWriterTest.java => TraCIOutputWriterTest.java} (96%) diff --git a/VadereManager/resources/log4j2.properties b/VadereManager/resources/log4j2.properties index 5099ddeef..8b731b846 100644 --- a/VadereManager/resources/log4j2.properties +++ b/VadereManager/resources/log4j2.properties @@ -1,6 +1,6 @@ name=PropertiesConfig property.logname = log.out -property.loglevel = INFO +property.loglevel = DEBUG appenders = console, file diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index 6c537c7bf..28236a5b1 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -1,13 +1,12 @@ package org.vadere.manager; -import de.uniluebeck.itm.tcpip.Storage; - +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.TraCIPacketBuffer; import org.vadere.util.logging.Logger; +import java.io.EOFException; import java.io.IOException; import java.net.ServerSocket; -import java.util.ArrayDeque; -import java.util.Queue; public class ClientHandler implements Runnable{ @@ -16,46 +15,102 @@ public class ClientHandler implements Runnable{ private final ServerSocket serverSocket; private final TraCISocket traCISocket; private final CommandExecutor cmdExecutor; +// private final OutputQueue outputQueue; public ClientHandler(ServerSocket serverSocket, TraCISocket traCISocket) { this.serverSocket = serverSocket; this.traCISocket = traCISocket; this.cmdExecutor = new CommandExecutor(); +// this.outputQueue = new OutputQueue(); +// this.outputQueue.start(); } - Storage copy(Storage s){ - byte[] data = new byte[s.size() - s.position()]; - for(int i=s.position(); i receivedCommands = new ArrayDeque<>(); - TraCiMessageBuilder msgBuilder = new TraCiMessageBuilder(); + } + private void handleClient() throws IOException{ + try{ while (true){ - traCISocket.receiveExact(receivedCommands); + TraCIPacketBuffer traCIPacketBuffer = traCISocket.receiveExact(); + + if (traCIPacketBuffer.hasRemaining()){ + TraCICommand cmd = traCIPacketBuffer.nextCommand(); + while (cmd != null ){ + - for(TraciCommand cmd: receivedCommands){ - logger.infof("Recieved Command: 0x%02X", cmd.getId()); - boolean status = cmdExecutor.execute(cmd, msgBuilder); - if (status){ - traCISocket.send(msgBuilder.build()); + TraCIPacket response = cmdExecutor.execute(cmd); + logger.debugf("send packet with %d byte", response.size()); + traCISocket.sendExact(response); +// outputQueue.put(response); + + cmd = traCIPacketBuffer.nextCommand(); } } } - } catch (IOException e) { - System.out.println("Exception caught when trying to listen on port " - + 9999 + " or listening for a connection"); - System.out.println(e.getMessage()); + } finally { + traCISocket.close(); } } + +// private class OutputQueue extends Thread{ +// +// +// private BlockingQueue packets; +// private boolean running; +// +// OutputQueue(){ +// packets = new ArrayBlockingQueue<>(30); +// running = true; +// } +// +// public void put(TraCIPacket packet){ +// try { +// packets.put(packet); +// } catch (InterruptedException e) { +// cancel(); +// Thread.currentThread().interrupt(); +// } +// } +// +// public void cancel(){ +// running = false; +// } +// +// @Override +// public void run(){ +// logger.info("Start output thread...."); +// try { +// while (running){ +// TraCIPacket packet = packets.take(); +// System.out.println("send package"); +// traCISocket.sendExact(packet); +// +// if (Thread.currentThread().isInterrupted()) +// running = false; +// } +// } catch (InterruptedException interEx) { +// Thread.currentThread().interrupt(); +// } catch (IOException e) { +// logger.error("Error sending TraciMessage",e); +// } finally { +// if (packets.size() > 0) +// logger.warnf("Stop sending data with %d packet left in queue. Deleting packets..."); +// +// } +// } +// } } diff --git a/VadereManager/src/org/vadere/manager/CommandExecutor.java b/VadereManager/src/org/vadere/manager/CommandExecutor.java index aa2938ba6..f172e57f9 100644 --- a/VadereManager/src/org/vadere/manager/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/CommandExecutor.java @@ -4,6 +4,7 @@ import de.tudresden.sumo.config.Constants; import org.vadere.manager.commandHandler.CommandHandler; import org.vadere.manager.commandHandler.GetVersionCmdHandler; +import org.vadere.manager.stsc.TraCIPacket; import org.vadere.util.logging.Logger; import java.util.HashMap; @@ -19,14 +20,14 @@ public class CommandExecutor { cmdMap.put(Constants.CMD_GETVERSION, new GetVersionCmdHandler()); } - boolean execute(TraciCommand cmd, TraCiMessageBuilder builder){ + TraCIPacket execute(TraCICommand cmd){ CommandHandler handler = cmdMap.get(cmd.getId()); if (handler == null){ logger.errorf("No CommandHandler found for command: %02X", cmd); - return false; + return null; } - return handler.handelCommand(cmd, builder); + return handler.handelCommand(cmd); } } diff --git a/VadereManager/src/org/vadere/manager/TraCICommand.java b/VadereManager/src/org/vadere/manager/TraCICommand.java new file mode 100644 index 000000000..de01e928e --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraCICommand.java @@ -0,0 +1,20 @@ +package org.vadere.manager; + +import org.vadere.manager.stsc.TraCICommandBuffer; + +public class TraCICommand { + + private int id; + private TraCICommandBuffer data; + + public TraCICommand(TraCICommandBuffer buff) { + this.id = buff.readCmdIdentifier(); + this.data = buff; + } + + + public int getId() { + return id; + } + +} diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index 32945bc5c..79b924eaa 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -1,6 +1,7 @@ package org.vadere.manager; -import de.uniluebeck.itm.tcpip.Storage; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.TraCIPacketBuffer; import java.io.Closeable; import java.io.DataInputStream; @@ -8,7 +9,7 @@ import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.nio.ByteBuffer; -import java.util.Queue; +import java.util.Arrays; public class TraCISocket implements Closeable { @@ -33,34 +34,22 @@ public class TraCISocket implements Closeable { return socket.isConnected(); } - public void send(final byte[] buf) throws IOException { + // send // + + private void send(final byte[] buf) throws IOException { outStream.write(buf); } - public void send(ByteBuffer buf) throws IOException { + private void send(ByteBuffer buf) throws IOException { outStream.write(buf.array(), buf.arrayOffset(), buf.array().length); } - public void sendExact(final Storage storage) throws IOException{ - int totalLength = TRACI_LEN_LENGTH + storage.size(); - Storage length_storage = new Storage(); - length_storage.writeInt(totalLength); - - byte[] data = new byte[totalLength]; - int n = 0; - // write length of total package - for(Byte b : length_storage.getStorageList()){ - data[n++] = b; - } - // write data - for(Byte b : storage.getStorageList()){ - data[n++] = b; - } - - send(data); + public void sendExact(final TraCIPacket packet) throws IOException{ + send(packet.send()); } + // receive // public void receiveComplete(byte[] buf, int len) throws IOException { inStream.readFully(buf, 0, len); @@ -72,16 +61,18 @@ public class TraCISocket implements Closeable { return buf; } - public boolean receiveExact(Queue queue) throws IOException{ + public TraCIPacketBuffer receiveExact() throws IOException{ + // read first 4 bytes (containing TracCI packet length) ByteBuffer msgLength = ByteBuffer.wrap(receive(TRACI_LEN_LENGTH)); int data_length = msgLength.getInt() - TRACI_LEN_LENGTH; - assert (data_length > 0); - // copy message content into msg. - TraciMessageBuffer commands = TraciMessageBuffer.wrap(receive(data_length)); - TraciCommand.extractCommandsFromByteBuffer(queue, commands); - return true; + if (data_length <=0){ + return TraCIPacketBuffer.empty(); + } else { + byte[] data = receive(data_length); + return TraCIPacketBuffer.wrap(data); + } } diff --git a/VadereManager/src/org/vadere/manager/TraciCommand.java b/VadereManager/src/org/vadere/manager/TraciCommand.java deleted file mode 100644 index 8faafb380..000000000 --- a/VadereManager/src/org/vadere/manager/TraciCommand.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.vadere.manager; - -import java.nio.ByteBuffer; -import java.util.Queue; - -public class TraciCommand { - - private int id; - private ByteBuffer data; - - public TraciCommand(int id, ByteBuffer data) { - this.id = id; - this.data = data; - } - - static void extractCommandsFromByteBuffer(Queue queue, TraciMessageBuffer buf){ - - while (!buf.reachedEnd()){ - int dataLen = buf.readUnsignedByte(); - if (dataLen == 0) { // extended command length field used. - if (!buf.ensureBytes(4)) - throw new TraCiException("expected extended command format but TraciMessageBuffer is empty."); - dataLen = buf.readInt(); - dataLen -= 6; // (1 + 4) + 1 (ext. command length + id) - } else { - dataLen -= 2; // 1 + 1 (command length field + id) - } - - int cmdId = buf.readUnsignedByte(); - ByteBuffer data = dataLen > 0 ? buf.readBytes(dataLen) : null; - - queue.add(new TraciCommand(cmdId, data)); - } - } - - - public int getId() { - return id; - } - - public ByteBuffer getData() { - return data; - } - -} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index c6da17c66..69e3639f9 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,17 +1,10 @@ package org.vadere.manager.commandHandler; -import org.vadere.manager.TraCiMessageBuilder; -import org.vadere.manager.TraciCommand; +import org.vadere.manager.TraCICommand; +import org.vadere.manager.stsc.TraCIPacket; public interface CommandHandler { - boolean handelCommand(TraciCommand cmd, TraCiMessageBuilder msgBuilder); + TraCIPacket handelCommand(TraCICommand cmd); - default void writeStatusCmd(TraCiMessageBuilder msgBuilder, final int commandId, final int status, final String description){ - // cmd length (Byte) + commandId (Byte) + status (Byte) + String LenField (Integer) + dataLen (i.e. description) -// msgBuilder.writeUnsignedByte( 1 + 1 + 1 + 4 + description.length()); - msgBuilder.writeUnsignedByte(0x11); - msgBuilder.writeUnsignedByte(0x22); - msgBuilder.writeStringASCII(description); - } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java index d7f65510a..fefe5f83a 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java @@ -3,27 +3,29 @@ package org.vadere.manager.commandHandler; import de.tudresden.sumo.config.Constants; -import org.vadere.manager.TraCiCommandBuilder; -import org.vadere.manager.TraCiMessageBuilder; -import org.vadere.manager.TraciCommand; +import org.vadere.manager.TraCICommand; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.TraCIWriter; public class GetVersionCmdHandler implements CommandHandler{ @Override - public boolean handelCommand(TraciCommand cmd, TraCiMessageBuilder builder) { + public TraCIPacket handelCommand(TraCICommand cmd) { - writeStatusCmd(builder, Constants.CMD_GETVERSION, Constants.RTYPE_OK, ""); + TraCIPacket response = TraCIPacket.createDynamicPacket(); - TraCiCommandBuilder b = new TraCiCommandBuilder(); + response.add_OK_StatusResponse(Constants.CMD_GETVERSION); -// b.writeUnsignedByte(Constants.CMD_GETVERSION); - b.writeUnsignedByte(0x33); - b.writeStringASCII("Vaderer TraCI Server"); + TraCIWriter writer = response.getWriter(); - builder.writeBytes(b.build()); + int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); + writer.writeCommandLength(cmdLen); // 1b or 5b + writer.writeInt(Constants.CMD_GETVERSION); // 1b + writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b + writer.writeString("Vaderer TraCI Server"); // 4b + X - return true; + return response; } } \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/stsc/Packet.java b/VadereManager/src/org/vadere/manager/stsc/Packet.java new file mode 100644 index 000000000..21442222e --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/Packet.java @@ -0,0 +1,8 @@ +package org.vadere.manager.stsc; + +public abstract class Packet { + + + public abstract byte[] send(); + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java b/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java new file mode 100644 index 000000000..c403b9e66 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java @@ -0,0 +1,21 @@ +package org.vadere.manager.stsc; + +import java.nio.ByteBuffer; + +public abstract class TraCIBuffer { + + protected TraCIReader buffer; + + protected TraCIBuffer (byte[] buf){ + buffer = TraCIReader.wrap(buf); + } + + protected TraCIBuffer (ByteBuffer buf){ + buffer = TraCIReader.wrap(buf); + } + + + public boolean hasRemaining(){ + return buffer.hasRemaining(); + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java b/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java new file mode 100644 index 000000000..42d1cc05d --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java @@ -0,0 +1,37 @@ +package org.vadere.manager.stsc; + +import java.nio.ByteBuffer; + +public class TraCICommandBuffer extends TraCIBuffer{ + + private boolean cmdIdentifierRead; + + public static TraCICommandBuffer wrap(byte[] buf){ + return new TraCICommandBuffer(buf); + } + + public static TraCICommandBuffer wrap(ByteBuffer buf){ + return new TraCICommandBuffer(buf); + } + + protected TraCICommandBuffer(byte[] buf) { + super(buf); + cmdIdentifierRead = false; + } + + protected TraCICommandBuffer(ByteBuffer buf) { + super(buf); + cmdIdentifierRead = false; + } + + + public int readCmdIdentifier(){ + if (cmdIdentifierRead) + throw new IllegalStateException("TraCI Command Identifier already consumed. readCmdIdentifier() must only be called once. Something went wrong in the TraCI message handling."); + + cmdIdentifierRead = true; + return buffer.readUnsignedByte(); + } + + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIOutputWriter.java b/VadereManager/src/org/vadere/manager/stsc/TraCIOutputWriter.java new file mode 100644 index 000000000..31796cbd4 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIOutputWriter.java @@ -0,0 +1,177 @@ +package org.vadere.manager.stsc; + +import org.vadere.manager.TraCiException; +import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.shapes.VPoint; + +import java.awt.*; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; + +public class TraCIOutputWriter implements TraCIWriter { + + ByteArrayOutputStream data; + + + + public TraCIOutputWriter() { + data = new ByteArrayOutputStream(); + } + + ByteBuffer asByteBuffer(){ + return ByteBuffer.wrap(data.toByteArray()); + } + + byte[] asByteArray(){ + return data.toByteArray(); + } + + void rest(){ + data.reset(); + } + + @Override + public void writeByte(int val) { + data.write(val); + } + + @Override + public void writeBytes(byte[] buf) { + data.writeBytes(buf); + } + + @Override + public void writeBytes(byte[] buf, int offset, int len) { + data.write(buf, offset, len); + } + + + @Override + public void writeString(String val){ + writeString(val, StandardCharsets.US_ASCII); + } + + @Override + public void writeStringList(List val){ + writeInt(val.size()); + val.forEach(this::writeString); + } + + private void writeString(String val, Charset c){ + byte[] byteString = val.getBytes(c); + writeInt(byteString.length); + if (byteString.length > 0) + writeBytes(byteString); + } + + @Override + public void write2DPosition(double x, double y){ + writeUnsignedByte(TraCIDataTypes.POS_2D.identifier); + writeDouble(x); + writeDouble(y); + } + + @Override + public void write3DPosition(double x, double y, double z){ + writeUnsignedByte(TraCIDataTypes.POS_3D.identifier); + writeDouble(x); + writeDouble(y); + writeDouble(z); + } + + + @Override + public void writeRoadMapPosition(String roadId, double pos, int laneId){ + writeUnsignedByte(TraCIDataTypes.POS_ROAD_MAP.identifier); + writeString(roadId); + writeDouble(pos); + writeUnsignedByte(laneId); + } + + @Override + public void writeLonLatPosition(double lon, double lat){ + writeUnsignedByte(TraCIDataTypes.POS_LON_LAT.identifier); + writeDouble(lon); + writeDouble(lat); + } + + @Override + public void writeLonLatAltPosition(double lon, double lat, double alt){ + writeUnsignedByte(TraCIDataTypes.POS_LON_LAT_ALT.identifier); + writeDouble(lon); + writeDouble(lat); + writeDouble(alt); + } + + @Override + public void writePolygon(VPoint... points){ + writePolygon(Arrays.asList(points)); + } + + @Override + public void writePolygon(List points){ + writeUnsignedByte(TraCIDataTypes.POLYGON.identifier); + if(points.size() > 255) + throw new TraCiException("Polygon to big. TraCI only supports polygon up to 255 points."); + writeUnsignedByte(points.size()); + points.forEach(p -> { + writeDouble(p.getX()); + writeDouble(p.getY()); + }); + } + + @Override + public void writeTrafficLightPhaseList(List phases){ + writeUnsignedByte(TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); + if(phases.size() > 255) + throw new TraCiException("Traffic Light Phase List to big. TraCI only supports list up to 255 elements."); + writeUnsignedByte(phases.size()); + phases.forEach( phase -> { + writeString(phase.getPrecRoad()); + writeString(phase.getSuccRoad()); + writeUnsignedByte(phase.getPhase().id); + }); + } + + @Override + public void writeColor(Color color){ + writeUnsignedByte(TraCIDataTypes.COLOR.identifier); + writeUnsignedByte(color.getRed()); + writeUnsignedByte(color.getGreen()); + writeUnsignedByte(color.getBlue()); + writeUnsignedByte(color.getAlpha()); + } + + @Override + public int stringByteCount(String str) { + return str.getBytes(StandardCharsets.US_ASCII).length; + } + + /** + * Check if the given cmdLen fits into a single byte. If not use the extended + * cmdLen format which nulls the first byte and introduces a int field for the + * cmdLen. + * + * @param cmdLen number of bytes of command *including* one byte for the cmdLen field. + */ + @Override + public void writeCommandLength(int cmdLen) { + + if (cmdLen <= 255){ // + writeUnsignedByte(cmdLen); + } else { + // use extended cmdLen field (+4 byte) + cmdLen += 4; + writeUnsignedByte(0); // first byte must be null + writeInt(cmdLen); // write cmdLen as integer + } + } + + public int size(){ + return data.size(); + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java new file mode 100644 index 000000000..9a8cba1a3 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java @@ -0,0 +1,95 @@ +package org.vadere.manager.stsc; + +import java.nio.ByteBuffer; + +public class TraCIPacket extends Packet { + + private TraCIOutputWriter data; + private boolean containsLengthField; + + + public static TraCIPacket createDynamicPacket(){ + return new TraCIPacket().setLength(-1); + } + + public static TraCIPacket createFixedPacket(int len){ + return new TraCIPacket().setLength(len); + } + + private TraCIPacket() { + data = new TraCIOutputWriter(); + } + + + + public TraCIPacket reset(){ + data.rest(); + return this; + } + + private TraCIPacket setLength(int len){ + data.writeInt(len); + containsLengthField = len != -1; + return this; + } + + public boolean isContainsLengthField() { + return containsLengthField; + } + + @Override + public byte[] send() { + + if (containsLengthField) + return data.asByteArray(); + + + ByteBuffer packet = data.asByteBuffer(); + // write final message length field at start of packet. + packet.putInt(packet.capacity()); + + return packet.array(); + } + + public TraCIPacket addCommand(ByteBuffer buf){ + data.writeBytes(buf); + return this; + } + + public TraCIPacket addCommand(byte[] buf){ + data.writeBytes(buf); + return this; + } + + public TraCIPacket add_OK_StatusResponse(int cmdIdentifier){ + // simple OK Status without description. + data.writeUnsignedByte(7); + data.writeUnsignedByte(cmdIdentifier); + data.writeUnsignedByte(TraCIStatusResponse.OK.code); + data.writeInt(0); + return this; + } + + public TraCIPacket addStatusResponse(int cmdIdentifier, TraCIStatusResponse response, String description){ + // expect single byte cmdLenField. + // cmdLenField + cmdIdentifier + cmdResult + strLen + str + // 1 + 1 + 1 + 4 + len(strBytes) + int cmdLen = 7 + data.stringByteCount(description); + + data.writeCommandLength(cmdLen); // 1b + data.writeUnsignedByte(cmdIdentifier); // 1b + data.writeUnsignedByte(response.code); // 4b + data.writeString(description); // 4b + X + + return this; + } + + public TraCIWriter getWriter(){ + return (TraCIWriter)data; + } + + public int size(){ + return data.size(); + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java new file mode 100644 index 000000000..17447f7a3 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java @@ -0,0 +1,52 @@ +package org.vadere.manager.stsc; + +import org.vadere.manager.TraCICommand; + +import java.nio.ByteBuffer; + +/** + * Contains a {@link ByteBuffer} which encodes + * possible multiple commands. + */ +public class TraCIPacketBuffer extends TraCIBuffer { + + public static TraCIPacketBuffer wrap(byte[] buf){ + return new TraCIPacketBuffer(buf); + } + + public static TraCIPacketBuffer wrap(ByteBuffer buf){ + return new TraCIPacketBuffer(buf); + } + + public static TraCIPacketBuffer empty(){ + return new TraCIPacketBuffer(new byte[0]); + } + + protected TraCIPacketBuffer(byte[] buf){ + super(buf); + } + + protected TraCIPacketBuffer(ByteBuffer buf){ + super(buf); + } + + public TraCICommand nextCommand(){ + if (!buffer.hasRemaining()) + return null; + + int cmdLen = getCommandDataLen(); + return new TraCICommand(TraCICommandBuffer.wrap(buffer.readByteBuffer(cmdLen))); + } + + + private int getCommandDataLen(){ + int cmdLen = buffer.readUnsignedByte(); + if (cmdLen == 0 ){ + // extended cmdLen field used. + cmdLen = buffer.readInt() - 5; // subtract cmdLen field: 1 ubyte + 1 int (4) + } else { + cmdLen -= 1; // subtract cmdLen field: 1 ubyte + } + return cmdLen; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java index ae20e2a61..444e786cf 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java @@ -26,6 +26,12 @@ public class TraCIReader implements ByteReader { return traCIReader; } + static TraCIReader wrap(ByteBuffer buffer){ + TraCIReader traCIReader = new TraCIReader(); + traCIReader.buf = buffer; + return traCIReader; + } + private TraCIReader(){ } @Override @@ -35,6 +41,7 @@ public class TraCIReader implements ByteReader { @Override public byte[] readBytes(int num) { + ensureBytes(num); byte[] data = new byte[num]; buf.get(data, 0, data.length); return data; diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java new file mode 100644 index 000000000..8a96eeb04 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java @@ -0,0 +1,15 @@ +package org.vadere.manager.stsc; + +public enum TraCIStatusResponse { + + OK(0x00), + ERR(0xFF), + NOT_IMPLEMENTED(0x01); + + + int code; + + TraCIStatusResponse(int code) { + this.code = code; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java index 1d49eebe1..7ba99b6b5 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java @@ -1,137 +1,37 @@ package org.vadere.manager.stsc; -import org.vadere.manager.TraCiException; import org.vadere.manager.stsc.sumo.TrafficLightPhase; import org.vadere.util.geometry.shapes.VPoint; import java.awt.*; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; import java.util.List; -public class TraCIWriter implements ByteWriter { - - ByteArrayOutputStream data; - - - - public TraCIWriter() { - data = new ByteArrayOutputStream(); - } - - ByteBuffer asByteBuffer(){ - return ByteBuffer.wrap(data.toByteArray()); - } - - byte[] asByteArray(){ - return data.toByteArray(); - } - - void rest(){ - data.reset(); - } - - @Override - public void writeByte(int val) { - data.write(val); - } - - @Override - public void writeBytes(byte[] buf) { - data.writeBytes(buf); - } - - @Override - public void writeBytes(byte[] buf, int offset, int len) { - data.write(buf, offset, len); - } - - - public void writeString(String val){ - writeString(val, StandardCharsets.US_ASCII); - } - - public void writeStringList(List val){ - writeInt(val.size()); - val.forEach(this::writeString); - } - - private void writeString(String val, Charset c){ - byte[] byteString = val.getBytes(c); - writeInt(byteString.length); - writeBytes(byteString); - } - - public void write2DPosition(double x, double y){ - writeUnsignedByte(TraCIDataTypes.POS_2D.identifier); - writeDouble(x); - writeDouble(y); - } - - public void write3DPosition(double x, double y, double z){ - writeUnsignedByte(TraCIDataTypes.POS_3D.identifier); - writeDouble(x); - writeDouble(y); - writeDouble(z); - } - - - public void writeRoadMapPosition(String roadId, double pos, int laneId){ - writeUnsignedByte(TraCIDataTypes.POS_ROAD_MAP.identifier); - writeString(roadId); - writeDouble(pos); - writeUnsignedByte(laneId); - } - - public void writeLonLatPosition(double lon, double lat){ - writeUnsignedByte(TraCIDataTypes.POS_LON_LAT.identifier); - writeDouble(lon); - writeDouble(lat); - } - - public void writeLonLatAltPosition(double lon, double lat, double alt){ - writeUnsignedByte(TraCIDataTypes.POS_LON_LAT_ALT.identifier); - writeDouble(lon); - writeDouble(lat); - writeDouble(alt); - } - - public void writePolygon(VPoint... points){ - writePolygon(Arrays.asList(points)); - } - - public void writePolygon(List points){ - writeUnsignedByte(TraCIDataTypes.POLYGON.identifier); - if(points.size() > 255) - throw new TraCiException("Polygon to big. TraCI only supports polygon up to 255 points."); - writeUnsignedByte(points.size()); - points.forEach(p -> { - writeDouble(p.getX()); - writeDouble(p.getY()); - }); - } - - public void writeTrafficLightPhaseList(List phases){ - writeUnsignedByte(TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); - if(phases.size() > 255) - throw new TraCiException("Traffic Light Phase List to big. TraCI only supports list up to 255 elements."); - writeUnsignedByte(phases.size()); - phases.forEach( phase -> { - writeString(phase.getPrecRoad()); - writeString(phase.getSuccRoad()); - writeUnsignedByte(phase.getPhase().id); - }); - } - - public void writeColor(Color color){ - writeUnsignedByte(TraCIDataTypes.COLOR.identifier); - writeUnsignedByte(color.getRed()); - writeUnsignedByte(color.getGreen()); - writeUnsignedByte(color.getBlue()); - writeUnsignedByte(color.getAlpha()); - } +public interface TraCIWriter extends ByteWriter { + + void writeString(String val); + + void writeStringList(List val); + + void write2DPosition(double x, double y); + + void write3DPosition(double x, double y, double z); + + void writeRoadMapPosition(String roadId, double pos, int laneId); + + void writeLonLatPosition(double lon, double lat); + + void writeLonLatAltPosition(double lon, double lat, double alt); + + void writePolygon(VPoint... points); + + void writePolygon(List points); + + void writeTrafficLightPhaseList(List phases); + + void writeColor(Color color); + + void writeCommandLength(int cmdLen); + + int stringByteCount(String str); } diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIOutputWriterTest.java similarity index 96% rename from VadereManager/tests/org/vadere/manager/stsc/TraCIWriterTest.java rename to VadereManager/tests/org/vadere/manager/stsc/TraCIOutputWriterTest.java index fd568415b..72a417d51 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIOutputWriterTest.java @@ -17,13 +17,13 @@ import java.util.stream.IntStream; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; -public class TraCIWriterTest { +public class TraCIOutputWriterTest { - TraCIWriter writer; + TraCIOutputWriter writer; @Before public void before(){ - writer = new TraCIWriter(); + writer = new TraCIOutputWriter(); } @After @@ -99,6 +99,20 @@ public class TraCIWriterTest { } + @Test + public void writeEmptyString(){ + writer.writeString(""); + + + ByteBuffer buf= writer.asByteBuffer(); + + assertThat(buf.capacity(), equalTo(4)); + assertThat(buf.getInt(), equalTo(0)); + + // buf must be empty + checkEmpty(buf); + } + @Test public void writeString() { String str = "Hello World !"; diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java index bd5e1fc00..c86e90f6e 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java @@ -20,12 +20,12 @@ import static org.junit.Assert.assertThat; public class TraCIReaderTest { - TraCIWriter writer; + TraCIOutputWriter writer; TraCIReader reader; @Before public void before(){ - writer = new TraCIWriter(); + writer = new TraCIOutputWriter(); } @After -- GitLab From 3cf4baf1ca4cdb242a6f3f2590848538cdf5a6fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 09:52:26 +0200 Subject: [PATCH 04/58] traci server implementation --- .../src/org/vadere/manager/ClientHandler.java | 1 + .../org/vadere/manager/CommandExecutor.java | 19 +- .../src/org/vadere/manager/TestClient.java | 26 +- .../src/org/vadere/manager/TraCICommand.java | 20 -- .../org/vadere/manager/TraCIException.java | 33 +++ .../src/org/vadere/manager/TraCISocket.java | 1 - .../vadere/manager/TraCiCommandBuilder.java | 42 ---- .../org/vadere/manager/TraCiException.java | 12 - .../vadere/manager/TraCiMessageBuilder.java | 65 ----- .../vadere/manager/TraciMessageBuffer.java | 50 ---- .../commandHandler/CommandHandler.java | 5 +- .../commandHandler/ControlCommands.java | 25 ++ .../commandHandler/PersonCommandHandler.java | 121 +++++++++ .../commandHandler/PolygonCommands.java | 16 ++ .../commandHandler/SimulationCommands.java | 16 ++ .../commandHandler/TraCICmdHandler.java | 11 + .../manager/commandHandler/TraCIVariable.java | 49 ++++ .../src/org/vadere/manager/stsc/Packet.java | 2 + .../org/vadere/manager/stsc/TraCIBuffer.java | 8 +- .../manager/stsc/TraCICommandBuffer.java | 2 +- ...TraCIDataTypes.java => TraCIDataType.java} | 28 ++- .../org/vadere/manager/stsc/TraCIPacket.java | 22 +- .../manager/stsc/TraCIPacketBuffer.java | 11 +- .../org/vadere/manager/stsc/TraCIReader.java | 193 ++------------ .../vadere/manager/stsc/TraCIReaderImpl.java | 235 ++++++++++++++++++ .../org/vadere/manager/stsc/TraCIWriter.java | 8 + ...OutputWriter.java => TraCIWriterImpl.java} | 68 +++-- .../vadere/manager/stsc/commands/CmdType.java | 13 + .../manager/stsc/commands/TraCICmd.java | 114 +++++++++ .../manager/stsc/commands/TraCICommand.java | 81 ++++++ .../stsc/commands/TraCIGetCommand.java | 42 ++++ .../stsc/commands/TraCISetCommand.java | 51 ++++ .../stsc/commands/control/CmdClose.java | 17 ++ .../commands/control/CmdGetVersion.java} | 19 +- .../stsc/commands/control/CmdSimStep.java | 26 ++ .../vadere/manager/stsc/sumo/LightPhase.java | 2 +- .../vadere/manager/stsc/TraCIReaderTest.java | 26 +- ...iterTest.java => TraCIWriterImplTest.java} | 28 +-- 38 files changed, 1069 insertions(+), 439 deletions(-) delete mode 100644 VadereManager/src/org/vadere/manager/TraCICommand.java create mode 100644 VadereManager/src/org/vadere/manager/TraCIException.java delete mode 100644 VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java delete mode 100644 VadereManager/src/org/vadere/manager/TraCiException.java delete mode 100644 VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java delete mode 100644 VadereManager/src/org/vadere/manager/TraciMessageBuffer.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/PolygonCommands.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/SimulationCommands.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/TraCIVariable.java rename VadereManager/src/org/vadere/manager/stsc/{TraCIDataTypes.java => TraCIDataType.java} (50%) create mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIReaderImpl.java rename VadereManager/src/org/vadere/manager/stsc/{TraCIOutputWriter.java => TraCIWriterImpl.java} (67%) create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/CmdType.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/TraCICmd.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java rename VadereManager/src/org/vadere/manager/{commandHandler/GetVersionCmdHandler.java => stsc/commands/control/CmdGetVersion.java} (59%) create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/CmdSimStep.java rename VadereManager/tests/org/vadere/manager/stsc/{TraCIOutputWriterTest.java => TraCIWriterImplTest.java} (91%) diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index 28236a5b1..a2eecfce5 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -1,5 +1,6 @@ package org.vadere.manager; +import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.TraCIPacketBuffer; import org.vadere.util.logging.Logger; diff --git a/VadereManager/src/org/vadere/manager/CommandExecutor.java b/VadereManager/src/org/vadere/manager/CommandExecutor.java index f172e57f9..8a2bb1091 100644 --- a/VadereManager/src/org/vadere/manager/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/CommandExecutor.java @@ -3,8 +3,9 @@ package org.vadere.manager; import de.tudresden.sumo.config.Constants; import org.vadere.manager.commandHandler.CommandHandler; -import org.vadere.manager.commandHandler.GetVersionCmdHandler; +import org.vadere.manager.commandHandler.PersonCommandHandler; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.util.logging.Logger; import java.util.HashMap; @@ -17,17 +18,23 @@ public class CommandExecutor { public CommandExecutor() { cmdMap = new HashMap<>(); - cmdMap.put(Constants.CMD_GETVERSION, new GetVersionCmdHandler()); +// cmdMap.put(Constants.CMD_GETVERSION, ControlCommands::getVersion); + cmdMap.put(Constants.CMD_GET_PERSON_VARIABLE, new PersonCommandHandler()); + cmdMap.put(Constants.CMD_SET_PERSON_VARIABLE, new PersonCommandHandler()); +// cmdMap.put(Constants.CMD_GET_SIM_VARIABLE, SimulationCommands::processGet); +// cmdMap.put(Constants.CMD_SET_SIM_VARIABLE, SimulationCommands::processSet); +// cmdMap.put(Constants.CMD_GET_POLYGON_VARIABLE, SimulationCommands::processGet); +// cmdMap.put(Constants.CMD_SET_POLYGON_VARIABLE, SimulationCommands::processSet); } TraCIPacket execute(TraCICommand cmd){ - CommandHandler handler = cmdMap.get(cmd.getId()); + CommandHandler handler = cmdMap.get(cmd.getTraCICmd()); if (handler == null){ - logger.errorf("No CommandHandler found for command: %02X", cmd); - return null; + logger.errorf("No CommandHandler found for command: %02X", cmd.getTraCICmd()); + return TraCIPacket.createDynamicPacket().add_Err_StatusResponse(cmd.getTraCICmd().id, "ID not found."); } - return handler.handelCommand(cmd); + return handler.handel(cmd); } } diff --git a/VadereManager/src/org/vadere/manager/TestClient.java b/VadereManager/src/org/vadere/manager/TestClient.java index 58beffe72..4acbc01d7 100644 --- a/VadereManager/src/org/vadere/manager/TestClient.java +++ b/VadereManager/src/org/vadere/manager/TestClient.java @@ -1,18 +1,23 @@ package org.vadere.manager; +import de.tudresden.sumo.cmd.Person; import de.tudresden.sumo.util.CommandProcessor; +import de.tudresden.sumo.util.Query; +import de.tudresden.sumo.util.SumoCommand; + +import it.polito.appeal.traci.protocol.ResponseContainer; import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; import java.net.Socket; -public class TestClient { +public class TestClient{ private int port; private Socket socket; private CommandProcessor cmdProcessor; - + private qq q; public TestClient(int port) throws IOException, InterruptedException { this.port = port; @@ -34,6 +39,7 @@ public class TestClient { throw new IOException("can't connect to Server!"); } else { cmdProcessor = new CommandProcessor(socket); + q = new qq(socket); } System.out.println("connected..."); } @@ -42,8 +48,22 @@ public class TestClient { TestClient testClient = new TestClient(9999); - testClient.cmdProcessor.do_setOrder(99); + SumoCommand cmd = Person.getIDList(); + + testClient.q.doThat(cmd); + + + } + + class qq extends Query { + public qq(Socket sock) throws IOException { + super(sock); + } + + public ResponseContainer doThat(SumoCommand c) throws IOException { + return this.doQuerySingle(c.get_command()); + } } diff --git a/VadereManager/src/org/vadere/manager/TraCICommand.java b/VadereManager/src/org/vadere/manager/TraCICommand.java deleted file mode 100644 index de01e928e..000000000 --- a/VadereManager/src/org/vadere/manager/TraCICommand.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.vadere.manager; - -import org.vadere.manager.stsc.TraCICommandBuffer; - -public class TraCICommand { - - private int id; - private TraCICommandBuffer data; - - public TraCICommand(TraCICommandBuffer buff) { - this.id = buff.readCmdIdentifier(); - this.data = buff; - } - - - public int getId() { - return id; - } - -} diff --git a/VadereManager/src/org/vadere/manager/TraCIException.java b/VadereManager/src/org/vadere/manager/TraCIException.java new file mode 100644 index 000000000..1f704d257 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/TraCIException.java @@ -0,0 +1,33 @@ +package org.vadere.manager; + +import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.commands.TraCIGetCommand; + +public class TraCIException extends RuntimeException { + + public TraCIException(String message) { + super(message); + } + + public TraCIException(String message, Throwable cause) { + super(message, cause); + } + + public static TraCIException cmdErr(TraCICmd cmd, Throwable cause){ + return new TraCIException("Error creating command: " + cmd.toString(), cause); + } + + public static TraCIException cmdErrDatatype(TraCICmd cmd, Throwable cause){ + return new TraCIException("Error creating Datatype: " + cmd.toString(), cause); + } + + public static TraCIException cmdErrVariableType(TraCICmd cmd, Throwable cause){ + return new TraCIException("Error creating TraCIVariable: " + cmd.toString(), cause); + } + + public static TraCIException getNotImplemented(TraCIGetCommand cmd){ + return new TraCIException("GetCommand for variableId " + cmd.getVariableId() + + "not supported in API: " + cmd.getTraCICmd().toString()); + } + +} diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index 79b924eaa..72f30d14c 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -9,7 +9,6 @@ import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.nio.ByteBuffer; -import java.util.Arrays; public class TraCISocket implements Closeable { diff --git a/VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java b/VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java deleted file mode 100644 index d3052dbc4..000000000 --- a/VadereManager/src/org/vadere/manager/TraCiCommandBuilder.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.vadere.manager; - -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; - -public class TraCiCommandBuilder extends TraCiMessageBuilder { - - public TraCiCommandBuilder(){ - reset(); - } - - @Override - void reset() { - byteArrayOutput = new ByteArrayOutputStream(); - // add 5 byte at the beginning as a placeholder for message size. - writeUnsignedByte(0); - writeInt(0); - } - - @Override - public ByteBuffer build(){ - byte[] msg = byteArrayOutput.toByteArray(); - reset(); - - ByteBuffer buffer; - if ((msg.length - 4 ) > 255){ - // use extended - buffer = ByteBuffer.wrap(msg); - buffer.put((byte) 0); - buffer.putInt(msg.length); - buffer.position(0); - } else { - buffer = ByteBuffer.wrap(msg,4, msg.length-4); - buffer.put((byte) (msg.length-4)); - buffer.position(4); - } - - return buffer; - } - - -} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/TraCiException.java b/VadereManager/src/org/vadere/manager/TraCiException.java deleted file mode 100644 index 35be9235a..000000000 --- a/VadereManager/src/org/vadere/manager/TraCiException.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.vadere.manager; - -public class TraCiException extends RuntimeException { - - public TraCiException(String message) { - super(message); - } - - public TraCiException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java b/VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java deleted file mode 100644 index 5282f074a..000000000 --- a/VadereManager/src/org/vadere/manager/TraCiMessageBuilder.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.vadere.manager; - -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; - -public class TraCiMessageBuilder { - - protected ByteArrayOutputStream byteArrayOutput; - TraCiMessageBuilder(){ - reset(); - } - - void reset() { - byteArrayOutput = new ByteArrayOutputStream(); - // add 4 byte at the beginning as a placeholder for message size. - writeInt(0); - } - - public ByteBuffer build(){ - // prepend size of message. - ByteBuffer buffer = ByteBuffer.wrap(byteArrayOutput.toByteArray()); - buffer.putInt(byteArrayOutput.size()); - buffer.position(0); - return buffer; - } - - public TraCiMessageBuilder writeUnsignedByte(int b) { - - if(b >= 0 && b <= 255){ - byteArrayOutput.write(b); - } else { - throw new IllegalArgumentException("unsigned byte must be within 0..255"); - } - - return this; - } - - public TraCiMessageBuilder writeInt(int i){ - byteArrayOutput.writeBytes(ByteBuffer.allocate(4).putInt(i).array()); - return this; - } - - - public TraCiMessageBuilder writeBytes(ByteBuffer data){ - byteArrayOutput.write(data.array(), data.arrayOffset(), data.array().length); - return this; - } - - public TraCiMessageBuilder writeBytes(byte[] data){ - byteArrayOutput.writeBytes(data); - return this; - } - - public TraCiMessageBuilder writeStringASCII(String s){ - byte[] stringBytes; - stringBytes = s.getBytes(StandardCharsets.US_ASCII); - - writeInt(stringBytes.length); - writeBytes(stringBytes); - return this; - } - - -} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/TraciMessageBuffer.java b/VadereManager/src/org/vadere/manager/TraciMessageBuffer.java deleted file mode 100644 index 596c55e83..000000000 --- a/VadereManager/src/org/vadere/manager/TraciMessageBuffer.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.vadere.manager; - -import java.nio.ByteBuffer; - -public class TraciMessageBuffer { - - ByteBuffer data; - - - public static TraciMessageBuffer wrap(byte[] buf){ - TraciMessageBuffer msgBuf = new TraciMessageBuffer(); - msgBuf.data = ByteBuffer.wrap(buf); - return msgBuf; - } - - private TraciMessageBuffer() { } - - - /** - * Ensure that at least n bytes can be read from the Buffer. - * @param n number of bytes - */ - public boolean ensureBytes(int n){ - return (data.limit() - data.position()) >= n; - } - - public boolean reachedEnd(){ - return data.position() == data.limit(); - } - - - public ByteBuffer readBytes(int n){ - return data.get(new byte[n]); - } - - public byte readByte(){ - return data.get(); - } - - public int readUnsignedByte(){ - return data.get() & 0xff; // get byte, cast to int and return the last byte (unsigned) - } - - public int readInt(){ - return data.getInt(); - } - - - -} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 69e3639f9..13f1e1d89 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,10 +1,7 @@ package org.vadere.manager.commandHandler; -import org.vadere.manager.TraCICommand; -import org.vadere.manager.stsc.TraCIPacket; +public abstract class CommandHandler implements TraCICmdHandler{ -public interface CommandHandler { - TraCIPacket handelCommand(TraCICommand cmd); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java new file mode 100644 index 000000000..5f6eb57e8 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java @@ -0,0 +1,25 @@ +package org.vadere.manager.commandHandler; + + +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; + +public class ControlCommands { + + static public TraCIPacket getVersion(TraCICommand cmd) { + + TraCIPacket response = TraCIPacket.createDynamicPacket(); + +// response.add_OK_StatusResponse(Constants.CMD_GETVERSION); +// +// TraCIWriter writer = response.getWriter(); +// +// int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); +// writer.writeCommandLength(cmdLen); // 1b or 5b +// writer.writeInt(Constants.CMD_GETVERSION); // 1b +// writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b +// writer.writeString("Vaderer TraCI Server"); // 4b + X + + return response; + } +} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java new file mode 100644 index 000000000..5d03a9f7a --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -0,0 +1,121 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.stsc.commands.TraCISetCommand; + +public class PersonCommandHandler extends CommandHandler{ + + + protected TraCIPacket process_getIDList(TraCIGetCommand cmd){ + TraCIPacket packet = TraCIPacket.createDynamicPacket(); + packet.add_OK_StatusResponse(cmd.getTraCICmd()); + + // Test + // get Data ... +// List list = new ArrayList<>(); +// packet.getWriter().writeCommandLength(4); // cmd leng +// packet.getWriter().writeUnsignedByte(1); + + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getIDCount(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getSpeed(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getPosition(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + + protected TraCIPacket process_getPosition3D(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getAngle(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getSlope(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getRoadID(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getTypeID(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getColor(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + + protected TraCIPacket process_getLanePosition(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + + protected TraCIPacket process_Length(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_MinGap(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getWidth(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getWaitingTime(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getNextEdge(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getRemainingStages(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + protected TraCIPacket process_getVehicle(TraCIGetCommand cmd){ + throw TraCIException.getNotImplemented(cmd); + } + + @Override + public TraCIPacket handel(TraCICommand cmd) { + switch (cmd.getCmdType()){ + case VALUE_GET: + return processGet((TraCIGetCommand) cmd); + case VALUE_SET: + return processSet((TraCISetCommand) cmd); + default: + throw new TraCIException("Wrong command type for TraCI/Person API"); + } + } + + public TraCIPacket processGet(TraCIGetCommand cmd){ +// switch (cmd.getVariableId()){ +// case TraCIVariable.ID_LIST.id: +// +// } + return null; + } + + public TraCIPacket processSet(TraCISetCommand cmd){ + return null; + } + + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommands.java b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommands.java new file mode 100644 index 000000000..e8727cbc9 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommands.java @@ -0,0 +1,16 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.TraCIPacket; + +public class PolygonCommands { + + static public TraCIPacket processGet(TraCICommand cmd){ + return null; + } + + static public TraCIPacket processSet(TraCICommand cmd){ + return null; + } + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommands.java b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommands.java new file mode 100644 index 000000000..4d3cbb4d8 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommands.java @@ -0,0 +1,16 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.TraCIPacket; + +public class SimulationCommands { + + static public TraCIPacket processGet(TraCICommand cmd){ + return null; + } + + static public TraCIPacket processSet(TraCICommand cmd){ + return null; + } + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java new file mode 100644 index 000000000..e9a68e123 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java @@ -0,0 +1,11 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; + +public interface TraCICmdHandler { + + + TraCIPacket handel (TraCICommand cmd); + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIVariable.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCIVariable.java new file mode 100644 index 000000000..f19a16d6e --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCIVariable.java @@ -0,0 +1,49 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.stsc.TraCIDataType; + +public enum TraCIVariable { + + ID_LIST(0x00, TraCIDataType.STRING_LIST), + COUNT(0x01, TraCIDataType.INTEGER), + SPEED(0x40, TraCIDataType.DOUBLE), + POS_2D(0x42, TraCIDataType.POS_2D), + POS_3D(0x42, TraCIDataType.POS_3D), + ANGLE(0x43, TraCIDataType.DOUBLE), + SLOPE(0x36, TraCIDataType.DOUBLE), + ROAD_ID(0x50, TraCIDataType.STRING), + TYPE(0x4f, TraCIDataType.STRING), + COLOR(0x45, TraCIDataType.COLOR), + EDGE_POS(0x56, TraCIDataType.DOUBLE), + LENGTH(0x44,TraCIDataType.DOUBLE), + MIN_GAP(0x4c, TraCIDataType.DOUBLE), + WIDTH(0x4d, TraCIDataType.DOUBLE), + WAITING_TIME(0x7a,TraCIDataType.DOUBLE), + NEXT_EDGE(0xc1, TraCIDataType.STRING), + REMAINING_STAGES(0xc2, TraCIDataType.INTEGER), + VEHICLE(0xc3, TraCIDataType.STRING), + UNKNOWN(-1, TraCIDataType.UNKNOWN), + ; + + + int id; + TraCIDataType returnType; + + TraCIVariable(int id, TraCIDataType retVal) { + this.id = id; + this.returnType = retVal; + } + + public boolean isUnknown(){ + return this.id == UNKNOWN.id; + } + + + @Override + public String toString() { + return "TraCIVariable{" + + "id=" + id + + ", returnType=" + returnType + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/Packet.java b/VadereManager/src/org/vadere/manager/stsc/Packet.java index 21442222e..a9448a526 100644 --- a/VadereManager/src/org/vadere/manager/stsc/Packet.java +++ b/VadereManager/src/org/vadere/manager/stsc/Packet.java @@ -5,4 +5,6 @@ public abstract class Packet { public abstract byte[] send(); + public abstract byte[] extractCommandsOnly(); + } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java b/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java index c403b9e66..284639302 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java @@ -4,18 +4,18 @@ import java.nio.ByteBuffer; public abstract class TraCIBuffer { - protected TraCIReader buffer; + public TraCIReader reader; protected TraCIBuffer (byte[] buf){ - buffer = TraCIReader.wrap(buf); + reader = TraCIReaderImpl.wrap(buf); } protected TraCIBuffer (ByteBuffer buf){ - buffer = TraCIReader.wrap(buf); + reader = TraCIReaderImpl.wrap(buf); } public boolean hasRemaining(){ - return buffer.hasRemaining(); + return reader.hasRemaining(); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java b/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java index 42d1cc05d..460bf2841 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java @@ -30,7 +30,7 @@ public class TraCICommandBuffer extends TraCIBuffer{ throw new IllegalStateException("TraCI Command Identifier already consumed. readCmdIdentifier() must only be called once. Something went wrong in the TraCI message handling."); cmdIdentifierRead = true; - return buffer.readUnsignedByte(); + return reader.readUnsignedByte(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIDataTypes.java b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java similarity index 50% rename from VadereManager/src/org/vadere/manager/stsc/TraCIDataTypes.java rename to VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java index b23a5f29d..22c386c68 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIDataTypes.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java @@ -1,6 +1,6 @@ package org.vadere.manager.stsc; -public enum TraCIDataTypes { +public enum TraCIDataType { U_BYTE(0x07, 1, true), BYTE(0x08, 1, true), INTEGER(0x09,4,true), @@ -15,7 +15,9 @@ public enum TraCIDataTypes { POS_LON_LAT_ALT(0x02, 25,false), POLYGON(0x06,-1,false), TRAFFIC_LIGHT_PHASE_LIST(0x0D,-1,false), - COLOR(0x11,5,false); + COLOR(0x11,5,false), + UNKNOWN(-1, -1, false) + ; @@ -24,10 +26,30 @@ public enum TraCIDataTypes { boolean isAtomar; - TraCIDataTypes(int identifier, int size_in_byte, boolean isAtomar){ + TraCIDataType(int identifier, int size_in_byte, boolean isAtomar){ this.identifier = identifier; this.size_in_byte = size_in_byte; this.isAtomar = isAtomar; } + public boolean isUnknown(){ + return this.identifier == UNKNOWN.identifier; + } + + public static TraCIDataType fromId(int id){ + for(TraCIDataType dataType : values()){ + if (dataType.identifier == id) + return dataType; + } + return UNKNOWN; + } + + @Override + public String toString() { + return "TraCIDataType{" + + "identifier=" + identifier + + ", size_in_byte=" + size_in_byte + + ", isAtomar=" + isAtomar + + '}'; + } } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java index 9a8cba1a3..aeda6d6c0 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java @@ -1,10 +1,12 @@ package org.vadere.manager.stsc; +import org.vadere.manager.stsc.commands.TraCICmd; + import java.nio.ByteBuffer; public class TraCIPacket extends Packet { - private TraCIOutputWriter data; + private TraCIWriterImpl data; private boolean containsLengthField; @@ -17,7 +19,7 @@ public class TraCIPacket extends Packet { } private TraCIPacket() { - data = new TraCIOutputWriter(); + data = new TraCIWriterImpl(); } @@ -51,6 +53,14 @@ public class TraCIPacket extends Packet { return packet.array(); } + public byte[] extractCommandsOnly(){ + byte[] ret = new byte[data.size()-4]; + ByteBuffer buffer = data.asByteBuffer(); + buffer.position(4); + buffer.get(ret, 0, ret.length); + return ret; + } + public TraCIPacket addCommand(ByteBuffer buf){ data.writeBytes(buf); return this; @@ -61,6 +71,14 @@ public class TraCIPacket extends Packet { return this; } + public TraCIPacket add_Err_StatusResponse(int cmdIdentifier, String description){ + return addStatusResponse(cmdIdentifier, TraCIStatusResponse.ERR, description); + } + + public TraCIPacket add_OK_StatusResponse(TraCICmd traCICmd){ + return add_OK_StatusResponse(traCICmd.id); + } + public TraCIPacket add_OK_StatusResponse(int cmdIdentifier){ // simple OK Status without description. data.writeUnsignedByte(7); diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java index 17447f7a3..36cb9c619 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java @@ -1,6 +1,6 @@ package org.vadere.manager.stsc; -import org.vadere.manager.TraCICommand; +import org.vadere.manager.stsc.commands.TraCICommand; import java.nio.ByteBuffer; @@ -31,19 +31,20 @@ public class TraCIPacketBuffer extends TraCIBuffer { } public TraCICommand nextCommand(){ - if (!buffer.hasRemaining()) + if (!reader.hasRemaining()) return null; int cmdLen = getCommandDataLen(); - return new TraCICommand(TraCICommandBuffer.wrap(buffer.readByteBuffer(cmdLen))); + + return TraCICommand.createCommand(reader.readByteBuffer(cmdLen)); } private int getCommandDataLen(){ - int cmdLen = buffer.readUnsignedByte(); + int cmdLen = reader.readUnsignedByte(); if (cmdLen == 0 ){ // extended cmdLen field used. - cmdLen = buffer.readInt() - 5; // subtract cmdLen field: 1 ubyte + 1 int (4) + cmdLen = reader.readInt() - 5; // subtract cmdLen field: 1 ubyte + 1 int (4) } else { cmdLen -= 1; // subtract cmdLen field: 1 ubyte } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java index 444e786cf..9042505e7 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java @@ -1,183 +1,40 @@ package org.vadere.manager.stsc; -import org.vadere.manager.TraCiException; -import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; -import org.vadere.util.geometry.GeometryUtils; import org.vadere.util.geometry.Vector3D; -import org.vadere.util.geometry.shapes.IPoint; import org.vadere.util.geometry.shapes.VPoint; import org.vadere.util.geometry.shapes.VPolygon; import java.awt.*; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.List; -public class TraCIReader implements ByteReader { - - private ByteBuffer buf; - - static TraCIReader wrap(byte[] data){ - TraCIReader traCIReader = new TraCIReader(); - traCIReader.buf = ByteBuffer.wrap(data); - return traCIReader; - } - - static TraCIReader wrap(ByteBuffer buffer){ - TraCIReader traCIReader = new TraCIReader(); - traCIReader.buf = buffer; - return traCIReader; - } - - private TraCIReader(){ } - - @Override - public byte readByte() { - return buf.get(); - } - - @Override - public byte[] readBytes(int num) { - ensureBytes(num); - byte[] data = new byte[num]; - buf.get(data, 0, data.length); - return data; - } - - @Override - public int readInt() { - return buf.getInt(); - } - - @Override - public double readDouble() { - return buf.getDouble(); - } - - public String readString(){ - ensureBytes(4); - int len = buf.getInt(); - - ensureBytes(len); - byte[] stringBytes = new byte[len]; - buf.get(stringBytes, 0, stringBytes.length); - - return new String(stringBytes, StandardCharsets.US_ASCII); - } - - public List readStringList(){ - ensureBytes(4); // 1x int - int numOfStrings = buf.getInt(); - - ArrayList stringList = new ArrayList<>(); - for(int i=0; i < numOfStrings; i++){ - stringList.add(readString()); - } - - return stringList; - } - - public VPoint read2DPosition(){ - // identifier already consumed - ensureBytes(16); // 2x double - double x = buf.getDouble(); - double y = buf.getDouble(); - return new VPoint(x,y); - } - - public Vector3D read3DPosition(){ - // identifier already consumed - ensureBytes(24); // 3x double - double x = buf.getDouble(); - double y = buf.getDouble(); - double z = buf.getDouble(); - return new Vector3D(x, y, z); - } - - public RoadMapPosition readRoadMapPosition(){ - // identifier already consumed - String roadId = readString(); - ensureBytes(9); // double + ubyte - double pos = readDouble(); - int laneId = readUnsignedByte(); - return new RoadMapPosition(roadId, pos, laneId); - } - - public VPoint readLonLatPosition(){ - // identifier already consumed - ensureBytes(16); // 2x double - double lon = buf.getDouble(); - double lat = buf.getDouble(); - return new VPoint(lon, lat); - } - - public Vector3D readLonLatAltPosition(){ - // identifier already consumed - ensureBytes(24); // 3x double - double lon = buf.getDouble(); - double lat = buf.getDouble(); - double alt = buf.getDouble(); - return new Vector3D(lon, lat, alt); - } - - public VPolygon readPolygon(){ - // identifier already consumed - ensureBytes(1); // ubyte - int numberOfPoints = readUnsignedByte(); - - ensureBytes(numberOfPoints * 16); // 2x double values for each numberOfPoints - IPoint[] points = new IPoint[numberOfPoints]; - for (int i = 0; i < points.length; i++) { - double x = buf.getDouble(); - double y = buf.getDouble(); - points[i] = new VPoint(x, y); - } - return GeometryUtils.polygonFromPoints2D(points); - } - - public List readTrafficLightPhaseList(){ - // identifier already consumed - ensureBytes(1); // 1x ubyte - int numberOfPhases = readUnsignedByte(); - - ArrayList phases = new ArrayList<>(); - for (int i=0; i < numberOfPhases; i++){ - String precRoad = readString(); - String succRoad = readString(); - ensureBytes(1); // 1x ubyte - int lightPhaseId = readUnsignedByte(); - phases.add(new TrafficLightPhase(precRoad, succRoad, LightPhase.fromId(lightPhaseId))); - } - - return phases; - } - - public Color readColor(){ - // identifier already consumed - ensureBytes(4); // 4x ubyte (RGBA) - - int r = readUnsignedByte(); - int g = readUnsignedByte(); - int b = readUnsignedByte(); - int a = readUnsignedByte(); - - return new Color(r, g, b, a); - } - - - public boolean hasRemaining(){ - return buf.hasRemaining(); - } - - private void ensureBytes(int num){ - int bytesLeft = buf.limit() - buf.position(); - if (bytesLeft < num) - throw new TraCiException("Not enough bytes left." + "Expected " + num + "Bytes but only " + bytesLeft + " found."); - } +public interface TraCIReader extends ByteReader { + String readString(); + List readStringList(); + + VPoint read2DPosition(); + + Vector3D read3DPosition(); + + RoadMapPosition readRoadMapPosition(); + + VPoint readLonLatPosition(); + + Vector3D readLonLatAltPosition(); + + VPolygon readPolygon(); + + List readTrafficLightPhaseList(); + + Object readTypeValue(TraCIDataType type); + + Color readColor(); + + boolean hasRemaining(); + + void ensureBytes(int num); } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIReaderImpl.java b/VadereManager/src/org/vadere/manager/stsc/TraCIReaderImpl.java new file mode 100644 index 000000000..7178fe6d2 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIReaderImpl.java @@ -0,0 +1,235 @@ +package org.vadere.manager.stsc; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.sumo.LightPhase; +import org.vadere.manager.stsc.sumo.RoadMapPosition; +import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.GeometryUtils; +import org.vadere.util.geometry.Vector3D; +import org.vadere.util.geometry.shapes.IPoint; +import org.vadere.util.geometry.shapes.VPoint; +import org.vadere.util.geometry.shapes.VPolygon; + +import java.awt.*; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +public class TraCIReaderImpl implements TraCIReader { + + private ByteBuffer byteBuffer; + + static TraCIReaderImpl wrap(byte[] data){ + TraCIReaderImpl traCIReaderImpl = new TraCIReaderImpl(); + traCIReaderImpl.byteBuffer = ByteBuffer.wrap(data); + return traCIReaderImpl; + } + + static TraCIReaderImpl wrap(ByteBuffer buffer){ + TraCIReaderImpl traCIReaderImpl = new TraCIReaderImpl(); + traCIReaderImpl.byteBuffer = buffer; + return traCIReaderImpl; + } + + private TraCIReaderImpl(){ } + + @Override + public byte readByte() { + return byteBuffer.get(); + } + + @Override + public byte[] readBytes(int num) { + ensureBytes(num); + byte[] data = new byte[num]; + byteBuffer.get(data, 0, data.length); + return data; + } + + @Override + public int readInt() { + return byteBuffer.getInt(); + } + + @Override + public double readDouble() { + return byteBuffer.getDouble(); + } + + @Override + public String readString(){ + ensureBytes(4); + int len = byteBuffer.getInt(); + + ensureBytes(len); + byte[] stringBytes = new byte[len]; + byteBuffer.get(stringBytes, 0, stringBytes.length); + + return new String(stringBytes, StandardCharsets.US_ASCII); + } + + @Override + public List readStringList(){ + ensureBytes(4); // 1x int + int numOfStrings = byteBuffer.getInt(); + + ArrayList stringList = new ArrayList<>(); + for(int i=0; i < numOfStrings; i++){ + stringList.add(readString()); + } + + return stringList; + } + + @Override + public VPoint read2DPosition(){ + // identifier already consumed + ensureBytes(16); // 2x double + double x = byteBuffer.getDouble(); + double y = byteBuffer.getDouble(); + return new VPoint(x,y); + } + + @Override + public Vector3D read3DPosition(){ + // identifier already consumed + ensureBytes(24); // 3x double + double x = byteBuffer.getDouble(); + double y = byteBuffer.getDouble(); + double z = byteBuffer.getDouble(); + return new Vector3D(x, y, z); + } + + @Override + public RoadMapPosition readRoadMapPosition(){ + // identifier already consumed + String roadId = readString(); + ensureBytes(9); // double + ubyte + double pos = readDouble(); + int laneId = readUnsignedByte(); + return new RoadMapPosition(roadId, pos, laneId); + } + + @Override + public VPoint readLonLatPosition(){ + // identifier already consumed + ensureBytes(16); // 2x double + double lon = byteBuffer.getDouble(); + double lat = byteBuffer.getDouble(); + return new VPoint(lon, lat); + } + + @Override + public Vector3D readLonLatAltPosition(){ + // identifier already consumed + ensureBytes(24); // 3x double + double lon = byteBuffer.getDouble(); + double lat = byteBuffer.getDouble(); + double alt = byteBuffer.getDouble(); + return new Vector3D(lon, lat, alt); + } + + @Override + public VPolygon readPolygon(){ + // identifier already consumed + ensureBytes(1); // ubyte + int numberOfPoints = readUnsignedByte(); + + ensureBytes(numberOfPoints * 16); // 2x double values for each numberOfPoints + IPoint[] points = new IPoint[numberOfPoints]; + for (int i = 0; i < points.length; i++) { + double x = byteBuffer.getDouble(); + double y = byteBuffer.getDouble(); + points[i] = new VPoint(x, y); + } + return GeometryUtils.polygonFromPoints2D(points); + } + + @Override + public List readTrafficLightPhaseList(){ + // identifier already consumed + ensureBytes(1); // 1x ubyte + int numberOfPhases = readUnsignedByte(); + + ArrayList phases = new ArrayList<>(); + for (int i=0; i < numberOfPhases; i++){ + String precRoad = readString(); + String succRoad = readString(); + ensureBytes(1); // 1x ubyte + int lightPhaseId = readUnsignedByte(); + phases.add(new TrafficLightPhase(precRoad, succRoad, LightPhase.fromId(lightPhaseId))); + } + + return phases; + } + + @Override + public Color readColor(){ + // identifier already consumed + ensureBytes(4); // 4x ubyte (RGBA) + + int r = readUnsignedByte(); + int g = readUnsignedByte(); + int b = readUnsignedByte(); + int a = readUnsignedByte(); + + return new Color(r, g, b, a); + } + + @Override + public Object readTypeValue(TraCIDataType type) { + + + switch (type){ + case U_BYTE: + return readUnsignedByte(); + case BYTE: + return readByte(); + case INTEGER: + return readInt(); + case DOUBLE: + return readDouble(); + case STRING: + return readString(); + case STRING_LIST: + return readStringList(); + case POS_2D: + return read2DPosition(); + case POS_3D: + return read3DPosition(); + case POS_ROAD_MAP: + return readRoadMapPosition(); + case POS_LON_LAT: + return readLonLatPosition(); + case POS_LON_LAT_ALT: + return readLonLatAltPosition(); + case POLYGON: + return readPolygon(); + case TRAFFIC_LIGHT_PHASE_LIST: + return readTrafficLightPhaseList(); + case COLOR: + return readColor(); + case COMPOUND_OBJECT: + case UNKNOWN: + default: + throw new TraCIException("Unknown Datatype: " + type.toString()); + + } + } + + @Override + public boolean hasRemaining(){ + return byteBuffer.hasRemaining(); + } + + @Override + public void ensureBytes(int num){ + int bytesLeft = byteBuffer.limit() - byteBuffer.position(); + if (bytesLeft < num) + throw new TraCIException("Not enough bytes left." + "Expected " + num + "Bytes but only " + bytesLeft + " found."); + } + + + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java index 7ba99b6b5..73f360eda 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java @@ -9,6 +9,14 @@ import java.util.List; public interface TraCIWriter extends ByteWriter { + void writeUnsignedByteWithId(int val); + void writeByteWithId(byte val); + void writeIntWithId(int val); + void writeDoubleWithId(double val); + void writeStringWithId(String val); + void writeStringListWithId(List val); + + void writeString(String val); void writeStringList(List val); diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIOutputWriter.java b/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java similarity index 67% rename from VadereManager/src/org/vadere/manager/stsc/TraCIOutputWriter.java rename to VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java index 31796cbd4..842a077a3 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIOutputWriter.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java @@ -1,6 +1,6 @@ package org.vadere.manager.stsc; -import org.vadere.manager.TraCiException; +import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.sumo.TrafficLightPhase; import org.vadere.util.geometry.shapes.VPoint; @@ -12,25 +12,25 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; -public class TraCIOutputWriter implements TraCIWriter { +public class TraCIWriterImpl implements TraCIWriter { ByteArrayOutputStream data; - public TraCIOutputWriter() { + public TraCIWriterImpl() { data = new ByteArrayOutputStream(); } - ByteBuffer asByteBuffer(){ + public ByteBuffer asByteBuffer(){ return ByteBuffer.wrap(data.toByteArray()); } - byte[] asByteArray(){ + public byte[] asByteArray(){ return data.toByteArray(); } - void rest(){ + public void rest(){ data.reset(); } @@ -50,6 +50,42 @@ public class TraCIOutputWriter implements TraCIWriter { } + @Override + public void writeUnsignedByteWithId(int val) { + writeUnsignedByte(TraCIDataType.U_BYTE.identifier); + writeUnsignedByte(val); + } + + @Override + public void writeByteWithId(byte val) { + writeUnsignedByte(TraCIDataType.BYTE.identifier); + writeByte(val); + } + + @Override + public void writeIntWithId(int val) { + writeUnsignedByte(TraCIDataType.INTEGER.identifier); + writeInt(val); + } + + @Override + public void writeDoubleWithId(double val) { + writeUnsignedByte(TraCIDataType.DOUBLE.identifier); + writeDouble(val); + } + + @Override + public void writeStringWithId(String val) { + writeUnsignedByte(TraCIDataType.STRING.identifier); + writeString(val); + } + + @Override + public void writeStringListWithId(List val) { + writeUnsignedByte(TraCIDataType.STRING_LIST.identifier); + writeStringList(val); + } + @Override public void writeString(String val){ writeString(val, StandardCharsets.US_ASCII); @@ -70,14 +106,14 @@ public class TraCIOutputWriter implements TraCIWriter { @Override public void write2DPosition(double x, double y){ - writeUnsignedByte(TraCIDataTypes.POS_2D.identifier); + writeUnsignedByte(TraCIDataType.POS_2D.identifier); writeDouble(x); writeDouble(y); } @Override public void write3DPosition(double x, double y, double z){ - writeUnsignedByte(TraCIDataTypes.POS_3D.identifier); + writeUnsignedByte(TraCIDataType.POS_3D.identifier); writeDouble(x); writeDouble(y); writeDouble(z); @@ -86,7 +122,7 @@ public class TraCIOutputWriter implements TraCIWriter { @Override public void writeRoadMapPosition(String roadId, double pos, int laneId){ - writeUnsignedByte(TraCIDataTypes.POS_ROAD_MAP.identifier); + writeUnsignedByte(TraCIDataType.POS_ROAD_MAP.identifier); writeString(roadId); writeDouble(pos); writeUnsignedByte(laneId); @@ -94,14 +130,14 @@ public class TraCIOutputWriter implements TraCIWriter { @Override public void writeLonLatPosition(double lon, double lat){ - writeUnsignedByte(TraCIDataTypes.POS_LON_LAT.identifier); + writeUnsignedByte(TraCIDataType.POS_LON_LAT.identifier); writeDouble(lon); writeDouble(lat); } @Override public void writeLonLatAltPosition(double lon, double lat, double alt){ - writeUnsignedByte(TraCIDataTypes.POS_LON_LAT_ALT.identifier); + writeUnsignedByte(TraCIDataType.POS_LON_LAT_ALT.identifier); writeDouble(lon); writeDouble(lat); writeDouble(alt); @@ -114,9 +150,9 @@ public class TraCIOutputWriter implements TraCIWriter { @Override public void writePolygon(List points){ - writeUnsignedByte(TraCIDataTypes.POLYGON.identifier); + writeUnsignedByte(TraCIDataType.POLYGON.identifier); if(points.size() > 255) - throw new TraCiException("Polygon to big. TraCI only supports polygon up to 255 points."); + throw new TraCIException("Polygon to big. TraCI only supports polygon up to 255 points."); writeUnsignedByte(points.size()); points.forEach(p -> { writeDouble(p.getX()); @@ -126,9 +162,9 @@ public class TraCIOutputWriter implements TraCIWriter { @Override public void writeTrafficLightPhaseList(List phases){ - writeUnsignedByte(TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); + writeUnsignedByte(TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.identifier); if(phases.size() > 255) - throw new TraCiException("Traffic Light Phase List to big. TraCI only supports list up to 255 elements."); + throw new TraCIException("Traffic Light Phase List to big. TraCI only supports list up to 255 elements."); writeUnsignedByte(phases.size()); phases.forEach( phase -> { writeString(phase.getPrecRoad()); @@ -139,7 +175,7 @@ public class TraCIOutputWriter implements TraCIWriter { @Override public void writeColor(Color color){ - writeUnsignedByte(TraCIDataTypes.COLOR.identifier); + writeUnsignedByte(TraCIDataType.COLOR.identifier); writeUnsignedByte(color.getRed()); writeUnsignedByte(color.getGreen()); writeUnsignedByte(color.getBlue()); diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/CmdType.java b/VadereManager/src/org/vadere/manager/stsc/commands/CmdType.java new file mode 100644 index 000000000..bd727029e --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/CmdType.java @@ -0,0 +1,13 @@ +package org.vadere.manager.stsc.commands; + +public enum CmdType { + + CTRL, + VALUE_GET, + VALUE_SET, + VALUE_SUB, + CONTEXT_SUB, + RESPONSE, + UNKNOWN; + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICmd.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICmd.java new file mode 100644 index 000000000..1c3f63cad --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICmd.java @@ -0,0 +1,114 @@ +package org.vadere.manager.stsc.commands; + +public enum TraCICmd { + // TraCI/Control-related commands + GET_VERSION(0x00, CmdType.CTRL), + SIM_STEP(0x02,CmdType.CTRL), + CLOSE(0x7F, CmdType.CTRL), + LOAD(0x01,CmdType.CTRL), + SET_ORDER(0x03, CmdType.CTRL), + // Value Retrieval + GET_INDUCTION_LOOP(0xa0, CmdType.VALUE_GET), + RESPONSE_GET_INDUCTION_LOOP(0xb0, CmdType.RESPONSE), + GET_MULTI_ENTRY_EXIT_DETECTOR(0xa1, CmdType.VALUE_GET), + RESPONSE_GET_MULTI_ENTRY_EXIT_DETECTOR(0xb1, CmdType.RESPONSE), + GET_TRAFFIC_LIGHT_VALUE(0xa2, CmdType.VALUE_GET), + RESPONSE_GET_TRAFFIC_LIGHT_VALUE(0xb2, CmdType.RESPONSE), + GET_LANE_VALUE(0xa3, CmdType.VALUE_GET), + RESPONSE_GET_LANE_VALUE(0xb3,CmdType.RESPONSE), + GET_VEHICLE_VALUE(0xa4, CmdType.VALUE_GET), + RESPONSE_GET_VEHICLE_VALUE(0xb4, CmdType.RESPONSE), + GET_VEHICLE_TYPE_VALUE(0xa5, CmdType.VALUE_GET), + RESPONSE_GET_VEHICLE_TYPE_VALUE(0xb5, CmdType.RESPONSE), + GET_ROUTE_VALUE(0xa6, CmdType.VALUE_GET), + RESPONSE_GET_ROUTE_VALUE(0xb6, CmdType.RESPONSE), + GET_POI_VALUE(0xa7, CmdType.VALUE_GET), + RESPONSE_GET_POI_VALUE(0xb7, CmdType.RESPONSE), + GET_POLYGON(0xa8, CmdType.VALUE_GET), + RESPONSE_GET_POLYGON(0xb8, CmdType.RESPONSE), + GET_JUNCTION_VALUE(0xa9, CmdType.VALUE_GET), + RESPONSE_GET_JUNCTION_VALUE(0xb9, CmdType.RESPONSE), + GET_EDGE_VALUE(0xaa, CmdType.VALUE_GET), + RESPONSE_GET_EDGE_VALUE(0xba, CmdType.RESPONSE), + GET_SIMULATION_VALUE(0xab, CmdType.VALUE_GET), + RESPONSE_GET_SIMULATION_VALUE(0xbb, CmdType.RESPONSE), + GET_GUI_VALUE(0xac, CmdType.VALUE_GET), + RESPONSE_GET_GUI_VALUE(0xbc, CmdType.RESPONSE), + GET_LANEAREA_DETECTOR(0xad, CmdType.VALUE_GET), + RESPONSE_GET_LANEAREA_DETECTOR(0xbd, CmdType.RESPONSE), + GET_PERSON_VALUE(0xae, CmdType.VALUE_GET), + RESPONSE_GET_PERSON_VALUE(0xbe, CmdType.RESPONSE), + // State Changing + SET_TRAFFIC_LIGHT_STATE(0xc2, CmdType.VALUE_SET), + SET_LANE_STATE(0xc3,CmdType.VALUE_SET), + SET_VEHICLE_STATE(0xc4, CmdType.VALUE_SET), + SET_PERSON_STATE(0xce, CmdType.VALUE_SET), + SET_VEHICLE_TYPE_STATE(0xc5, CmdType.VALUE_SET), + SET_ROUTE_STATE(0xc6, CmdType.VALUE_SET), + SET_POT_STATE(0xc7, CmdType.VALUE_SET), + SET_POLYGON_STATE(0xc8, CmdType.VALUE_SET), + SET_EDGE_STATE(0xca, CmdType.VALUE_SET), + SET_SIMULATION_STATE(0xcc, CmdType.VALUE_SET), + SET_GUI_STATE(0xcc, CmdType.VALUE_SET), + // TraCI/Object Variable Subscription + SUB_INDUCTION_LOOP_VALUE(0xd0, CmdType.VALUE_SUB), + RESPONSE_SUB_INDUCTION_LOOP_VALUE(0xe0, CmdType.RESPONSE), + SUB_MULTI_ENTRY_EXIT_DETECTOR_VALUE(0xd1, CmdType.VALUE_SUB), + RESPONSE_SUB_MULTI_ENTRY_EXIT_DETECTOR_VALUE(0xe1, CmdType.RESPONSE), + SUB_TRAFFIC_LIGHT_VALUE(0xd2, CmdType.VALUE_SUB), + RESPONSE_SUB_TRAFFIC_LIGHT_VALUE(0xe2, CmdType.RESPONSE), + SUB_LANE_VALUE(0xd3, CmdType.VALUE_SUB), + RESPONSE_SUB_LANE_VALUE(0xe3, CmdType.RESPONSE), + SUB_VEHICLE_VALUE(0xd4, CmdType.VALUE_SUB), + RESPONSE_SUB_VEHICLE_VALUE(0xe4, CmdType.RESPONSE), + SUB_VEHICLE_TYPE_VALUE(0xd5, CmdType.VALUE_SUB), + RESPONSE_SUB_VEHICLE_TYPE_VALUE(0xe5, CmdType.RESPONSE), + SUB_ROUTE_VALUE(0xd6, CmdType.VALUE_SUB), + RESPONSE_SUB_ROUTE_VALUE(0xe6, CmdType.RESPONSE), + SUB_POI_VALUE(0xd7, CmdType.VALUE_SUB), + RESPONSE_SUB_POI_VALUE(0xe7, CmdType.RESPONSE), + SUB_POLYGON_VALUE(0xd8, CmdType.VALUE_SUB), + RESPONSE_SUB_POLYGON_VALUE(0xe8, CmdType.RESPONSE), + SUB_JUNCTION_VALUE(0xd9, CmdType.VALUE_SUB), + RESPONSE_SUB_JUNCTION_VALUE(0xe9, CmdType.RESPONSE), + SUB_EDGE_VALUE(0xda, CmdType.VALUE_SUB), + RESPONSE_SUB_EDGE_VALUE(0xea, CmdType.RESPONSE), + SUB_SIMULATION_VALUE(0xdb, CmdType.VALUE_SUB), + RESPONSE_SUB_SIMULATION_VALUE(0xeb, CmdType.RESPONSE), + // TraCI/Object Context Subscription + + UNKNOWN_CMD(-1, CmdType.UNKNOWN) + + + ; + + public int id; + public CmdType type; + + TraCICmd(int id, CmdType type) { + this.id = id; + this.type = type; + + } + + static TraCICmd fromId(int id){ + for(TraCICmd traCICmd : values()){ + if (traCICmd.id == id) + return traCICmd; + } + + return UNKNOWN_CMD; + } + + boolean isUnknown(){ + return this.id == UNKNOWN_CMD.id; + } + + @Override + public String toString() { + return "TraCICmd{" + + "id=" + id + + ", type=" + type + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java new file mode 100644 index 000000000..6ecb3d738 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -0,0 +1,81 @@ +package org.vadere.manager.stsc.commands; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICommandBuffer; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.control.CmdClose; +import org.vadere.manager.stsc.commands.control.CmdGetVersion; +import org.vadere.manager.stsc.commands.control.CmdSimStep; + +import java.nio.ByteBuffer; + +public abstract class TraCICommand { + + protected TraCICmd traCICmd; +// protected TraCICommandBuffer data; + + public static TraCICommand createCommand(ByteBuffer rawCmd){ + TraCICommandBuffer cmdBuffer = TraCICommandBuffer.wrap(rawCmd); + + int identifier = cmdBuffer.readCmdIdentifier(); + TraCICmd cmd = TraCICmd.fromId(identifier); + + switch (cmd.type){ + case CTRL: + return createControlCommand(cmd, cmdBuffer); + case VALUE_GET: + return createGetCommand(cmd, cmdBuffer); + case VALUE_SET: + return createSetCommand(cmd, cmdBuffer); + case VALUE_SUB: + case CONTEXT_SUB: + throw new TraCIException("Subscrtipons not implemente"); + case UNKNOWN: + throw new TraCIException("Unknown command found found with identifier: " + identifier); + default: + throw new IllegalStateException("Should not be reached. All CmdType enums are tested in switch statement"); + } + + } + + private static TraCICommand createControlCommand(TraCICmd cmd, TraCICommandBuffer cmdBuffer){ + + switch (cmd){ + case GET_VERSION: + return new CmdGetVersion(cmd); + case SIM_STEP: + return new CmdSimStep(cmd, cmdBuffer); + case CLOSE: + return new CmdClose(cmd); + + default: + throw new IllegalStateException("Should not be reached. Only TraCI control commands expected"); + } + + } + + private static TraCICommand createGetCommand(TraCICmd cmd, TraCICommandBuffer cmdBuffer){ + return new TraCIGetCommand(cmd, cmdBuffer); + } + + private static TraCICommand createSetCommand(TraCICmd cmd, TraCICommandBuffer cmdBuffer){ + return new TraCISetCommand(cmd, cmdBuffer); + } + + + protected TraCICommand(TraCICmd traCICmd){ + this.traCICmd = traCICmd; + } + + + public abstract TraCIPacket handleCommand(TraCIPacket response); + + public TraCICmd getTraCICmd() { + return traCICmd; + } + + public CmdType getCmdType(){ + return traCICmd.type; + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java new file mode 100644 index 000000000..37a29bec2 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -0,0 +1,42 @@ +package org.vadere.manager.stsc.commands; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICommandBuffer; +import org.vadere.manager.stsc.TraCIPacket; + +import java.util.EnumSet; + +public class TraCIGetCommand extends TraCICommand { + + protected int variableId; + protected String elementId; + + public TraCIGetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { + super(traCICmd); + EnumSet set; + try{ + variableId = cmdBuffer.reader.readUnsignedByte(); + elementId = cmdBuffer.reader.readString(); + } catch (Exception e){ + throw TraCIException.cmdErr(traCICmd, e); + } + } + + + public int getVariableId() { + return variableId; + } + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + @Override + public TraCIPacket handleCommand(TraCIPacket response) { + return null; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java new file mode 100644 index 000000000..ee1cb0d18 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -0,0 +1,51 @@ +package org.vadere.manager.stsc.commands; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICommandBuffer; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.TraCIPacket; + +public class TraCISetCommand extends TraCICommand{ + + protected int variableId; + protected String elementId; + protected TraCIDataType returnDataType; + protected Object variableValue; + + + public TraCISetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { + super(traCICmd); + try{ + variableId = cmdBuffer.reader.readUnsignedByte(); + elementId = cmdBuffer.reader.readString(); + int dataTye = cmdBuffer.reader.readUnsignedByte(); + returnDataType = TraCIDataType.fromId(dataTye); + if (returnDataType.isUnknown()) + throw new TraCIException("unknown TraCIDataType found in command: " + dataTye); + variableValue = cmdBuffer.reader.readTypeValue(returnDataType); + } catch (Exception e){ + throw TraCIException.cmdErr(traCICmd, e); + } + } + + public Object getVariableValue(){ + return variableValue; + } + + public int getVariableId() { + return variableId; + } + + public String getElementId() { + return elementId; + } + + public TraCIDataType getReturnDataType() { + return returnDataType; + } + + @Override + public TraCIPacket handleCommand(TraCIPacket response) { + return null; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java new file mode 100644 index 000000000..705d868de --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java @@ -0,0 +1,17 @@ +package org.vadere.manager.stsc.commands.control; + +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.commands.TraCICommand; + +public class CmdClose extends TraCICommand { + + public CmdClose(TraCICmd traCICmd) { + super(traCICmd); + } + + @Override + public TraCIPacket handleCommand(TraCIPacket response) { + return null; + } +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdGetVersion.java similarity index 59% rename from VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java rename to VadereManager/src/org/vadere/manager/stsc/commands/control/CmdGetVersion.java index fefe5f83a..0c102aca1 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/GetVersionCmdHandler.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdGetVersion.java @@ -1,20 +1,21 @@ -package org.vadere.manager.commandHandler; - +package org.vadere.manager.stsc.commands.control; import de.tudresden.sumo.config.Constants; -import org.vadere.manager.TraCICommand; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.TraCIWriter; +import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.commands.TraCICommand; -public class GetVersionCmdHandler implements CommandHandler{ +public class CmdGetVersion extends TraCICommand { + public CmdGetVersion(TraCICmd traCICmd){ + super(traCICmd); + } @Override - public TraCIPacket handelCommand(TraCICommand cmd) { - - - TraCIPacket response = TraCIPacket.createDynamicPacket(); + public TraCIPacket handleCommand(TraCIPacket response) { + response = TraCIPacket.createDynamicPacket(); response.add_OK_StatusResponse(Constants.CMD_GETVERSION); @@ -28,4 +29,4 @@ public class GetVersionCmdHandler implements CommandHandler{ return response; } -} \ No newline at end of file +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdSimStep.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdSimStep.java new file mode 100644 index 000000000..eee798ba5 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdSimStep.java @@ -0,0 +1,26 @@ +package org.vadere.manager.stsc.commands.control; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICommandBuffer; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.commands.TraCICommand; + +public class CmdSimStep extends TraCICommand { + + double targetTime; + + public CmdSimStep(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { + super(traCICmd); + try{ + this.targetTime = cmdBuffer.reader.readDouble(); + } catch (Exception e){ + throw TraCIException.cmdErr(traCICmd, e); + } + } + + @Override + public TraCIPacket handleCommand(TraCIPacket response) { + return null; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java b/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java index 10cc70224..85a01da80 100644 --- a/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java +++ b/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java @@ -19,7 +19,7 @@ public enum LightPhase { if (value.id == id) return value; } - throw new IllegalArgumentException("No LightPhase for id: " + id); + throw new IllegalArgumentException("No LightPhase for traCICmd: " + id); } } diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java index c86e90f6e..9377398f4 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java @@ -20,12 +20,12 @@ import static org.junit.Assert.assertThat; public class TraCIReaderTest { - TraCIOutputWriter writer; - TraCIReader reader; + TraCIWriterImpl writer; + TraCIReaderImpl reader; @Before public void before(){ - writer = new TraCIOutputWriter(); + writer = new TraCIWriterImpl(); } @After @@ -34,11 +34,11 @@ public class TraCIReaderTest { } private void createReader(){ - reader = TraCIReader.wrap(writer.asByteArray()); + reader = TraCIReaderImpl.wrap(writer.asByteArray()); } private void checkEmpty(){ - assertThat("TraCIReader must be empty at this point", reader.hasRemaining(), equalTo(false)); + assertThat("TraCIReaderImpl must be empty at this point", reader.hasRemaining(), equalTo(false)); } private void checkIdentifier( int matchWith){ @@ -124,7 +124,7 @@ public class TraCIReaderTest { writer.write2DPosition(22.3, 4.0); createReader(); - checkIdentifier(TraCIDataTypes.POS_2D.identifier); + checkIdentifier(TraCIDataType.POS_2D.identifier); VPoint p = reader.read2DPosition(); assertThat(p.x, equalTo(22.3)); assertThat(p.y, equalTo(4.0)); @@ -138,7 +138,7 @@ public class TraCIReaderTest { writer.write3DPosition(11.1, 22.2, 33.3); createReader(); - checkIdentifier(TraCIDataTypes.POS_3D.identifier); + checkIdentifier(TraCIDataType.POS_3D.identifier); Vector3D vec = reader.read3DPosition(); assertThat(vec.x, equalTo(11.1)); assertThat(vec.y, equalTo(22.2)); @@ -153,7 +153,7 @@ public class TraCIReaderTest { writer.writeRoadMapPosition("road_001", 12.5, 0); createReader(); - checkIdentifier(TraCIDataTypes.POS_ROAD_MAP.identifier); + checkIdentifier(TraCIDataType.POS_ROAD_MAP.identifier); RoadMapPosition roadMapPosition = reader.readRoadMapPosition(); assertThat(roadMapPosition.getRoadId(), equalTo("road_001")); assertThat(roadMapPosition.getPos(), equalTo(12.5)); @@ -168,7 +168,7 @@ public class TraCIReaderTest { writer.writeLonLatPosition(23.3, 11.9); createReader(); - checkIdentifier(TraCIDataTypes.POS_LON_LAT.identifier); + checkIdentifier(TraCIDataType.POS_LON_LAT.identifier); VPoint lonLat = reader.readLonLatPosition(); assertThat(lonLat.x, equalTo(23.3)); assertThat(lonLat.y, equalTo(11.9)); @@ -182,7 +182,7 @@ public class TraCIReaderTest { writer.writeLonLatAltPosition(34.5, 34.0, 11.3436); createReader(); - checkIdentifier(TraCIDataTypes.POS_LON_LAT_ALT.identifier); + checkIdentifier(TraCIDataType.POS_LON_LAT_ALT.identifier); Vector3D lonlatalt = reader.readLonLatAltPosition(); assertThat(lonlatalt.x, equalTo(34.5)); assertThat(lonlatalt.y, equalTo(34.0)); @@ -199,7 +199,7 @@ public class TraCIReaderTest { createReader(); VPolygon match = GeometryUtils.polygonFromPoints2D(points); - checkIdentifier(TraCIDataTypes.POLYGON.identifier); + checkIdentifier(TraCIDataType.POLYGON.identifier); VPolygon actual = reader.readPolygon(); assertThat(actual, equalTo(match)); @@ -215,7 +215,7 @@ public class TraCIReaderTest { writer.writeTrafficLightPhaseList(phases); createReader(); - checkIdentifier(TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); + checkIdentifier(TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.identifier); List actualPhases = reader.readTrafficLightPhaseList(); assertThat(actualPhases, equalTo(phases)); @@ -229,7 +229,7 @@ public class TraCIReaderTest { writer.writeColor(color); createReader(); - checkIdentifier(TraCIDataTypes.COLOR.identifier); + checkIdentifier(TraCIDataType.COLOR.identifier); assertThat(reader.readColor(), equalTo(color)); // buf must be empty diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIOutputWriterTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java similarity index 91% rename from VadereManager/tests/org/vadere/manager/stsc/TraCIOutputWriterTest.java rename to VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java index 72a417d51..1862806b4 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIOutputWriterTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java @@ -3,7 +3,7 @@ package org.vadere.manager.stsc; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.vadere.manager.TraCiException; +import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.TrafficLightPhase; import org.vadere.util.geometry.shapes.VPoint; @@ -17,13 +17,13 @@ import java.util.stream.IntStream; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; -public class TraCIOutputWriterTest { +public class TraCIWriterImplTest { - TraCIOutputWriter writer; + TraCIWriterImpl writer; @Before public void before(){ - writer = new TraCIOutputWriter(); + writer = new TraCIWriterImpl(); } @After @@ -166,7 +166,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.POS_2D.identifier); + checkIdentifier(buf.get(), TraCIDataType.POS_2D.identifier); // check x, y assertThat(buf.getDouble(), equalTo(23.456)); @@ -182,7 +182,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.POS_3D.identifier); + checkIdentifier(buf.get(), TraCIDataType.POS_3D.identifier); // check x, y, z assertThat(buf.getDouble(), equalTo(3.34)); @@ -201,7 +201,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.POS_ROAD_MAP.identifier); + checkIdentifier(buf.get(), TraCIDataType.POS_ROAD_MAP.identifier); // check roadId checkString(buf, "r001"); @@ -222,7 +222,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.POS_LON_LAT.identifier); + checkIdentifier(buf.get(), TraCIDataType.POS_LON_LAT.identifier); // check lon, lat assertThat(buf.getDouble(), equalTo(49.3345)); @@ -238,7 +238,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.POS_LON_LAT_ALT.identifier); + checkIdentifier(buf.get(), TraCIDataType.POS_LON_LAT_ALT.identifier); // check lon, lat, alt assertThat(buf.getDouble(), equalTo(49.33)); @@ -249,7 +249,7 @@ public class TraCIOutputWriterTest { checkEmpty(buf); } - @Test(expected = TraCiException.class) + @Test(expected = TraCIException.class) public void writePolygonWithError(){ ArrayList points = new ArrayList<>(); IntStream.range(0, 300).forEach( i -> points.add(new VPoint(i,i))); @@ -268,7 +268,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.POLYGON.identifier); + checkIdentifier(buf.get(), TraCIDataType.POLYGON.identifier); // check number of points (ubyte) assertThat(buf.get() & 0xff, equalTo(3)); @@ -288,7 +288,7 @@ public class TraCIOutputWriterTest { } - @Test(expected = TraCiException.class) + @Test(expected = TraCIException.class) public void writeTrafficLightPhaseListError(){ ArrayList phases = new ArrayList<>(); IntStream.range(0, 256) @@ -308,7 +308,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.TRAFFIC_LIGHT_PHASE_LIST.identifier); + checkIdentifier(buf.get(), TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.identifier); // check number of phases assertThat(buf.get() & 0xff, equalTo(1)); @@ -330,7 +330,7 @@ public class TraCIOutputWriterTest { ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataTypes.COLOR.identifier); + checkIdentifier(buf.get(), TraCIDataType.COLOR.identifier); // check color rgba assertThat(buf.get() & 0xff, equalTo(10) ); -- GitLab From fe2ec341850ca4ea0c5e1300ac27f26e448e5afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 10:25:10 +0200 Subject: [PATCH 05/58] move command handling to CommandHandler classes --- .../org/vadere/manager/CommandExecutor.java | 13 +++-- .../commandHandler/ControlCommandHandler.java | 56 +++++++++++++++++++ .../commandHandler/ControlCommands.java | 25 --------- .../commandHandler/PersonCommandHandler.java | 17 +++++- .../manager/stsc/commands/TraCICommand.java | 17 ++---- .../stsc/commands/TraCIGetCommand.java | 8 --- .../stsc/commands/TraCISetCommand.java | 5 -- .../stsc/commands/control/CmdClose.java | 17 ------ .../stsc/commands/control/CmdGetVersion.java | 32 ----------- .../commands/control/TraCICloseCommand.java | 12 ++++ .../control/TraCIGetVersionCommand.java | 12 ++++ ...dSimStep.java => TraCISimStepCommand.java} | 13 ++--- 12 files changed, 114 insertions(+), 113 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java delete mode 100644 VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java delete mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java delete mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/CmdGetVersion.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java rename VadereManager/src/org/vadere/manager/stsc/commands/control/{CmdSimStep.java => TraCISimStepCommand.java} (60%) diff --git a/VadereManager/src/org/vadere/manager/CommandExecutor.java b/VadereManager/src/org/vadere/manager/CommandExecutor.java index 8a2bb1091..4bed636bd 100644 --- a/VadereManager/src/org/vadere/manager/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/CommandExecutor.java @@ -2,8 +2,9 @@ package org.vadere.manager; import de.tudresden.sumo.config.Constants; -import org.vadere.manager.commandHandler.CommandHandler; +import org.vadere.manager.commandHandler.ControlCommandHandler; import org.vadere.manager.commandHandler.PersonCommandHandler; +import org.vadere.manager.commandHandler.TraCICmdHandler; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.util.logging.Logger; @@ -14,13 +15,13 @@ public class CommandExecutor { private static Logger logger = Logger.getLogger(CommandExecutor.class); - private HashMap cmdMap; + private HashMap cmdMap; public CommandExecutor() { cmdMap = new HashMap<>(); -// cmdMap.put(Constants.CMD_GETVERSION, ControlCommands::getVersion); - cmdMap.put(Constants.CMD_GET_PERSON_VARIABLE, new PersonCommandHandler()); - cmdMap.put(Constants.CMD_SET_PERSON_VARIABLE, new PersonCommandHandler()); + cmdMap.put(Constants.CMD_GETVERSION, ControlCommandHandler.instance::process_getVersion); + cmdMap.put(Constants.CMD_GET_PERSON_VARIABLE, PersonCommandHandler.instance::processGet); + cmdMap.put(Constants.CMD_SET_PERSON_VARIABLE, PersonCommandHandler.instance::processSet); // cmdMap.put(Constants.CMD_GET_SIM_VARIABLE, SimulationCommands::processGet); // cmdMap.put(Constants.CMD_SET_SIM_VARIABLE, SimulationCommands::processSet); // cmdMap.put(Constants.CMD_GET_POLYGON_VARIABLE, SimulationCommands::processGet); @@ -28,7 +29,7 @@ public class CommandExecutor { } TraCIPacket execute(TraCICommand cmd){ - CommandHandler handler = cmdMap.get(cmd.getTraCICmd()); + TraCICmdHandler handler = cmdMap.get(cmd.getTraCICmd()); if (handler == null){ logger.errorf("No CommandHandler found for command: %02X", cmd.getTraCICmd()); return TraCIPacket.createDynamicPacket().add_Err_StatusResponse(cmd.getTraCICmd().id, "ID not found."); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java new file mode 100644 index 000000000..832d1f944 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -0,0 +1,56 @@ +package org.vadere.manager.commandHandler; + + +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; + +public class ControlCommandHandler extends CommandHandler{ + + public static ControlCommandHandler instance; + + static { + instance = new ControlCommandHandler(); + } + + private ControlCommandHandler(){} + + public TraCIPacket process_getVersion(TraCICommand cmd) { + + TraCIPacket response = TraCIPacket.createDynamicPacket(); + + // @Override +// public TraCIPacket handleCommand(TraCIPacket response) { +// response = TraCIPacket.createDynamicPacket(); +// +// response.add_OK_StatusResponse(Constants.CMD_GETVERSION); +// +// TraCIWriter writer = response.getWriter(); +// +// int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); +// writer.writeCommandLength(cmdLen); // 1b or 5b +// writer.writeInt(Constants.CMD_GETVERSION); // 1b +// writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b +// writer.writeString("Vaderer TraCI Server"); // 4b + X +// +// return response; +// } + +// response.add_OK_StatusResponse(Constants.CMD_GETVERSION); +// +// TraCIWriter writer = response.getWriter(); +// +// int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); +// writer.writeCommandLength(cmdLen); // 1b or 5b +// writer.writeInt(Constants.CMD_GETVERSION); // 1b +// writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b +// writer.writeString("Vaderer TraCI Server"); // 4b + X + + return response; + } + + + @Override + public TraCIPacket handel(TraCICommand cmd) { + return null; + } +} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java deleted file mode 100644 index 5f6eb57e8..000000000 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommands.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.vadere.manager.commandHandler; - - -import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCICommand; - -public class ControlCommands { - - static public TraCIPacket getVersion(TraCICommand cmd) { - - TraCIPacket response = TraCIPacket.createDynamicPacket(); - -// response.add_OK_StatusResponse(Constants.CMD_GETVERSION); -// -// TraCIWriter writer = response.getWriter(); -// -// int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); -// writer.writeCommandLength(cmdLen); // 1b or 5b -// writer.writeInt(Constants.CMD_GETVERSION); // 1b -// writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b -// writer.writeString("Vaderer TraCI Server"); // 4b + X - - return response; - } -} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 5d03a9f7a..d3326f3c4 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -9,6 +9,17 @@ import org.vadere.manager.stsc.commands.TraCISetCommand; public class PersonCommandHandler extends CommandHandler{ + public static PersonCommandHandler instance; + + static { + instance = new PersonCommandHandler(); + } + + private PersonCommandHandler(){ + + } + + protected TraCIPacket process_getIDList(TraCIGetCommand cmd){ TraCIPacket packet = TraCIPacket.createDynamicPacket(); packet.add_OK_StatusResponse(cmd.getTraCICmd()); @@ -105,7 +116,8 @@ public class PersonCommandHandler extends CommandHandler{ } } - public TraCIPacket processGet(TraCIGetCommand cmd){ + public TraCIPacket processGet(TraCICommand cmd){ + TraCIGetCommand getCmd = (TraCIGetCommand) cmd; // switch (cmd.getVariableId()){ // case TraCIVariable.ID_LIST.id: // @@ -113,7 +125,8 @@ public class PersonCommandHandler extends CommandHandler{ return null; } - public TraCIPacket processSet(TraCISetCommand cmd){ + public TraCIPacket processSet(TraCICommand cmd){ + TraCISetCommand setCmd = (TraCISetCommand) cmd; return null; } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java index 6ecb3d738..1c509e6d3 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -2,17 +2,15 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICommandBuffer; -import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.commands.control.CmdClose; -import org.vadere.manager.stsc.commands.control.CmdGetVersion; -import org.vadere.manager.stsc.commands.control.CmdSimStep; +import org.vadere.manager.stsc.commands.control.TraCICloseCommand; +import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import java.nio.ByteBuffer; public abstract class TraCICommand { protected TraCICmd traCICmd; -// protected TraCICommandBuffer data; public static TraCICommand createCommand(ByteBuffer rawCmd){ TraCICommandBuffer cmdBuffer = TraCICommandBuffer.wrap(rawCmd); @@ -42,11 +40,11 @@ public abstract class TraCICommand { switch (cmd){ case GET_VERSION: - return new CmdGetVersion(cmd); + return new TraCIGetVersionCommand(cmd); case SIM_STEP: - return new CmdSimStep(cmd, cmdBuffer); + return new TraCISimStepCommand(cmd, cmdBuffer); case CLOSE: - return new CmdClose(cmd); + return new TraCICloseCommand(cmd); default: throw new IllegalStateException("Should not be reached. Only TraCI control commands expected"); @@ -67,9 +65,6 @@ public abstract class TraCICommand { this.traCICmd = traCICmd; } - - public abstract TraCIPacket handleCommand(TraCIPacket response); - public TraCICmd getTraCICmd() { return traCICmd; } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index 37a29bec2..1eb703ba4 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -2,7 +2,6 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICommandBuffer; -import org.vadere.manager.stsc.TraCIPacket; import java.util.EnumSet; @@ -31,12 +30,5 @@ public class TraCIGetCommand extends TraCICommand { return elementId; } - public void setElementId(String elementId) { - this.elementId = elementId; - } - @Override - public TraCIPacket handleCommand(TraCIPacket response) { - return null; - } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java index ee1cb0d18..c13f91cf0 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -3,7 +3,6 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICommandBuffer; import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.TraCIPacket; public class TraCISetCommand extends TraCICommand{ @@ -44,8 +43,4 @@ public class TraCISetCommand extends TraCICommand{ return returnDataType; } - @Override - public TraCIPacket handleCommand(TraCIPacket response) { - return null; - } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java deleted file mode 100644 index 705d868de..000000000 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdClose.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.vadere.manager.stsc.commands.control; - -import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCICmd; -import org.vadere.manager.stsc.commands.TraCICommand; - -public class CmdClose extends TraCICommand { - - public CmdClose(TraCICmd traCICmd) { - super(traCICmd); - } - - @Override - public TraCIPacket handleCommand(TraCIPacket response) { - return null; - } -} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdGetVersion.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdGetVersion.java deleted file mode 100644 index 0c102aca1..000000000 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdGetVersion.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.vadere.manager.stsc.commands.control; - -import de.tudresden.sumo.config.Constants; - -import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.TraCIWriter; -import org.vadere.manager.stsc.commands.TraCICmd; -import org.vadere.manager.stsc.commands.TraCICommand; - -public class CmdGetVersion extends TraCICommand { - - public CmdGetVersion(TraCICmd traCICmd){ - super(traCICmd); - } - - @Override - public TraCIPacket handleCommand(TraCIPacket response) { - response = TraCIPacket.createDynamicPacket(); - - response.add_OK_StatusResponse(Constants.CMD_GETVERSION); - - TraCIWriter writer = response.getWriter(); - - int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); - writer.writeCommandLength(cmdLen); // 1b or 5b - writer.writeInt(Constants.CMD_GETVERSION); // 1b - writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b - writer.writeString("Vaderer TraCI Server"); // 4b + X - - return response; - } -} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java new file mode 100644 index 000000000..dd94d236c --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java @@ -0,0 +1,12 @@ +package org.vadere.manager.stsc.commands.control; + +import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.commands.TraCICommand; + +public class TraCICloseCommand extends TraCICommand { + + public TraCICloseCommand(TraCICmd traCICmd) { + super(traCICmd); + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java new file mode 100644 index 000000000..093bb4098 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java @@ -0,0 +1,12 @@ +package org.vadere.manager.stsc.commands.control; + +import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.commands.TraCICommand; + +public class TraCIGetVersionCommand extends TraCICommand { + + public TraCIGetVersionCommand(TraCICmd traCICmd){ + super(traCICmd); + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdSimStep.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java similarity index 60% rename from VadereManager/src/org/vadere/manager/stsc/commands/control/CmdSimStep.java rename to VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java index eee798ba5..f92f81940 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/CmdSimStep.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java @@ -2,15 +2,14 @@ package org.vadere.manager.stsc.commands.control; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICommandBuffer; -import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; -public class CmdSimStep extends TraCICommand { +public class TraCISimStepCommand extends TraCICommand { - double targetTime; + private double targetTime; - public CmdSimStep(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { + public TraCISimStepCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); try{ this.targetTime = cmdBuffer.reader.readDouble(); @@ -19,8 +18,8 @@ public class CmdSimStep extends TraCICommand { } } - @Override - public TraCIPacket handleCommand(TraCIPacket response) { - return null; + public double getTargetTime() { + return targetTime; } + } -- GitLab From ee19adb3c6a5ade1e2598794dc6d07965f5eb519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 10:29:24 +0200 Subject: [PATCH 06/58] remove TraCICmdHandler interface from CommandHandler class. This is only a functional Interface --- .../manager/commandHandler/CommandHandler.java | 3 +-- .../commandHandler/ControlCommandHandler.java | 4 ---- .../manager/commandHandler/PersonCommandHandler.java | 12 ------------ .../manager/commandHandler/TraCICmdHandler.java | 1 + 4 files changed, 2 insertions(+), 18 deletions(-) diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 13f1e1d89..0febebd32 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,7 +1,6 @@ package org.vadere.manager.commandHandler; -public abstract class CommandHandler implements TraCICmdHandler{ - +public abstract class CommandHandler { } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 832d1f944..230ebee43 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -49,8 +49,4 @@ public class ControlCommandHandler extends CommandHandler{ } - @Override - public TraCIPacket handel(TraCICommand cmd) { - return null; - } } \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index d3326f3c4..2378ead25 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -104,18 +104,6 @@ public class PersonCommandHandler extends CommandHandler{ throw TraCIException.getNotImplemented(cmd); } - @Override - public TraCIPacket handel(TraCICommand cmd) { - switch (cmd.getCmdType()){ - case VALUE_GET: - return processGet((TraCIGetCommand) cmd); - case VALUE_SET: - return processSet((TraCISetCommand) cmd); - default: - throw new TraCIException("Wrong command type for TraCI/Person API"); - } - } - public TraCIPacket processGet(TraCICommand cmd){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; // switch (cmd.getVariableId()){ diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java index e9a68e123..ad9f6c0e6 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java @@ -3,6 +3,7 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; +@FunctionalInterface public interface TraCICmdHandler { -- GitLab From 50b33199fec89136bc785099f62a8984a12aaa25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 10:53:50 +0200 Subject: [PATCH 07/58] dispatch PersonGet Commands --- .../org/vadere/manager/TraCIException.java | 2 +- .../commandHandler/CommandHandler.java | 10 +++ .../commandHandler/PersonCommandHandler.java | 86 ++++++++----------- ...TraCIVariable.java => TraCIPersonVar.java} | 13 ++- 4 files changed, 56 insertions(+), 55 deletions(-) rename VadereManager/src/org/vadere/manager/commandHandler/{TraCIVariable.java => TraCIPersonVar.java} (81%) diff --git a/VadereManager/src/org/vadere/manager/TraCIException.java b/VadereManager/src/org/vadere/manager/TraCIException.java index 1f704d257..5e8be22a1 100644 --- a/VadereManager/src/org/vadere/manager/TraCIException.java +++ b/VadereManager/src/org/vadere/manager/TraCIException.java @@ -22,7 +22,7 @@ public class TraCIException extends RuntimeException { } public static TraCIException cmdErrVariableType(TraCICmd cmd, Throwable cause){ - return new TraCIException("Error creating TraCIVariable: " + cmd.toString(), cause); + return new TraCIException("Error creating TraCIPersonVar: " + cmd.toString(), cause); } public static TraCIException getNotImplemented(TraCIGetCommand cmd){ diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 0febebd32..3c21bad23 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,6 +1,16 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; + public abstract class CommandHandler { + public TraCIPacket process_NotImplemented(TraCICommand cmd){ + return null; + } + + public TraCIPacket process_UnknownCommand(TraCICommand cmd){ + return null; + } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 2378ead25..67639e917 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -21,6 +21,9 @@ public class PersonCommandHandler extends CommandHandler{ protected TraCIPacket process_getIDList(TraCIGetCommand cmd){ + + + TraCIPacket packet = TraCIPacket.createDynamicPacket(); packet.add_OK_StatusResponse(cmd.getTraCICmd()); @@ -46,44 +49,11 @@ public class PersonCommandHandler extends CommandHandler{ } - protected TraCIPacket process_getPosition3D(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_getAngle(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_getSlope(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_getRoadID(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_getTypeID(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_getColor(TraCIGetCommand cmd){ + protected TraCIPacket process_getLength(TraCIGetCommand cmd){ throw TraCIException.getNotImplemented(cmd); } - protected TraCIPacket process_getLanePosition(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - - protected TraCIPacket process_Length(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_MinGap(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - protected TraCIPacket process_getWidth(TraCIGetCommand cmd){ throw TraCIException.getNotImplemented(cmd); } @@ -92,25 +62,39 @@ public class PersonCommandHandler extends CommandHandler{ throw TraCIException.getNotImplemented(cmd); } - protected TraCIPacket process_getNextEdge(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_getRemainingStages(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - - protected TraCIPacket process_getVehicle(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } - public TraCIPacket processGet(TraCICommand cmd){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; -// switch (cmd.getVariableId()){ -// case TraCIVariable.ID_LIST.id: -// -// } - return null; + + switch (TraCIPersonVar.fromId(getCmd.getVariableId())){ + case ID_LIST: + return process_getIDList(getCmd); + case COUNT: + return process_getIDCount(getCmd); + case SPEED: + return process_getSpeed(getCmd); + case POS_2D: + return process_getPosition(getCmd); + case LENGTH: + return process_getLength(getCmd); + case WIDTH: + return process_getWidth(getCmd); + case WAITING_TIME: + return process_getWaitingTime(getCmd); + case POS_3D: + case ANGLE: + case ROAD_ID: + case TYPE: + case COLOR: + case EDGE_POS: + case MIN_GAP: + case NEXT_EDGE: + case REMAINING_STAGES: + case VEHICLE: + return process_NotImplemented(getCmd); + case UNKNOWN: + default: + return process_UnknownCommand(getCmd); + } } public TraCIPacket processSet(TraCICommand cmd){ diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIVariable.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java similarity index 81% rename from VadereManager/src/org/vadere/manager/commandHandler/TraCIVariable.java rename to VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java index f19a16d6e..64fdb3c70 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCIVariable.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java @@ -2,7 +2,7 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.TraCIDataType; -public enum TraCIVariable { +public enum TraCIPersonVar { ID_LIST(0x00, TraCIDataType.STRING_LIST), COUNT(0x01, TraCIDataType.INTEGER), @@ -29,7 +29,7 @@ public enum TraCIVariable { int id; TraCIDataType returnType; - TraCIVariable(int id, TraCIDataType retVal) { + TraCIPersonVar(int id, TraCIDataType retVal) { this.id = id; this.returnType = retVal; } @@ -38,10 +38,17 @@ public enum TraCIVariable { return this.id == UNKNOWN.id; } + public static TraCIPersonVar fromId(int id){ + for(TraCIPersonVar var : values()){ + if (var.id == id) + return var; + } + return UNKNOWN; + } @Override public String toString() { - return "TraCIVariable{" + + return "TraCIPersonVar{" + "id=" + id + ", returnType=" + returnType + '}'; -- GitLab From 5474ef4a3cec774238dc16b848bbc90a4ec0e9a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 15:21:03 +0200 Subject: [PATCH 08/58] refactor TraCIWriter. Implement PersonCommandHandler --- .../org/vadere/manager/CommandExecutor.java | 2 +- .../commandHandler/CommandHandler.java | 5 +- .../commandHandler/ControlCommandHandler.java | 4 +- .../commandHandler/PersonCommandHandler.java | 48 +++-- .../org/vadere/manager/stsc/ByteWriter.java | 35 ---- .../src/org/vadere/manager/stsc/Packet.java | 10 - .../org/vadere/manager/stsc/TraCIPacket.java | 189 ++++++++++++++---- .../org/vadere/manager/stsc/TraCIWriter.java | 82 ++++++-- .../vadere/manager/stsc/TraCIWriterImpl.java | 78 +++++--- 9 files changed, 296 insertions(+), 157 deletions(-) delete mode 100644 VadereManager/src/org/vadere/manager/stsc/ByteWriter.java delete mode 100644 VadereManager/src/org/vadere/manager/stsc/Packet.java diff --git a/VadereManager/src/org/vadere/manager/CommandExecutor.java b/VadereManager/src/org/vadere/manager/CommandExecutor.java index 4bed636bd..62cb82fe1 100644 --- a/VadereManager/src/org/vadere/manager/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/CommandExecutor.java @@ -32,7 +32,7 @@ public class CommandExecutor { TraCICmdHandler handler = cmdMap.get(cmd.getTraCICmd()); if (handler == null){ logger.errorf("No CommandHandler found for command: %02X", cmd.getTraCICmd()); - return TraCIPacket.createDynamicPacket().add_Err_StatusResponse(cmd.getTraCICmd().id, "ID not found."); + return TraCIPacket.create().add_Err_StatusResponse(cmd.getTraCICmd().id, "ID not found."); } return handler.handel(cmd); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 3c21bad23..d63390ba0 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,16 +1,17 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.TraCIStatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; public abstract class CommandHandler { public TraCIPacket process_NotImplemented(TraCICommand cmd){ - return null; + return TraCIPacket.sendStatus(cmd.getTraCICmd(), TraCIStatusResponse.NOT_IMPLEMENTED, "Command " + cmd.getCmdType().toString() + "not Implemented"); } public TraCIPacket process_UnknownCommand(TraCICommand cmd){ - return null; + return TraCIPacket.sendStatus(cmd.getTraCICmd(), TraCIStatusResponse.ERR, "Command " + cmd.getCmdType().toString() + "Unknown"); } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 230ebee43..c57f68515 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -16,11 +16,11 @@ public class ControlCommandHandler extends CommandHandler{ public TraCIPacket process_getVersion(TraCICommand cmd) { - TraCIPacket response = TraCIPacket.createDynamicPacket(); + TraCIPacket response = TraCIPacket.create(); // @Override // public TraCIPacket handleCommand(TraCIPacket response) { -// response = TraCIPacket.createDynamicPacket(); +// response = TraCIPacket.create(); // // response.add_OK_StatusResponse(Constants.CMD_GETVERSION); // diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 67639e917..7bd11083c 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -1,10 +1,13 @@ package org.vadere.manager.commandHandler; -import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.manager.stsc.commands.TraCISetCommand; +import org.vadere.util.geometry.shapes.VPoint; + +import java.util.List; public class PersonCommandHandler extends CommandHandler{ @@ -19,49 +22,51 @@ public class PersonCommandHandler extends CommandHandler{ } - protected TraCIPacket process_getIDList(TraCIGetCommand cmd){ + List pedestrians = null; // get.... - - TraCIPacket packet = TraCIPacket.createDynamicPacket(); - packet.add_OK_StatusResponse(cmd.getTraCICmd()); - - // Test - // get Data ... -// List list = new ArrayList<>(); -// packet.getWriter().writeCommandLength(4); // cmd leng -// packet.getWriter().writeUnsignedByte(1); - - throw TraCIException.getNotImplemented(cmd); + return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, pedestrians); } protected TraCIPacket process_getIDCount(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); + + int numPerson = 0; // get... + + return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, numPerson); } protected TraCIPacket process_getSpeed(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); + + double speed = 0.0; // get... + + return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, speed); } protected TraCIPacket process_getPosition(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); + + VPoint point = new VPoint(1.0, 1.0); // get + + return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, point); } protected TraCIPacket process_getLength(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); + + + double pedLength = 0.4; // get... (durchmesser) + + return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, pedLength); } protected TraCIPacket process_getWidth(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); - } + double pedWidth = 0.4; // get.. (durchmesser) - protected TraCIPacket process_getWaitingTime(TraCIGetCommand cmd){ - throw TraCIException.getNotImplemented(cmd); + return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, pedWidth); } + public TraCIPacket processGet(TraCICommand cmd){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; @@ -79,7 +84,6 @@ public class PersonCommandHandler extends CommandHandler{ case WIDTH: return process_getWidth(getCmd); case WAITING_TIME: - return process_getWaitingTime(getCmd); case POS_3D: case ANGLE: case ROAD_ID: diff --git a/VadereManager/src/org/vadere/manager/stsc/ByteWriter.java b/VadereManager/src/org/vadere/manager/stsc/ByteWriter.java deleted file mode 100644 index 1f6548fa0..000000000 --- a/VadereManager/src/org/vadere/manager/stsc/ByteWriter.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.vadere.manager.stsc; - -import java.nio.ByteBuffer; - -public interface ByteWriter { - - void writeByte(int val); - - default void writeUnsignedByte(int val){ - if (val>= 0 && val<=255){ - writeByte(val); - } else { - throw new IllegalArgumentException( - "unsignedByte must be within (including) 0..255 but was: " + val); - } - } - void writeBytes(byte[] buf); - void writeBytes(byte[] buf, int offset, int len); - - default void writeBytes(ByteBuffer buf, int offset, int len){ - writeBytes(buf.array(), offset, len); - } - default void writeBytes(ByteBuffer buf){ - writeBytes(buf, 0, buf.array().length); - } - - default void writeInt(int val){ - writeBytes(ByteBuffer.allocate(4).putInt(val).array()); - } - - default void writeDouble(double val){ - writeBytes(ByteBuffer.allocate(8).putDouble(val).array()); - } - -} \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/stsc/Packet.java b/VadereManager/src/org/vadere/manager/stsc/Packet.java deleted file mode 100644 index a9448a526..000000000 --- a/VadereManager/src/org/vadere/manager/stsc/Packet.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.vadere.manager.stsc; - -public abstract class Packet { - - - public abstract byte[] send(); - - public abstract byte[] extractCommandsOnly(); - -} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java index aeda6d6c0..6dc3607f6 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java @@ -1,113 +1,216 @@ package org.vadere.manager.stsc; +import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.util.geometry.shapes.VPoint; import java.nio.ByteBuffer; +import java.util.List; -public class TraCIPacket extends Packet { +public class TraCIPacket { - private TraCIWriterImpl data; - private boolean containsLengthField; + private TraCIWriter writer; + private boolean emptyLengthField; + private boolean finalized; // - public static TraCIPacket createDynamicPacket(){ - return new TraCIPacket().setLength(-1); + public static TraCIPacket create(){ + return new TraCIPacket().addEmptyLengthField(); } - public static TraCIPacket createFixedPacket(int len){ - return new TraCIPacket().setLength(len); + public static TraCIPacket create(int packetSize){ + TraCIPacket packet = new TraCIPacket(); + packet.writer.writeInt(packetSize); + return packet; + } + + public static TraCIPacket sendStatusOK(TraCICmd cmd){ + TraCIPacket response = new TraCIPacket(); + response.writer.writeInt(11); // packet size (4 + 7) [4] + response.add_OK_StatusResponse(cmd); + response.finalizePacket(); + return response; + } + + public static TraCIPacket sendStatus(TraCICmd cmd, TraCIStatusResponse status, String description){ + TraCIPacket response = new TraCIPacket(); + int cmdLen = 7 + response.writer.getStringByteCount(description); + + if (cmdLen > 255){ + //extended CMD + cmdLen += 4; // add int field + response.writer.writeInt(4 + cmdLen); // packet size (4 + cmdLen) [4] + response.writer.writeUnsignedByte(0); // [1] + response.writer.writeInt(cmdLen); // [4] + } else { + response.writer.writeInt(4 + cmdLen); // [4] + response.writer.writeUnsignedByte(cmdLen); // [1] + } + response.writer.writeUnsignedByte(cmd.id); // [1] + response.writer.writeUnsignedByte(status.code); // [1] + response.writer.writeString(description); //[4 + strLen] + response.finalizePacket(); + return response; + } + + private void finalizePacket(){ + finalized = true; + } + + private void throwIfFinalized(){ + if (finalized) + throw new TraCIException("Cannot change finalized TraCIPacket"); } private TraCIPacket() { - data = new TraCIWriterImpl(); + writer = new TraCIWriterImpl(); + finalized = false; + emptyLengthField = false; } public TraCIPacket reset(){ - data.rest(); + writer.rest(); return this; } - private TraCIPacket setLength(int len){ - data.writeInt(len); - containsLengthField = len != -1; + private TraCIPacket addEmptyLengthField(){ + if(emptyLengthField) + throw new IllegalStateException("Should only be called at most once."); + writer.writeInt(-1); + emptyLengthField = true; return this; } - public boolean isContainsLengthField() { - return containsLengthField; - } - @Override public byte[] send() { - if (containsLengthField) - return data.asByteArray(); + // packet is valid TraCI packet an can be send. + if (finalized) + return writer.asByteArray(); + + // packet size must be set to correct value + if (emptyLengthField){ + ByteBuffer packet = writer.asByteBuffer(); + packet.putInt(packet.capacity()); + packet.position(0); + return packet.array(); + } else { + return writer.asByteArray(); + } + } - ByteBuffer packet = data.asByteBuffer(); - // write final message length field at start of packet. - packet.putInt(packet.capacity()); - return packet.array(); + private TraCIWriter getCmdBuilder(TraCIGetCommand cmd, TraCICmd responseCMD){ + return new TraCIWriterImpl() + .writeUnsignedByte(responseCMD.id) + .writeUnsignedByte(cmd.getVariableId()) + .writeString(cmd.getElementId()); } - public byte[] extractCommandsOnly(){ - byte[] ret = new byte[data.size()-4]; - ByteBuffer buffer = data.asByteBuffer(); - buffer.position(4); - buffer.get(ret, 0, ret.length); - return ret; + + public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, List data){ + + add_OK_StatusResponse(cmd.getTraCICmd()); + + addCommand(getCmdBuilder(cmd, responseCMD) + .writeStringListWithId(data) + .asByteArray()); + return this; } - public TraCIPacket addCommand(ByteBuffer buf){ - data.writeBytes(buf); + + public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, int data){ + + add_OK_StatusResponse(cmd.getTraCICmd()); + + addCommand(getCmdBuilder(cmd, responseCMD) + .writeIntWithId(data) + .asByteArray()); + + return this; + } + + public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, double data){ + + add_OK_StatusResponse(cmd.getTraCICmd()); + + addCommand(getCmdBuilder(cmd, responseCMD) + .writeDoubleWithId(data) + .asByteArray()); + return this; } - public TraCIPacket addCommand(byte[] buf){ - data.writeBytes(buf); + public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, VPoint data){ + + add_OK_StatusResponse(cmd.getTraCICmd()); + + addCommand(getCmdBuilder(cmd, responseCMD) + .write2DPosition(data.x, data.y) + .asByteArray()); + return this; } + + private void addCommand(byte[] buffer){ + if (buffer.length > 255){ + writer.writeUnsignedByte(0); + writer.writeInt(buffer.length); + writer.writeBytes(buffer); + } else { + writer.writeUnsignedByte(buffer.length); + writer.writeBytes(buffer); + } + } + + public TraCIPacket add_Err_StatusResponse(int cmdIdentifier, String description){ + throwIfFinalized(); return addStatusResponse(cmdIdentifier, TraCIStatusResponse.ERR, description); } public TraCIPacket add_OK_StatusResponse(TraCICmd traCICmd){ + throwIfFinalized(); return add_OK_StatusResponse(traCICmd.id); } public TraCIPacket add_OK_StatusResponse(int cmdIdentifier){ + throwIfFinalized(); // simple OK Status without description. - data.writeUnsignedByte(7); - data.writeUnsignedByte(cmdIdentifier); - data.writeUnsignedByte(TraCIStatusResponse.OK.code); - data.writeInt(0); + writer.writeUnsignedByte(7); + writer.writeUnsignedByte(cmdIdentifier); + writer.writeUnsignedByte(TraCIStatusResponse.OK.code); + writer.writeInt(0); return this; } public TraCIPacket addStatusResponse(int cmdIdentifier, TraCIStatusResponse response, String description){ + throwIfFinalized(); // expect single byte cmdLenField. // cmdLenField + cmdIdentifier + cmdResult + strLen + str // 1 + 1 + 1 + 4 + len(strBytes) - int cmdLen = 7 + data.stringByteCount(description); + int cmdLen = 7 + writer.stringByteCount(description); - data.writeCommandLength(cmdLen); // 1b - data.writeUnsignedByte(cmdIdentifier); // 1b - data.writeUnsignedByte(response.code); // 4b - data.writeString(description); // 4b + X + writer.writeCommandLength(cmdLen); // 1b + writer.writeUnsignedByte(cmdIdentifier); // 1b + writer.writeUnsignedByte(response.code); // 4b + writer.writeString(description); // 4b + X return this; } public TraCIWriter getWriter(){ - return (TraCIWriter)data; + throwIfFinalized(); + return writer; } public int size(){ - return data.size(); + return writer.size(); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java index 73f360eda..8dee049f5 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java @@ -4,42 +4,86 @@ import org.vadere.manager.stsc.sumo.TrafficLightPhase; import org.vadere.util.geometry.shapes.VPoint; import java.awt.*; +import java.nio.ByteBuffer; import java.util.List; -public interface TraCIWriter extends ByteWriter { +public interface TraCIWriter { - void writeUnsignedByteWithId(int val); - void writeByteWithId(byte val); - void writeIntWithId(int val); - void writeDoubleWithId(double val); - void writeStringWithId(String val); - void writeStringListWithId(List val); + ByteBuffer asByteBuffer(); + byte[] asByteArray(); - void writeString(String val); + TraCIWriter rest(); - void writeStringList(List val); + TraCIWriter writeUnsignedByteWithId(int val); + TraCIWriter writeByteWithId(byte val); + TraCIWriter writeIntWithId(int val); + TraCIWriter writeDoubleWithId(double val); + TraCIWriter writeStringWithId(String val); + TraCIWriter writeStringListWithId(List val); - void write2DPosition(double x, double y); + TraCIWriter writeByte(int val); - void write3DPosition(double x, double y, double z); + default TraCIWriter writeUnsignedByte(int val){ + if (val>= 0 && val<=255){ + writeByte(val); + } else { + throw new IllegalArgumentException( + "unsignedByte must be within (including) 0..255 but was: " + val); + } + return this; + } - void writeRoadMapPosition(String roadId, double pos, int laneId); + TraCIWriter writeBytes(byte[] buf); + TraCIWriter writeBytes(byte[] buf, int offset, int len); - void writeLonLatPosition(double lon, double lat); + default TraCIWriter writeBytes(ByteBuffer buf, int offset, int len){ + writeBytes(buf.array(), offset, len); + return this; + } + default TraCIWriter writeBytes(ByteBuffer buf){ + writeBytes(buf, 0, buf.array().length); + return this; + } - void writeLonLatAltPosition(double lon, double lat, double alt); + default TraCIWriter writeInt(int val){ + writeBytes(ByteBuffer.allocate(4).putInt(val).array()); + return this; + } - void writePolygon(VPoint... points); + default TraCIWriter writeDouble(double val){ + writeBytes(ByteBuffer.allocate(8).putDouble(val).array()); + return this; + } - void writePolygon(List points); + TraCIWriter writeString(String val); - void writeTrafficLightPhaseList(List phases); + TraCIWriter writeStringList(List val); - void writeColor(Color color); + TraCIWriter write2DPosition(double x, double y); - void writeCommandLength(int cmdLen); + TraCIWriter write3DPosition(double x, double y, double z); + + TraCIWriter writeRoadMapPosition(String roadId, double pos, int laneId); + + TraCIWriter writeLonLatPosition(double lon, double lat); + + TraCIWriter writeLonLatAltPosition(double lon, double lat, double alt); + + TraCIWriter writePolygon(VPoint... points); + + TraCIWriter writePolygon(List points); + + TraCIWriter writeTrafficLightPhaseList(List phases); + + TraCIWriter writeColor(Color color); + + TraCIWriter writeCommandLength(int cmdLen); int stringByteCount(String str); + + int size(); + int getStringByteCount(String val); + } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java b/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java index 842a077a3..9be0ca4cb 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java @@ -22,134 +22,161 @@ public class TraCIWriterImpl implements TraCIWriter { data = new ByteArrayOutputStream(); } + @Override public ByteBuffer asByteBuffer(){ return ByteBuffer.wrap(data.toByteArray()); } + @Override public byte[] asByteArray(){ return data.toByteArray(); } - public void rest(){ + @Override + public TraCIWriter rest(){ data.reset(); + return this; } @Override - public void writeByte(int val) { + public TraCIWriter writeByte(int val) { data.write(val); + return this; } @Override - public void writeBytes(byte[] buf) { + public TraCIWriter writeBytes(byte[] buf) { data.writeBytes(buf); + return this; } @Override - public void writeBytes(byte[] buf, int offset, int len) { + public TraCIWriter writeBytes(byte[] buf, int offset, int len) { data.write(buf, offset, len); + return this; } @Override - public void writeUnsignedByteWithId(int val) { + public TraCIWriter writeUnsignedByteWithId(int val) { writeUnsignedByte(TraCIDataType.U_BYTE.identifier); writeUnsignedByte(val); + return this; } @Override - public void writeByteWithId(byte val) { + public TraCIWriter writeByteWithId(byte val) { writeUnsignedByte(TraCIDataType.BYTE.identifier); writeByte(val); + return this; } @Override - public void writeIntWithId(int val) { + public TraCIWriter writeIntWithId(int val) { writeUnsignedByte(TraCIDataType.INTEGER.identifier); writeInt(val); + return this; } @Override - public void writeDoubleWithId(double val) { + public TraCIWriter writeDoubleWithId(double val) { writeUnsignedByte(TraCIDataType.DOUBLE.identifier); writeDouble(val); + return this; } @Override - public void writeStringWithId(String val) { + public TraCIWriter writeStringWithId(String val) { writeUnsignedByte(TraCIDataType.STRING.identifier); writeString(val); + return this; } @Override - public void writeStringListWithId(List val) { + public TraCIWriter writeStringListWithId(List val) { writeUnsignedByte(TraCIDataType.STRING_LIST.identifier); writeStringList(val); + return this; } @Override - public void writeString(String val){ + public TraCIWriter writeString(String val){ writeString(val, StandardCharsets.US_ASCII); + return this; } @Override - public void writeStringList(List val){ + public TraCIWriter writeStringList(List val){ writeInt(val.size()); val.forEach(this::writeString); + return this; } - private void writeString(String val, Charset c){ + @Override + public int getStringByteCount(String val){ + return val.getBytes(StandardCharsets.US_ASCII).length; + } + + private TraCIWriter writeString(String val, Charset c){ byte[] byteString = val.getBytes(c); writeInt(byteString.length); if (byteString.length > 0) writeBytes(byteString); + return this; } @Override - public void write2DPosition(double x, double y){ + public TraCIWriter write2DPosition(double x, double y){ writeUnsignedByte(TraCIDataType.POS_2D.identifier); writeDouble(x); writeDouble(y); + return this; } @Override - public void write3DPosition(double x, double y, double z){ + public TraCIWriter write3DPosition(double x, double y, double z){ writeUnsignedByte(TraCIDataType.POS_3D.identifier); writeDouble(x); writeDouble(y); writeDouble(z); + return this; } @Override - public void writeRoadMapPosition(String roadId, double pos, int laneId){ + public TraCIWriter writeRoadMapPosition(String roadId, double pos, int laneId){ writeUnsignedByte(TraCIDataType.POS_ROAD_MAP.identifier); writeString(roadId); writeDouble(pos); writeUnsignedByte(laneId); + return this; } @Override - public void writeLonLatPosition(double lon, double lat){ + public TraCIWriter writeLonLatPosition(double lon, double lat){ writeUnsignedByte(TraCIDataType.POS_LON_LAT.identifier); writeDouble(lon); writeDouble(lat); + return this; } @Override - public void writeLonLatAltPosition(double lon, double lat, double alt){ + public TraCIWriter writeLonLatAltPosition(double lon, double lat, double alt){ writeUnsignedByte(TraCIDataType.POS_LON_LAT_ALT.identifier); writeDouble(lon); writeDouble(lat); writeDouble(alt); + return this; } @Override - public void writePolygon(VPoint... points){ + public TraCIWriter writePolygon(VPoint... points){ writePolygon(Arrays.asList(points)); + return this; } @Override - public void writePolygon(List points){ + public TraCIWriter writePolygon(List points){ writeUnsignedByte(TraCIDataType.POLYGON.identifier); if(points.size() > 255) throw new TraCIException("Polygon to big. TraCI only supports polygon up to 255 points."); @@ -158,10 +185,11 @@ public class TraCIWriterImpl implements TraCIWriter { writeDouble(p.getX()); writeDouble(p.getY()); }); + return this; } @Override - public void writeTrafficLightPhaseList(List phases){ + public TraCIWriter writeTrafficLightPhaseList(List phases){ writeUnsignedByte(TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.identifier); if(phases.size() > 255) throw new TraCIException("Traffic Light Phase List to big. TraCI only supports list up to 255 elements."); @@ -171,15 +199,17 @@ public class TraCIWriterImpl implements TraCIWriter { writeString(phase.getSuccRoad()); writeUnsignedByte(phase.getPhase().id); }); + return this; } @Override - public void writeColor(Color color){ + public TraCIWriter writeColor(Color color){ writeUnsignedByte(TraCIDataType.COLOR.identifier); writeUnsignedByte(color.getRed()); writeUnsignedByte(color.getGreen()); writeUnsignedByte(color.getBlue()); writeUnsignedByte(color.getAlpha()); + return this; } @Override @@ -195,7 +225,7 @@ public class TraCIWriterImpl implements TraCIWriter { * @param cmdLen number of bytes of command *including* one byte for the cmdLen field. */ @Override - public void writeCommandLength(int cmdLen) { + public TraCIWriter writeCommandLength(int cmdLen) { if (cmdLen <= 255){ // writeUnsignedByte(cmdLen); @@ -205,8 +235,10 @@ public class TraCIWriterImpl implements TraCIWriter { writeUnsignedByte(0); // first byte must be null writeInt(cmdLen); // write cmdLen as integer } + return this; } + @Override public int size(){ return data.size(); } -- GitLab From ae8a9e73f7b699a767bba4b2babe03fdb4790040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 15:31:44 +0200 Subject: [PATCH 09/58] set command not implemented --- .../commandHandler/PersonCommandHandler.java | 4 +- .../commandHandler/TraCIPersonVar.java | 41 +++++++++++-------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 7bd11083c..6a6d28981 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -4,7 +4,6 @@ import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.commands.TraCISetCommand; import org.vadere.util.geometry.shapes.VPoint; import java.util.List; @@ -102,8 +101,7 @@ public class PersonCommandHandler extends CommandHandler{ } public TraCIPacket processSet(TraCICommand cmd){ - TraCISetCommand setCmd = (TraCISetCommand) cmd; - return null; + return process_NotImplemented(cmd); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java index 64fdb3c70..ce207f161 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java @@ -4,24 +4,29 @@ import org.vadere.manager.stsc.TraCIDataType; public enum TraCIPersonVar { - ID_LIST(0x00, TraCIDataType.STRING_LIST), - COUNT(0x01, TraCIDataType.INTEGER), - SPEED(0x40, TraCIDataType.DOUBLE), - POS_2D(0x42, TraCIDataType.POS_2D), - POS_3D(0x42, TraCIDataType.POS_3D), - ANGLE(0x43, TraCIDataType.DOUBLE), - SLOPE(0x36, TraCIDataType.DOUBLE), - ROAD_ID(0x50, TraCIDataType.STRING), - TYPE(0x4f, TraCIDataType.STRING), - COLOR(0x45, TraCIDataType.COLOR), - EDGE_POS(0x56, TraCIDataType.DOUBLE), - LENGTH(0x44,TraCIDataType.DOUBLE), - MIN_GAP(0x4c, TraCIDataType.DOUBLE), - WIDTH(0x4d, TraCIDataType.DOUBLE), - WAITING_TIME(0x7a,TraCIDataType.DOUBLE), - NEXT_EDGE(0xc1, TraCIDataType.STRING), - REMAINING_STAGES(0xc2, TraCIDataType.INTEGER), - VEHICLE(0xc3, TraCIDataType.STRING), + ID_LIST(0x00, TraCIDataType.STRING_LIST), // get + COUNT(0x01, TraCIDataType.INTEGER), // get + SPEED(0x40, TraCIDataType.DOUBLE), // get, set + POS_2D(0x42, TraCIDataType.POS_2D), // get + POS_3D(0x42, TraCIDataType.POS_3D), // get + ANGLE(0x43, TraCIDataType.DOUBLE), // get + SLOPE(0x36, TraCIDataType.DOUBLE), // get + ROAD_ID(0x50, TraCIDataType.STRING), // get + TYPE(0x4f, TraCIDataType.STRING), // get, set + COLOR(0x45, TraCIDataType.COLOR), // get, set + EDGE_POS(0x56, TraCIDataType.DOUBLE), // get + LENGTH(0x44,TraCIDataType.DOUBLE), // get, set + MIN_GAP(0x4c, TraCIDataType.DOUBLE), // get, set + WIDTH(0x4d, TraCIDataType.DOUBLE), // get, set + WAITING_TIME(0x7a,TraCIDataType.DOUBLE), // get + NEXT_EDGE(0xc1, TraCIDataType.STRING), // get + REMAINING_STAGES(0xc2, TraCIDataType.INTEGER), // get + VEHICLE(0xc3, TraCIDataType.STRING), // get + ADD(0x80, TraCIDataType.COMPOUND_OBJECT), // set + APPEND_STAGE(0xc4, TraCIDataType.COMPOUND_OBJECT), // set + REMOVE_STAGE(0xc5, TraCIDataType.INTEGER), // set + REROUTE(0x90, TraCIDataType.COMPOUND_OBJECT), // set + UNKNOWN(-1, TraCIDataType.UNKNOWN), ; -- GitLab From b8a11e2d6799b927b44fe23bf719d5cef0a5582a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 20:48:55 +0200 Subject: [PATCH 10/58] add single simulation step control. --- VadereGui/resources/messages.properties | 5 +- VadereGui/resources/messages_de_DE.properties | 5 +- .../control/ActionNextTimeStep.java | 35 +++++++++++ .../control/ActionPauseScenario.java | 9 +-- .../control/ActionResumeNormalSpeed.java | 29 +++++++++ .../gui/projectview/model/VadereState.java | 6 +- .../gui/projectview/view/ProjectView.java | 57 +++++++++++++++-- .../vadere/simulator/control/Simulation.java | 59 +++++++++++++++++- .../simulator/projects/ScenarioRun.java | 61 ++++++++++++------- .../simulator/projects/VadereProject.java | 16 +++++ 10 files changed, 243 insertions(+), 39 deletions(-) create mode 100644 VadereGui/src/org/vadere/gui/projectview/control/ActionNextTimeStep.java create mode 100644 VadereGui/src/org/vadere/gui/projectview/control/ActionResumeNormalSpeed.java diff --git a/VadereGui/resources/messages.properties b/VadereGui/resources/messages.properties index ace1e07bd..1a5fad2b2 100644 --- a/VadereGui/resources/messages.properties +++ b/VadereGui/resources/messages.properties @@ -79,11 +79,13 @@ ProjectView.btnRunAllTests.text=Run all scenarios ProjectView.mntmRunSelectetTests.text=Run selected scenario ProjectView.mntmRunSelectedTests.text=Run selected scenarios ProjectView.mntmSimulationResult.text=Show Simulation Result Dialog -ProjectView.btnPauseRunningTests.text=Pause running scenarios +ProjectView.btnPauseRunningTests.text=Pause ProjectView.btnRunSelectedTest.text=Run selected scenario ProjectView.btnRunSelectedTest.toolTipText=Run selected scenario ProjectView.btnPauseRunningTests.toolTipText=Pause the scenario run ProjectView.btnStopRunningTests.text=Stop running scenarios +ProjectView.btnResumeNormalSpeed.text=Resume +ProjectView.btnNextSimulationStep=Step ProjectView.lblCurrentTest.text=Current scenario\: ProjectView.lblNewLabel.text=New label ProjectView.mnFile.text=Project @@ -193,6 +195,7 @@ Unavailable.text=Unavailable Running.text=Running Paused.text=Paused Initialized.text=Initialized +Step.text=Singlestep OutputprocessorsView.columnNames.text=["No dataProcessor chosen"] OutputprocessorsView.dataProcessor.text={Processor: ""} diff --git a/VadereGui/resources/messages_de_DE.properties b/VadereGui/resources/messages_de_DE.properties index 22bd9ca55..13dbdac97 100644 --- a/VadereGui/resources/messages_de_DE.properties +++ b/VadereGui/resources/messages_de_DE.properties @@ -79,11 +79,13 @@ ProjectView.btnRunAllTests.text=Alle Szenarios ausf\u00FChren ProjectView.mntmRunSelectetTests.text=Ausgew\u00E4hlte Szenarios ausf\u00FChren ProjectView.mntmRunSelectedTests.text=Ausgew\u00E4hlte Szenarios ausf\u00FChren ProjectView.mntmSimulationResult.text=Ergebnis Dialog anzeigen -ProjectView.btnPauseRunningTests.text=Laufende Szenarios pausieren +ProjectView.btnPauseRunningTests.text=Pausieren ProjectView.btnRunSelectedTest.text=Ausgew\u00E4hltes Szenario ausf\u00FChren ProjectView.btnRunSelectedTest.toolTipText=Ausgew\u00E4hlten Szenario ausf\u00FChren ProjectView.btnPauseRunningTests.toolTipText=Pausiert den Szenariodurchlauf ProjectView.btnStopRunningTests.text=Laufende Szenarios anhalten +ProjectView.btnResumeNormalSpeed.text=Ausf\u00FChren +ProjectView.btnNextSimulationStep=Einzelschritt ProjectView.lblCurrentTest.text=Aktuelles Szenario\: ProjectView.lblNewLabel.text=Neues Label ProjectView.mnFile.text=Projekt @@ -198,6 +200,7 @@ Unavailable.text=Nicht verf\u00FCgbar Running.text=L\u00E4uft Paused.text=Pausiert Initialized.text=Initialisiert +Step.text=Einzelschritt OutputprocessorsView.columnNames.text=["Kein Prozessor gew\u00E4hlt"] OutputprocessorsView.dataProcessor.text={"Processor": ""} diff --git a/VadereGui/src/org/vadere/gui/projectview/control/ActionNextTimeStep.java b/VadereGui/src/org/vadere/gui/projectview/control/ActionNextTimeStep.java new file mode 100644 index 000000000..cd43cb218 --- /dev/null +++ b/VadereGui/src/org/vadere/gui/projectview/control/ActionNextTimeStep.java @@ -0,0 +1,35 @@ +package org.vadere.gui.projectview.control; + +import org.vadere.gui.projectview.model.ProjectViewModel; +import org.vadere.gui.projectview.model.VadereScenarioTableModel; +import org.vadere.gui.projectview.model.VadereState; +import org.vadere.simulator.projects.Scenario; + +import java.awt.event.ActionEvent; + +import javax.swing.*; + +public class ActionNextTimeStep extends AbstractAction { + + private ProjectViewModel model; + + public ActionNextTimeStep(final String name, final ProjectViewModel model) { + super(name); + this.model = model; + } + + + @Override + public void actionPerformed(ActionEvent e) { + Scenario scenario = model.getRunningScenario().getScenario(); + model.getScenarioTableModel().replace(scenario, + new VadereScenarioTableModel.VadereDisplay(scenario, VadereState.STEP)); + if(model.getProject().isScenarioInSingleStepMode()){ + model.getProject().nextSimCommand(-1); + } else { + // activate SingleStepMode and start waiting + model.getProject().setSingleStepMode(true); + model.getProject().nextSimCommand(-1); // wait on each simulation step. + } + } +} diff --git a/VadereGui/src/org/vadere/gui/projectview/control/ActionPauseScenario.java b/VadereGui/src/org/vadere/gui/projectview/control/ActionPauseScenario.java index 0c51e862c..1bd5395a3 100644 --- a/VadereGui/src/org/vadere/gui/projectview/control/ActionPauseScenario.java +++ b/VadereGui/src/org/vadere/gui/projectview/control/ActionPauseScenario.java @@ -1,6 +1,5 @@ package org.vadere.gui.projectview.control; - import org.vadere.gui.projectview.model.ProjectViewModel; import org.vadere.gui.projectview.model.VadereScenarioTableModel; import org.vadere.gui.projectview.model.VadereState; @@ -22,17 +21,11 @@ public class ActionPauseScenario extends AbstractAction { this.model = model; } - @Override public void actionPerformed(final ActionEvent e) { ProjectViewModel.ScenarioBundle optionalScenarioBundle = model.getRunningScenario(); Scenario scenario = optionalScenarioBundle.getScenario(); - if (model.getProject().isScenarioPaused()) { - model.getProject().resumePausedScenarios(); - model.getScenarioTableModel().replace(scenario, - new VadereScenarioTableModel.VadereDisplay(scenario, VadereState.RUNNING)); - logger.info(String.format("all running scenarios resumed")); - } else { + if (! model.getProject().isScenarioPaused()) { model.getProject().pauseRunnningScenario(); model.getScenarioTableModel().replace(scenario, new VadereScenarioTableModel.VadereDisplay(scenario, VadereState.PAUSED)); diff --git a/VadereGui/src/org/vadere/gui/projectview/control/ActionResumeNormalSpeed.java b/VadereGui/src/org/vadere/gui/projectview/control/ActionResumeNormalSpeed.java new file mode 100644 index 000000000..2a290a17f --- /dev/null +++ b/VadereGui/src/org/vadere/gui/projectview/control/ActionResumeNormalSpeed.java @@ -0,0 +1,29 @@ +package org.vadere.gui.projectview.control; + +import org.vadere.gui.projectview.model.ProjectViewModel; +import org.vadere.gui.projectview.model.VadereScenarioTableModel; +import org.vadere.gui.projectview.model.VadereState; +import org.vadere.simulator.projects.Scenario; + +import java.awt.event.ActionEvent; + +import javax.swing.*; + +public class ActionResumeNormalSpeed extends AbstractAction { + + + private ProjectViewModel model; + + public ActionResumeNormalSpeed(String name, ProjectViewModel model) { + super(name); + this.model = model; + } + + @Override + public void actionPerformed(ActionEvent e) { + Scenario scenario = model.getRunningScenario().getScenario(); + model.getProject().resumePausedScenarios(); + model.getScenarioTableModel().replace(scenario, + new VadereScenarioTableModel.VadereDisplay(scenario, VadereState.RUNNING)); + } +} diff --git a/VadereGui/src/org/vadere/gui/projectview/model/VadereState.java b/VadereGui/src/org/vadere/gui/projectview/model/VadereState.java index 6931cad49..2bc15d580 100644 --- a/VadereGui/src/org/vadere/gui/projectview/model/VadereState.java +++ b/VadereGui/src/org/vadere/gui/projectview/model/VadereState.java @@ -3,7 +3,7 @@ package org.vadere.gui.projectview.model; import org.vadere.gui.components.utils.Messages; public enum VadereState { - RUNNING, PAUSED, INTERRUPTED, INITIALIZED; + RUNNING, PAUSED, INTERRUPTED, INITIALIZED, STEP; @Override public String toString() { @@ -16,8 +16,10 @@ public enum VadereState { return Messages.getString("Interrupted.text"); case INITIALIZED: return Messages.getString("Initialized.text"); + case STEP: + return Messages.getString("Step.text"); default: - return this.toString(); + throw new IllegalStateException("VadereState. Should not be reached. All enums already tested."); } } } diff --git a/VadereGui/src/org/vadere/gui/projectview/view/ProjectView.java b/VadereGui/src/org/vadere/gui/projectview/view/ProjectView.java index 9c163f288..335d94fd2 100644 --- a/VadereGui/src/org/vadere/gui/projectview/view/ProjectView.java +++ b/VadereGui/src/org/vadere/gui/projectview/view/ProjectView.java @@ -5,7 +5,36 @@ import org.jetbrains.annotations.NotNull; import org.vadere.gui.components.utils.Messages; import org.vadere.gui.postvisualization.control.Player; import org.vadere.gui.projectview.VadereApplication; -import org.vadere.gui.projectview.control.*; +import org.vadere.gui.projectview.control.ActionAddScenario; +import org.vadere.gui.projectview.control.ActionCloneScenario; +import org.vadere.gui.projectview.control.ActionCloseApplication; +import org.vadere.gui.projectview.control.ActionCreateProject; +import org.vadere.gui.projectview.control.ActionDeleteOutputDirectories; +import org.vadere.gui.projectview.control.ActionDeleteScenarios; +import org.vadere.gui.projectview.control.ActionEditScenarioDescription; +import org.vadere.gui.projectview.control.ActionGenerateScenarioFromOutputFile; +import org.vadere.gui.projectview.control.ActionInterruptScenarios; +import org.vadere.gui.projectview.control.ActionLoadProject; +import org.vadere.gui.projectview.control.ActionLoadRecentProject; +import org.vadere.gui.projectview.control.ActionNextTimeStep; +import org.vadere.gui.projectview.control.ActionOpenInExplorer; +import org.vadere.gui.projectview.control.ActionOutputToScenario; +import org.vadere.gui.projectview.control.ActionPauseScenario; +import org.vadere.gui.projectview.control.ActionRenameOutputFile; +import org.vadere.gui.projectview.control.ActionRenameProject; +import org.vadere.gui.projectview.control.ActionRenameScenario; +import org.vadere.gui.projectview.control.ActionResumeNormalSpeed; +import org.vadere.gui.projectview.control.ActionRunAllScenarios; +import org.vadere.gui.projectview.control.ActionRunOutput; +import org.vadere.gui.projectview.control.ActionRunSelectedScenarios; +import org.vadere.gui.projectview.control.ActionSaveAsProject; +import org.vadere.gui.projectview.control.ActionSaveProject; +import org.vadere.gui.projectview.control.ActionSeeDiscardChanges; +import org.vadere.gui.projectview.control.ActionShowAboutDialog; +import org.vadere.gui.projectview.control.ActionToClipboard; +import org.vadere.gui.projectview.control.IOutputFileRefreshListener; +import org.vadere.gui.projectview.control.IProjectChangeListener; +import org.vadere.gui.projectview.control.ShowResultDialogAction; import org.vadere.gui.projectview.model.ProjectViewModel; import org.vadere.gui.projectview.model.ProjectViewModel.OutputBundle; import org.vadere.gui.projectview.model.ProjectViewModel.ScenarioBundle; @@ -20,9 +49,6 @@ import org.vadere.util.io.IOUtils; import org.vadere.util.logging.Logger; import org.vadere.util.opencl.CLUtils; -import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.event.ListSelectionEvent; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; @@ -37,6 +63,10 @@ import java.util.Optional; import java.util.Set; import java.util.prefs.Preferences; +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import javax.swing.event.ListSelectionEvent; + /** * Main view of the Vadere GUI. * @@ -72,6 +102,8 @@ public class ProjectView extends JFrame implements ProjectFinishedListener, Sing private JButton btnRunAllScenarios; private JButton btnStopRunningScenarios; private JButton btnPauseRunningScenarios; + private JButton btnNextSimulationStep; + private JButton btnResumeNormalSpeed; private JMenu mntmRecentProjects; private ProgressPanel progressPanel = new ProgressPanel(); private ScenarioPanel scenarioJPanel; @@ -288,6 +320,8 @@ public class ProjectView extends JFrame implements ProjectFinishedListener, Sing btnRunSelectedScenario.setVisible(!flag); btnStopRunningScenarios.setVisible(flag); btnPauseRunningScenarios.setVisible(flag); + btnNextSimulationStep.setVisible(flag); + btnResumeNormalSpeed.setVisible(flag); scenarioTable.setEnabled(!flag); scenarioTable.clearSelection(); outputTable.setEnabled(!flag); @@ -699,6 +733,13 @@ public class ProjectView extends JFrame implements ProjectFinishedListener, Sing btnStopRunningScenarios = new JButton(interruptScenariosAction); toolBar.add(btnStopRunningScenarios); + ActionResumeNormalSpeed resumeNormalSpeedAction = + new ActionResumeNormalSpeed(Messages.getString("ProjectView.btnResumeNormalSpeed.text"), model); + resumeNormalSpeedAction.putValue(Action.LARGE_ICON_KEY, + new ImageIcon(ProjectView.class.getResource("/icons/greenarrow_right_small.png"))); + btnResumeNormalSpeed = new JButton(resumeNormalSpeedAction); + toolBar.add(btnResumeNormalSpeed); + ActionPauseScenario pauseScenarioAction = new ActionPauseScenario(Messages.getString("ProjectView.btnPauseRunningTests.text"), model); pauseScenarioAction.putValue(Action.LONG_DESCRIPTION, @@ -712,6 +753,14 @@ public class ProjectView extends JFrame implements ProjectFinishedListener, Sing KeyStroke.getKeyStroke(Messages.getString("ProjectView.pauseTests.shortcut").charAt(0)), "pauseTests"); toolBar.getActionMap().put("pauseTests", pauseScenarioAction); + ActionNextTimeStep nextTimeStepAction = + new ActionNextTimeStep(Messages.getString("ProjectView.btnNextSimulationStep"), model); + nextTimeStepAction.putValue(Action.LONG_DESCRIPTION, "Next Step"); + nextTimeStepAction.putValue(Action.LARGE_ICON_KEY, + new ImageIcon(ProjectView.class.getResource("/icons/greenarrow_step.png"))); + btnNextSimulationStep = new JButton(nextTimeStepAction); + toolBar.add(btnNextSimulationStep); + buildKeyboardShortcuts(pauseScenarioAction, interruptScenariosAction); } diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index 17e9bc6d4..27e240c8b 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -47,6 +47,10 @@ public class Simulation { private boolean isRunSimulation = false; private boolean isPaused = false; + private boolean singleStepMode = false; + private boolean waitForSimCommand = false; + private double simulateUntilInSec = -1; + /** * current simulation time (seconds) */ @@ -252,6 +256,36 @@ public class Simulation { c.postUpdate(simTimeInSec); } + + // Single step hook + // Remote Control Hook + synchronized (this){ + if (singleStepMode){ + // check reached next simTime (-1 simulate one step) + if (simTimeInSec >= simulateUntilInSec || simulateUntilInSec == -1){ + logger.warnf("Simulated until: %.4f", simTimeInSec); + logger.warn("check command queue"); + logger.warn("check subscriptions"); + // check command queue and execute (GET, SET Value) + // check subscriptions + // todo: add some control manger (i.e. TraCI-Manager, ...) + + setWaitForSimCommand(true); + while (waitForSimCommand){ + logger.warn("wait for next SimCommand..."); + try { + wait(); + } catch (InterruptedException e) { + waitForSimCommand = false; + Thread.currentThread().interrupt(); + logger.warn("interrupt while waitForSimCommand"); + } + } + } + } + } + + if (runTimeInSec + startTimeInSec > simTimeInSec + 1e-7) { simTimeInSec += Math.min(attributesSimulation.getSimTimeStepLength(), runTimeInSec + startTimeInSec - simTimeInSec); } else { @@ -362,11 +396,34 @@ public class Simulation { } public synchronized boolean isRunning() { - return isRunSimulation && !isPaused(); + return isRunSimulation && !isPaused() && !isWaitForSimCommand(); + } + + public synchronized boolean isSingleStepMode(){ return singleStepMode;} + + public void setSingleStepMode(boolean singleStepMode) { + this.singleStepMode = singleStepMode; + } + + public boolean isWaitForSimCommand() { + return waitForSimCommand; + } + + public void setWaitForSimCommand(boolean waitForSimCommand) { + this.waitForSimCommand = waitForSimCommand; + } + + public synchronized void nextSimCommand(double simulateUntilInSec){ + this.simulateUntilInSec = simulateUntilInSec; + waitForSimCommand = false; + isPaused = false; + notify(); } public synchronized void resume() { isPaused = false; + waitForSimCommand = false; + singleStepMode = false; notify(); } diff --git a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java index 2aa420902..9e9da31c2 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java @@ -143,6 +143,45 @@ public class ScenarioRun implements Runnable { return simulation != null && simulation.isRunning(); } + public boolean isScenarioInSingleStepMode(){ + return simulation != null && simulation.isSingleStepMode(); + } + + public void setSingleStepMode(boolean singleStepMode){ + + simulation.setSingleStepMode(singleStepMode); + } + + public boolean isWaitForSimCommand(){ + return simulation != null && simulation.isWaitForSimCommand(); + } + + public void nextSimCommand(double simulateUntilInSec){ + + if ( !simulation.isSingleStepMode()) + throw new IllegalStateException("Simulation is not in 'remoteControl' state"); + + simulation.nextSimCommand(simulateUntilInSec); + } + + public void pause() { + + if(! simulation.isRunning()) + throw new IllegalStateException("Received trigger to pause the simulation, but it is not running!"); + + if (simulation != null) + simulation.pause(); + } + + public void resume() { + + if(simulation.isRunning()) + throw new IllegalStateException("Received trigger to resume the simulation, but it is not paused!"); + + if (simulation != null) + simulation.resume(); + } + public void addPassiveCallback(final PassiveCallback pc) { passiveCallbacks.add(pc); } @@ -168,28 +207,6 @@ public class ScenarioRun implements Runnable { return Paths.get(this.outputPath.toString()); } - public void pause() { - - if(! simulation.isRunning()){ - throw new IllegalStateException("Received trigger to pause the simulation, but it is not running!"); - } - - if (simulation != null) { - simulation.pause(); - } - } - - public void resume() { - - if(simulation.isRunning()){ - throw new IllegalStateException("Received trigger to resume the simulation, but it is not paused!"); - } - - if (simulation != null) { - simulation.resume(); - } - } - private void createAndSetOutputDirectory() { try { // Create output directory diff --git a/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java b/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java index 5bb7a24f5..c8acdcbd4 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java @@ -165,6 +165,22 @@ public class VadereProject { return !currentScenarioRun.isRunning(); } + public boolean isScenarioInSingleStepMode(){ + return currentScenarioRun.isScenarioInSingleStepMode(); + } + + public void setSingleStepMode(boolean singleStepMode){ + currentScenarioRun.setSingleStepMode(singleStepMode); + } + + public boolean isWaitForSimCommand(){ + return currentScenarioRun.isWaitForSimCommand(); + } + + public void nextSimCommand(double simulateUntilInSec){ + currentScenarioRun.nextSimCommand(simulateUntilInSec); + } + public void resumePausedScenarios() { currentScenarioRun.resume(); } -- GitLab From bcec6271e79f3a0956fc7a7d37ae6cf91392cda0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 22:03:03 +0200 Subject: [PATCH 11/58] add remote control code to ScenarioRun.java and Simulation.java --- VadereManager/pom.xml | 7 +++ .../src/org/vadere/manager/ClientHandler.java | 53 +---------------- .../org/vadere/manager/CommandExecutor.java | 34 ++++++++--- .../src/org/vadere/manager/RemoteManager.java | 57 +++++++++++++++++++ .../commandHandler/ControlCommandHandler.java | 12 ++++ .../control/RemoteManagerListener.java | 10 ++++ .../vadere/simulator/control/Simulation.java | 19 ++++--- .../simulator/projects/ScenarioRun.java | 16 +++++- 8 files changed, 139 insertions(+), 69 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/RemoteManager.java create mode 100644 VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java diff --git a/VadereManager/pom.xml b/VadereManager/pom.xml index 039b577d8..21524652e 100644 --- a/VadereManager/pom.xml +++ b/VadereManager/pom.xml @@ -145,6 +145,13 @@ traas 1.0 + + org.vadere + simulator + 0.1-SNAPSHOT + compile + + diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index a2eecfce5..bd41b9f4c 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -16,14 +16,13 @@ public class ClientHandler implements Runnable{ private final ServerSocket serverSocket; private final TraCISocket traCISocket; private final CommandExecutor cmdExecutor; -// private final OutputQueue outputQueue; + public ClientHandler(ServerSocket serverSocket, TraCISocket traCISocket) { this.serverSocket = serverSocket; this.traCISocket = traCISocket; this.cmdExecutor = new CommandExecutor(); -// this.outputQueue = new OutputQueue(); -// this.outputQueue.start(); + } @@ -54,7 +53,6 @@ public class ClientHandler implements Runnable{ TraCIPacket response = cmdExecutor.execute(cmd); logger.debugf("send packet with %d byte", response.size()); traCISocket.sendExact(response); -// outputQueue.put(response); cmd = traCIPacketBuffer.nextCommand(); } @@ -67,51 +65,4 @@ public class ClientHandler implements Runnable{ } -// private class OutputQueue extends Thread{ -// -// -// private BlockingQueue packets; -// private boolean running; -// -// OutputQueue(){ -// packets = new ArrayBlockingQueue<>(30); -// running = true; -// } -// -// public void put(TraCIPacket packet){ -// try { -// packets.put(packet); -// } catch (InterruptedException e) { -// cancel(); -// Thread.currentThread().interrupt(); -// } -// } -// -// public void cancel(){ -// running = false; -// } -// -// @Override -// public void run(){ -// logger.info("Start output thread...."); -// try { -// while (running){ -// TraCIPacket packet = packets.take(); -// System.out.println("send package"); -// traCISocket.sendExact(packet); -// -// if (Thread.currentThread().isInterrupted()) -// running = false; -// } -// } catch (InterruptedException interEx) { -// Thread.currentThread().interrupt(); -// } catch (IOException e) { -// logger.error("Error sending TraciMessage",e); -// } finally { -// if (packets.size() > 0) -// logger.warnf("Stop sending data with %d packet left in queue. Deleting packets..."); -// -// } -// } -// } } diff --git a/VadereManager/src/org/vadere/manager/CommandExecutor.java b/VadereManager/src/org/vadere/manager/CommandExecutor.java index 62cb82fe1..1598dc53c 100644 --- a/VadereManager/src/org/vadere/manager/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/CommandExecutor.java @@ -1,11 +1,10 @@ package org.vadere.manager; -import de.tudresden.sumo.config.Constants; - import org.vadere.manager.commandHandler.ControlCommandHandler; import org.vadere.manager.commandHandler.PersonCommandHandler; import org.vadere.manager.commandHandler.TraCICmdHandler; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.util.logging.Logger; @@ -16,16 +15,33 @@ public class CommandExecutor { private static Logger logger = Logger.getLogger(CommandExecutor.class); private HashMap cmdMap; + // TODO: RemoteManager verwaltet die Simulation. + // Sobald ein Simulationsschrit fertig ist, wird der RemoteManager über den + // RemoteManagerListener informiert. Jetzt kann der org.vadere.simulator.control.SimulationState + // ausgelesen werden. + // vorghen: + // 1. LOAD_Command: Laden der String Representation und erzeugen des Scenario Objekts + // 2. erstellen von Subscriptions (später) + // 3. SIM_STEP_Command: + // - wenn die Simulatoin noch nicht gestarter wurde starte simulation + // - erstes RemoteManagerListener kommt + // - Sende Antwort auf SIM_STEP_Command + // 4. Warte auf GET/SET commands und beantworte dies über den RemoteManager + // 5. nächste SIM_STEP_Command: Führe den nächsten Simulatoinsschrit aus + // - remoteManager.currentSimulationRun.nextSimCommand(-1); + // Soll der remoteManager mit in den TraCICmdHandler übergeben werden? + // + private RemoteManager remoteManager; public CommandExecutor() { + remoteManager = new RemoteManager(); cmdMap = new HashMap<>(); - cmdMap.put(Constants.CMD_GETVERSION, ControlCommandHandler.instance::process_getVersion); - cmdMap.put(Constants.CMD_GET_PERSON_VARIABLE, PersonCommandHandler.instance::processGet); - cmdMap.put(Constants.CMD_SET_PERSON_VARIABLE, PersonCommandHandler.instance::processSet); -// cmdMap.put(Constants.CMD_GET_SIM_VARIABLE, SimulationCommands::processGet); -// cmdMap.put(Constants.CMD_SET_SIM_VARIABLE, SimulationCommands::processSet); -// cmdMap.put(Constants.CMD_GET_POLYGON_VARIABLE, SimulationCommands::processGet); -// cmdMap.put(Constants.CMD_SET_POLYGON_VARIABLE, SimulationCommands::processSet); + cmdMap.put(TraCICmd.GET_VERSION.id, ControlCommandHandler.instance::process_getVersion); + cmdMap.put(TraCICmd.LOAD.id, ControlCommandHandler.instance::process_load); + cmdMap.put(TraCICmd.SIM_STEP.id, ControlCommandHandler.instance::process_simStep); + cmdMap.put(TraCICmd.CLOSE.id, ControlCommandHandler.instance::process_close); + cmdMap.put(TraCICmd.GET_PERSON_VALUE.id, PersonCommandHandler.instance::processGet); + cmdMap.put(TraCICmd.SET_PERSON_STATE.id, PersonCommandHandler.instance::processSet); } TraCIPacket execute(TraCICommand cmd){ diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java new file mode 100644 index 000000000..70f6dce7b --- /dev/null +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -0,0 +1,57 @@ +package org.vadere.manager; + +import org.vadere.simulator.control.RemoteManagerListener; +import org.vadere.simulator.entrypoints.ScenarioFactory; +import org.vadere.simulator.projects.RunnableFinishedListener; +import org.vadere.simulator.projects.Scenario; +import org.vadere.simulator.projects.ScenarioRun; +import org.vadere.util.logging.Logger; + +import java.io.IOException; + +public class RemoteManager implements RemoteManagerListener, RunnableFinishedListener, Runnable { + + + private static Logger logger = Logger.getLogger(RemoteManager.class); + + private ScenarioRun currentSimulationRun; + private Thread currentSimulationThread; + + + RemoteManager() { } + + public void loadScenario(String scenarioString) throws IOException { + Scenario scenario = ScenarioFactory.createScenarioWithScenarioJson(scenarioString); + currentSimulationRun = new ScenarioRun(scenario, this); + currentSimulationRun.addRemoteManagerListener(this); + currentSimulationRun.setSingleStepMode(true); + } + + @Override + public void simulationStepFinishedListener() { + + } + + @Override + public void finished(Runnable runnable) { + logger.infof("Simulation finished."); + } + + @Override + public void run() { + startSimulation(); + } + + private void startSimulation(){ + if (currentSimulationRun == null) + throw new IllegalStateException("ScenarioRun object must not be null"); + + currentSimulationThread = new Thread(currentSimulationRun); + currentSimulationThread.setUncaughtExceptionHandler((t, ex) -> { + currentSimulationRun.simulationFailed(ex); + }); + + logger.infof("Start Scenario %s with remote control...", currentSimulationRun.getScenario().getName()); + currentSimulationThread.start(); + } +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index c57f68515..ee52689b8 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -14,6 +14,18 @@ public class ControlCommandHandler extends CommandHandler{ private ControlCommandHandler(){} + public TraCIPacket process_load(TraCICommand cmd) { + return null; + } + + public TraCIPacket process_close(TraCICommand cmd) { + return null; + } + + public TraCIPacket process_simStep(TraCICommand cmd) { + return null; + } + public TraCIPacket process_getVersion(TraCICommand cmd) { TraCIPacket response = TraCIPacket.create(); diff --git a/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java b/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java new file mode 100644 index 000000000..fe0dd716e --- /dev/null +++ b/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java @@ -0,0 +1,10 @@ +package org.vadere.simulator.control; + +public interface RemoteManagerListener { + + /** + * Notify RemoteManger that the simulation reached end of loop and the {@link SimulationState} + * is ready to be read/changed. The simulation thread will wait after the call is finished. + */ + void simulationStepFinishedListener(); +} diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index 27e240c8b..78f6e6ee6 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -18,7 +18,11 @@ import org.vadere.simulator.projects.dataprocessing.ProcessorManager; import org.vadere.state.attributes.AttributesSimulation; import org.vadere.state.attributes.scenario.AttributesAgent; import org.vadere.state.events.types.Event; -import org.vadere.state.scenario.*; +import org.vadere.state.scenario.AbsorbingArea; +import org.vadere.state.scenario.Pedestrian; +import org.vadere.state.scenario.Source; +import org.vadere.state.scenario.Target; +import org.vadere.state.scenario.Topography; import org.vadere.util.logging.Logger; import java.awt.geom.Rectangle2D; @@ -43,11 +47,12 @@ public class Simulation { private DynamicElementFactory dynamicElementFactory; private final List passiveCallbacks; + private final List remoteManagerListeners; private List models; private boolean isRunSimulation = false; private boolean isPaused = false; - private boolean singleStepMode = false; + private boolean singleStepMode; // constructor private boolean waitForSimCommand = false; private double simulateUntilInSec = -1; @@ -81,7 +86,7 @@ public class Simulation { public Simulation(MainModel mainModel, double startTimeInSec, final String name, ScenarioStore scenarioStore, List passiveCallbacks, Random random, ProcessorManager processorManager, - SimulationResult simulationResult) { + SimulationResult simulationResult, List remoteManagerListeners, boolean singleStepMode) { this.name = name; this.mainModel = mainModel; @@ -105,6 +110,8 @@ public class Simulation { this.processorManager = processorManager; this.passiveCallbacks = passiveCallbacks; + this.remoteManagerListeners = remoteManagerListeners; + this.singleStepMode = singleStepMode; // "eventController" is final. Therefore, create object here and not in helper method. this.eventController = new EventController(scenarioStore); @@ -264,14 +271,10 @@ public class Simulation { // check reached next simTime (-1 simulate one step) if (simTimeInSec >= simulateUntilInSec || simulateUntilInSec == -1){ logger.warnf("Simulated until: %.4f", simTimeInSec); - logger.warn("check command queue"); - logger.warn("check subscriptions"); - // check command queue and execute (GET, SET Value) - // check subscriptions - // todo: add some control manger (i.e. TraCI-Manager, ...) setWaitForSimCommand(true); while (waitForSimCommand){ + remoteManagerListeners.forEach(RemoteManagerListener::simulationStepFinishedListener); logger.warn("wait for next SimCommand..."); try { wait(); diff --git a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java index 9e9da31c2..4b9843f13 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java @@ -2,6 +2,7 @@ package org.vadere.simulator.projects; import org.jetbrains.annotations.Nullable; import org.vadere.simulator.control.PassiveCallback; +import org.vadere.simulator.control.RemoteManagerListener; import org.vadere.simulator.control.Simulation; import org.vadere.simulator.models.MainModel; import org.vadere.simulator.models.MainModelBuilder; @@ -16,6 +17,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -35,10 +37,14 @@ public class ScenarioRun implements Runnable { private final List passiveCallbacks = new LinkedList<>(); + private final List remoteManagerListeners = new ArrayList<>(); + private final DataProcessingJsonManager dataProcessingJsonManager; private Simulation simulation; + private boolean singleStepMode = false; + // the processor is null if no output is written i.e. if scenarioStore.attributesSimulation.isWriteSimulationData() is false. private @Nullable ProcessorManager processorManager; @@ -112,7 +118,7 @@ public class ScenarioRun implements Runnable { // Run simulation main loop from start time = 0 seconds simulation = new Simulation(mainModel, 0, scenarioStore.getName(), scenarioStore, passiveCallbacks, random, - processorManager, simulationResult); + processorManager, simulationResult, remoteManagerListeners, singleStepMode); } simulation.run(); simulationResult.setState("SimulationRun completed"); @@ -186,6 +192,14 @@ public class ScenarioRun implements Runnable { passiveCallbacks.add(pc); } + public void addRemoteManagerListener(final RemoteManagerListener listener){ + remoteManagerListeners.add(listener); + } + + public boolean isSingleStepMode() { + return singleStepMode; + } + public void setOutputPaths(final Path outputPath, boolean overwriteTimestampSetting){ if (overwriteTimestampSetting){ this.outputPath = outputPath; -- GitLab From 8b3ca2fac0f77298f0b79698af4ad97e1699af97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 5 Jun 2019 22:04:14 +0200 Subject: [PATCH 12/58] add missing icon --- VadereGui/resources/icons/greenarrow_step.png | Bin 0 -> 650 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 VadereGui/resources/icons/greenarrow_step.png diff --git a/VadereGui/resources/icons/greenarrow_step.png b/VadereGui/resources/icons/greenarrow_step.png new file mode 100644 index 0000000000000000000000000000000000000000..11c0f1b3072ae89e2051efa908b141369e265833 GIT binary patch literal 650 zcmV;50(Jd~P)P000>X1^@s6#OZ}&00009a7bBm000XU z000XU0RWnu7ytkO8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b0vAa{ zK~zYI#n!)T6JZ?3@%Lj|D&=hDv_dpqz(uU!B7%s6L$^A#gI)DcaJNIY(zQB?Vi!RN zL68jM;3Qa_6gs&nSfm!DCb{RHUtfnyS{-tigot1G!reXGy`InaSq}P_Dp(t;j`UlI z-^Uk{r^)4iicD4~PuCafui}mPYUx)t5jK&bk<4aZj!Lz*PmOo9&t7xDyN5GRP_O+ew15QW*wPNg|= z5&|HHElBbzFOWq-Gd>0G|0Y%0(d#n_0v=I3-N%-qJPhi;QD@!!^ zQik*&S8vz7hVHyjq-^nx71qmvVx*UZ1Ee>iEm|zI&dwk}G2#vo=^_fl2e!G%Lw*bj zK-rlbj!U6=%V!pc1qMR`ij*ebxy5~UhXr7eaarE6%Wc-!8wDsvJQEl`@`+`hlmK@| k{j+&Qox4;=d-*@qZ{cMvLp}K({Qv*}07*qoM6N<$f+e>YyZ`_I literal 0 HcmV?d00001 -- GitLab From 21b1f680ddb16358b71076cd00a81056c66e5274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Thu, 6 Jun 2019 19:20:34 +0200 Subject: [PATCH 13/58] major traci server/client refactoring: * add simple cli-client to issue commands * implement TraCIResponse hierarchy * separate command handling from TraCIMessage creation * add test scenarios --- .../src/org/vadere/manager/ClientHandler.java | 4 +- .../src/org/vadere/manager/RemoteManager.java | 2 +- .../src/org/vadere/manager/TestClient.java | 70 ------ .../org/vadere/manager/TraCIException.java | 2 +- .../src/org/vadere/manager/TraCISocket.java | 2 +- .../src/org/vadere/manager/VadereServer.java | 1 + .../vadere/manager/client/ConsoleCommand.java | 9 + .../vadere/manager/client/ConsoleReader.java | 109 +++++++++ .../org/vadere/manager/client/TestClient.java | 113 +++++++++ .../{ => commandHandler}/CommandExecutor.java | 16 +- .../commandHandler/CommandHandler.java | 14 +- .../commandHandler/ControlCommandHandler.java | 57 ++--- .../commandHandler/PersonCommandHandler.java | 55 +++-- .../commandHandler/TraCICmdHandler.java | 3 +- .../org/vadere/manager/stsc/ByteReader.java | 22 -- .../manager/stsc/{commands => }/CmdType.java | 2 +- .../manager/stsc/{commands => }/TraCICmd.java | 14 +- .../vadere/manager/stsc/TraCIDataType.java | 6 +- .../org/vadere/manager/stsc/TraCIPacket.java | 87 ++++--- .../manager/stsc/TraCIStatusResponse.java | 15 -- .../manager/stsc/commands/TraCICommand.java | 15 +- .../stsc/commands/TraCIGetCommand.java | 56 ++++- .../stsc/commands/TraCISetCommand.java | 8 +- .../commands/control/TraCICloseCommand.java | 8 +- .../control/TraCIGetVersionCommand.java | 33 ++- .../commands/control/TraCISimStepCommand.java | 29 ++- .../stsc/{ => reader}/TraCIBuffer.java | 6 +- .../stsc/{ => reader}/TraCICommandBuffer.java | 10 +- .../stsc/{ => reader}/TraCIPacketBuffer.java | 25 +- .../stsc/{ => reader}/TraCIReader.java | 21 +- .../stsc/{ => reader}/TraCIReaderImpl.java | 10 +- .../manager/stsc/respons/StatusResponse.java | 91 ++++++++ .../stsc/respons/TraCIGetVersionResponse.java | 73 ++++++ .../manager/stsc/respons/TraCIResponse.java | 99 ++++++++ .../stsc/respons/TraCISimTimeResponse.java | 29 +++ .../stsc/respons/TraCIStatusResponse.java | 25 ++ .../stsc/{ => writer}/TraCIWriter.java | 17 +- .../stsc/{ => writer}/TraCIWriterImpl.java | 98 ++++++-- .../scenarios/scenario001.scenario | 216 ++++++++++++++++++ .../testProject001/vadere.project | 1 + .../vadere/manager/stsc/TraCIReaderTest.java | 12 +- .../manager/stsc/TraCIWriterImplTest.java | 13 +- 42 files changed, 1205 insertions(+), 293 deletions(-) delete mode 100644 VadereManager/src/org/vadere/manager/TestClient.java create mode 100644 VadereManager/src/org/vadere/manager/client/ConsoleCommand.java create mode 100644 VadereManager/src/org/vadere/manager/client/ConsoleReader.java create mode 100644 VadereManager/src/org/vadere/manager/client/TestClient.java rename VadereManager/src/org/vadere/manager/{ => commandHandler}/CommandExecutor.java (83%) delete mode 100644 VadereManager/src/org/vadere/manager/stsc/ByteReader.java rename VadereManager/src/org/vadere/manager/stsc/{commands => }/CmdType.java (71%) rename VadereManager/src/org/vadere/manager/stsc/{commands => }/TraCICmd.java (95%) delete mode 100644 VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java rename VadereManager/src/org/vadere/manager/stsc/{ => reader}/TraCIBuffer.java (68%) rename VadereManager/src/org/vadere/manager/stsc/{ => reader}/TraCICommandBuffer.java (80%) rename VadereManager/src/org/vadere/manager/stsc/{ => reader}/TraCIPacketBuffer.java (53%) rename VadereManager/src/org/vadere/manager/stsc/{ => reader}/TraCIReader.java (56%) rename VadereManager/src/org/vadere/manager/stsc/{ => reader}/TraCIReaderImpl.java (96%) create mode 100644 VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java rename VadereManager/src/org/vadere/manager/stsc/{ => writer}/TraCIWriter.java (78%) rename VadereManager/src/org/vadere/manager/stsc/{ => writer}/TraCIWriterImpl.java (70%) create mode 100644 VadereManager/testResources/testProject001/scenarios/scenario001.scenario create mode 100644 VadereManager/testResources/testProject001/vadere.project diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index bd41b9f4c..ba524c811 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -1,8 +1,9 @@ package org.vadere.manager; +import org.vadere.manager.commandHandler.CommandExecutor; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.TraCIPacketBuffer; +import org.vadere.manager.stsc.reader.TraCIPacketBuffer; import org.vadere.util.logging.Logger; import java.io.EOFException; @@ -41,6 +42,7 @@ public class ClientHandler implements Runnable{ private void handleClient() throws IOException{ try{ + logger.info("client connected..."); while (true){ TraCIPacketBuffer traCIPacketBuffer = traCISocket.receiveExact(); diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index 70f6dce7b..04fc8d74f 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -18,7 +18,7 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis private Thread currentSimulationThread; - RemoteManager() { } + public RemoteManager() { } public void loadScenario(String scenarioString) throws IOException { Scenario scenario = ScenarioFactory.createScenarioWithScenarioJson(scenarioString); diff --git a/VadereManager/src/org/vadere/manager/TestClient.java b/VadereManager/src/org/vadere/manager/TestClient.java deleted file mode 100644 index 4acbc01d7..000000000 --- a/VadereManager/src/org/vadere/manager/TestClient.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.vadere.manager; - -import de.tudresden.sumo.cmd.Person; -import de.tudresden.sumo.util.CommandProcessor; -import de.tudresden.sumo.util.Query; -import de.tudresden.sumo.util.SumoCommand; - -import it.polito.appeal.traci.protocol.ResponseContainer; - -import java.io.IOException; -import java.net.ConnectException; -import java.net.InetSocketAddress; -import java.net.Socket; - -public class TestClient{ - - private int port; - private Socket socket; - private CommandProcessor cmdProcessor; - private qq q; - - public TestClient(int port) throws IOException, InterruptedException { - this.port = port; - - socket = new Socket(); - socket.setTcpNoDelay(true); - int waitTime = 500; //ms - for(int i=0; i < 14; i++){ - try { - socket.connect(new InetSocketAddress("127.0.0.1", this.port)); - break; - } catch (ConnectException ex){ - Thread.sleep(waitTime); - waitTime *= 2; - } - } - - if (!socket.isConnected()){ - throw new IOException("can't connect to Server!"); - } else { - cmdProcessor = new CommandProcessor(socket); - q = new qq(socket); - } - System.out.println("connected..."); - } - - public static void main(String[] args) throws IOException, InterruptedException { - - TestClient testClient = new TestClient(9999); - - SumoCommand cmd = Person.getIDList(); - - testClient.q.doThat(cmd); - - - } - - class qq extends Query { - - public qq(Socket sock) throws IOException { - super(sock); - } - - public ResponseContainer doThat(SumoCommand c) throws IOException { - return this.doQuerySingle(c.get_command()); - } - } - - -} diff --git a/VadereManager/src/org/vadere/manager/TraCIException.java b/VadereManager/src/org/vadere/manager/TraCIException.java index 5e8be22a1..3e4733747 100644 --- a/VadereManager/src/org/vadere/manager/TraCIException.java +++ b/VadereManager/src/org/vadere/manager/TraCIException.java @@ -1,6 +1,6 @@ package org.vadere.manager; -import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCIGetCommand; public class TraCIException extends RuntimeException { diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index 72f30d14c..3c7ad1157 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -1,7 +1,7 @@ package org.vadere.manager; import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.TraCIPacketBuffer; +import org.vadere.manager.stsc.reader.TraCIPacketBuffer; import java.io.Closeable; import java.io.DataInputStream; diff --git a/VadereManager/src/org/vadere/manager/VadereServer.java b/VadereManager/src/org/vadere/manager/VadereServer.java index 018e50fe4..549a6ffde 100644 --- a/VadereManager/src/org/vadere/manager/VadereServer.java +++ b/VadereManager/src/org/vadere/manager/VadereServer.java @@ -23,6 +23,7 @@ public class VadereServer implements Runnable{ @Override public void run() { try { + logger.infof("listening on port %d...", serverSocket.getLocalPort()); while (true) { Socket clientSocket = serverSocket.accept(); diff --git a/VadereManager/src/org/vadere/manager/client/ConsoleCommand.java b/VadereManager/src/org/vadere/manager/client/ConsoleCommand.java new file mode 100644 index 000000000..f36b19e6a --- /dev/null +++ b/VadereManager/src/org/vadere/manager/client/ConsoleCommand.java @@ -0,0 +1,9 @@ +package org.vadere.manager.client; + +import java.io.IOException; + +public interface ConsoleCommand { + + void execute(String[] args) throws IOException; + +} diff --git a/VadereManager/src/org/vadere/manager/client/ConsoleReader.java b/VadereManager/src/org/vadere/manager/client/ConsoleReader.java new file mode 100644 index 000000000..0480fe989 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/client/ConsoleReader.java @@ -0,0 +1,109 @@ +package org.vadere.manager.client; + +import java.io.BufferedReader; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Scanner; + +public class ConsoleReader implements Runnable{ + + private HashMap cmdMap; + private HashMap helpMap; + private BufferedReader reader; + private Scanner scanner; + private boolean running; + + public ConsoleReader() { + cmdMap = new HashMap<>(); + helpMap = new HashMap<>(); + reader = new BufferedReader(new InputStreamReader(System.in)); + running = true; + + addCommand("help", "Print this Help", this::cmd_help); + addCommand("close", "Close Application", this::cmd_Close); + } + + private void cmd_help(String[] args){ + if (! args[0].equals("help")) + System.out.println("Unknown command: " + args[0]); + + System.out.println("Help: "); + helpMap.entrySet().forEach(e -> { + System.out.printf("%s %s\n", e.getKey(), e.getValue()); + }); + System.out.println(""); + } + + private void cmd_Close(String[] args){ + System.out.println("Close..."); + stop(); + } + + private void executeCmd(String cmdStr){ + if(cmdStr.equals("")) + return; + String[] cmdArgs = cmdStr.split(" "); + ConsoleCommand cmd = cmdMap.getOrDefault(cmdArgs[0], this::cmd_help); + try { + cmd.execute(cmdArgs); + } catch (EOFException eof){ + System.out.println("Server closed connection"); + stop(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void addCommand(String cmdStr, String cmdHelp, ConsoleCommand cmd){ + cmdMap.put(cmdStr, cmd); + helpMap.put(cmdStr, cmdHelp); + } + + private void commandLoop(){ + + while (running){ + + try { + System.out.print("> "); + String cmd = reader.readLine(); + executeCmd(cmd); + } catch (IOException e) { + e.printStackTrace(); + } + } + + System.out.println("ending...."); + } + + synchronized public void stop(){ + running = false; + } + + + public static void main(String[] args){ + ConsoleReader r = new ConsoleReader(); + r.addCommand("do-shit", "guess..", + args1 -> System.out.println("do-shit with "+ Arrays.toString(args1))); + + Thread thread = new Thread(r); + + System.out.println("start.."); + + thread.start(); + + try { + thread.join(); + System.out.println("joined"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + @Override + public void run() { + commandLoop(); + } +} diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java new file mode 100644 index 000000000..acc80583d --- /dev/null +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -0,0 +1,113 @@ +package org.vadere.manager.client; + +import org.vadere.manager.TraCISocket; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.respons.TraCIResponse; +import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.stsc.reader.TraCIPacketBuffer; + +import java.io.IOException; +import java.net.ConnectException; +import java.net.InetSocketAddress; +import java.net.Socket; + +public class TestClient implements Runnable{ + + private int port; + private TraCISocket traCISocket; + private ConsoleReader consoleReader; + private Thread consoleThread; + private boolean running; + + public static void main(String[] args) throws IOException, InterruptedException { + TestClient testClient = new TestClient(9999); + testClient.run(); + } + + + public TestClient(int port) { + this.port = port; + this.running = false; + } + + + void getVersion(String[] args) throws IOException { + TraCIPacket p = TraCIGetVersionCommand.build(); + + traCISocket.sendExact(p); + + TraCIPacketBuffer buf = traCISocket.receiveExact(); + TraCIResponse cmd = buf.nextResponse(); + + System.out.println(cmd.toString()); + + } + + private void addCommands(ConsoleReader consoleReader){ + consoleReader.addCommand("getVersion", "", this::getVersion); + } + + + + private void establishConnection() throws IOException, InterruptedException { + Socket socket = new Socket(); + socket.setTcpNoDelay(true); + int waitTime = 500; //ms + System.out.println("Connect to 127.0.0.1:" + this.port); + for (int i = 0; i < 14; i++) { + try { + socket.connect(new InetSocketAddress("127.0.0.1", this.port)); + break; + } catch (ConnectException ex) { + Thread.sleep(waitTime); + waitTime *= 2; + } + } + + if (!socket.isConnected()) { + System.out.println("can't connect to Server!"); + return; + } + + System.out.println("connected..."); + traCISocket = new TraCISocket(socket); + + running = true; + } + + private void handleConnection() throws IOException { + try{ + + consoleReader = new ConsoleReader(); + addCommands(consoleReader); + consoleThread = new Thread(consoleReader); + consoleThread.start(); + + consoleThread.join(); + + + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + if (traCISocket != null) + traCISocket.close(); + if (consoleReader != null) + consoleReader.stop(); + } + } + + + @Override + public void run() { + + try { + establishConnection(); + handleConnection(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } +} diff --git a/VadereManager/src/org/vadere/manager/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java similarity index 83% rename from VadereManager/src/org/vadere/manager/CommandExecutor.java rename to VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index 1598dc53c..1d46e43c8 100644 --- a/VadereManager/src/org/vadere/manager/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -1,10 +1,8 @@ -package org.vadere.manager; +package org.vadere.manager.commandHandler; -import org.vadere.manager.commandHandler.ControlCommandHandler; -import org.vadere.manager.commandHandler.PersonCommandHandler; -import org.vadere.manager.commandHandler.TraCICmdHandler; +import org.vadere.manager.RemoteManager; import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.util.logging.Logger; @@ -44,14 +42,14 @@ public class CommandExecutor { cmdMap.put(TraCICmd.SET_PERSON_STATE.id, PersonCommandHandler.instance::processSet); } - TraCIPacket execute(TraCICommand cmd){ - TraCICmdHandler handler = cmdMap.get(cmd.getTraCICmd()); + public TraCIPacket execute(TraCICommand cmd){ + TraCICmdHandler handler = cmdMap.get(cmd.getTraCICmd().id); if (handler == null){ - logger.errorf("No CommandHandler found for command: %02X", cmd.getTraCICmd()); + logger.errorf("No CommandHandler found for command: %02X", cmd.getTraCICmd().id); return TraCIPacket.create().add_Err_StatusResponse(cmd.getTraCICmd().id, "ID not found."); } - return handler.handel(cmd); + return handler.handel(cmd).buildResponsePacket(); } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index d63390ba0..df7f5ddbd 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,17 +1,21 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.TraCIStatusResponse; +import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; public abstract class CommandHandler { - public TraCIPacket process_NotImplemented(TraCICommand cmd){ - return TraCIPacket.sendStatus(cmd.getTraCICmd(), TraCIStatusResponse.NOT_IMPLEMENTED, "Command " + cmd.getCmdType().toString() + "not Implemented"); + public TraCICommand process_NotImplemented(TraCICommand cmd){ + return cmd.setNOK_response(TraCIPacket.sendStatus(cmd.getTraCICmd(), + TraCIStatusResponse.NOT_IMPLEMENTED, + "Command " + cmd.getCmdType().toString() + "not Implemented")); } - public TraCIPacket process_UnknownCommand(TraCICommand cmd){ - return TraCIPacket.sendStatus(cmd.getTraCICmd(), TraCIStatusResponse.ERR, "Command " + cmd.getCmdType().toString() + "Unknown"); + public TraCICommand process_UnknownCommand(TraCICommand cmd){ + return cmd.setNOK_response(TraCIPacket.sendStatus(cmd.getTraCICmd(), + TraCIStatusResponse.ERR, + "Command " + cmd.getCmdType().toString() + "Unknown")); } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index ee52689b8..fe9918889 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -1,8 +1,11 @@ package org.vadere.manager.commandHandler; -import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; +import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; +import org.vadere.manager.stsc.respons.TraCISimTimeResponse; public class ControlCommandHandler extends CommandHandler{ @@ -14,50 +17,30 @@ public class ControlCommandHandler extends CommandHandler{ private ControlCommandHandler(){} - public TraCIPacket process_load(TraCICommand cmd) { + public TraCICommand process_load(TraCICommand rawCmd) { return null; } - public TraCIPacket process_close(TraCICommand cmd) { + public TraCICommand process_close(TraCICommand rawCmd) { return null; } - public TraCIPacket process_simStep(TraCICommand cmd) { - return null; + public TraCICommand process_simStep(TraCICommand rawCmd) { + TraCISimStepCommand cmd = (TraCISimStepCommand) rawCmd; + Object data = null; // handle subscriptions + + cmd.setResponse(new TraCISimTimeResponse(data)); + + return cmd; } - public TraCIPacket process_getVersion(TraCICommand cmd) { - - TraCIPacket response = TraCIPacket.create(); - - // @Override -// public TraCIPacket handleCommand(TraCIPacket response) { -// response = TraCIPacket.create(); -// -// response.add_OK_StatusResponse(Constants.CMD_GETVERSION); -// -// TraCIWriter writer = response.getWriter(); -// -// int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); -// writer.writeCommandLength(cmdLen); // 1b or 5b -// writer.writeInt(Constants.CMD_GETVERSION); // 1b -// writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b -// writer.writeString("Vaderer TraCI Server"); // 4b + X -// -// return response; -// } - -// response.add_OK_StatusResponse(Constants.CMD_GETVERSION); -// -// TraCIWriter writer = response.getWriter(); -// -// int cmdLen = 10 + writer.stringByteCount("Vaderer TraCI Server"); -// writer.writeCommandLength(cmdLen); // 1b or 5b -// writer.writeInt(Constants.CMD_GETVERSION); // 1b -// writer.writeUnsignedByte(Constants.TRACI_VERSION); // 4b -// writer.writeString("Vaderer TraCI Server"); // 4b + X - - return response; + public TraCICommand process_getVersion(TraCICommand rawCmd) { + + TraCIGetVersionCommand cmd = (TraCIGetVersionCommand)rawCmd; + cmd.setResponse(new TraCIGetVersionResponse(33, "Version 33 From Vadere")); + + return cmd; + } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 6a6d28981..e62eb2a9f 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -1,7 +1,7 @@ package org.vadere.manager.commandHandler; -import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.util.geometry.shapes.VPoint; @@ -21,52 +21,75 @@ public class PersonCommandHandler extends CommandHandler{ } - protected TraCIPacket process_getIDList(TraCIGetCommand cmd){ + protected TraCICommand process_getIDList(TraCIGetCommand cmd){ List pedestrians = null; // get.... - return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, pedestrians); + cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) + .addResponseVariableType(TraCIDataType.STRING_LIST) + .addResponseData(pedestrians); + return cmd; } - protected TraCIPacket process_getIDCount(TraCIGetCommand cmd){ + protected TraCICommand process_getIDCount(TraCIGetCommand cmd){ int numPerson = 0; // get... - return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, numPerson); + cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) + .addResponseVariableType(TraCIDataType.INTEGER) + .addResponseData(numPerson); + + return cmd; + } - protected TraCIPacket process_getSpeed(TraCIGetCommand cmd){ + protected TraCICommand process_getSpeed(TraCIGetCommand cmd){ double speed = 0.0; // get... - return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, speed); + cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) + .addResponseVariableType(TraCIDataType.DOUBLE) + .addResponseData(speed); + return cmd; } - protected TraCIPacket process_getPosition(TraCIGetCommand cmd){ + protected TraCICommand process_getPosition(TraCIGetCommand cmd){ VPoint point = new VPoint(1.0, 1.0); // get - return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, point); + cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) + .addResponseVariableType(TraCIDataType.POS_2D) + .addResponseData(point); + + return cmd; } - protected TraCIPacket process_getLength(TraCIGetCommand cmd){ + protected TraCICommand process_getLength(TraCIGetCommand cmd){ double pedLength = 0.4; // get... (durchmesser) - return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, pedLength); + cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) + .addResponseVariableType(TraCIDataType.DOUBLE) + .addResponseData(pedLength); + + return cmd; } - protected TraCIPacket process_getWidth(TraCIGetCommand cmd){ + protected TraCICommand process_getWidth(TraCIGetCommand cmd){ double pedWidth = 0.4; // get.. (durchmesser) - return TraCIPacket.create().wrapGetResponse(cmd, TraCICmd.RESPONSE_GET_PERSON_VALUE, pedWidth); + cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) + .addResponseVariableType(TraCIDataType.DOUBLE) + .addResponseData(pedWidth); + + return cmd; } - public TraCIPacket processGet(TraCICommand cmd){ + public TraCICommand processGet(TraCICommand cmd){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; switch (TraCIPersonVar.fromId(getCmd.getVariableId())){ @@ -100,7 +123,7 @@ public class PersonCommandHandler extends CommandHandler{ } } - public TraCIPacket processSet(TraCICommand cmd){ + public TraCICommand processSet(TraCICommand cmd){ return process_NotImplemented(cmd); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java index ad9f6c0e6..e68276f36 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java @@ -1,12 +1,11 @@ package org.vadere.manager.commandHandler; -import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; @FunctionalInterface public interface TraCICmdHandler { - TraCIPacket handel (TraCICommand cmd); + TraCICommand handel (TraCICommand cmd); } diff --git a/VadereManager/src/org/vadere/manager/stsc/ByteReader.java b/VadereManager/src/org/vadere/manager/stsc/ByteReader.java deleted file mode 100644 index e7c48b6b4..000000000 --- a/VadereManager/src/org/vadere/manager/stsc/ByteReader.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.vadere.manager.stsc; - -import java.nio.ByteBuffer; - -public interface ByteReader { - - - byte readByte(); - default int readUnsignedByte(){ - // (signed)byte --cast--> (signed)int --(& 0xff)--> cut highest three bytes. - // This result represents the an unsigned byte value (0..255) as an int. - return (int)readByte() & 0xff; - } - - byte[] readBytes(int num); - default ByteBuffer readByteBuffer(int num){ - return ByteBuffer.wrap(readBytes(num)); - } - - int readInt(); - double readDouble(); -} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/CmdType.java b/VadereManager/src/org/vadere/manager/stsc/CmdType.java similarity index 71% rename from VadereManager/src/org/vadere/manager/stsc/commands/CmdType.java rename to VadereManager/src/org/vadere/manager/stsc/CmdType.java index bd727029e..ea566c5f0 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/CmdType.java +++ b/VadereManager/src/org/vadere/manager/stsc/CmdType.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc.commands; +package org.vadere.manager.stsc; public enum CmdType { diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICmd.java b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java similarity index 95% rename from VadereManager/src/org/vadere/manager/stsc/commands/TraCICmd.java rename to VadereManager/src/org/vadere/manager/stsc/TraCICmd.java index 1c3f63cad..0c76a082a 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICmd.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc.commands; +package org.vadere.manager.stsc; public enum TraCICmd { // TraCI/Control-related commands @@ -78,8 +78,6 @@ public enum TraCICmd { // TraCI/Object Context Subscription UNKNOWN_CMD(-1, CmdType.UNKNOWN) - - ; public int id; @@ -91,7 +89,7 @@ public enum TraCICmd { } - static TraCICmd fromId(int id){ + public static TraCICmd fromId(int id){ for(TraCICmd traCICmd : values()){ if (traCICmd.id == id) return traCICmd; @@ -100,15 +98,13 @@ public enum TraCICmd { return UNKNOWN_CMD; } - boolean isUnknown(){ + public boolean isUnknown(){ return this.id == UNKNOWN_CMD.id; } @Override public String toString() { - return "TraCICmd{" + - "id=" + id + - ", type=" + type + - '}'; + + return String.format("TraCICmd{id=0x%02X, type=%s}", id, type ); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java index 22c386c68..bebdce195 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java @@ -21,9 +21,9 @@ public enum TraCIDataType { - int identifier; - int size_in_byte; - boolean isAtomar; + public int identifier; + public int size_in_byte; + public boolean isAtomar; TraCIDataType(int identifier, int size_in_byte, boolean isAtomar){ diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java index 6dc3607f6..8829bdd00 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java @@ -1,12 +1,16 @@ package org.vadere.manager.stsc; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.commands.TraCICmd; import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.util.geometry.shapes.VPoint; +import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; +import org.vadere.manager.stsc.respons.StatusResponse; +import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; +import org.vadere.manager.stsc.respons.TraCIStatusResponse; +import org.vadere.manager.stsc.writer.TraCIWriter; +import org.vadere.manager.stsc.writer.TraCIWriterImpl; import java.nio.ByteBuffer; -import java.util.List; public class TraCIPacket { @@ -54,8 +58,9 @@ public class TraCIPacket { return response; } - private void finalizePacket(){ + public TraCIPacket finalizePacket(){ finalized = true; + return this; } private void throwIfFinalized(){ @@ -70,12 +75,6 @@ public class TraCIPacket { } - - public TraCIPacket reset(){ - writer.rest(); - return this; - } - private TraCIPacket addEmptyLengthField(){ if(emptyLengthField) throw new IllegalStateException("Should only be called at most once."); @@ -103,67 +102,58 @@ public class TraCIPacket { } - - private TraCIWriter getCmdBuilder(TraCIGetCommand cmd, TraCICmd responseCMD){ - return new TraCIWriterImpl() - .writeUnsignedByte(responseCMD.id) - .writeUnsignedByte(cmd.getVariableId()) - .writeString(cmd.getElementId()); + private TraCIWriter getCmdBuilder(){ + return new TraCIWriterImpl(); } - - public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, List data){ - + public TraCIPacket wrapGetResponse(TraCIGetCommand cmd){ add_OK_StatusResponse(cmd.getTraCICmd()); - addCommand(getCmdBuilder(cmd, responseCMD) - .writeStringListWithId(data) - .asByteArray()); - return this; - } - - - public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, int data){ - - add_OK_StatusResponse(cmd.getTraCICmd()); + TraCIWriter cmdBuilder = getCmdBuilder(); + cmdBuilder.writeUnsignedByte(cmd.getResponseIdentifier().id) + .writeUnsignedByte(cmd.getVariableId()) + .writeString(cmd.getElementId()) + .writeObjectWithId(cmd.getResponseDataType(), cmd.getResponseData()); - addCommand(getCmdBuilder(cmd, responseCMD) - .writeIntWithId(data) - .asByteArray()); + addCommandWithoutLen(cmdBuilder.asByteArray()); return this; } - public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, double data){ + public TraCIPacket wrapGetVersionCommand(TraCIGetVersionCommand cmd){ + TraCIGetVersionResponse res = cmd.getResponse(); - add_OK_StatusResponse(cmd.getTraCICmd()); + if(res.isOKResponseStatus()) + add_OK_StatusResponse(cmd.getTraCICmd()); + else + addStatusResponse(res.getStatusResponse()); + + TraCIWriter cmdBuilder = getCmdBuilder(); + cmdBuilder.writeUnsignedByte(res.getResponseIdentifier().id) + .writeInt(res.getVersionId()) + .writeString(res.getVersionString()); - addCommand(getCmdBuilder(cmd, responseCMD) - .writeDoubleWithId(data) - .asByteArray()); + addCommandWithoutLen(cmdBuilder.asByteArray()); return this; } - public TraCIPacket wrapGetResponse(TraCIGetCommand cmd, TraCICmd responseCMD, VPoint data){ + public TraCIPacket wrapSimTimeStepCommand(TraCISimStepCommand cmd){ + addStatusResponse(cmd.getResponse().getStatusResponse()); - add_OK_StatusResponse(cmd.getTraCICmd()); - - addCommand(getCmdBuilder(cmd, responseCMD) - .write2DPosition(data.x, data.y) - .asByteArray()); + // todo: send subscription data... return this; } - private void addCommand(byte[] buffer){ + public void addCommandWithoutLen(byte[] buffer){ if (buffer.length > 255){ writer.writeUnsignedByte(0); - writer.writeInt(buffer.length); + writer.writeInt(buffer.length + 5); // 1 + 4 length field writer.writeBytes(buffer); } else { - writer.writeUnsignedByte(buffer.length); + writer.writeUnsignedByte(buffer.length + 1); // 1 length field writer.writeBytes(buffer); } } @@ -189,6 +179,11 @@ public class TraCIPacket { return this; } + public TraCIPacket addStatusResponse(StatusResponse res) { + addStatusResponse(res.getCmdIdentifier().id, res.getResponse(), res.getDescription()); + return this; + } + public TraCIPacket addStatusResponse(int cmdIdentifier, TraCIStatusResponse response, String description){ throwIfFinalized(); // expect single byte cmdLenField. diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java deleted file mode 100644 index 8a96eeb04..000000000 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIStatusResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.vadere.manager.stsc; - -public enum TraCIStatusResponse { - - OK(0x00), - ERR(0xFF), - NOT_IMPLEMENTED(0x01); - - - int code; - - TraCIStatusResponse(int code) { - this.code = code; - } -} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java index 1c509e6d3..451cbd8d8 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -1,7 +1,10 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCICommandBuffer; +import org.vadere.manager.stsc.CmdType; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.commands.control.TraCICloseCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; @@ -11,8 +14,9 @@ import java.nio.ByteBuffer; public abstract class TraCICommand { protected TraCICmd traCICmd; + protected TraCIPacket NOK_response = null; - public static TraCICommand createCommand(ByteBuffer rawCmd){ + public static TraCICommand create(ByteBuffer rawCmd){ TraCICommandBuffer cmdBuffer = TraCICommandBuffer.wrap(rawCmd); int identifier = cmdBuffer.readCmdIdentifier(); @@ -73,4 +77,11 @@ public abstract class TraCICommand { return traCICmd.type; } + + public TraCICommand setNOK_response(TraCIPacket NOK_response) { + this.NOK_response = NOK_response; + return this; + } + + public abstract TraCIPacket buildResponsePacket(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index 1eb703ba4..40a37c75a 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -1,7 +1,10 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCICommandBuffer; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; import java.util.EnumSet; @@ -10,6 +13,12 @@ public class TraCIGetCommand extends TraCICommand { protected int variableId; protected String elementId; + // response + + private TraCICmd responseIdentifier; + private TraCIDataType responseDataType; + private Object responseData; + public TraCIGetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); EnumSet set; @@ -30,5 +39,50 @@ public class TraCIGetCommand extends TraCICommand { return elementId; } + public TraCIDataType getResponseDataType() { + return responseDataType; + } + + public void setResponseDataType(TraCIDataType responseDataType) { + this.responseDataType = responseDataType; + } + + public Object getResponseData() { + return responseData; + } + + public void setResponseData(Object responseData) { + this.responseData = responseData; + } + + public TraCICmd getResponseIdentifier() { + return responseIdentifier; + } + + public void setResponseIdentifier(TraCICmd responseIdentifier) { + this.responseIdentifier = responseIdentifier; + } + + public TraCIGetCommand addResponseIdentifier(TraCICmd val){ + setResponseIdentifier(val); + return this; + } + public TraCIGetCommand addResponseVariableType(TraCIDataType val){ + setResponseDataType(val); + return this; + } + + public TraCIGetCommand addResponseData(Object val){ + setResponseData(val); + return this; + } + + @Override + public TraCIPacket buildResponsePacket() { + if (NOK_response != null) + return NOK_response; + else + return TraCIPacket.create().wrapGetResponse(this); + } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java index c13f91cf0..488a05550 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -1,7 +1,9 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCICommandBuffer; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.TraCIDataType; public class TraCISetCommand extends TraCICommand{ @@ -43,4 +45,8 @@ public class TraCISetCommand extends TraCICommand{ return returnDataType; } + @Override + public TraCIPacket buildResponsePacket() { + return null; + } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java index dd94d236c..1721b96bc 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java @@ -1,6 +1,7 @@ package org.vadere.manager.stsc.commands.control; -import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; public class TraCICloseCommand extends TraCICommand { @@ -9,4 +10,9 @@ public class TraCICloseCommand extends TraCICommand { super(traCICmd); } + @Override + public TraCIPacket buildResponsePacket() { + return TraCIPacket.create(11).add_OK_StatusResponse(TraCICmd.CLOSE); + } + } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java index 093bb4098..3b10c78c6 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java @@ -1,12 +1,43 @@ package org.vadere.manager.stsc.commands.control; -import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; public class TraCIGetVersionCommand extends TraCICommand { + private TraCIGetVersionResponse response; + + public static TraCIPacket build(){ + TraCIPacket packet = TraCIPacket.create(6); + packet.getWriter() + .writeUnsignedByte(2) + .writeUnsignedByte(TraCICmd.GET_VERSION.id); + return packet; + } + public TraCIGetVersionCommand(TraCICmd traCICmd){ super(traCICmd); + response = new TraCIGetVersionResponse(); + } + + + public TraCIGetVersionResponse getResponse() { + return response; } + public void setResponse(TraCIGetVersionResponse response) { + this.response = response; + } + + @Override + public TraCIPacket buildResponsePacket() { + if (NOK_response != null) + return NOK_response; + else + return TraCIPacket.create().wrapGetVersionCommand(this); + } + + } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java index f92f81940..3d7d8033a 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java @@ -1,14 +1,19 @@ package org.vadere.manager.stsc.commands.control; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCICommandBuffer; -import org.vadere.manager.stsc.commands.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.respons.TraCISimTimeResponse; public class TraCISimStepCommand extends TraCICommand { private double targetTime; + private TraCISimTimeResponse response; + + public TraCISimStepCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); try{ @@ -22,4 +27,24 @@ public class TraCISimStepCommand extends TraCICommand { return targetTime; } + + public void setTargetTime(double targetTime) { + this.targetTime = targetTime; + } + + public TraCISimTimeResponse getResponse() { + return response; + } + + public void setResponse(TraCISimTimeResponse response) { + this.response = response; + } + + @Override + public TraCIPacket buildResponsePacket() { + if (NOK_response != null) + return NOK_response; + else + return TraCIPacket.create().wrapSimTimeStepCommand(this); // TODO + } } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java similarity index 68% rename from VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java rename to VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java index 284639302..8e352300f 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java @@ -1,7 +1,11 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.reader; import java.nio.ByteBuffer; +/** + * Wrapper around byte representation for packets, commands and responses + * received over a socket. + */ public abstract class TraCIBuffer { public TraCIReader reader; diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java similarity index 80% rename from VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java rename to VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java index 460bf2841..93d74b00e 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCICommandBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java @@ -1,7 +1,10 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.reader; import java.nio.ByteBuffer; +/** + * Wraps single command with command length removed. + */ public class TraCICommandBuffer extends TraCIBuffer{ private boolean cmdIdentifierRead; @@ -14,6 +17,11 @@ public class TraCICommandBuffer extends TraCIBuffer{ return new TraCICommandBuffer(buf); } + public static TraCICommandBuffer empty(){ + return new TraCICommandBuffer(new byte[0]); + } + + protected TraCICommandBuffer(byte[] buf) { super(buf); cmdIdentifierRead = false; diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java similarity index 53% rename from VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java rename to VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java index 36cb9c619..e37038e3c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacketBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java @@ -1,12 +1,13 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.reader; +import org.vadere.manager.stsc.respons.StatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.respons.TraCIResponse; import java.nio.ByteBuffer; /** - * Contains a {@link ByteBuffer} which encodes - * possible multiple commands. + * Wraps the whole packet received over the socket with packet length removed. */ public class TraCIPacketBuffer extends TraCIBuffer { @@ -36,9 +37,25 @@ public class TraCIPacketBuffer extends TraCIBuffer { int cmdLen = getCommandDataLen(); - return TraCICommand.createCommand(reader.readByteBuffer(cmdLen)); + return TraCICommand.create(reader.readByteBuffer(cmdLen)); } + public TraCIResponse nextResponse(){ + if (!reader.hasRemaining()) + return null; + + int statusLen = getCommandDataLen(); + StatusResponse statusResponse = StatusResponse.createFromByteBuffer(reader.readByteBuffer(statusLen)); + + if (!reader.hasRemaining()){ + // only StatusResponse + return TraCIResponse.create(statusResponse, ByteBuffer.wrap(new byte[0])); + } else { + int responseDataLen = getCommandDataLen(); + ByteBuffer buffer = reader.readByteBuffer(responseDataLen); + return TraCIResponse.create(statusResponse, buffer); + } + } private int getCommandDataLen(){ int cmdLen = reader.readUnsignedByte(); diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java similarity index 56% rename from VadereManager/src/org/vadere/manager/stsc/TraCIReader.java rename to VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java index 9042505e7..b75461825 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIReader.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java @@ -1,5 +1,6 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.reader; +import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; import org.vadere.util.geometry.Vector3D; @@ -7,11 +8,27 @@ import org.vadere.util.geometry.shapes.VPoint; import org.vadere.util.geometry.shapes.VPolygon; import java.awt.*; +import java.nio.ByteBuffer; import java.util.List; -public interface TraCIReader extends ByteReader { +public interface TraCIReader { + byte readByte(); + default int readUnsignedByte(){ + // (signed)byte --cast--> (signed)int --(& 0xff)--> cut highest three bytes. + // This result represents the an unsigned byte value (0..255) as an int. + return (int)readByte() & 0xff; + } + + byte[] readBytes(int num); + default ByteBuffer readByteBuffer(int num){ + return ByteBuffer.wrap(readBytes(num)); + } + + int readInt(); + double readDouble(); + String readString(); List readStringList(); diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIReaderImpl.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java similarity index 96% rename from VadereManager/src/org/vadere/manager/stsc/TraCIReaderImpl.java rename to VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java index 7178fe6d2..1be50a4be 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIReaderImpl.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java @@ -1,6 +1,7 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.reader; import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; @@ -20,13 +21,13 @@ public class TraCIReaderImpl implements TraCIReader { private ByteBuffer byteBuffer; - static TraCIReaderImpl wrap(byte[] data){ + public static TraCIReaderImpl wrap(byte[] data){ TraCIReaderImpl traCIReaderImpl = new TraCIReaderImpl(); traCIReaderImpl.byteBuffer = ByteBuffer.wrap(data); return traCIReaderImpl; } - static TraCIReaderImpl wrap(ByteBuffer buffer){ + public static TraCIReaderImpl wrap(ByteBuffer buffer){ TraCIReaderImpl traCIReaderImpl = new TraCIReaderImpl(); traCIReaderImpl.byteBuffer = buffer; return traCIReaderImpl; @@ -62,6 +63,9 @@ public class TraCIReaderImpl implements TraCIReader { ensureBytes(4); int len = byteBuffer.getInt(); + if(len == 0) + return ""; + ensureBytes(len); byte[] stringBytes = new byte[len]; byteBuffer.get(stringBytes, 0, stringBytes.length); diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java new file mode 100644 index 000000000..d214f76ec --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java @@ -0,0 +1,91 @@ +package org.vadere.manager.stsc.respons; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import java.nio.ByteBuffer; +import java.util.Objects; + +public class StatusResponse { + + private TraCICmd cmdIdentifier; + private TraCIStatusResponse response; + private String description; + + public static StatusResponse createFromByteBuffer(ByteBuffer rawCmd){ + StatusResponse ret = new StatusResponse(); + TraCICommandBuffer buf = TraCICommandBuffer.wrap(rawCmd); + int cmdIdentifierCode = buf.readCmdIdentifier(); + ret.cmdIdentifier = TraCICmd.fromId(cmdIdentifierCode); + if (ret.cmdIdentifier.equals(TraCICmd.UNKNOWN_CMD)) + throw new TraCIException("Unknown command in status response: " + cmdIdentifierCode); + int status = buf.reader.readUnsignedByte(); + ret.response = TraCIStatusResponse.fromId(status); + if (ret.response.equals(TraCIStatusResponse.UNKNOWN)) + throw new TraCIException("Unknown status response: " + status); + + ret.description = buf.reader.readString(); + + return ret; + } + + private StatusResponse(){ + + } + + public StatusResponse(TraCICmd cmdIdentifier, TraCIStatusResponse response, String description) { + this.cmdIdentifier = cmdIdentifier; + this.response = response; + this.description = description; + } + + + public TraCICmd getCmdIdentifier() { + return cmdIdentifier; + } + + public void setCmdIdentifier(TraCICmd cmdIdentifier) { + this.cmdIdentifier = cmdIdentifier; + } + + public TraCIStatusResponse getResponse() { + return response; + } + + public void setResponse(TraCIStatusResponse response) { + this.response = response; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StatusResponse response1 = (StatusResponse) o; + return cmdIdentifier == response1.cmdIdentifier && + response == response1.response && + description.equals(response1.description); + } + + @Override + public int hashCode() { + return Objects.hash(cmdIdentifier, response, description); + } + + @Override + public String toString() { + return "StatusResponse{" + + "cmdIdentifier=" + cmdIdentifier + + ", response=" + response + + ", description='" + description + '\'' + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java new file mode 100644 index 000000000..522e5714e --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java @@ -0,0 +1,73 @@ +package org.vadere.manager.stsc.respons; + +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import java.util.Objects; + +public class TraCIGetVersionResponse extends TraCIResponse{ + + private int versionId; + private String versionString; + + public TraCIGetVersionResponse(StatusResponse statusResponse, TraCICommandBuffer buffer) { + super(statusResponse, TraCICmd.GET_VERSION); + this.versionId = buffer.reader.readInt(); + this.versionString = buffer.reader.readString(); + } + + public TraCIGetVersionResponse(){ + super(new StatusResponse(TraCICmd.GET_VERSION, TraCIStatusResponse.OK, ""), + TraCICmd.GET_VERSION); + } + + public TraCIGetVersionResponse(int versionId, String versionString) { + this(); + this.versionId = versionId; + this.versionString = versionString; + } + + public boolean isOKResponseStatus(){ + return statusResponse.getResponse().equals(TraCIStatusResponse.OK); + } + + public int getVersionId() { + return versionId; + } + + public void setVersionId(int versionId) { + this.versionId = versionId; + } + + public String getVersionString() { + return versionString; + } + + public void setVersionString(String versionString) { + this.versionString = versionString; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TraCIGetVersionResponse that = (TraCIGetVersionResponse) o; + return versionId == that.versionId && + Objects.equals(versionString, that.versionString); + } + + @Override + public int hashCode() { + return Objects.hash(versionId, versionString); + } + + @Override + public String toString() { + return "TraCIGetVersionResponse{" + + "versionId=" + versionId + + ", versionString='" + versionString + '\'' + + ", statusResponse=" + statusResponse + + ", responseIdentifier=" + responseIdentifier + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java new file mode 100644 index 000000000..f3ad7c95c --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java @@ -0,0 +1,99 @@ +package org.vadere.manager.stsc.respons; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import java.nio.ByteBuffer; + +public class TraCIResponse { + + protected StatusResponse statusResponse; + protected TraCICmd responseIdentifier; + + + public static TraCIResponse create(StatusResponse statusResponse, ByteBuffer rawCmd){ + TraCICommandBuffer cmdResponseBuffer = TraCICommandBuffer.wrap(rawCmd); + + TraCICmd commandIdentifier = statusResponse.getCmdIdentifier(); + + int identifier = cmdResponseBuffer.readCmdIdentifier(); + TraCICmd responseIdentifier = TraCICmd.fromId(identifier); + if (responseIdentifier.equals(TraCICmd.UNKNOWN_CMD)) + throw new TraCIException("Unknown response identifier: " + identifier + + " for command: " + commandIdentifier.id); + + // build correct versions. based on actual command + switch (commandIdentifier.type){ + case CTRL: + return createControlResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer, statusResponse); + case VALUE_GET: + return createGetResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer, statusResponse); + case VALUE_SET: + return createSetResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer, statusResponse); + case VALUE_SUB: +// return createControlResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer); + case CONTEXT_SUB: +// return createControlResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer); + default: + throw new TraCIException("Response Object not implemented for command: " + commandIdentifier.toString()); + } + } + + // factory methods + + private static TraCIResponse createControlResponse(TraCICmd commandIdentifier, TraCICmd responseIdentifier, TraCICommandBuffer cmdResponseBuffer, StatusResponse statusResponse){ + switch (commandIdentifier){ + case GET_VERSION: + return new TraCIGetVersionResponse(statusResponse, cmdResponseBuffer); + case SIM_STEP: + return new TraCISimTimeResponse(statusResponse, cmdResponseBuffer); + + } + return null; + } + + private static TraCIResponse createGetResponse(TraCICmd commandIdentifier, TraCICmd responseIdentifier, TraCICommandBuffer cmdResponseBuffer, StatusResponse statusResponse){ + + return null; + } + + private static TraCIResponse createSetResponse(TraCICmd commandIdentifier, TraCICmd responseIdentifier, TraCICommandBuffer cmdResponseBuffer, StatusResponse statusResponse){ + + return null; + } + + + // instance methods + + protected TraCIResponse (StatusResponse statusResponse, TraCICmd responseIdentifier + ){ + this.statusResponse = statusResponse; + this.responseIdentifier = responseIdentifier; + } + + + public StatusResponse getStatusResponse() { + return statusResponse; + } + + public void setStatusResponse(StatusResponse statusResponse) { + this.statusResponse = statusResponse; + } + + public TraCICmd getResponseIdentifier() { + return responseIdentifier; + } + + public void setResponseIdentifier(TraCICmd responseIdentifier) { + this.responseIdentifier = responseIdentifier; + } + + @Override + public String toString() { + return "TraCIResponse{" + + "statusResponse=" + statusResponse + + ", responseIdentifier=" + responseIdentifier + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java new file mode 100644 index 000000000..80b47c21e --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java @@ -0,0 +1,29 @@ +package org.vadere.manager.stsc.respons; + +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +public class TraCISimTimeResponse extends TraCIResponse { + + private Object subscriptionData; + + + public TraCISimTimeResponse (StatusResponse statusResponse, TraCICommandBuffer buffer){ + super(statusResponse, TraCICmd.SIM_STEP); + subscriptionData = buffer; // todo: read subscription response... + } + + public TraCISimTimeResponse( Object subscriptionData) { + super(new StatusResponse(TraCICmd.SIM_STEP, TraCIStatusResponse.OK, ""), + TraCICmd.SIM_STEP); + this.subscriptionData = subscriptionData; + } + + public Object getSubscriptionData() { + return subscriptionData; + } + + public void setSubscriptionData(Object subscriptionData) { + this.subscriptionData = subscriptionData; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java new file mode 100644 index 000000000..98c1f9418 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java @@ -0,0 +1,25 @@ +package org.vadere.manager.stsc.respons; + +public enum TraCIStatusResponse { + + OK(0x00), + ERR(0xFF), + NOT_IMPLEMENTED(0x01), + UNKNOWN(0xaa); + + + public int code; + + + public static TraCIStatusResponse fromId(int code){ + for(TraCIStatusResponse status : values()){ + if (status.code == code) + return status; + } + return UNKNOWN; + } + + TraCIStatusResponse(int code) { + this.code = code; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriter.java similarity index 78% rename from VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java rename to VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriter.java index 8dee049f5..0d1997a75 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIWriter.java +++ b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriter.java @@ -1,6 +1,9 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.writer; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; import java.awt.*; @@ -16,6 +19,8 @@ public interface TraCIWriter { TraCIWriter rest(); + TraCIWriter writeObjectWithId(TraCIDataType dataType, Object data); + TraCIWriter writeUnsignedByteWithId(int val); TraCIWriter writeByteWithId(byte val); TraCIWriter writeIntWithId(int val); @@ -61,15 +66,15 @@ public interface TraCIWriter { TraCIWriter writeStringList(List val); - TraCIWriter write2DPosition(double x, double y); + TraCIWriter write2DPosition(VPoint val); - TraCIWriter write3DPosition(double x, double y, double z); + TraCIWriter write3DPosition(Vector3D val); - TraCIWriter writeRoadMapPosition(String roadId, double pos, int laneId); + TraCIWriter writeRoadMapPosition(RoadMapPosition val); - TraCIWriter writeLonLatPosition(double lon, double lat); + TraCIWriter writeLonLatPosition(VPoint lonLat); - TraCIWriter writeLonLatAltPosition(double lon, double lat, double alt); + TraCIWriter writeLonLatAltPosition(Vector3D lonLatAlt); TraCIWriter writePolygon(VPoint... points); diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriterImpl.java similarity index 70% rename from VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java rename to VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriterImpl.java index 9be0ca4cb..350b93e0c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIWriterImpl.java +++ b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriterImpl.java @@ -1,8 +1,12 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.writer; import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; +import org.vadere.util.logging.Logger; import java.awt.*; import java.io.ByteArrayOutputStream; @@ -14,6 +18,8 @@ import java.util.List; public class TraCIWriterImpl implements TraCIWriter { + private static Logger logger = Logger.getLogger(TraCIWriterImpl.class); + ByteArrayOutputStream data; @@ -38,6 +44,60 @@ public class TraCIWriterImpl implements TraCIWriter { return this; } + @Override + public TraCIWriter writeObjectWithId(TraCIDataType dataType, Object data) { + + switch (dataType){ + case U_BYTE: + writeUnsignedByteWithId((int) data); + break; + case BYTE: + writeByteWithId((byte) data); + break; + case INTEGER: + writeIntWithId((int) data); + break; + case DOUBLE: + writeDoubleWithId((double) data); + break; + case STRING: + writeStringWithId((String) data); + break; + case STRING_LIST: + writeStringListWithId((List) data); + break; + case POS_2D: + write2DPosition((VPoint) data); + break; + case POS_3D: + write3DPosition((Vector3D) data); + break; + case POS_ROAD_MAP: + writeRoadMapPosition((RoadMapPosition) data); + break; + case POS_LON_LAT: + writeLonLatPosition((VPoint) data); + break; + case POS_LON_LAT_ALT: + writeLonLatAltPosition((Vector3D) data); + break; + case POLYGON: + writePolygon((List) data); + break; + case TRAFFIC_LIGHT_PHASE_LIST: + writeTrafficLightPhaseList((List) data); + break; + case COLOR: + writeColor((Color) data); + break; + default: + logger.errorf("cannot write %s", dataType.toString()); + + } + + return this; + } + @Override public TraCIWriter writeByte(int val) { data.write(val); @@ -126,46 +186,46 @@ public class TraCIWriterImpl implements TraCIWriter { } @Override - public TraCIWriter write2DPosition(double x, double y){ + public TraCIWriter write2DPosition(VPoint val){ writeUnsignedByte(TraCIDataType.POS_2D.identifier); - writeDouble(x); - writeDouble(y); + writeDouble(val.x); + writeDouble(val.y); return this; } @Override - public TraCIWriter write3DPosition(double x, double y, double z){ + public TraCIWriter write3DPosition(Vector3D val){ writeUnsignedByte(TraCIDataType.POS_3D.identifier); - writeDouble(x); - writeDouble(y); - writeDouble(z); + writeDouble(val.x); + writeDouble(val.y); + writeDouble(val.z); return this; } @Override - public TraCIWriter writeRoadMapPosition(String roadId, double pos, int laneId){ + public TraCIWriter writeRoadMapPosition(RoadMapPosition val){ writeUnsignedByte(TraCIDataType.POS_ROAD_MAP.identifier); - writeString(roadId); - writeDouble(pos); - writeUnsignedByte(laneId); + writeString(val.getRoadId()); + writeDouble(val.getPos()); + writeUnsignedByte(val.getLaneId()); return this; } @Override - public TraCIWriter writeLonLatPosition(double lon, double lat){ + public TraCIWriter writeLonLatPosition(VPoint lonLat){ writeUnsignedByte(TraCIDataType.POS_LON_LAT.identifier); - writeDouble(lon); - writeDouble(lat); + writeDouble(lonLat.x); + writeDouble(lonLat.y); return this; } @Override - public TraCIWriter writeLonLatAltPosition(double lon, double lat, double alt){ + public TraCIWriter writeLonLatAltPosition(Vector3D lonLatAlt){ writeUnsignedByte(TraCIDataType.POS_LON_LAT_ALT.identifier); - writeDouble(lon); - writeDouble(lat); - writeDouble(alt); + writeDouble(lonLatAlt.x); + writeDouble(lonLatAlt.y); + writeDouble(lonLatAlt.z); return this; } diff --git a/VadereManager/testResources/testProject001/scenarios/scenario001.scenario b/VadereManager/testResources/testProject001/scenarios/scenario001.scenario new file mode 100644 index 000000000..c38a01746 --- /dev/null +++ b/VadereManager/testResources/testProject001/scenarios/scenario001.scenario @@ -0,0 +1,216 @@ +{ + "name" : "scenario001", + "description" : "", + "release" : "0.10", + "processWriters" : { + "files" : [ { + "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.TimestepPedestrianIdOutputFile", + "filename" : "postvis.trajectories", + "processors" : [ 1, 2 ] + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.TimestepPedestrianIdOverlapOutputFile", + "filename" : "overlaps.csv", + "processors" : [ 3 ] + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.NoDataKeyOutputFile", + "filename" : "overlapCount.txt", + "processors" : [ 4 ] + } ], + "processors" : [ { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianPositionProcessor", + "id" : 1 + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianTargetIdProcessor", + "id" : 2 + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianOverlapProcessor", + "id" : 3 + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.NumberOverlapsProcessor", + "id" : 4, + "attributesType" : "org.vadere.state.attributes.processor.AttributesNumberOverlapsProcessor", + "attributes" : { + "pedestrianOverlapProcessorId" : 3 + } + } ], + "isTimestamped" : true, + "isWriteMetaData" : false + }, + "scenario" : { + "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", + "attributesModel" : { + "org.vadere.state.attributes.models.AttributesOSM" : { + "stepCircleResolution" : 4, + "numberOfCircles" : 1, + "optimizationType" : "NELDER_MEAD", + "varyStepDirection" : true, + "movementType" : "ARBITRARY", + "stepLengthIntercept" : 0.4625, + "stepLengthSlopeSpeed" : 0.2345, + "stepLengthSD" : 0.036, + "movementThreshold" : 0.0, + "minStepLength" : 0.1, + "minimumStepLength" : true, + "maxStepDuration" : 1.7976931348623157E308, + "dynamicStepLength" : true, + "updateType" : "EVENT_DRIVEN", + "seeSmallWalls" : false, + "targetPotentialModel" : "org.vadere.simulator.models.potential.fields.PotentialFieldTargetGrid", + "pedestrianPotentialModel" : "org.vadere.simulator.models.potential.PotentialFieldPedestrianCompactSoftshell", + "obstaclePotentialModel" : "org.vadere.simulator.models.potential.PotentialFieldObstacleCompactSoftshell", + "submodels" : [ ] + }, + "org.vadere.state.attributes.models.AttributesPotentialCompactSoftshell" : { + "pedPotentialIntimateSpaceWidth" : 0.45, + "pedPotentialPersonalSpaceWidth" : 1.2, + "pedPotentialHeight" : 50.0, + "obstPotentialWidth" : 0.8, + "obstPotentialHeight" : 6.0, + "intimateSpaceFactor" : 1.2, + "personalSpacePower" : 1, + "intimateSpacePower" : 1 + }, + "org.vadere.state.attributes.models.AttributesFloorField" : { + "createMethod" : "HIGH_ACCURACY_FAST_MARCHING", + "potentialFieldResolution" : 0.1, + "obstacleGridPenalty" : 0.1, + "targetAttractionStrength" : 1.0, + "timeCostAttributes" : { + "standardDeviation" : 0.7, + "type" : "UNIT", + "obstacleDensityWeight" : 3.5, + "pedestrianSameTargetDensityWeight" : 3.5, + "pedestrianOtherTargetDensityWeight" : 3.5, + "pedestrianWeight" : 3.5, + "queueWidthLoading" : 1.0, + "pedestrianDynamicWeight" : 6.0, + "loadingType" : "CONSTANT", + "width" : 0.2, + "height" : 1.0 + } + } + }, + "attributesSimulation" : { + "finishTime" : 50.0, + "simTimeStepLength" : 0.4, + "realTimeSimTimeRatio" : 0.1, + "writeSimulationData" : true, + "visualizationEnabled" : true, + "printFPS" : false, + "digitsPerCoordinate" : 2, + "useFixedSeed" : true, + "fixedSeed" : 183115877309837713, + "simulationSeed" : 0, + "useSalientBehavior" : false + }, + "topography" : { + "attributes" : { + "bounds" : { + "x" : 0.0, + "y" : 0.0, + "width" : 10.0, + "height" : 10.0 + }, + "boundingBoxWidth" : 0.5, + "bounded" : true + }, + "obstacles" : [ { + "shape" : { + "x" : 0.5, + "y" : 5.3, + "width" : 6.7, + "height" : 1.0, + "type" : "RECTANGLE" + }, + "id" : 3 + }, { + "shape" : { + "x" : 2.0, + "y" : 2.7, + "width" : 7.5, + "height" : 1.3, + "type" : "RECTANGLE" + }, + "id" : 4 + } ], + "measurementAreas" : [ ], + "stairs" : [ ], + "targets" : [ { + "id" : 2, + "absorbing" : true, + "shape" : { + "x" : 6.6, + "y" : 0.8, + "width" : 2.4, + "height" : 1.6, + "type" : "RECTANGLE" + }, + "waitingTime" : 0.0, + "waitingTimeYellowPhase" : 0.0, + "parallelWaiters" : 0, + "individualWaiting" : true, + "deletionDistance" : 0.1, + "startingWithRedLight" : false, + "nextSpeed" : -1.0 + } ], + "absorbingAreas" : [ ], + "sources" : [ { + "id" : 1, + "shape" : { + "x" : 1.0, + "y" : 7.504761904761905, + "width" : 2.0095238095238095, + "height" : 1.4952380952380953, + "type" : "RECTANGLE" + }, + "interSpawnTimeDistribution" : "org.vadere.state.scenario.ConstantDistribution", + "distributionParameters" : [ 20.0 ], + "spawnNumber" : 4, + "maxSpawnNumberTotal" : 8, + "startTime" : 0.0, + "endTime" : 50.0, + "spawnAtRandomPositions" : true, + "useFreeSpaceOnly" : true, + "targetIds" : [ 2 ], + "groupSizeDistribution" : [ 1.0 ], + "dynamicElementType" : "PEDESTRIAN" + } ], + "dynamicElements" : [ ], + "attributesPedestrian" : { + "radius" : 0.2, + "densityDependentSpeed" : false, + "speedDistributionMean" : 1.34, + "speedDistributionStandardDeviation" : 0.26, + "minimumSpeed" : 0.5, + "maximumSpeed" : 2.2, + "acceleration" : 2.0, + "footStepsToStore" : 4, + "searchRadius" : 1.0, + "angleCalculationType" : "USE_CENTER", + "targetOrientationAngleThreshold" : 45.0 + }, + "teleporter" : null, + "attributesCar" : { + "id" : -1, + "radius" : 0.2, + "densityDependentSpeed" : false, + "speedDistributionMean" : 1.34, + "speedDistributionStandardDeviation" : 0.26, + "minimumSpeed" : 0.5, + "maximumSpeed" : 2.2, + "acceleration" : 2.0, + "footStepsToStore" : 4, + "searchRadius" : 1.0, + "angleCalculationType" : "USE_CENTER", + "targetOrientationAngleThreshold" : 45.0, + "length" : 4.5, + "width" : 1.7, + "direction" : { + "x" : 1.0, + "y" : 0.0 + } + } + }, + "eventInfos" : [ ] + } +} \ No newline at end of file diff --git a/VadereManager/testResources/testProject001/vadere.project b/VadereManager/testResources/testProject001/vadere.project new file mode 100644 index 000000000..fe15fe316 --- /dev/null +++ b/VadereManager/testResources/testProject001/vadere.project @@ -0,0 +1 @@ +testProject001 \ No newline at end of file diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java index 9377398f4..4eda3dd1a 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java @@ -3,9 +3,11 @@ package org.vadere.manager.stsc; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.vadere.manager.stsc.reader.TraCIReaderImpl; import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.manager.stsc.writer.TraCIWriterImpl; import org.vadere.util.geometry.GeometryUtils; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; @@ -121,7 +123,7 @@ public class TraCIReaderTest { @Test public void read2DPosition() { - writer.write2DPosition(22.3, 4.0); + writer.write2DPosition(new VPoint(22.3, 4.0)); createReader(); checkIdentifier(TraCIDataType.POS_2D.identifier); @@ -135,7 +137,7 @@ public class TraCIReaderTest { @Test public void read3DPosition() { - writer.write3DPosition(11.1, 22.2, 33.3); + writer.write3DPosition(new Vector3D(11.1, 22.2, 33.3)); createReader(); checkIdentifier(TraCIDataType.POS_3D.identifier); @@ -150,7 +152,7 @@ public class TraCIReaderTest { @Test public void readRoadMapPosition() { - writer.writeRoadMapPosition("road_001", 12.5, 0); + writer.writeRoadMapPosition(new RoadMapPosition("road_001", 12.5, 0)); createReader(); checkIdentifier(TraCIDataType.POS_ROAD_MAP.identifier); @@ -165,7 +167,7 @@ public class TraCIReaderTest { @Test public void readLonLatPosition() { - writer.writeLonLatPosition(23.3, 11.9); + writer.writeLonLatPosition(new VPoint(23.3, 11.9)); createReader(); checkIdentifier(TraCIDataType.POS_LON_LAT.identifier); @@ -179,7 +181,7 @@ public class TraCIReaderTest { @Test public void readLonLatAltPosition() { - writer.writeLonLatAltPosition(34.5, 34.0, 11.3436); + writer.writeLonLatAltPosition(new Vector3D(34.5, 34.0, 11.3436)); createReader(); checkIdentifier(TraCIDataType.POS_LON_LAT_ALT.identifier); diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java index 1862806b4..ab52d38b2 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java @@ -5,7 +5,10 @@ import org.junit.Before; import org.junit.Test; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.sumo.LightPhase; +import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.manager.stsc.writer.TraCIWriterImpl; +import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; import java.awt.*; @@ -162,7 +165,7 @@ public class TraCIWriterImplTest { @Test public void write2DPosition() { - writer.write2DPosition(23.456,3.3); + writer.write2DPosition(new VPoint(23.456,3.3)); ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) @@ -178,7 +181,7 @@ public class TraCIWriterImplTest { @Test public void write3DPosition() { - writer.write3DPosition(3.34, 12.33, 56.8889); + writer.write3DPosition(new Vector3D(3.34, 12.33, 56.8889)); ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) @@ -196,7 +199,7 @@ public class TraCIWriterImplTest { @Test public void writeRoadMapPosition() { - writer.writeRoadMapPosition("r001", 12.4, 3); + writer.writeRoadMapPosition(new RoadMapPosition("r001", 12.4, 3)); int roadIdLen = "r001".getBytes(StandardCharsets.US_ASCII).length; ByteBuffer buf = writer.asByteBuffer(); @@ -218,7 +221,7 @@ public class TraCIWriterImplTest { @Test public void writeLonLatPosition() { - writer.writeLonLatPosition(49.3345, 10.10453); + writer.writeLonLatPosition(new VPoint(49.3345, 10.10453)); ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) @@ -234,7 +237,7 @@ public class TraCIWriterImplTest { @Test public void writeLonLatAltPosition() { - writer.writeLonLatAltPosition(49.33, 15.223, 12.33); + writer.writeLonLatAltPosition(new Vector3D(49.33, 15.223, 12.33)); ByteBuffer buf = writer.asByteBuffer(); // identifier (ubyte) -- GitLab From c1ffebbf326fe2ad007520153ff3da24c3609b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Thu, 6 Jun 2019 20:16:08 +0200 Subject: [PATCH 14/58] add sendFile Command --- .../org/vadere/manager/client/TestClient.java | 48 ++++++++++++----- .../commandHandler/CommandExecutor.java | 1 + .../commandHandler/ControlCommandHandler.java | 16 ++++++ .../src/org/vadere/manager/stsc/TraCICmd.java | 1 + .../manager/stsc/commands/TraCICommand.java | 6 ++- .../control/TraCIGetVersionCommand.java | 6 +-- .../control/TraCISendFileCommand.java | 54 +++++++++++++++++++ .../commands/control/TraCISimStepCommand.java | 9 +++- .../stsc/reader/TraCIPacketBuffer.java | 2 +- .../manager/stsc/respons/TraCIResponse.java | 4 ++ 10 files changed, 127 insertions(+), 20 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index acc80583d..65e405afa 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -2,9 +2,11 @@ package org.vadere.manager.client; import org.vadere.manager.TraCISocket; import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.respons.TraCIResponse; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; +import org.vadere.manager.stsc.respons.TraCIResponse; +import org.vadere.util.io.IOUtils; import java.io.IOException; import java.net.ConnectException; @@ -31,20 +33,9 @@ public class TestClient implements Runnable{ } - void getVersion(String[] args) throws IOException { - TraCIPacket p = TraCIGetVersionCommand.build(); - - traCISocket.sendExact(p); - - TraCIPacketBuffer buf = traCISocket.receiveExact(); - TraCIResponse cmd = buf.nextResponse(); - - System.out.println(cmd.toString()); - - } - private void addCommands(ConsoleReader consoleReader){ consoleReader.addCommand("getVersion", "", this::getVersion); + consoleReader.addCommand("sendFile", "send file. default: scenario001", this::sendFile); } @@ -110,4 +101,35 @@ public class TestClient implements Runnable{ } } + + // Commands + + void getVersion(String[] args) throws IOException { + TraCIPacket p = TraCIGetVersionCommand.build(); + + traCISocket.sendExact(p); + + TraCIPacketBuffer buf = traCISocket.receiveExact(); + TraCIResponse cmd = buf.nextResponse(); + + System.out.println(cmd.toString()); + } + + void sendFile(String[] args) throws IOException { + + String filePath = "/home/stsc/repos/vadere/VadereManager/testResources/testProject001/scenarios/scenario001.scenario"; + + if (args.length > 1) + filePath = args[1]; + + TraCIPacket packet = TraCISendFileCommand.TraCISendFileCommand(IOUtils.readTextFile(filePath)); + + traCISocket.sendExact(packet); + + TraCIPacketBuffer buf = traCISocket.receiveExact(); + TraCIResponse cmd = buf.nextResponse(); + + System.out.println(cmd.toString()); + } + } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index 1d46e43c8..ab0eee949 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -38,6 +38,7 @@ public class CommandExecutor { cmdMap.put(TraCICmd.LOAD.id, ControlCommandHandler.instance::process_load); cmdMap.put(TraCICmd.SIM_STEP.id, ControlCommandHandler.instance::process_simStep); cmdMap.put(TraCICmd.CLOSE.id, ControlCommandHandler.instance::process_close); + cmdMap.put(TraCICmd.SEND_FILE.id, ControlCommandHandler.instance::process_load_file); cmdMap.put(TraCICmd.GET_PERSON_VALUE.id, PersonCommandHandler.instance::processGet); cmdMap.put(TraCICmd.SET_PERSON_STATE.id, PersonCommandHandler.instance::processSet); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index fe9918889..ce1abd2d4 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -3,12 +3,17 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; +import org.vadere.simulator.projects.Scenario; +import org.vadere.util.logging.Logger; public class ControlCommandHandler extends CommandHandler{ + private static Logger logger = Logger.getLogger(CommandExecutor.class); + public static ControlCommandHandler instance; static { @@ -44,4 +49,15 @@ public class ControlCommandHandler extends CommandHandler{ } + public TraCICommand process_load_file(TraCICommand rawCmd) { + + TraCISendFileCommand cmd = (TraCISendFileCommand) rawCmd; + + Scenario s = new Scenario(cmd.getFile()); + + logger.infof("Received scenario File: %s", s.getName()); + + + return cmd; + } } \ No newline at end of file diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java index 0c76a082a..870e0a3db 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java @@ -7,6 +7,7 @@ public enum TraCICmd { CLOSE(0x7F, CmdType.CTRL), LOAD(0x01,CmdType.CTRL), SET_ORDER(0x03, CmdType.CTRL), + SEND_FILE(0x75, CmdType.CTRL), // Value Retrieval GET_INDUCTION_LOOP(0xa0, CmdType.VALUE_GET), RESPONSE_GET_INDUCTION_LOOP(0xb0, CmdType.RESPONSE), diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java index 451cbd8d8..4777ab787 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -4,6 +4,7 @@ import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.CmdType; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.commands.control.TraCICloseCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; @@ -49,9 +50,10 @@ public abstract class TraCICommand { return new TraCISimStepCommand(cmd, cmdBuffer); case CLOSE: return new TraCICloseCommand(cmd); - + case SEND_FILE: + return new TraCISendFileCommand(cmd, cmdBuffer); default: - throw new IllegalStateException("Should not be reached. Only TraCI control commands expected"); + throw new IllegalStateException(String.format("Should not be reached. Only TraCI control commands expected: %0X", cmd.id)); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java index 3b10c78c6..fc3a99875 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java @@ -10,10 +10,10 @@ public class TraCIGetVersionCommand extends TraCICommand { private TraCIGetVersionResponse response; public static TraCIPacket build(){ - TraCIPacket packet = TraCIPacket.create(6); + TraCIPacket packet = TraCIPacket.create(6); // 4 packet.getWriter() - .writeUnsignedByte(2) - .writeUnsignedByte(TraCICmd.GET_VERSION.id); + .writeCommandLength(2) // 1 + .writeUnsignedByte(TraCICmd.GET_VERSION.id); // 1 return packet; } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java new file mode 100644 index 000000000..43e2d58ed --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java @@ -0,0 +1,54 @@ +package org.vadere.manager.stsc.commands.control; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import java.nio.charset.StandardCharsets; + +public class TraCISendFileCommand extends TraCICommand { + + private String file; + + public static TraCIPacket TraCISendFileCommand(String file){ + int strLen = file.getBytes(StandardCharsets.US_ASCII).length; + TraCIPacket packet = TraCIPacket.create(); // 4 (add later) + packet.getWriter() + .writeCommandLength(1 + 1 + 4 + strLen) // [1|5] + .writeUnsignedByte(TraCICmd.SEND_FILE.id) // 1 + .writeString(file); // 4+strLen + return packet; + } + + public TraCISendFileCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { + super(traCICmd); + try{ + this.file = cmdBuffer.reader.readString(); + } catch (Exception e){ + throw TraCIException.cmdErr(traCICmd, e); + } + } + + + protected TraCISendFileCommand(TraCICmd traCICmd) { + super(traCICmd); + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + + @Override + public TraCIPacket buildResponsePacket() { + if (NOK_response != null) + return NOK_response; + else + return TraCIPacket.create(11).add_OK_StatusResponse(TraCICmd.SEND_FILE); + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java index 3d7d8033a..095ca0f06 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java @@ -10,9 +10,16 @@ import org.vadere.manager.stsc.respons.TraCISimTimeResponse; public class TraCISimStepCommand extends TraCICommand { private double targetTime; - private TraCISimTimeResponse response; + public static TraCIPacket build(double targetTime){ + TraCIPacket packet = TraCIPacket.create(14); // 4 + packet.getWriter() + .writeUnsignedByte(10) // 1 + .writeUnsignedByte(TraCICmd.SIM_STEP.id) // 1 + .writeDouble(targetTime); // 8 + return packet; + } public TraCISimStepCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java index e37038e3c..326a8589d 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java @@ -49,7 +49,7 @@ public class TraCIPacketBuffer extends TraCIBuffer { if (!reader.hasRemaining()){ // only StatusResponse - return TraCIResponse.create(statusResponse, ByteBuffer.wrap(new byte[0])); + return TraCIResponse.create(statusResponse); } else { int responseDataLen = getCommandDataLen(); ByteBuffer buffer = reader.readByteBuffer(responseDataLen); diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java index f3ad7c95c..2f584dbf8 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java @@ -12,6 +12,10 @@ public class TraCIResponse { protected TraCICmd responseIdentifier; + public static TraCIResponse create(StatusResponse statusResponse){ + return new TraCIResponse(statusResponse, statusResponse.getCmdIdentifier()); + } + public static TraCIResponse create(StatusResponse statusResponse, ByteBuffer rawCmd){ TraCICommandBuffer cmdResponseBuffer = TraCICommandBuffer.wrap(rawCmd); -- GitLab From 80d2e2572c35775e8bf6b925e3e1dc5619a30461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Thu, 6 Jun 2019 22:46:12 +0200 Subject: [PATCH 15/58] connect simulation with TraCI --- .../src/org/vadere/manager/RemoteManager.java | 55 +++++++++++++++++-- .../vadere/manager/client/ConsoleReader.java | 2 +- .../org/vadere/manager/client/TestClient.java | 22 +++++++- .../commandHandler/CommandExecutor.java | 2 +- .../commandHandler/CommandHandler.java | 5 +- .../commandHandler/ControlCommandHandler.java | 29 ++++++---- .../commandHandler/PersonCommandHandler.java | 49 +++++++++-------- .../commandHandler/StateAccessHandler.java | 10 ++++ .../commandHandler/TraCICmdHandler.java | 3 +- .../org/vadere/manager/stsc/TraCIPacket.java | 12 +++- .../stsc/commands/TraCIGetCommand.java | 1 - .../stsc/respons/TraCISimTimeResponse.java | 24 +++++++- .../vadere/simulator/control/Simulation.java | 6 +- .../simulator/projects/ScenarioRun.java | 10 ++++ 14 files changed, 177 insertions(+), 53 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index 04fc8d74f..d0d5047ff 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -1,5 +1,6 @@ package org.vadere.manager; +import org.vadere.manager.commandHandler.StateAccessHandler; import org.vadere.simulator.control.RemoteManagerListener; import org.vadere.simulator.entrypoints.ScenarioFactory; import org.vadere.simulator.projects.RunnableFinishedListener; @@ -8,6 +9,7 @@ import org.vadere.simulator.projects.ScenarioRun; import org.vadere.util.logging.Logger; import java.io.IOException; +import java.util.concurrent.locks.ReentrantLock; public class RemoteManager implements RemoteManagerListener, RunnableFinishedListener, Runnable { @@ -16,20 +18,61 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis private ScenarioRun currentSimulationRun; private Thread currentSimulationThread; + private final Object waitForLoopEnd; + private ReentrantLock lock; - public RemoteManager() { } + public RemoteManager() { + waitForLoopEnd = new Object(); + lock = new ReentrantLock(); + } - public void loadScenario(String scenarioString) throws IOException { - Scenario scenario = ScenarioFactory.createScenarioWithScenarioJson(scenarioString); - currentSimulationRun = new ScenarioRun(scenario, this); + public void loadScenario(String scenarioString) { + Scenario scenario = null; + try { + scenario = ScenarioFactory.createScenarioWithScenarioJson(scenarioString); + } catch (IOException e) { + throw new TraCIException("Cannot create Scenario from given file."); + } + currentSimulationRun = new ScenarioRun(scenario, this, true); currentSimulationRun.addRemoteManagerListener(this); - currentSimulationRun.setSingleStepMode(true); + } + + + synchronized public void accessState(StateAccessHandler stateAccessHandler){ + try { + + if (!currentSimulationRun.isWaitForSimCommand()) { + synchronized (waitForLoopEnd){ + waitForLoopEnd.wait(); + } + } + lock.lock(); + stateAccessHandler.execute(currentSimulationRun.getSimulationState()); + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new TraCIException("Interrupted while accessing simulation state"); + } finally { + lock.unlock(); + } + } + + synchronized public void nextStep(double simTime){ + try { + lock.lock(); + currentSimulationRun.nextSimCommand(simTime); + + } finally { + lock.unlock(); + } } @Override public void simulationStepFinishedListener() { - + synchronized (waitForLoopEnd){ + waitForLoopEnd.notify(); + } } @Override diff --git a/VadereManager/src/org/vadere/manager/client/ConsoleReader.java b/VadereManager/src/org/vadere/manager/client/ConsoleReader.java index 0480fe989..e03c42108 100644 --- a/VadereManager/src/org/vadere/manager/client/ConsoleReader.java +++ b/VadereManager/src/org/vadere/manager/client/ConsoleReader.java @@ -69,7 +69,7 @@ public class ConsoleReader implements Runnable{ try { System.out.print("> "); String cmd = reader.readLine(); - executeCmd(cmd); + executeCmd(cmd.trim()); } catch (IOException e) { e.printStackTrace(); } diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index 65e405afa..18bd208a1 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -4,8 +4,10 @@ import org.vadere.manager.TraCISocket; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; +import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; import org.vadere.manager.stsc.respons.TraCIResponse; +import org.vadere.manager.stsc.respons.TraCISimTimeResponse; import org.vadere.util.io.IOUtils; import java.io.IOException; @@ -36,6 +38,7 @@ public class TestClient implements Runnable{ private void addCommands(ConsoleReader consoleReader){ consoleReader.addCommand("getVersion", "", this::getVersion); consoleReader.addCommand("sendFile", "send file. default: scenario001", this::sendFile); + consoleReader.addCommand("nextStep", "default(-1) one loop.", this::nextSimTimeStep); } @@ -106,7 +109,6 @@ public class TestClient implements Runnable{ void getVersion(String[] args) throws IOException { TraCIPacket p = TraCIGetVersionCommand.build(); - traCISocket.sendExact(p); TraCIPacketBuffer buf = traCISocket.receiveExact(); @@ -115,6 +117,24 @@ public class TestClient implements Runnable{ System.out.println(cmd.toString()); } + void nextSimTimeStep(String[] args) throws IOException{ + double nextSimTime = -1.0; + + if (args.length>2) + nextSimTime = Double.parseDouble(args[1]); + + TraCIPacket packet = TraCISimStepCommand.build(nextSimTime); + traCISocket.sendExact(packet); + + TraCIPacketBuffer buf = traCISocket.receiveExact(); + TraCISimTimeResponse cmd = (TraCISimTimeResponse) buf.nextResponse(); + System.out.println(cmd.toString()); + } + + void getPersonList(String[] args) throws IOException{ + + } + void sendFile(String[] args) throws IOException { String filePath = "/home/stsc/repos/vadere/VadereManager/testResources/testProject001/scenarios/scenario001.scenario"; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index ab0eee949..146e430bc 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -50,7 +50,7 @@ public class CommandExecutor { return TraCIPacket.create().add_Err_StatusResponse(cmd.getTraCICmd().id, "ID not found."); } - return handler.handel(cmd).buildResponsePacket(); + return handler.handel(cmd, remoteManager).buildResponsePacket(); } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index df7f5ddbd..20d9fa30b 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,5 +1,6 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.RemoteManager; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; @@ -7,13 +8,13 @@ import org.vadere.manager.stsc.commands.TraCICommand; public abstract class CommandHandler { - public TraCICommand process_NotImplemented(TraCICommand cmd){ + public TraCICommand process_NotImplemented(TraCICommand cmd, RemoteManager remoteManager){ return cmd.setNOK_response(TraCIPacket.sendStatus(cmd.getTraCICmd(), TraCIStatusResponse.NOT_IMPLEMENTED, "Command " + cmd.getCmdType().toString() + "not Implemented")); } - public TraCICommand process_UnknownCommand(TraCICommand cmd){ + public TraCICommand process_UnknownCommand(TraCICommand cmd, RemoteManager remoteManager){ return cmd.setNOK_response(TraCIPacket.sendStatus(cmd.getTraCICmd(), TraCIStatusResponse.ERR, "Command " + cmd.getCmdType().toString() + "Unknown")); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index ce1abd2d4..413865f22 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -1,13 +1,14 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.RemoteManager; +import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; -import org.vadere.simulator.projects.Scenario; import org.vadere.util.logging.Logger; public class ControlCommandHandler extends CommandHandler{ @@ -22,24 +23,30 @@ public class ControlCommandHandler extends CommandHandler{ private ControlCommandHandler(){} - public TraCICommand process_load(TraCICommand rawCmd) { + public TraCICommand process_load(TraCICommand rawCmd, RemoteManager remoteManager) { return null; } - public TraCICommand process_close(TraCICommand rawCmd) { + public TraCICommand process_close(TraCICommand rawCmd, RemoteManager remoteManager) { return null; } - public TraCICommand process_simStep(TraCICommand rawCmd) { + public TraCICommand process_simStep(TraCICommand rawCmd, RemoteManager remoteManager) { TraCISimStepCommand cmd = (TraCISimStepCommand) rawCmd; - Object data = null; // handle subscriptions - cmd.setResponse(new TraCISimTimeResponse(data)); + remoteManager.nextStep(cmd.getTargetTime()); + + remoteManager.accessState(state -> { + cmd.setResponse(new TraCISimTimeResponse(state.getStep(), TraCIDataType.INTEGER)); + }); + + + logger.infof("Simulate next step %f", cmd.getTargetTime()); return cmd; } - public TraCICommand process_getVersion(TraCICommand rawCmd) { + public TraCICommand process_getVersion(TraCICommand rawCmd, RemoteManager remoteManager) { TraCIGetVersionCommand cmd = (TraCIGetVersionCommand)rawCmd; cmd.setResponse(new TraCIGetVersionResponse(33, "Version 33 From Vadere")); @@ -49,14 +56,12 @@ public class ControlCommandHandler extends CommandHandler{ } - public TraCICommand process_load_file(TraCICommand rawCmd) { + public TraCICommand process_load_file(TraCICommand rawCmd, RemoteManager remoteManager) { TraCISendFileCommand cmd = (TraCISendFileCommand) rawCmd; - Scenario s = new Scenario(cmd.getFile()); - - logger.infof("Received scenario File: %s", s.getName()); - + remoteManager.loadScenario(cmd.getFile()); + remoteManager.run(); return cmd; } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index e62eb2a9f..2422e3f37 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -1,12 +1,13 @@ package org.vadere.manager.commandHandler; -import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.RemoteManager; import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.util.geometry.shapes.VPoint; -import java.util.List; +import java.util.ArrayList; public class PersonCommandHandler extends CommandHandler{ @@ -21,17 +22,19 @@ public class PersonCommandHandler extends CommandHandler{ } - protected TraCICommand process_getIDList(TraCIGetCommand cmd){ + protected TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager){ - List pedestrians = null; // get.... + remoteManager.accessState(state -> { + cmd.setResponseData(new ArrayList<>(state.getTopography().getPedestrianDynamicElements().getElements())); + }); + + cmd.setResponseDataType(TraCIDataType.STRING_LIST); + cmd.setResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE); - cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) - .addResponseVariableType(TraCIDataType.STRING_LIST) - .addResponseData(pedestrians); return cmd; } - protected TraCICommand process_getIDCount(TraCIGetCommand cmd){ + protected TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager){ int numPerson = 0; // get... @@ -43,7 +46,7 @@ public class PersonCommandHandler extends CommandHandler{ } - protected TraCICommand process_getSpeed(TraCIGetCommand cmd){ + protected TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager){ double speed = 0.0; // get... @@ -53,7 +56,7 @@ public class PersonCommandHandler extends CommandHandler{ return cmd; } - protected TraCICommand process_getPosition(TraCIGetCommand cmd){ + protected TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager){ VPoint point = new VPoint(1.0, 1.0); // get @@ -65,7 +68,7 @@ public class PersonCommandHandler extends CommandHandler{ } - protected TraCICommand process_getLength(TraCIGetCommand cmd){ + protected TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager){ double pedLength = 0.4; // get... (durchmesser) @@ -78,7 +81,7 @@ public class PersonCommandHandler extends CommandHandler{ } - protected TraCICommand process_getWidth(TraCIGetCommand cmd){ + protected TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager){ double pedWidth = 0.4; // get.. (durchmesser) cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) @@ -89,22 +92,22 @@ public class PersonCommandHandler extends CommandHandler{ } - public TraCICommand processGet(TraCICommand cmd){ + public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; switch (TraCIPersonVar.fromId(getCmd.getVariableId())){ case ID_LIST: - return process_getIDList(getCmd); + return process_getIDList(getCmd, remoteManager); case COUNT: - return process_getIDCount(getCmd); + return process_getIDCount(getCmd, remoteManager); case SPEED: - return process_getSpeed(getCmd); + return process_getSpeed(getCmd, remoteManager); case POS_2D: - return process_getPosition(getCmd); + return process_getPosition(getCmd, remoteManager); case LENGTH: - return process_getLength(getCmd); + return process_getLength(getCmd, remoteManager); case WIDTH: - return process_getWidth(getCmd); + return process_getWidth(getCmd, remoteManager); case WAITING_TIME: case POS_3D: case ANGLE: @@ -116,15 +119,15 @@ public class PersonCommandHandler extends CommandHandler{ case NEXT_EDGE: case REMAINING_STAGES: case VEHICLE: - return process_NotImplemented(getCmd); + return process_NotImplemented(getCmd, remoteManager); case UNKNOWN: default: - return process_UnknownCommand(getCmd); + return process_UnknownCommand(getCmd, remoteManager); } } - public TraCICommand processSet(TraCICommand cmd){ - return process_NotImplemented(cmd); + public TraCICommand processSet(TraCICommand cmd, RemoteManager remoteManager){ + return process_NotImplemented(cmd, remoteManager); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java new file mode 100644 index 000000000..43ef9941a --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java @@ -0,0 +1,10 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.simulator.control.SimulationState; + +@FunctionalInterface +public interface StateAccessHandler { + + void execute(SimulationState state); + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java index e68276f36..81c3913e8 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java @@ -1,11 +1,12 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.RemoteManager; import org.vadere.manager.stsc.commands.TraCICommand; @FunctionalInterface public interface TraCICmdHandler { - TraCICommand handel (TraCICommand cmd); + TraCICommand handel(TraCICommand cmd, RemoteManager remoteManager); } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java index 8829bdd00..f3f7f3299 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java @@ -6,6 +6,7 @@ import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.respons.StatusResponse; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; +import org.vadere.manager.stsc.respons.TraCISimTimeResponse; import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.manager.stsc.writer.TraCIWriter; import org.vadere.manager.stsc.writer.TraCIWriterImpl; @@ -139,9 +140,16 @@ public class TraCIPacket { } public TraCIPacket wrapSimTimeStepCommand(TraCISimStepCommand cmd){ - addStatusResponse(cmd.getResponse().getStatusResponse()); + TraCISimTimeResponse res = cmd.getResponse(); - // todo: send subscription data... + addStatusResponse(res.getStatusResponse()); + + + TraCIWriter cmdBuilder = getCmdBuilder(); + cmdBuilder.writeUnsignedByte(res.getResponseIdentifier().id) + .writeObjectWithId(res.getSubscriptionDataType(), res.getSubscriptionData()); + + addCommandWithoutLen(cmdBuilder.asByteArray()); return this; } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index 40a37c75a..3a647088e 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -14,7 +14,6 @@ public class TraCIGetCommand extends TraCICommand { protected String elementId; // response - private TraCICmd responseIdentifier; private TraCIDataType responseDataType; private Object responseData; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java index 80b47c21e..d74a197dd 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java @@ -1,22 +1,26 @@ package org.vadere.manager.stsc.respons; import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.reader.TraCICommandBuffer; public class TraCISimTimeResponse extends TraCIResponse { private Object subscriptionData; + private TraCIDataType subscriptionDataType; public TraCISimTimeResponse (StatusResponse statusResponse, TraCICommandBuffer buffer){ super(statusResponse, TraCICmd.SIM_STEP); - subscriptionData = buffer; // todo: read subscription response... + subscriptionDataType = TraCIDataType.fromId(buffer.reader.readUnsignedByte()); + subscriptionData = buffer.reader.readTypeValue(subscriptionDataType); } - public TraCISimTimeResponse( Object subscriptionData) { + public TraCISimTimeResponse( Object subscriptionData, TraCIDataType subscriptionDataType) { super(new StatusResponse(TraCICmd.SIM_STEP, TraCIStatusResponse.OK, ""), TraCICmd.SIM_STEP); this.subscriptionData = subscriptionData; + this.subscriptionDataType = subscriptionDataType; } public Object getSubscriptionData() { @@ -26,4 +30,20 @@ public class TraCISimTimeResponse extends TraCIResponse { public void setSubscriptionData(Object subscriptionData) { this.subscriptionData = subscriptionData; } + + public TraCIDataType getSubscriptionDataType() { + return subscriptionDataType; + } + + public void setSubscriptionDataType(TraCIDataType subscriptionDataType) { + this.subscriptionDataType = subscriptionDataType; + } + + @Override + public String toString() { + return "TraCISimTimeResponse{" + + "subscriptionData=" + subscriptionData + + ", subscriptionDataType=" + subscriptionDataType + + '}'; + } } diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index 78f6e6ee6..fc9950592 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -273,8 +273,8 @@ public class Simulation { logger.warnf("Simulated until: %.4f", simTimeInSec); setWaitForSimCommand(true); + remoteManagerListeners.forEach(RemoteManagerListener::simulationStepFinishedListener); while (waitForSimCommand){ - remoteManagerListeners.forEach(RemoteManagerListener::simulationStepFinishedListener); logger.warn("wait for next SimCommand..."); try { wait(); @@ -464,4 +464,8 @@ public class Simulation { public void setStartTimeInSec(double startTimeInSec) { this.startTimeInSec = startTimeInSec; } + + public synchronized SimulationState getSimulationState(){ + return simulationState; + } } diff --git a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java index 4b9843f13..4d7b2446d 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.Nullable; import org.vadere.simulator.control.PassiveCallback; import org.vadere.simulator.control.RemoteManagerListener; import org.vadere.simulator.control.Simulation; +import org.vadere.simulator.control.SimulationState; import org.vadere.simulator.models.MainModel; import org.vadere.simulator.models.MainModelBuilder; import org.vadere.simulator.projects.dataprocessing.DataProcessingJsonManager; @@ -56,6 +57,11 @@ public class ScenarioRun implements Runnable { private SimulationResult simulationResult; + public ScenarioRun(final Scenario scenario, RunnableFinishedListener scenarioFinishedListener, boolean singleStepMode) { + this(scenario, IOUtils.OUTPUT_DIR, scenarioFinishedListener); + this.singleStepMode = singleStepMode; + } + public ScenarioRun(final Scenario scenario, RunnableFinishedListener scenarioFinishedListener) { this(scenario, IOUtils.OUTPUT_DIR, scenarioFinishedListener); } @@ -188,6 +194,10 @@ public class ScenarioRun implements Runnable { simulation.resume(); } + public SimulationState getSimulationState(){ + return simulation.getSimulationState(); + } + public void addPassiveCallback(final PassiveCallback pc) { passiveCallbacks.add(pc); } -- GitLab From 17e2359495b7e2443e91c73762b171a7f8394ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Fri, 7 Jun 2019 10:34:06 +0200 Subject: [PATCH 16/58] fix nextStep command to allow multiple steps --- VadereManager/src/org/vadere/manager/client/TestClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index 18bd208a1..711e6852e 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -120,7 +120,7 @@ public class TestClient implements Runnable{ void nextSimTimeStep(String[] args) throws IOException{ double nextSimTime = -1.0; - if (args.length>2) + if (args.length > 1) nextSimTime = Double.parseDouble(args[1]); TraCIPacket packet = TraCISimStepCommand.build(nextSimTime); -- GitLab From 706df02392287ee1bafb1b179523f11d7be503d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Fri, 7 Jun 2019 10:51:51 +0200 Subject: [PATCH 17/58] notify commands if simulation ended. --- .../src/org/vadere/manager/RemoteManager.java | 18 ++++++++++++++++-- .../src/org/vadere/manager/VadereServer.java | 3 +++ .../commandHandler/ControlCommandHandler.java | 7 ++++--- .../commandHandler/PersonCommandHandler.java | 2 +- .../commandHandler/StateAccessHandler.java | 3 ++- .../control/RemoteManagerListener.java | 2 ++ .../vadere/simulator/control/Simulation.java | 3 +++ 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index d0d5047ff..79c29904e 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -20,15 +20,17 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis private Thread currentSimulationThread; private final Object waitForLoopEnd; private ReentrantLock lock; + private boolean lastSimulationStep; public RemoteManager() { waitForLoopEnd = new Object(); lock = new ReentrantLock(); + lastSimulationStep = false; } public void loadScenario(String scenarioString) { - Scenario scenario = null; + Scenario scenario; try { scenario = ScenarioFactory.createScenarioWithScenarioJson(scenarioString); } catch (IOException e) { @@ -48,7 +50,7 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis } } lock.lock(); - stateAccessHandler.execute(currentSimulationRun.getSimulationState()); + stateAccessHandler.execute(this, currentSimulationRun.getSimulationState()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -75,6 +77,18 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis } } + @Override + public void lastSimulationStepFinishedListener() { + synchronized (waitForLoopEnd){ + lastSimulationStep = true; + waitForLoopEnd.notify(); + } + } + + public boolean isLastSimulationStep() { + return lastSimulationStep; + } + @Override public void finished(Runnable runnable) { logger.infof("Simulation finished."); diff --git a/VadereManager/src/org/vadere/manager/VadereServer.java b/VadereManager/src/org/vadere/manager/VadereServer.java index 549a6ffde..b3b1d7d54 100644 --- a/VadereManager/src/org/vadere/manager/VadereServer.java +++ b/VadereManager/src/org/vadere/manager/VadereServer.java @@ -12,6 +12,9 @@ public class VadereServer implements Runnable{ private static Logger logger = Logger.getLogger(VadereServer.class); + public static int SUPPORTED_TRACI_VERSION = 20; + public static String SUPPORTED_TRACI_VERSION_STRING = "Vadere Simulator. Supports subset of commands based von TraCI Version " + SUPPORTED_TRACI_VERSION; + private final ServerSocket serverSocket; private final ExecutorService handlerPool; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 413865f22..241fce028 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -2,6 +2,7 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; +import org.vadere.manager.VadereServer; import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; @@ -36,7 +37,7 @@ public class ControlCommandHandler extends CommandHandler{ remoteManager.nextStep(cmd.getTargetTime()); - remoteManager.accessState(state -> { + remoteManager.accessState((manger, state) -> { cmd.setResponse(new TraCISimTimeResponse(state.getStep(), TraCIDataType.INTEGER)); }); @@ -49,10 +50,10 @@ public class ControlCommandHandler extends CommandHandler{ public TraCICommand process_getVersion(TraCICommand rawCmd, RemoteManager remoteManager) { TraCIGetVersionCommand cmd = (TraCIGetVersionCommand)rawCmd; - cmd.setResponse(new TraCIGetVersionResponse(33, "Version 33 From Vadere")); + cmd.setResponse(new TraCIGetVersionResponse(VadereServer.SUPPORTED_TRACI_VERSION, + VadereServer.SUPPORTED_TRACI_VERSION_STRING)); return cmd; - } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 2422e3f37..7e2726326 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -24,7 +24,7 @@ public class PersonCommandHandler extends CommandHandler{ protected TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager){ - remoteManager.accessState(state -> { + remoteManager.accessState((manger, state) -> { cmd.setResponseData(new ArrayList<>(state.getTopography().getPedestrianDynamicElements().getElements())); }); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java index 43ef9941a..e772ec648 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java @@ -1,10 +1,11 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.RemoteManager; import org.vadere.simulator.control.SimulationState; @FunctionalInterface public interface StateAccessHandler { - void execute(SimulationState state); + void execute(RemoteManager remoteManager, SimulationState state); } diff --git a/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java b/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java index fe0dd716e..cada7eee0 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java +++ b/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java @@ -7,4 +7,6 @@ public interface RemoteManagerListener { * is ready to be read/changed. The simulation thread will wait after the call is finished. */ void simulationStepFinishedListener(); + + void lastSimulationStepFinishedListener(); } diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index fc9950592..6362259ba 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -216,6 +216,9 @@ public class Simulation { processorManager.postLoop(this.simulationState); } + // notify remoteManger that simulation ended. If a command waited for the next + // simulation step notify it and execute command with current SimulationState. + remoteManagerListeners.forEach(RemoteManagerListener::lastSimulationStepFinishedListener); } /** -- GitLab From c3c57e37be9306c4ec0d21c4d3f5b0c788b357a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Fri, 7 Jun 2019 12:00:52 +0200 Subject: [PATCH 18/58] implement close command --- .../src/org/vadere/manager/ClientHandler.java | 1 + .../src/org/vadere/manager/RemoteManager.java | 9 ++++++ .../src/org/vadere/manager/TraCISocket.java | 6 ++++ .../vadere/manager/client/ConsoleReader.java | 5 --- .../org/vadere/manager/client/TestClient.java | 19 +++++++++-- .../commandHandler/CommandExecutor.java | 4 +++ .../commandHandler/ControlCommandHandler.java | 11 ++++++- .../commands/control/TraCICloseCommand.java | 32 ++++++++++++++++++- .../manager/stsc/respons/TraCIResponse.java | 2 +- 9 files changed, 79 insertions(+), 10 deletions(-) diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index ba524c811..5ef744f3f 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -63,6 +63,7 @@ public class ClientHandler implements Runnable{ } } finally { traCISocket.close(); + cmdExecutor.stop(); } } diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index 79c29904e..30d3ab3bc 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -40,6 +40,15 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis currentSimulationRun.addRemoteManagerListener(this); } + public boolean stopSimulation(){ + if (currentSimulationThread != null && currentSimulationThread.isAlive()){ + currentSimulationThread.interrupt(); + return true; + } + + return false; + } + synchronized public void accessState(StateAccessHandler stateAccessHandler){ try { diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index 3c7ad1157..f1491ca94 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -2,6 +2,7 @@ package org.vadere.manager; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; +import org.vadere.manager.stsc.respons.TraCIResponse; import java.io.Closeable; import java.io.DataInputStream; @@ -74,6 +75,11 @@ public class TraCISocket implements Closeable { } } + public TraCIResponse receiveResponse() throws IOException { + TraCIPacketBuffer buf = receiveExact(); + return buf.nextResponse(); + } + @Override public void close() throws IOException { diff --git a/VadereManager/src/org/vadere/manager/client/ConsoleReader.java b/VadereManager/src/org/vadere/manager/client/ConsoleReader.java index e03c42108..92acc76f3 100644 --- a/VadereManager/src/org/vadere/manager/client/ConsoleReader.java +++ b/VadereManager/src/org/vadere/manager/client/ConsoleReader.java @@ -23,7 +23,6 @@ public class ConsoleReader implements Runnable{ running = true; addCommand("help", "Print this Help", this::cmd_help); - addCommand("close", "Close Application", this::cmd_Close); } private void cmd_help(String[] args){ @@ -37,10 +36,6 @@ public class ConsoleReader implements Runnable{ System.out.println(""); } - private void cmd_Close(String[] args){ - System.out.println("Close..."); - stop(); - } private void executeCmd(String cmdStr){ if(cmdStr.equals("")) diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index 711e6852e..5ae3700df 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -2,6 +2,7 @@ package org.vadere.manager.client; import org.vadere.manager.TraCISocket; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.control.TraCICloseCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; @@ -39,6 +40,7 @@ public class TestClient implements Runnable{ consoleReader.addCommand("getVersion", "", this::getVersion); consoleReader.addCommand("sendFile", "send file. default: scenario001", this::sendFile); consoleReader.addCommand("nextStep", "default(-1) one loop.", this::nextSimTimeStep); + consoleReader.addCommand("close", "Close application and stop running simulations", this::close); } @@ -115,8 +117,22 @@ public class TestClient implements Runnable{ TraCIResponse cmd = buf.nextResponse(); System.out.println(cmd.toString()); + + System.out.println("Bye"); + consoleReader.stop(); } + + + void close(String[] args) throws IOException { + + traCISocket.sendExact(TraCICloseCommand.build()); + + TraCIResponse cmd = traCISocket.receiveResponse(); + System.out.println(cmd); + } + + void nextSimTimeStep(String[] args) throws IOException{ double nextSimTime = -1.0; @@ -126,8 +142,7 @@ public class TestClient implements Runnable{ TraCIPacket packet = TraCISimStepCommand.build(nextSimTime); traCISocket.sendExact(packet); - TraCIPacketBuffer buf = traCISocket.receiveExact(); - TraCISimTimeResponse cmd = (TraCISimTimeResponse) buf.nextResponse(); + TraCISimTimeResponse cmd = (TraCISimTimeResponse) traCISocket.receiveResponse(); System.out.println(cmd.toString()); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index 146e430bc..c12972b87 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -53,4 +53,8 @@ public class CommandExecutor { return handler.handel(cmd, remoteManager).buildResponsePacket(); } + + public void stop(){ + remoteManager.stopSimulation(); + } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 241fce028..9e927a250 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -5,6 +5,7 @@ import org.vadere.manager.RemoteManager; import org.vadere.manager.VadereServer; import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.commands.control.TraCICloseCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; @@ -29,7 +30,15 @@ public class ControlCommandHandler extends CommandHandler{ } public TraCICommand process_close(TraCICommand rawCmd, RemoteManager remoteManager) { - return null; + + TraCICloseCommand cmd = (TraCICloseCommand)rawCmd; + + if (remoteManager.stopSimulation()) + cmd.getResponse().getStatusResponse().setDescription("Stop simulation waiting for client close EOF"); + else + cmd.getResponse().getStatusResponse().setDescription("waiting for client close EOF"); + + return cmd; } public TraCICommand process_simStep(TraCICommand rawCmd, RemoteManager remoteManager) { diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java index 1721b96bc..df9d6c397 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java @@ -3,16 +3,46 @@ package org.vadere.manager.stsc.commands.control; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.respons.StatusResponse; +import org.vadere.manager.stsc.respons.TraCIResponse; +import org.vadere.manager.stsc.respons.TraCIStatusResponse; public class TraCICloseCommand extends TraCICommand { + private TraCIResponse response; + + public static TraCIPacket build(){ + + TraCIPacket packet = TraCIPacket.create(6); // 4 + packet.getWriter() + .writeUnsignedByte(2) // 1 + .writeUnsignedByte(TraCICmd.CLOSE.id); // 1 + + return packet; + } + + public TraCICloseCommand(TraCICmd traCICmd) { super(traCICmd); + this.response = new TraCIResponse( + new StatusResponse(TraCICmd.CLOSE, TraCIStatusResponse.OK, ""), + TraCICmd.CLOSE); + } + + public TraCIResponse getResponse() { + return response; + } + + public void setResponse(TraCIResponse response) { + this.response = response; } @Override public TraCIPacket buildResponsePacket() { - return TraCIPacket.create(11).add_OK_StatusResponse(TraCICmd.CLOSE); + if (NOK_response != null) + return NOK_response; + else + return TraCIPacket.create().addStatusResponse(response.getStatusResponse()); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java index 2f584dbf8..f03ed7c62 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java @@ -70,7 +70,7 @@ public class TraCIResponse { // instance methods - protected TraCIResponse (StatusResponse statusResponse, TraCICmd responseIdentifier + public TraCIResponse (StatusResponse statusResponse, TraCICmd responseIdentifier ){ this.statusResponse = statusResponse; this.responseIdentifier = responseIdentifier; -- GitLab From 23bcfb43191b95e66c963cde4fd66f20cafc5aca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Fri, 7 Jun 2019 15:29:38 +0200 Subject: [PATCH 19/58] implement: * GetResponse * ListPerson Command * Number of Person Command --- .../org/vadere/manager/TraCIException.java | 2 +- .../org/vadere/manager/client/TestClient.java | 38 ++++++-- .../commandHandler/ControlCommandHandler.java | 2 - .../commandHandler/PersonCommandHandler.java | 87 +++++++++++-------- .../commandHandler/TraCIPersonVar.java | 12 +-- .../src/org/vadere/manager/stsc/TraCICmd.java | 10 +-- .../vadere/manager/stsc/TraCIDataType.java | 9 +- .../org/vadere/manager/stsc/TraCIPacket.java | 28 +++--- .../stsc/commands/TraCIGetCommand.java | 82 +++++++---------- .../stsc/commands/TraCISetCommand.java | 5 +- .../commands/control/TraCICloseCommand.java | 1 - .../manager/stsc/reader/TraCIReaderImpl.java | 3 - .../manager/stsc/respons/StatusResponse.java | 11 +-- .../stsc/respons/TraCIGetResponse.java | 83 ++++++++++++++++++ .../stsc/respons/TraCIGetVersionResponse.java | 1 + .../manager/stsc/respons/TraCIResponse.java | 14 +-- .../stsc/respons/TraCIStatusResponse.java | 18 ++-- 17 files changed, 238 insertions(+), 168 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java diff --git a/VadereManager/src/org/vadere/manager/TraCIException.java b/VadereManager/src/org/vadere/manager/TraCIException.java index 3e4733747..16731edb4 100644 --- a/VadereManager/src/org/vadere/manager/TraCIException.java +++ b/VadereManager/src/org/vadere/manager/TraCIException.java @@ -26,7 +26,7 @@ public class TraCIException extends RuntimeException { } public static TraCIException getNotImplemented(TraCIGetCommand cmd){ - return new TraCIException("GetCommand for variableId " + cmd.getVariableId() + return new TraCIException("GetCommand for variableIdentifier " + cmd.getVariableIdentifier() + "not supported in API: " + cmd.getTraCICmd().toString()); } diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index 5ae3700df..74c936ff6 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -1,14 +1,19 @@ package org.vadere.manager.client; import org.vadere.manager.TraCISocket; +import org.vadere.manager.commandHandler.TraCIPersonVar; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.manager.stsc.commands.control.TraCICloseCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; +import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.manager.stsc.respons.TraCIResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; +import org.vadere.util.geometry.shapes.VPoint; import org.vadere.util.io.IOUtils; import java.io.IOException; @@ -41,6 +46,8 @@ public class TestClient implements Runnable{ consoleReader.addCommand("sendFile", "send file. default: scenario001", this::sendFile); consoleReader.addCommand("nextStep", "default(-1) one loop.", this::nextSimTimeStep); consoleReader.addCommand("close", "Close application and stop running simulations", this::close); + consoleReader.addCommand("pedIdList", "Get Pedestrian Ids as list", this::getIDs); + consoleReader.addCommand("getPos", "arg: idStr of pedestrian", this::getPos); } @@ -118,11 +125,32 @@ public class TestClient implements Runnable{ System.out.println(cmd.toString()); - System.out.println("Bye"); - consoleReader.stop(); } + void getIDs(String[] args) throws IOException { + TraCIPacket p = TraCIGetCommand.build(TraCICmd.GET_PERSON_VALUE, TraCIPersonVar.ID_LIST.id, "1"); + traCISocket.sendExact(p); + + TraCIGetResponse res = (TraCIGetResponse) traCISocket.receiveResponse(); + System.out.println(res.getResponseData()); + } + + + void getPos(String[] args) throws IOException { + + if(args.length < 2){ + System.out.println("command needs argument (id)"); + return; + } + String elementIdentifier = args[1]; + traCISocket.sendExact(TraCIGetCommand.build(TraCICmd.GET_PERSON_VALUE, TraCIPersonVar.POS_2D.id, elementIdentifier)); + + TraCIGetResponse res = (TraCIGetResponse) traCISocket.receiveResponse(); + VPoint p = (VPoint) res.getResponseData(); + System.out.println(p.toString()); + + } void close(String[] args) throws IOException { @@ -130,6 +158,9 @@ public class TestClient implements Runnable{ TraCIResponse cmd = traCISocket.receiveResponse(); System.out.println(cmd); + + System.out.println("Bye"); + consoleReader.stop(); } @@ -146,9 +177,6 @@ public class TestClient implements Runnable{ System.out.println(cmd.toString()); } - void getPersonList(String[] args) throws IOException{ - - } void sendFile(String[] args) throws IOException { diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 9e927a250..59819498d 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -50,7 +50,6 @@ public class ControlCommandHandler extends CommandHandler{ cmd.setResponse(new TraCISimTimeResponse(state.getStep(), TraCIDataType.INTEGER)); }); - logger.infof("Simulate next step %f", cmd.getTargetTime()); return cmd; @@ -65,7 +64,6 @@ public class ControlCommandHandler extends CommandHandler{ return cmd; } - public TraCICommand process_load_file(TraCICommand rawCmd, RemoteManager remoteManager) { TraCISendFileCommand cmd = (TraCISendFileCommand) rawCmd; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 7e2726326..8b041945f 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -5,9 +5,13 @@ import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.stsc.respons.StatusResponse; +import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.util.geometry.shapes.VPoint; -import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; public class PersonCommandHandler extends CommandHandler{ @@ -18,29 +22,38 @@ public class PersonCommandHandler extends CommandHandler{ instance = new PersonCommandHandler(); } - private PersonCommandHandler(){ + private PersonCommandHandler(){ } + private TraCIGetResponse response(TraCIDataType responseDataType, Object responseData){ + TraCIGetResponse res = new TraCIGetResponse( + new StatusResponse(TraCICmd.GET_PERSON_VALUE, TraCIStatusResponse.OK, ""), + TraCICmd.RESPONSE_GET_PERSON_VALUE); + res.setResponseDataType(responseDataType); + res.setResponseData(responseData); + return res; } protected TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager){ - - remoteManager.accessState((manger, state) -> { - cmd.setResponseData(new ArrayList<>(state.getTopography().getPedestrianDynamicElements().getElements())); + // elementIdentifier ignored. + remoteManager.accessState((manager, state) -> { + List data = state.getTopography().getPedestrianDynamicElements() + .getElements() + .stream() + .map(p -> Integer.toString(p.getId())) + .collect(Collectors.toList()); + TraCIGetResponse res = response(TraCIDataType.STRING_LIST, data); + cmd.setResponse(res); }); - cmd.setResponseDataType(TraCIDataType.STRING_LIST); - cmd.setResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE); - return cmd; } protected TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager){ - int numPerson = 0; // get... - - cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) - .addResponseVariableType(TraCIDataType.INTEGER) - .addResponseData(numPerson); + remoteManager.accessState((manager, state) -> { + int numPeds = state.getTopography().getPedestrianDynamicElements().getElements().size(); + cmd.setResponse(response(TraCIDataType.INTEGER, numPeds)); + }); return cmd; @@ -48,21 +61,26 @@ public class PersonCommandHandler extends CommandHandler{ protected TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager){ - double speed = 0.0; // get... + remoteManager.accessState((manager, state) -> { + double speed = state.getTopography() + .getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())) + .getVelocity().getLength(); + cmd.setResponse(response(TraCIDataType.DOUBLE, speed)); + }); - cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) - .addResponseVariableType(TraCIDataType.DOUBLE) - .addResponseData(speed); return cmd; } - protected TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager){ - VPoint point = new VPoint(1.0, 1.0); // get + protected TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager){ - cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) - .addResponseVariableType(TraCIDataType.POS_2D) - .addResponseData(point); + remoteManager.accessState((manager, state) -> { + VPoint pos = state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())) + .getPosition(); + cmd.setResponse(response(TraCIDataType.POS_2D, pos)); + }); return cmd; } @@ -70,23 +88,25 @@ public class PersonCommandHandler extends CommandHandler{ protected TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager){ - - double pedLength = 0.4; // get... (durchmesser) - - cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) - .addResponseVariableType(TraCIDataType.DOUBLE) - .addResponseData(pedLength); + remoteManager.accessState((manager, state) -> { + double pedLength = state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())) + .getRadius() *2; + cmd.setResponse(response(TraCIDataType.DOUBLE, pedLength)); + }); return cmd; } protected TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager){ - double pedWidth = 0.4; // get.. (durchmesser) - cmd.addResponseIdentifier(TraCICmd.RESPONSE_GET_PERSON_VALUE) - .addResponseVariableType(TraCIDataType.DOUBLE) - .addResponseData(pedWidth); + remoteManager.accessState((manager, state) -> { + double pedWidth= state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())) + .getRadius() *2; + cmd.setResponse(response(TraCIDataType.DOUBLE, pedWidth)); + }); return cmd; } @@ -95,7 +115,7 @@ public class PersonCommandHandler extends CommandHandler{ public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; - switch (TraCIPersonVar.fromId(getCmd.getVariableId())){ + switch (TraCIPersonVar.fromId(getCmd.getVariableIdentifier())){ case ID_LIST: return process_getIDList(getCmd, remoteManager); case COUNT: @@ -120,7 +140,6 @@ public class PersonCommandHandler extends CommandHandler{ case REMAINING_STAGES: case VEHICLE: return process_NotImplemented(getCmd, remoteManager); - case UNKNOWN: default: return process_UnknownCommand(getCmd, remoteManager); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java index ce207f161..50606597a 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java @@ -1,5 +1,6 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCIDataType; public enum TraCIPersonVar { @@ -26,29 +27,24 @@ public enum TraCIPersonVar { APPEND_STAGE(0xc4, TraCIDataType.COMPOUND_OBJECT), // set REMOVE_STAGE(0xc5, TraCIDataType.INTEGER), // set REROUTE(0x90, TraCIDataType.COMPOUND_OBJECT), // set - - UNKNOWN(-1, TraCIDataType.UNKNOWN), ; - int id; - TraCIDataType returnType; + public int id; + public TraCIDataType returnType; TraCIPersonVar(int id, TraCIDataType retVal) { this.id = id; this.returnType = retVal; } - public boolean isUnknown(){ - return this.id == UNKNOWN.id; - } public static TraCIPersonVar fromId(int id){ for(TraCIPersonVar var : values()){ if (var.id == id) return var; } - return UNKNOWN; + throw new TraCIException(String.format("No person variable found with id: %02X", id)); } @Override diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java index 870e0a3db..4fd8e3829 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java @@ -1,5 +1,7 @@ package org.vadere.manager.stsc; +import org.vadere.manager.TraCIException; + public enum TraCICmd { // TraCI/Control-related commands GET_VERSION(0x00, CmdType.CTRL), @@ -78,7 +80,6 @@ public enum TraCICmd { RESPONSE_SUB_SIMULATION_VALUE(0xeb, CmdType.RESPONSE), // TraCI/Object Context Subscription - UNKNOWN_CMD(-1, CmdType.UNKNOWN) ; public int id; @@ -95,12 +96,7 @@ public enum TraCICmd { if (traCICmd.id == id) return traCICmd; } - - return UNKNOWN_CMD; - } - - public boolean isUnknown(){ - return this.id == UNKNOWN_CMD.id; + throw new TraCIException(String.format("No TraCI command found with id: %02X", id)); } @Override diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java index bebdce195..d50d4249f 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java @@ -1,5 +1,7 @@ package org.vadere.manager.stsc; +import org.vadere.manager.TraCIException; + public enum TraCIDataType { U_BYTE(0x07, 1, true), BYTE(0x08, 1, true), @@ -16,7 +18,6 @@ public enum TraCIDataType { POLYGON(0x06,-1,false), TRAFFIC_LIGHT_PHASE_LIST(0x0D,-1,false), COLOR(0x11,5,false), - UNKNOWN(-1, -1, false) ; @@ -32,16 +33,12 @@ public enum TraCIDataType { this.isAtomar = isAtomar; } - public boolean isUnknown(){ - return this.identifier == UNKNOWN.identifier; - } - public static TraCIDataType fromId(int id){ for(TraCIDataType dataType : values()){ if (dataType.identifier == id) return dataType; } - return UNKNOWN; + throw new TraCIException(String.format("No TraCI data type found for given id: %02X", id)); } @Override diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java index f3f7f3299..e7c708ebc 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java @@ -1,10 +1,10 @@ package org.vadere.manager.stsc; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.respons.StatusResponse; +import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; import org.vadere.manager.stsc.respons.TraCIStatusResponse; @@ -30,14 +30,6 @@ public class TraCIPacket { return packet; } - public static TraCIPacket sendStatusOK(TraCICmd cmd){ - TraCIPacket response = new TraCIPacket(); - response.writer.writeInt(11); // packet size (4 + 7) [4] - response.add_OK_StatusResponse(cmd); - response.finalizePacket(); - return response; - } - public static TraCIPacket sendStatus(TraCICmd cmd, TraCIStatusResponse status, String description){ TraCIPacket response = new TraCIPacket(); int cmdLen = 7 + response.writer.getStringByteCount(description); @@ -53,7 +45,7 @@ public class TraCIPacket { response.writer.writeUnsignedByte(cmdLen); // [1] } response.writer.writeUnsignedByte(cmd.id); // [1] - response.writer.writeUnsignedByte(status.code); // [1] + response.writer.writeUnsignedByte(status.id); // [1] response.writer.writeString(description); //[4 + strLen] response.finalizePacket(); return response; @@ -107,14 +99,14 @@ public class TraCIPacket { return new TraCIWriterImpl(); } - public TraCIPacket wrapGetResponse(TraCIGetCommand cmd){ - add_OK_StatusResponse(cmd.getTraCICmd()); + public TraCIPacket wrapGetResponse(TraCIGetResponse res){ + addStatusResponse(res.getStatusResponse()); TraCIWriter cmdBuilder = getCmdBuilder(); - cmdBuilder.writeUnsignedByte(cmd.getResponseIdentifier().id) - .writeUnsignedByte(cmd.getVariableId()) - .writeString(cmd.getElementId()) - .writeObjectWithId(cmd.getResponseDataType(), cmd.getResponseData()); + cmdBuilder.writeUnsignedByte(res.getResponseIdentifier().id) + .writeUnsignedByte(res.getVariableIdentifier()) + .writeString(res.getElementIdentifier()) + .writeObjectWithId(res.getResponseDataType(), res.getResponseData()); addCommandWithoutLen(cmdBuilder.asByteArray()); @@ -182,7 +174,7 @@ public class TraCIPacket { // simple OK Status without description. writer.writeUnsignedByte(7); writer.writeUnsignedByte(cmdIdentifier); - writer.writeUnsignedByte(TraCIStatusResponse.OK.code); + writer.writeUnsignedByte(TraCIStatusResponse.OK.id); writer.writeInt(0); return this; } @@ -201,7 +193,7 @@ public class TraCIPacket { writer.writeCommandLength(cmdLen); // 1b writer.writeUnsignedByte(cmdIdentifier); // 1b - writer.writeUnsignedByte(response.code); // 4b + writer.writeUnsignedByte(response.id); // 4b writer.writeString(description); // 4b + X return this; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index 3a647088e..d2f153d3c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -1,87 +1,71 @@ package org.vadere.manager.stsc.commands; -import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.stsc.respons.TraCIGetResponse; -import java.util.EnumSet; +import java.nio.charset.StandardCharsets; public class TraCIGetCommand extends TraCICommand { - protected int variableId; - protected String elementId; + protected int variableIdentifier; + protected String elementIdentifier; - // response - private TraCICmd responseIdentifier; - private TraCIDataType responseDataType; - private Object responseData; + private TraCIGetResponse response; - public TraCIGetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { - super(traCICmd); - EnumSet set; - try{ - variableId = cmdBuffer.reader.readUnsignedByte(); - elementId = cmdBuffer.reader.readString(); - } catch (Exception e){ - throw TraCIException.cmdErr(traCICmd, e); - } - } + public static TraCIPacket build(TraCICmd commandIdentifier, int variableIdentifier, String elementIdentifier){ + int cmdLen = 1 + 1 + 1 + 4 + elementIdentifier.getBytes(StandardCharsets.US_ASCII).length; + TraCIPacket packet = TraCIPacket.create(); + packet.getWriter() + .writeCommandLength(cmdLen) // [1|5] + .writeUnsignedByte(commandIdentifier.id) // 1 + .writeUnsignedByte(variableIdentifier) // 1 + .writeString(elementIdentifier); // 4+strLen - public int getVariableId() { - return variableId; - } - - public String getElementId() { - return elementId; + return packet; } - public TraCIDataType getResponseDataType() { - return responseDataType; + public TraCIGetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { + super(traCICmd); + variableIdentifier = cmdBuffer.reader.readUnsignedByte(); + elementIdentifier = cmdBuffer.reader.readString(); } - public void setResponseDataType(TraCIDataType responseDataType) { - this.responseDataType = responseDataType; + public int getVariableIdentifier() { + return variableIdentifier; } - public Object getResponseData() { - return responseData; + public void setVariableIdentifier(int variableIdentifier) { + this.variableIdentifier = variableIdentifier; } - public void setResponseData(Object responseData) { - this.responseData = responseData; + public String getElementIdentifier() { + return elementIdentifier; } - public TraCICmd getResponseIdentifier() { - return responseIdentifier; + public void setElementIdentifier(String elementIdentifier) { + this.elementIdentifier = elementIdentifier; } - public void setResponseIdentifier(TraCICmd responseIdentifier) { - this.responseIdentifier = responseIdentifier; + public TraCIGetResponse getResponse() { + return response; } - public TraCIGetCommand addResponseIdentifier(TraCICmd val){ - setResponseIdentifier(val); - return this; + public void setResponse(TraCIGetResponse response) { + response.setVariableIdentifier(variableIdentifier); + response.setElementIdentifier(elementIdentifier); + this.response = response; } - public TraCIGetCommand addResponseVariableType(TraCIDataType val){ - setResponseDataType(val); - return this; - } - public TraCIGetCommand addResponseData(Object val){ - setResponseData(val); - return this; - } @Override public TraCIPacket buildResponsePacket() { if (NOK_response != null) return NOK_response; else - return TraCIPacket.create().wrapGetResponse(this); + return TraCIPacket.create().wrapGetResponse(response); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java index 488a05550..f12c64dc3 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -19,10 +19,7 @@ public class TraCISetCommand extends TraCICommand{ try{ variableId = cmdBuffer.reader.readUnsignedByte(); elementId = cmdBuffer.reader.readString(); - int dataTye = cmdBuffer.reader.readUnsignedByte(); - returnDataType = TraCIDataType.fromId(dataTye); - if (returnDataType.isUnknown()) - throw new TraCIException("unknown TraCIDataType found in command: " + dataTye); + returnDataType = TraCIDataType.fromId(cmdBuffer.reader.readUnsignedByte()); variableValue = cmdBuffer.reader.readTypeValue(returnDataType); } catch (Exception e){ throw TraCIException.cmdErr(traCICmd, e); diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java index df9d6c397..7eaf42b4c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java @@ -21,7 +21,6 @@ public class TraCICloseCommand extends TraCICommand { return packet; } - public TraCICloseCommand(TraCICmd traCICmd) { super(traCICmd); this.response = new TraCIResponse( diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java index 1be50a4be..4085cf52a 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java @@ -184,7 +184,6 @@ public class TraCIReaderImpl implements TraCIReader { @Override public Object readTypeValue(TraCIDataType type) { - switch (type){ case U_BYTE: return readUnsignedByte(); @@ -215,10 +214,8 @@ public class TraCIReaderImpl implements TraCIReader { case COLOR: return readColor(); case COMPOUND_OBJECT: - case UNKNOWN: default: throw new TraCIException("Unknown Datatype: " + type.toString()); - } } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java index d214f76ec..6cdfc509f 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java @@ -1,6 +1,5 @@ package org.vadere.manager.stsc.respons; -import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.reader.TraCICommandBuffer; @@ -16,14 +15,8 @@ public class StatusResponse { public static StatusResponse createFromByteBuffer(ByteBuffer rawCmd){ StatusResponse ret = new StatusResponse(); TraCICommandBuffer buf = TraCICommandBuffer.wrap(rawCmd); - int cmdIdentifierCode = buf.readCmdIdentifier(); - ret.cmdIdentifier = TraCICmd.fromId(cmdIdentifierCode); - if (ret.cmdIdentifier.equals(TraCICmd.UNKNOWN_CMD)) - throw new TraCIException("Unknown command in status response: " + cmdIdentifierCode); - int status = buf.reader.readUnsignedByte(); - ret.response = TraCIStatusResponse.fromId(status); - if (ret.response.equals(TraCIStatusResponse.UNKNOWN)) - throw new TraCIException("Unknown status response: " + status); + ret.cmdIdentifier = TraCICmd.fromId(buf.readCmdIdentifier()); + ret.response = TraCIStatusResponse.fromId(buf.reader.readUnsignedByte()); ret.description = buf.reader.readString(); diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java new file mode 100644 index 000000000..45ababb87 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java @@ -0,0 +1,83 @@ +package org.vadere.manager.stsc.respons; + +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import java.util.Objects; + +public class TraCIGetResponse extends TraCIResponse{ + + private int variableIdentifier; + private String elementIdentifier; + + private TraCIDataType responseDataType; + private Object responseData; + + public TraCIGetResponse(StatusResponse statusResponse, TraCICmd responseIdentifier, TraCICommandBuffer buffer) { + super(statusResponse, responseIdentifier); + + variableIdentifier = buffer.reader.readUnsignedByte(); + elementIdentifier = buffer.reader.readString(); + responseDataType = TraCIDataType.fromId(buffer.reader.readUnsignedByte()); + responseData = buffer.reader.readTypeValue(responseDataType); + } + + public TraCIGetResponse(StatusResponse statusResponse, TraCICmd responseIdentifier) { + super(statusResponse, responseIdentifier); + } + + public int getVariableIdentifier() { + return variableIdentifier; + } + + public void setVariableIdentifier(int variableIdentifier) { + this.variableIdentifier = variableIdentifier; + } + + public String getElementIdentifier() { + return elementIdentifier; + } + + public void setElementIdentifier(String elementIdentifier) { + this.elementIdentifier = elementIdentifier; + } + + public TraCIDataType getResponseDataType() { + return responseDataType; + } + + public void setResponseDataType(TraCIDataType responseDataType) { + this.responseDataType = responseDataType; + } + + public Object getResponseData() { + return responseData; + } + + public void setResponseData(Object responseData) { + this.responseData = responseData; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TraCIGetResponse that = (TraCIGetResponse) o; + return responseDataType == that.responseDataType && + responseData.equals(that.responseData); + } + + @Override + public int hashCode() { + return Objects.hash(responseDataType, responseData); + } + + @Override + public String toString() { + return "TraCIGetResponse{" + + "responseDataType=" + responseDataType + + ", responseData=" + responseData + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java index 522e5714e..0a8e609eb 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java @@ -10,6 +10,7 @@ public class TraCIGetVersionResponse extends TraCIResponse{ private int versionId; private String versionString; + // deserialize from buffer (wrap byte[]) public TraCIGetVersionResponse(StatusResponse statusResponse, TraCICommandBuffer buffer) { super(statusResponse, TraCICmd.GET_VERSION); this.versionId = buffer.reader.readInt(); diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java index f03ed7c62..14251d126 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java @@ -21,18 +21,14 @@ public class TraCIResponse { TraCICmd commandIdentifier = statusResponse.getCmdIdentifier(); - int identifier = cmdResponseBuffer.readCmdIdentifier(); - TraCICmd responseIdentifier = TraCICmd.fromId(identifier); - if (responseIdentifier.equals(TraCICmd.UNKNOWN_CMD)) - throw new TraCIException("Unknown response identifier: " + identifier + - " for command: " + commandIdentifier.id); + TraCICmd responseIdentifier = TraCICmd.fromId(cmdResponseBuffer.readCmdIdentifier()); // build correct versions. based on actual command switch (commandIdentifier.type){ case CTRL: return createControlResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer, statusResponse); case VALUE_GET: - return createGetResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer, statusResponse); + return new TraCIGetResponse(statusResponse, responseIdentifier, cmdResponseBuffer); case VALUE_SET: return createSetResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer, statusResponse); case VALUE_SUB: @@ -52,22 +48,16 @@ public class TraCIResponse { return new TraCIGetVersionResponse(statusResponse, cmdResponseBuffer); case SIM_STEP: return new TraCISimTimeResponse(statusResponse, cmdResponseBuffer); - } return null; } - private static TraCIResponse createGetResponse(TraCICmd commandIdentifier, TraCICmd responseIdentifier, TraCICommandBuffer cmdResponseBuffer, StatusResponse statusResponse){ - - return null; - } private static TraCIResponse createSetResponse(TraCICmd commandIdentifier, TraCICmd responseIdentifier, TraCICommandBuffer cmdResponseBuffer, StatusResponse statusResponse){ return null; } - // instance methods public TraCIResponse (StatusResponse statusResponse, TraCICmd responseIdentifier diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java index 98c1f9418..5d93f6a80 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java @@ -1,25 +1,25 @@ package org.vadere.manager.stsc.respons; +import org.vadere.manager.TraCIException; + public enum TraCIStatusResponse { OK(0x00), ERR(0xFF), NOT_IMPLEMENTED(0x01), - UNKNOWN(0xaa); - - - public int code; + ; + public int id; - public static TraCIStatusResponse fromId(int code){ + public static TraCIStatusResponse fromId(int id){ for(TraCIStatusResponse status : values()){ - if (status.code == code) + if (status.id == id) return status; } - return UNKNOWN; + throw new TraCIException(String.format("No status id found with id: %02X", id)); } - TraCIStatusResponse(int code) { - this.code = code; + TraCIStatusResponse(int id) { + this.id = id; } } -- GitLab From cd4faa1d9dc53b38d2a8c37403615ae2a94f3c22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Fri, 7 Jun 2019 16:44:47 +0200 Subject: [PATCH 20/58] add experimental annotation interfaces --- .../commandHandler/CommandExecutor.java | 2 +- .../commandHandler/GetCommandProcessor.java | 10 +++ .../manager/commandHandler/GetHandler.java | 18 ++++++ .../commandHandler/PersonCommandHandler.java | 63 ++++++++++++++++++- 4 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/GetHandler.java diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index c12972b87..9423c0609 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -34,7 +34,7 @@ public class CommandExecutor { public CommandExecutor() { remoteManager = new RemoteManager(); cmdMap = new HashMap<>(); - cmdMap.put(TraCICmd.GET_VERSION.id, ControlCommandHandler.instance::process_getVersion); + cmdMap.put(TraCICmd.GET_VERSION.id, ControlCommandHandler.instance::process_getVersion ); cmdMap.put(TraCICmd.LOAD.id, ControlCommandHandler.instance::process_load); cmdMap.put(TraCICmd.SIM_STEP.id, ControlCommandHandler.instance::process_simStep); cmdMap.put(TraCICmd.CLOSE.id, ControlCommandHandler.instance::process_close); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java b/VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java new file mode 100644 index 000000000..b067164d3 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java @@ -0,0 +1,10 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.RemoteManager; +import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.commands.TraCIGetCommand; + +public interface GetCommandProcessor { + + TraCICommand process(TraCIGetCommand cmd, RemoteManager remoteManager); +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/GetHandler.java new file mode 100644 index 000000000..2fe8b5ee6 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/GetHandler.java @@ -0,0 +1,18 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface GetHandler { + TraCICmd commandIdentifier(); + TraCIPersonVar variable(); + String clientCommandName(); + TraCIDataType returnType(); +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 8b041945f..c068c4541 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -18,11 +18,25 @@ public class PersonCommandHandler extends CommandHandler{ public static PersonCommandHandler instance; +// private HashMap handler; + static { instance = new PersonCommandHandler(); } - private PersonCommandHandler(){ } + private PersonCommandHandler(){ +// handler = new HashMap<>(); +// init(); + } + +// private void init(){ +// for (Method m : this.getClass().getDeclaredMethods()){ +// if (m.isAnnotationPresent(GetHandler.class)){ +// GetHandler an = m.getAnnotation(GetHandler.class); +// handler.put(an.variable(), m); +// } +// } +// } private TraCIGetResponse response(TraCIDataType responseDataType, Object responseData){ TraCIGetResponse res = new TraCIGetResponse( @@ -33,6 +47,11 @@ public class PersonCommandHandler extends CommandHandler{ return res; } + @GetHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + returnType = TraCIDataType.STRING_LIST, + variable = TraCIPersonVar.ID_LIST, + clientCommandName = "getIDList") protected TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager){ // elementIdentifier ignored. remoteManager.accessState((manager, state) -> { @@ -48,6 +67,11 @@ public class PersonCommandHandler extends CommandHandler{ return cmd; } + @GetHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + returnType = TraCIDataType.INTEGER, + variable = TraCIPersonVar.COUNT, + clientCommandName = "getIDCount") protected TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { @@ -59,6 +83,11 @@ public class PersonCommandHandler extends CommandHandler{ } + @GetHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + returnType = TraCIDataType.DOUBLE, + variable = TraCIPersonVar.SPEED, + clientCommandName = "getSpeed") protected TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { @@ -72,7 +101,11 @@ public class PersonCommandHandler extends CommandHandler{ return cmd; } - + @GetHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + returnType = TraCIDataType.POS_2D, + variable = TraCIPersonVar.POS_2D, + clientCommandName = "getPosition2D") protected TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { @@ -86,6 +119,11 @@ public class PersonCommandHandler extends CommandHandler{ } + @GetHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + returnType = TraCIDataType.DOUBLE, + variable = TraCIPersonVar.LENGTH, + clientCommandName = "getLength") protected TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { @@ -99,6 +137,11 @@ public class PersonCommandHandler extends CommandHandler{ } + @GetHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + returnType = TraCIDataType.DOUBLE, + variable = TraCIPersonVar.WIDTH, + clientCommandName = "getWidth") protected TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { @@ -115,7 +158,21 @@ public class PersonCommandHandler extends CommandHandler{ public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; - switch (TraCIPersonVar.fromId(getCmd.getVariableIdentifier())){ + TraCIPersonVar var = TraCIPersonVar.fromId(getCmd.getVariableIdentifier()); + +// Method m = handler.getOrDefault(var, null); +// if(m == null){ +// return process_NotImplemented(getCmd, remoteManager); +// } else { +// try { +// return (TraCIGetCommand) m.invoke(this, getCmd, remoteManager); +// } catch (IllegalAccessException | InvocationTargetException e) { +// e.printStackTrace(); +// } +// return process_UnknownCommand(getCmd, remoteManager); +// } + + switch (var){ case ID_LIST: return process_getIDList(getCmd, remoteManager); case COUNT: -- GitLab From 3ff9e39b67c6334603079ff7630076be84123fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Fri, 7 Jun 2019 18:06:40 +0200 Subject: [PATCH 21/58] small refactoring, add comments to classes --- .../src/org/vadere/manager/ClientHandler.java | 9 ++- .../src/org/vadere/manager/RemoteManager.java | 5 +- .../src/org/vadere/manager/TraCISocket.java | 3 + .../src/org/vadere/manager/VadereServer.java | 3 + .../commandHandler/CommandExecutor.java | 10 +-- .../commandHandler/CommandHandler.java | 9 +++ .../commandHandler/ControlCommandHandler.java | 5 +- .../commandHandler/GetCommandProcessor.java | 10 --- .../commandHandler/PersonCommandHandler.java | 64 +++++++++---------- .../{GetHandler.java => PersonHandler.java} | 13 +++- ...mmands.java => PolygonCommandHandler.java} | 5 +- ...nds.java => SimulationCommandHandler.java} | 5 +- .../commandHandler/StateAccessHandler.java | 13 ++++ .../commandHandler/TraCICmdHandler.java | 4 +- .../commandHandler/TraCIPersonVar.java | 4 ++ .../src/org/vadere/manager/stsc/CmdType.java | 8 +-- .../src/org/vadere/manager/stsc/TraCICmd.java | 4 +- .../vadere/manager/stsc/TraCIDataType.java | 3 + .../org/vadere/manager/stsc/TraCIPacket.java | 3 + .../manager/stsc/commands/TraCICommand.java | 20 +++++- .../stsc/commands/TraCIGetCommand.java | 18 ++++++ .../stsc/commands/TraCISetCommand.java | 19 ++++++ ...erImpl.java => ByteBufferTraCIReader.java} | 27 +++++--- .../manager/stsc/reader/TraCIBuffer.java | 4 +- .../stsc/reader/TraCICommandBuffer.java | 6 +- .../stsc/reader/TraCIPacketBuffer.java | 7 +- .../manager/stsc/reader/TraCIReader.java | 5 ++ .../manager/stsc/respons/StatusResponse.java | 6 ++ .../stsc/respons/TraCIGetResponse.java | 17 +++++ .../stsc/respons/TraCIGetVersionResponse.java | 7 ++ .../manager/stsc/respons/TraCIResponse.java | 16 ++++- .../stsc/respons/TraCISimTimeResponse.java | 6 ++ .../stsc/respons/TraCIStatusResponse.java | 7 ++ .../vadere/manager/stsc/TraCIReaderTest.java | 8 +-- 34 files changed, 269 insertions(+), 84 deletions(-) delete mode 100644 VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java rename VadereManager/src/org/vadere/manager/commandHandler/{GetHandler.java => PersonHandler.java} (51%) rename VadereManager/src/org/vadere/manager/commandHandler/{PolygonCommands.java => PolygonCommandHandler.java} (67%) rename VadereManager/src/org/vadere/manager/commandHandler/{SimulationCommands.java => SimulationCommandHandler.java} (66%) rename VadereManager/src/org/vadere/manager/stsc/reader/{TraCIReaderImpl.java => ByteBufferTraCIReader.java} (88%) diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index 5ef744f3f..3b812a2e9 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -10,6 +10,9 @@ import java.io.EOFException; import java.io.IOException; import java.net.ServerSocket; +/** + * //todo comment + */ public class ClientHandler implements Runnable{ private static Logger logger = Logger.getLogger(ClientHandler.class); @@ -17,12 +20,14 @@ public class ClientHandler implements Runnable{ private final ServerSocket serverSocket; private final TraCISocket traCISocket; private final CommandExecutor cmdExecutor; + private RemoteManager remoteManager; public ClientHandler(ServerSocket serverSocket, TraCISocket traCISocket) { this.serverSocket = serverSocket; this.traCISocket = traCISocket; - this.cmdExecutor = new CommandExecutor(); + this.remoteManager = new RemoteManager(); + this.cmdExecutor = new CommandExecutor(remoteManager); } @@ -63,7 +68,7 @@ public class ClientHandler implements Runnable{ } } finally { traCISocket.close(); - cmdExecutor.stop(); + remoteManager.stopSimulationIfRunning(); } } diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index 30d3ab3bc..0eff3e760 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -11,6 +11,9 @@ import org.vadere.util.logging.Logger; import java.io.IOException; import java.util.concurrent.locks.ReentrantLock; +/** + * //todo comment + */ public class RemoteManager implements RemoteManagerListener, RunnableFinishedListener, Runnable { @@ -40,7 +43,7 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis currentSimulationRun.addRemoteManagerListener(this); } - public boolean stopSimulation(){ + public boolean stopSimulationIfRunning(){ if (currentSimulationThread != null && currentSimulationThread.isAlive()){ currentSimulationThread.interrupt(); return true; diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index f1491ca94..0b168582c 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -11,6 +11,9 @@ import java.io.IOException; import java.net.Socket; import java.nio.ByteBuffer; +/** + * //todo comment + */ public class TraCISocket implements Closeable { private final static int TRACI_LEN_LENGTH = 4; diff --git a/VadereManager/src/org/vadere/manager/VadereServer.java b/VadereManager/src/org/vadere/manager/VadereServer.java index b3b1d7d54..c97647d78 100644 --- a/VadereManager/src/org/vadere/manager/VadereServer.java +++ b/VadereManager/src/org/vadere/manager/VadereServer.java @@ -8,6 +8,9 @@ import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; +/** + * //todo comment + */ public class VadereServer implements Runnable{ private static Logger logger = Logger.getLogger(VadereServer.class); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index 9423c0609..807e75f0e 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -8,6 +8,9 @@ import org.vadere.util.logging.Logger; import java.util.HashMap; +/** + * Dispatcher for {@link TraCICommand}s. + */ public class CommandExecutor { private static Logger logger = Logger.getLogger(CommandExecutor.class); @@ -31,8 +34,8 @@ public class CommandExecutor { // private RemoteManager remoteManager; - public CommandExecutor() { - remoteManager = new RemoteManager(); + public CommandExecutor(RemoteManager remoteManager) { + this.remoteManager = remoteManager; cmdMap = new HashMap<>(); cmdMap.put(TraCICmd.GET_VERSION.id, ControlCommandHandler.instance::process_getVersion ); cmdMap.put(TraCICmd.LOAD.id, ControlCommandHandler.instance::process_load); @@ -54,7 +57,4 @@ public class CommandExecutor { } - public void stop(){ - remoteManager.stopSimulation(); - } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 20d9fa30b..fdc68a8f0 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -5,6 +5,15 @@ import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; + +/** + * {@link CommandHandler} classes perform the actual request within the command. + * + * See {@link CommandExecutor} on how commands are dispatched to the correct {@link CommandHandler} + * subclass. These classes implement methods which adhere to the TraCICmdHandler Interface. These + * methods are used by the {@link CommandExecutor} for dispatching. + * + */ public abstract class CommandHandler { diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 59819498d..9c4296d9c 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -13,6 +13,9 @@ import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; import org.vadere.util.logging.Logger; +/** + * Handel {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Control API + */ public class ControlCommandHandler extends CommandHandler{ private static Logger logger = Logger.getLogger(CommandExecutor.class); @@ -33,7 +36,7 @@ public class ControlCommandHandler extends CommandHandler{ TraCICloseCommand cmd = (TraCICloseCommand)rawCmd; - if (remoteManager.stopSimulation()) + if (remoteManager.stopSimulationIfRunning()) cmd.getResponse().getStatusResponse().setDescription("Stop simulation waiting for client close EOF"); else cmd.getResponse().getStatusResponse().setDescription("waiting for client close EOF"); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java b/VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java deleted file mode 100644 index b067164d3..000000000 --- a/VadereManager/src/org/vadere/manager/commandHandler/GetCommandProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.vadere.manager.commandHandler; - -import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.commands.TraCIGetCommand; - -public interface GetCommandProcessor { - - TraCICommand process(TraCIGetCommand cmd, RemoteManager remoteManager); -} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index c068c4541..8f3b94361 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -13,6 +13,10 @@ import org.vadere.util.geometry.shapes.VPoint; import java.util.List; import java.util.stream.Collectors; + +/** + * Handel GET/SET {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Person API + */ public class PersonCommandHandler extends CommandHandler{ @@ -31,8 +35,8 @@ public class PersonCommandHandler extends CommandHandler{ // private void init(){ // for (Method m : this.getClass().getDeclaredMethods()){ -// if (m.isAnnotationPresent(GetHandler.class)){ -// GetHandler an = m.getAnnotation(GetHandler.class); +// if (m.isAnnotationPresent(PersonHandler.class)){ +// PersonHandler an = m.getAnnotation(PersonHandler.class); // handler.put(an.variable(), m); // } // } @@ -47,12 +51,11 @@ public class PersonCommandHandler extends CommandHandler{ return res; } - @GetHandler( + @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, - returnType = TraCIDataType.STRING_LIST, variable = TraCIPersonVar.ID_LIST, clientCommandName = "getIDList") - protected TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager){ + protected TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ // elementIdentifier ignored. remoteManager.accessState((manager, state) -> { List data = state.getTopography().getPedestrianDynamicElements() @@ -60,95 +63,90 @@ public class PersonCommandHandler extends CommandHandler{ .stream() .map(p -> Integer.toString(p.getId())) .collect(Collectors.toList()); - TraCIGetResponse res = response(TraCIDataType.STRING_LIST, data); + TraCIGetResponse res = response(traCIVar.returnType, data); cmd.setResponse(res); }); return cmd; } - @GetHandler( + @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, - returnType = TraCIDataType.INTEGER, variable = TraCIPersonVar.COUNT, clientCommandName = "getIDCount") - protected TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager){ + protected TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { int numPeds = state.getTopography().getPedestrianDynamicElements().getElements().size(); - cmd.setResponse(response(TraCIDataType.INTEGER, numPeds)); + cmd.setResponse(response(traCIVar.returnType, numPeds)); }); return cmd; } - @GetHandler( + @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, - returnType = TraCIDataType.DOUBLE, variable = TraCIPersonVar.SPEED, clientCommandName = "getSpeed") - protected TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager){ + protected TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { double speed = state.getTopography() .getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getVelocity().getLength(); - cmd.setResponse(response(TraCIDataType.DOUBLE, speed)); + cmd.setResponse(response(traCIVar.returnType, speed)); }); return cmd; } - @GetHandler( + @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, - returnType = TraCIDataType.POS_2D, variable = TraCIPersonVar.POS_2D, clientCommandName = "getPosition2D") - protected TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager){ + protected TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { VPoint pos = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getPosition(); - cmd.setResponse(response(TraCIDataType.POS_2D, pos)); + cmd.setResponse(response(traCIVar.returnType, pos)); }); return cmd; } - @GetHandler( + @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, - returnType = TraCIDataType.DOUBLE, variable = TraCIPersonVar.LENGTH, clientCommandName = "getLength") - protected TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager){ + protected TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { double pedLength = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getRadius() *2; - cmd.setResponse(response(TraCIDataType.DOUBLE, pedLength)); + cmd.setResponse(response(traCIVar.returnType, pedLength)); }); return cmd; } - @GetHandler( + @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, - returnType = TraCIDataType.DOUBLE, variable = TraCIPersonVar.WIDTH, clientCommandName = "getWidth") - protected TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager){ + protected TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { double pedWidth= state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getRadius() *2; - cmd.setResponse(response(TraCIDataType.DOUBLE, pedWidth)); + cmd.setResponse(response(traCIVar.returnType, pedWidth)); }); return cmd; @@ -165,7 +163,7 @@ public class PersonCommandHandler extends CommandHandler{ // return process_NotImplemented(getCmd, remoteManager); // } else { // try { -// return (TraCIGetCommand) m.invoke(this, getCmd, remoteManager); +// return (TraCIGetCommand) m.invoke(this, getCmd, remoteManager, var); // } catch (IllegalAccessException | InvocationTargetException e) { // e.printStackTrace(); // } @@ -174,17 +172,17 @@ public class PersonCommandHandler extends CommandHandler{ switch (var){ case ID_LIST: - return process_getIDList(getCmd, remoteManager); + return process_getIDList(getCmd, remoteManager, var); case COUNT: - return process_getIDCount(getCmd, remoteManager); + return process_getIDCount(getCmd, remoteManager, var); case SPEED: - return process_getSpeed(getCmd, remoteManager); + return process_getSpeed(getCmd, remoteManager, var); case POS_2D: - return process_getPosition(getCmd, remoteManager); + return process_getPosition(getCmd, remoteManager, var); case LENGTH: - return process_getLength(getCmd, remoteManager); + return process_getLength(getCmd, remoteManager, var); case WIDTH: - return process_getWidth(getCmd, remoteManager); + return process_getWidth(getCmd, remoteManager, var); case WAITING_TIME: case POS_3D: case ANGLE: diff --git a/VadereManager/src/org/vadere/manager/commandHandler/GetHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonHandler.java similarity index 51% rename from VadereManager/src/org/vadere/manager/commandHandler/GetHandler.java rename to VadereManager/src/org/vadere/manager/commandHandler/PersonHandler.java index 2fe8b5ee6..54a30d250 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/GetHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonHandler.java @@ -1,18 +1,25 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * Experimental annotation interface which removes long manually create switch statements by + * creating a dynamic HashMap connecting commands(using variableIDs) to the corresponding + * handler methods. + * + * Reflection is minimized to a single startup routine at object creation. At runtime only + * HashMap access is performed. + */ + @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface GetHandler { +public @interface PersonHandler { TraCICmd commandIdentifier(); TraCIPersonVar variable(); String clientCommandName(); - TraCIDataType returnType(); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommands.java b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java similarity index 67% rename from VadereManager/src/org/vadere/manager/commandHandler/PolygonCommands.java rename to VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java index e8727cbc9..ca9c0a91c 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommands.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java @@ -3,7 +3,10 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.TraCIPacket; -public class PolygonCommands { +/** + * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Polygon API + */ +public class PolygonCommandHandler { static public TraCIPacket processGet(TraCICommand cmd){ return null; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommands.java b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java similarity index 66% rename from VadereManager/src/org/vadere/manager/commandHandler/SimulationCommands.java rename to VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java index 4d3cbb4d8..a352e226d 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommands.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java @@ -3,7 +3,10 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.TraCIPacket; -public class SimulationCommands { +/** + * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Simulation API + */ +public class SimulationCommandHandler { static public TraCIPacket processGet(TraCICommand cmd){ return null; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java index e772ec648..b2feeee97 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java @@ -3,6 +3,19 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.simulator.control.SimulationState; +/** + * Interface used to allow access to the {@link SimulationState} + * + * This Interface is only implemented as lambda functions in {@link CommandHandler}s + * (see {@link PersonCommandHandler} for usage) + * + * In {@link RemoteManager#accessState(StateAccessHandler)} the access to the state is + * managerd and monitored to ensure that {@link SimulationState} access is synchronized + * and only occurs if the simulation is halted. + * + * (see singleStepMode in {@link org.vadere.simulator.control.Simulation}) + * + */ @FunctionalInterface public interface StateAccessHandler { diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java index 81c3913e8..f4f0dee18 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java @@ -3,10 +3,12 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.manager.stsc.commands.TraCICommand; +/** + * Interface used to dispatch command handling to the correct {@link CommandHandler} subclass + */ @FunctionalInterface public interface TraCICmdHandler { - TraCICommand handel(TraCICommand cmd, RemoteManager remoteManager); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java index 50606597a..b019f8c55 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java @@ -3,6 +3,10 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCIDataType; + +/** + * VariableId list for Person API. + */ public enum TraCIPersonVar { ID_LIST(0x00, TraCIDataType.STRING_LIST), // get diff --git a/VadereManager/src/org/vadere/manager/stsc/CmdType.java b/VadereManager/src/org/vadere/manager/stsc/CmdType.java index ea566c5f0..f036f1ceb 100644 --- a/VadereManager/src/org/vadere/manager/stsc/CmdType.java +++ b/VadereManager/src/org/vadere/manager/stsc/CmdType.java @@ -1,13 +1,13 @@ package org.vadere.manager.stsc; +/** + * Command Types of TraCI. Used to cluster commands. + */ public enum CmdType { - CTRL, VALUE_GET, VALUE_SET, VALUE_SUB, CONTEXT_SUB, - RESPONSE, - UNKNOWN; - + RESPONSE } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java index 4fd8e3829..04ff591a2 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java @@ -2,6 +2,9 @@ package org.vadere.manager.stsc; import org.vadere.manager.TraCIException; +/** + * List of all TraCI Commands and there Types. + */ public enum TraCICmd { // TraCI/Control-related commands GET_VERSION(0x00, CmdType.CTRL), @@ -79,7 +82,6 @@ public enum TraCICmd { SUB_SIMULATION_VALUE(0xdb, CmdType.VALUE_SUB), RESPONSE_SUB_SIMULATION_VALUE(0xeb, CmdType.RESPONSE), // TraCI/Object Context Subscription - ; public int id; diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java index d50d4249f..c9ed5cc16 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java @@ -2,6 +2,9 @@ package org.vadere.manager.stsc; import org.vadere.manager.TraCIException; +/** + * Possible data types used in TraCI + */ public enum TraCIDataType { U_BYTE(0x07, 1, true), BYTE(0x08, 1, true), diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java index e7c708ebc..3067b0006 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java @@ -13,6 +13,9 @@ import org.vadere.manager.stsc.writer.TraCIWriterImpl; import java.nio.ByteBuffer; +/** + * //todo comment + */ public class TraCIPacket { private TraCIWriter writer; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java index 4777ab787..dc09df3ee 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -12,6 +12,24 @@ import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import java.nio.ByteBuffer; +/** + * Abstract Class for TraCICommands. + * + * Object of this Class only hold the state (input parameters, response data) for each + * command. The execution is handed by {@link org.vadere.manager.commandHandler.CommandHandler} + * classes. + * + * Each command has an Id managed as an enum {@link TraCICmd}. This enum also contains + * the type of the command (i.e. GET, SET, Control). Depending on the type (and sometimes on + * the variable queried) different sub classes are used to manage the command. + * + * Construction Methods: (compare with {@link org.vadere.manager.stsc.respons.TraCIResponse}) + * + * 1) created from serialized data (byte[] / {@link ByteBuffer} / {@link TraCICommandBuffer}) + * + * 2) created from simple static factories which are used by clients. + * + */ public abstract class TraCICommand { protected TraCICmd traCICmd; @@ -33,8 +51,6 @@ public abstract class TraCICommand { case VALUE_SUB: case CONTEXT_SUB: throw new TraCIException("Subscrtipons not implemente"); - case UNKNOWN: - throw new TraCIException("Unknown command found found with identifier: " + identifier); default: throw new IllegalStateException("Should not be reached. All CmdType enums are tested in switch statement"); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index d2f153d3c..345c10249 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -7,6 +7,24 @@ import org.vadere.manager.stsc.respons.TraCIGetResponse; import java.nio.charset.StandardCharsets; + +/** + * Sub class of {@link TraCICommand} which represents a get request to some API. + * + * An API in this context is for instance the Person(GET/SET), Simulation(GET/SET/SUB) + * + * Command Structure + * + * [ cmdIdentifier(based on API) ] [ variableId ] [ elementId] + * + * - cmdIdentifier(based on API): see {@link TraCICmd} enum GET_**** + * - variableId: Id for the variable. The numbers may be the same between different APIs + * see {@link org.vadere.manager.commandHandler.TraCIPersonVar} enum + * - elementId: String based identifier for the object (i.e. a pedestrianId) + * + * see {@link org.vadere.manager.commandHandler.PersonCommandHandler} for execution handing. + * + */ public class TraCIGetCommand extends TraCICommand { protected int variableIdentifier; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java index f12c64dc3..7433ab8c6 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -6,6 +6,25 @@ import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.TraCIDataType; +/** + * Sub class of {@link TraCICommand} which represents a set request to some API. + * + * An API in this context is for instance the Person(GET/SET), Simulation(GET/SET/SUB) + * + * Command Structure + * + * [ cmdIdentifier(based on API) ] [ variableId ] [ elementId] [ dataTypeId ] [ data ] + * + * - cmdIdentifier(based on API): see {@link TraCICmd} enum GET_**** + * - variableId: Id for the variable. The numbers may be the same between different APIs + * see {@link org.vadere.manager.commandHandler.TraCIPersonVar} enum + * - elementId: String based identifier for the object (i.e. a pedestrianId) + * - dataTypeId: see {@link TraCIDataType} + * - data: data to be returned. + * + * see {@link org.vadere.manager.commandHandler.PersonCommandHandler} for execution handing. + * + */ public class TraCISetCommand extends TraCICommand{ protected int variableId; diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java b/VadereManager/src/org/vadere/manager/stsc/reader/ByteBufferTraCIReader.java similarity index 88% rename from VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java rename to VadereManager/src/org/vadere/manager/stsc/reader/ByteBufferTraCIReader.java index 4085cf52a..35c39b1d8 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReaderImpl.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/ByteBufferTraCIReader.java @@ -17,23 +17,30 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -public class TraCIReaderImpl implements TraCIReader { + +/** + * A {@link ByteBuffer} based implementation of the {@link TraCIReader} interface. + * The {@link ByteBuffer} wraps a byte[] array and allows getX access to the given + * byte[] array. + * + */ +public class ByteBufferTraCIReader implements TraCIReader { private ByteBuffer byteBuffer; - public static TraCIReaderImpl wrap(byte[] data){ - TraCIReaderImpl traCIReaderImpl = new TraCIReaderImpl(); - traCIReaderImpl.byteBuffer = ByteBuffer.wrap(data); - return traCIReaderImpl; + public static ByteBufferTraCIReader wrap(byte[] data){ + ByteBufferTraCIReader byteBufferTraCIReader = new ByteBufferTraCIReader(); + byteBufferTraCIReader.byteBuffer = ByteBuffer.wrap(data); + return byteBufferTraCIReader; } - public static TraCIReaderImpl wrap(ByteBuffer buffer){ - TraCIReaderImpl traCIReaderImpl = new TraCIReaderImpl(); - traCIReaderImpl.byteBuffer = buffer; - return traCIReaderImpl; + public static ByteBufferTraCIReader wrap(ByteBuffer buffer){ + ByteBufferTraCIReader byteBufferTraCIReader = new ByteBufferTraCIReader(); + byteBufferTraCIReader.byteBuffer = buffer; + return byteBufferTraCIReader; } - private TraCIReaderImpl(){ } + private ByteBufferTraCIReader(){ } @Override public byte readByte() { diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java index 8e352300f..7e52b0d4e 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java @@ -11,11 +11,11 @@ public abstract class TraCIBuffer { public TraCIReader reader; protected TraCIBuffer (byte[] buf){ - reader = TraCIReaderImpl.wrap(buf); + reader = ByteBufferTraCIReader.wrap(buf); } protected TraCIBuffer (ByteBuffer buf){ - reader = TraCIReaderImpl.wrap(buf); + reader = ByteBufferTraCIReader.wrap(buf); } diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java index 93d74b00e..fde5e8cef 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java @@ -3,7 +3,11 @@ package org.vadere.manager.stsc.reader; import java.nio.ByteBuffer; /** - * Wraps single command with command length removed. + * A simple Wrapper around a {@link TraCIReader} which knows how to traverse a single command. + * + * The class expects that the given buffer only contains *one* command. The command length filed + * (1 byte or 5 bytes, depending on the command size) must be removed before creating an instance. + * */ public class TraCICommandBuffer extends TraCIBuffer{ diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java index 326a8589d..7877df29c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java @@ -7,7 +7,12 @@ import org.vadere.manager.stsc.respons.TraCIResponse; import java.nio.ByteBuffer; /** - * Wraps the whole packet received over the socket with packet length removed. + * A simple Wrapper around a {@link TraCIReader} which knows how to retrieve * + * single commands from a TraCI byte[] array. + * + * The class expects that the given buffer only contains commands. The packet length filed (int) + * must be removed before! + * */ public class TraCIPacketBuffer extends TraCIBuffer { diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java index b75461825..1d040b7aa 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java @@ -11,6 +11,11 @@ import java.awt.*; import java.nio.ByteBuffer; import java.util.List; + +/** + * Definition of read methods used to deserialize TraCICommands / TraCIResponses received + * over a socket. + */ public interface TraCIReader { diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java index 6cdfc509f..63828f51b 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java @@ -6,6 +6,12 @@ import org.vadere.manager.stsc.reader.TraCICommandBuffer; import java.nio.ByteBuffer; import java.util.Objects; + +/** + * {@link StatusResponse} object send with each response. + * + * see {@link TraCIStatusResponse} for status codes. + */ public class StatusResponse { private TraCICmd cmdIdentifier; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java index 45ababb87..6718c337a 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java @@ -6,6 +6,23 @@ import org.vadere.manager.stsc.reader.TraCICommandBuffer; import java.util.Objects; + +/** + * Response object for {@link org.vadere.manager.stsc.commands.TraCIGetCommand} + * command. This command is used to retrieve generic data from the simulator. + * + * The structure of the response: + * + * [ responseID(based on API) ] [ variableId ] [ elementId ] [ dataTypeId ] [ data ] + * + * - responseID(based on API): Each API (Person, Vehicle, Simulation, ...) has a different Id. + * - variableId: Id for the variable. The numbers may be the same between different APIs + * - elementId: String based identifier for the object (i.e. a pedestrianId) + * - dataTypeId: see {@link TraCIDataType} + * - data: data to be returned. + * + * See {@link TraCIResponse} for static factory methods used to create objects from byte[] + */ public class TraCIGetResponse extends TraCIResponse{ private int variableIdentifier; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java index 0a8e609eb..88c15fbca 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java @@ -5,6 +5,13 @@ import org.vadere.manager.stsc.reader.TraCICommandBuffer; import java.util.Objects; +/** + * Response object for {@link org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand} + * command. It returns the numerical {@link #versionId} and string {@link #versionString} + * representation of the current TraCI version. + * + * See {@link TraCIResponse} for static factory methods used to create objects from byte[] + */ public class TraCIGetVersionResponse extends TraCIResponse{ private int versionId; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java index 14251d126..ab2120e09 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java @@ -6,6 +6,21 @@ import org.vadere.manager.stsc.reader.TraCICommandBuffer; import java.nio.ByteBuffer; + +/** + * Generic response object for each command. It contains the {@link StatusResponse} object + * as well as optional response data warped in a second command. + * + * If no additional data is send the responseIdentifier will be ignored. + * + * Construction Methods: (compare with {@link org.vadere.manager.stsc.commands.TraCICommand}) + * + * Each {@link TraCIResponse} class is build in two ways. Either it is created from bytes + * (i.e. some byte[] wrapped in a {@link ByteBuffer} or {@link TraCICommandBuffer} for ease of use) + * or manually to prepaid a response to a client. + * + * + */ public class TraCIResponse { protected StatusResponse statusResponse; @@ -54,7 +69,6 @@ public class TraCIResponse { private static TraCIResponse createSetResponse(TraCICmd commandIdentifier, TraCICmd responseIdentifier, TraCICommandBuffer cmdResponseBuffer, StatusResponse statusResponse){ - return null; } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java index d74a197dd..6eed6e969 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java @@ -4,6 +4,12 @@ import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.reader.TraCICommandBuffer; +/** + * Response object for {@link org.vadere.manager.stsc.commands.control.TraCISimStepCommand} + * command. It includes all subscriptions previously added by each client. + * + * See {@link TraCIResponse} for static factory methods used to create objects from byte[] + */ public class TraCISimTimeResponse extends TraCIResponse { private Object subscriptionData; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java index 5d93f6a80..13143ab99 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java @@ -2,6 +2,13 @@ package org.vadere.manager.stsc.respons; import org.vadere.manager.TraCIException; +/** + * Status Codes for each Response send from a TraCI-Server. These codes are wrapped within a + * {@link TraCIStatusResponse} response send back to the client. Depending on the command + * an additional response appended. + * + * See {@link TraCIResponse} for more information. + */ public enum TraCIStatusResponse { OK(0x00), diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java index 4eda3dd1a..a1bb39e6e 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java @@ -3,7 +3,7 @@ package org.vadere.manager.stsc; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.vadere.manager.stsc.reader.TraCIReaderImpl; +import org.vadere.manager.stsc.reader.ByteBufferTraCIReader; import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; @@ -23,7 +23,7 @@ import static org.junit.Assert.assertThat; public class TraCIReaderTest { TraCIWriterImpl writer; - TraCIReaderImpl reader; + ByteBufferTraCIReader reader; @Before public void before(){ @@ -36,11 +36,11 @@ public class TraCIReaderTest { } private void createReader(){ - reader = TraCIReaderImpl.wrap(writer.asByteArray()); + reader = ByteBufferTraCIReader.wrap(writer.asByteArray()); } private void checkEmpty(){ - assertThat("TraCIReaderImpl must be empty at this point", reader.hasRemaining(), equalTo(false)); + assertThat("ByteBufferTraCIReader must be empty at this point", reader.hasRemaining(), equalTo(false)); } private void checkIdentifier( int matchWith){ -- GitLab From b6cf4561cb859ca7680e2f5c485295b47d140857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Sun, 9 Jun 2019 18:46:40 +0200 Subject: [PATCH 22/58] add Test --- .../stsc/respons/StatusResponseTest.java | 79 +++++++++++++++++++ .../stsc/respons/TraCIGetResponseTest.java | 31 ++++++++ .../respons/TraCIGetVersionResponseTest.java | 27 +++++++ 3 files changed, 137 insertions(+) create mode 100644 VadereManager/tests/org/vadere/manager/stsc/respons/StatusResponseTest.java create mode 100644 VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetResponseTest.java create mode 100644 VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetVersionResponseTest.java diff --git a/VadereManager/tests/org/vadere/manager/stsc/respons/StatusResponseTest.java b/VadereManager/tests/org/vadere/manager/stsc/respons/StatusResponseTest.java new file mode 100644 index 000000000..e5794a569 --- /dev/null +++ b/VadereManager/tests/org/vadere/manager/stsc/respons/StatusResponseTest.java @@ -0,0 +1,79 @@ +package org.vadere.manager.stsc.respons; + +import org.junit.Test; +import org.vadere.manager.stsc.TraCICmd; + +import java.nio.ByteBuffer; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.hamcrest.core.IsNot.not; +import static org.junit.Assert.assertThat; + +public class StatusResponseTest { + + + + + @Test + public void createFromByteBuffer() { + //length removed + byte[] data = new byte[]{(byte)TraCICmd.GET_VERSION.id, (byte)TraCIStatusResponse.OK.id, 0, 0, 0, 0}; + + StatusResponse r = StatusResponse.createFromByteBuffer(ByteBuffer.wrap(data)); + + assertThat(r.getCmdIdentifier(), equalTo(TraCICmd.GET_VERSION)); + assertThat(r.getResponse(), equalTo(TraCIStatusResponse.OK)); + assertThat(r.getDescription(), equalTo("")); + } + + @Test + public void getCmdIdentifier() { + StatusResponse r = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + assertThat(r.getCmdIdentifier(), equalTo(TraCICmd.GET_EDGE_VALUE)); + } + + @Test + public void setCmdIdentifier() { + StatusResponse r = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + r.setCmdIdentifier(TraCICmd.SEND_FILE); + assertThat(r.getCmdIdentifier(), equalTo(TraCICmd.SEND_FILE)); + } + + @Test + public void getResponse() { + StatusResponse r = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + assertThat(r.getResponse(), equalTo(TraCIStatusResponse.ERR)); + } + + @Test + public void setResponse() { + StatusResponse r = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + r.setResponse(TraCIStatusResponse.NOT_IMPLEMENTED); + assertThat(r.getResponse(), equalTo(TraCIStatusResponse.NOT_IMPLEMENTED)); + } + + @Test + public void getDescription() { + StatusResponse r = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + assertThat(r.getDescription(), equalTo("Test")); + } + + @Test + public void setDescription() { + StatusResponse r = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + r.setDescription("Test2"); + assertThat(r.getDescription(), equalTo("Test2")); + } + + @Test + public void equals1() { + StatusResponse r1 = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + StatusResponse r2 = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.ERR, "Test"); + StatusResponse r3 = new StatusResponse(TraCICmd.GET_EDGE_VALUE, TraCIStatusResponse.OK, "Test"); + + assertThat(r1, equalTo(r2)); + assertThat(r1, not(equalTo(r3))); + assertThat(r2, not(equalTo(r3))); + } + +} \ No newline at end of file diff --git a/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetResponseTest.java b/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetResponseTest.java new file mode 100644 index 000000000..eb32ee27c --- /dev/null +++ b/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetResponseTest.java @@ -0,0 +1,31 @@ +package org.vadere.manager.stsc.respons; + +import org.junit.Test; +import org.vadere.manager.commandHandler.TraCIPersonVar; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + +public class TraCIGetResponseTest { + + + @Test + public void createFromBuffer(){ + byte[] data = new byte[]{(byte)TraCIPersonVar.COUNT.id, 0,0,0,2, 65, 65, (byte)TraCIDataType.INTEGER.identifier, 0,0,0,78}; + TraCIGetResponse response = new TraCIGetResponse( + new StatusResponse(TraCICmd.GET_PERSON_VALUE, TraCIStatusResponse.OK, ""), + TraCICmd.RESPONSE_GET_PERSON_VALUE, + TraCICommandBuffer.wrap(data) + ); + + assertThat(response.getStatusResponse(), equalTo(new StatusResponse(TraCICmd.GET_PERSON_VALUE, TraCIStatusResponse.OK, ""))); + assertThat(response.getResponseIdentifier(), equalTo(TraCICmd.RESPONSE_GET_PERSON_VALUE)); + assertThat(response.getElementIdentifier(), equalTo("AA")); + assertThat(response.getResponseData(), equalTo(78)); + assertThat(response.getResponseDataType(), equalTo(TraCIDataType.INTEGER)); + } + +} \ No newline at end of file diff --git a/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetVersionResponseTest.java b/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetVersionResponseTest.java new file mode 100644 index 000000000..dea937263 --- /dev/null +++ b/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetVersionResponseTest.java @@ -0,0 +1,27 @@ +package org.vadere.manager.stsc.respons; + +import org.junit.Test; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + +public class TraCIGetVersionResponseTest { + + + @Test + public void createFromBuffer(){ + byte[] data = new byte[]{0,0,0,34, 0,0,0,2, 65, 65}; + TraCIGetVersionResponse response = new TraCIGetVersionResponse( + new StatusResponse(TraCICmd.GET_VERSION, TraCIStatusResponse.OK, ""), + TraCICommandBuffer.wrap(data) + ); + + assertThat(response.getStatusResponse(), equalTo(new StatusResponse(TraCICmd.GET_VERSION, TraCIStatusResponse.OK, ""))); + assertThat(response.getResponseIdentifier(), equalTo(TraCICmd.GET_VERSION)); + assertThat(response.getVersionString(), equalTo("AA")); + assertThat(response.getVersionId(), equalTo(34)); + } + +} \ No newline at end of file -- GitLab From 23fbc93c4b7048df0e4f62dfd0c2ff5d8e54408a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Sun, 9 Jun 2019 18:47:19 +0200 Subject: [PATCH 23/58] refactor commands --- .../manager/stsc/commands/TraCICommand.java | 11 +++++--- .../commands/control/TraCICloseCommand.java | 4 +-- .../control/TraCIGetVersionCommand.java | 4 +-- .../commands/control/TraCILoadCommand.java | 28 +++++++++++++++++++ .../control/TraCISendFileCommand.java | 11 ++------ .../commands/control/TraCISimStepCommand.java | 15 ++++------ 6 files changed, 47 insertions(+), 26 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java index dc09df3ee..3a59facf2 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -4,6 +4,7 @@ import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.CmdType; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.control.TraCILoadCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.commands.control.TraCICloseCommand; @@ -61,13 +62,15 @@ public abstract class TraCICommand { switch (cmd){ case GET_VERSION: - return new TraCIGetVersionCommand(cmd); + return new TraCIGetVersionCommand(); case SIM_STEP: - return new TraCISimStepCommand(cmd, cmdBuffer); + return new TraCISimStepCommand(cmdBuffer); case CLOSE: - return new TraCICloseCommand(cmd); + return new TraCICloseCommand(); case SEND_FILE: - return new TraCISendFileCommand(cmd, cmdBuffer); + return new TraCISendFileCommand(cmdBuffer); + case LOAD: + return new TraCILoadCommand(cmdBuffer); default: throw new IllegalStateException(String.format("Should not be reached. Only TraCI control commands expected: %0X", cmd.id)); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java index 7eaf42b4c..a8baed30b 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java @@ -21,8 +21,8 @@ public class TraCICloseCommand extends TraCICommand { return packet; } - public TraCICloseCommand(TraCICmd traCICmd) { - super(traCICmd); + public TraCICloseCommand() { + super(TraCICmd.CLOSE); this.response = new TraCIResponse( new StatusResponse(TraCICmd.CLOSE, TraCIStatusResponse.OK, ""), TraCICmd.CLOSE); diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java index fc3a99875..36a389487 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java @@ -17,8 +17,8 @@ public class TraCIGetVersionCommand extends TraCICommand { return packet; } - public TraCIGetVersionCommand(TraCICmd traCICmd){ - super(traCICmd); + public TraCIGetVersionCommand(){ + super(TraCICmd.GET_VERSION); response = new TraCIGetVersionResponse(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java new file mode 100644 index 000000000..f2ccf5ba8 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java @@ -0,0 +1,28 @@ +package org.vadere.manager.stsc.commands.control; + +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import java.util.List; + +public class TraCILoadCommand extends TraCICommand { + + private List optionList; + + public static TraCIPacket build(List optionList){ + TraCIPacket packet = TraCIPacket.create(); + return packet; + } + + public TraCILoadCommand(TraCICommandBuffer cmdBuffer) { + super(TraCICmd.LOAD); + this.optionList = cmdBuffer.reader.readStringList(); + } + + @Override + public TraCIPacket buildResponsePacket() { + return null; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java index 43e2d58ed..cca2ea35e 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java @@ -1,6 +1,5 @@ package org.vadere.manager.stsc.commands.control; -import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; @@ -22,13 +21,9 @@ public class TraCISendFileCommand extends TraCICommand { return packet; } - public TraCISendFileCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { - super(traCICmd); - try{ - this.file = cmdBuffer.reader.readString(); - } catch (Exception e){ - throw TraCIException.cmdErr(traCICmd, e); - } + public TraCISendFileCommand(TraCICommandBuffer cmdBuffer) { + super(TraCICmd.SEND_FILE); + this.file = cmdBuffer.reader.readString(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java index 095ca0f06..b8eef5f60 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java @@ -1,10 +1,9 @@ package org.vadere.manager.stsc.commands.control; -import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCIPacket; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; public class TraCISimStepCommand extends TraCICommand { @@ -21,13 +20,9 @@ public class TraCISimStepCommand extends TraCICommand { return packet; } - public TraCISimStepCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { - super(traCICmd); - try{ - this.targetTime = cmdBuffer.reader.readDouble(); - } catch (Exception e){ - throw TraCIException.cmdErr(traCICmd, e); - } + public TraCISimStepCommand(TraCICommandBuffer cmdBuffer) { + super(TraCICmd.SIM_STEP); + this.targetTime = cmdBuffer.reader.readDouble(); } public double getTargetTime() { -- GitLab From e95a6f2160a509a56304dda3700bcc1f7434c580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Sun, 9 Jun 2019 19:00:58 +0200 Subject: [PATCH 24/58] refactor TraCI Reader (Packet, Command) --- .../stsc/commands/TraCIGetCommand.java | 4 +-- .../stsc/commands/TraCISetCommand.java | 8 +++--- .../commands/control/TraCILoadCommand.java | 2 +- .../control/TraCISendFileCommand.java | 2 +- .../commands/control/TraCISimStepCommand.java | 2 +- .../manager/stsc/reader/TraCIBuffer.java | 25 ----------------- ...rTraCIReader.java => TraCIByteBuffer.java} | 28 ++++++++++++------- .../stsc/reader/TraCICommandBuffer.java | 8 +++--- .../stsc/reader/TraCIPacketBuffer.java | 18 ++++++------ .../manager/stsc/respons/StatusResponse.java | 4 +-- .../stsc/respons/TraCIGetResponse.java | 8 +++--- .../stsc/respons/TraCIGetVersionResponse.java | 4 +-- .../stsc/respons/TraCISimTimeResponse.java | 4 +-- .../vadere/manager/stsc/TraCIReaderTest.java | 8 +++--- 14 files changed, 54 insertions(+), 71 deletions(-) delete mode 100644 VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java rename VadereManager/src/org/vadere/manager/stsc/reader/{ByteBufferTraCIReader.java => TraCIByteBuffer.java} (90%) diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index 345c10249..4d94b4fd4 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -47,8 +47,8 @@ public class TraCIGetCommand extends TraCICommand { public TraCIGetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); - variableIdentifier = cmdBuffer.reader.readUnsignedByte(); - elementIdentifier = cmdBuffer.reader.readString(); + variableIdentifier = cmdBuffer.readUnsignedByte(); + elementIdentifier = cmdBuffer.readString(); } public int getVariableIdentifier() { diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java index 7433ab8c6..7149c054d 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -36,10 +36,10 @@ public class TraCISetCommand extends TraCICommand{ public TraCISetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); try{ - variableId = cmdBuffer.reader.readUnsignedByte(); - elementId = cmdBuffer.reader.readString(); - returnDataType = TraCIDataType.fromId(cmdBuffer.reader.readUnsignedByte()); - variableValue = cmdBuffer.reader.readTypeValue(returnDataType); + variableId = cmdBuffer.readUnsignedByte(); + elementId = cmdBuffer.readString(); + returnDataType = TraCIDataType.fromId(cmdBuffer.readUnsignedByte()); + variableValue = cmdBuffer.readTypeValue(returnDataType); } catch (Exception e){ throw TraCIException.cmdErr(traCICmd, e); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java index f2ccf5ba8..2c4e5e155 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java @@ -18,7 +18,7 @@ public class TraCILoadCommand extends TraCICommand { public TraCILoadCommand(TraCICommandBuffer cmdBuffer) { super(TraCICmd.LOAD); - this.optionList = cmdBuffer.reader.readStringList(); + this.optionList = cmdBuffer.readStringList(); } @Override diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java index cca2ea35e..ee2cf8173 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java @@ -23,7 +23,7 @@ public class TraCISendFileCommand extends TraCICommand { public TraCISendFileCommand(TraCICommandBuffer cmdBuffer) { super(TraCICmd.SEND_FILE); - this.file = cmdBuffer.reader.readString(); + this.file = cmdBuffer.readString(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java index b8eef5f60..db003765c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java @@ -22,7 +22,7 @@ public class TraCISimStepCommand extends TraCICommand { public TraCISimStepCommand(TraCICommandBuffer cmdBuffer) { super(TraCICmd.SIM_STEP); - this.targetTime = cmdBuffer.reader.readDouble(); + this.targetTime = cmdBuffer.readDouble(); } public double getTargetTime() { diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java deleted file mode 100644 index 7e52b0d4e..000000000 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIBuffer.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.vadere.manager.stsc.reader; - -import java.nio.ByteBuffer; - -/** - * Wrapper around byte representation for packets, commands and responses - * received over a socket. - */ -public abstract class TraCIBuffer { - - public TraCIReader reader; - - protected TraCIBuffer (byte[] buf){ - reader = ByteBufferTraCIReader.wrap(buf); - } - - protected TraCIBuffer (ByteBuffer buf){ - reader = ByteBufferTraCIReader.wrap(buf); - } - - - public boolean hasRemaining(){ - return reader.hasRemaining(); - } -} diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/ByteBufferTraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java similarity index 90% rename from VadereManager/src/org/vadere/manager/stsc/reader/ByteBufferTraCIReader.java rename to VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java index 35c39b1d8..223353396 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/ByteBufferTraCIReader.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java @@ -24,23 +24,31 @@ import java.util.List; * byte[] array. * */ -public class ByteBufferTraCIReader implements TraCIReader { +public class TraCIByteBuffer implements TraCIReader { private ByteBuffer byteBuffer; - public static ByteBufferTraCIReader wrap(byte[] data){ - ByteBufferTraCIReader byteBufferTraCIReader = new ByteBufferTraCIReader(); - byteBufferTraCIReader.byteBuffer = ByteBuffer.wrap(data); - return byteBufferTraCIReader; + public static TraCIByteBuffer wrap(byte[] data){ + TraCIByteBuffer traCIByteBuffer = new TraCIByteBuffer(); + traCIByteBuffer.byteBuffer = ByteBuffer.wrap(data); + return traCIByteBuffer; } - public static ByteBufferTraCIReader wrap(ByteBuffer buffer){ - ByteBufferTraCIReader byteBufferTraCIReader = new ByteBufferTraCIReader(); - byteBufferTraCIReader.byteBuffer = buffer; - return byteBufferTraCIReader; + public static TraCIByteBuffer wrap(ByteBuffer buffer){ + TraCIByteBuffer traCIByteBuffer = new TraCIByteBuffer(); + traCIByteBuffer.byteBuffer = buffer; + return traCIByteBuffer; } - private ByteBufferTraCIReader(){ } + protected TraCIByteBuffer(){ } + + protected TraCIByteBuffer(byte[] buffer){ + byteBuffer = ByteBuffer.wrap(buffer); + } + + protected TraCIByteBuffer(ByteBuffer buffer){ + byteBuffer = buffer; + } @Override public byte readByte() { diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java index fde5e8cef..87b02a792 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java @@ -9,7 +9,7 @@ import java.nio.ByteBuffer; * (1 byte or 5 bytes, depending on the command size) must be removed before creating an instance. * */ -public class TraCICommandBuffer extends TraCIBuffer{ +public class TraCICommandBuffer extends TraCIByteBuffer { private boolean cmdIdentifierRead; @@ -26,12 +26,12 @@ public class TraCICommandBuffer extends TraCIBuffer{ } - protected TraCICommandBuffer(byte[] buf) { + private TraCICommandBuffer(byte[] buf) { super(buf); cmdIdentifierRead = false; } - protected TraCICommandBuffer(ByteBuffer buf) { + private TraCICommandBuffer(ByteBuffer buf) { super(buf); cmdIdentifierRead = false; } @@ -42,7 +42,7 @@ public class TraCICommandBuffer extends TraCIBuffer{ throw new IllegalStateException("TraCI Command Identifier already consumed. readCmdIdentifier() must only be called once. Something went wrong in the TraCI message handling."); cmdIdentifierRead = true; - return reader.readUnsignedByte(); + return readUnsignedByte(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java index 7877df29c..8e9f423bf 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java @@ -14,7 +14,7 @@ import java.nio.ByteBuffer; * must be removed before! * */ -public class TraCIPacketBuffer extends TraCIBuffer { +public class TraCIPacketBuffer extends TraCIByteBuffer { public static TraCIPacketBuffer wrap(byte[] buf){ return new TraCIPacketBuffer(buf); @@ -37,36 +37,36 @@ public class TraCIPacketBuffer extends TraCIBuffer { } public TraCICommand nextCommand(){ - if (!reader.hasRemaining()) + if (!hasRemaining()) return null; int cmdLen = getCommandDataLen(); - return TraCICommand.create(reader.readByteBuffer(cmdLen)); + return TraCICommand.create(readByteBuffer(cmdLen)); } public TraCIResponse nextResponse(){ - if (!reader.hasRemaining()) + if (!hasRemaining()) return null; int statusLen = getCommandDataLen(); - StatusResponse statusResponse = StatusResponse.createFromByteBuffer(reader.readByteBuffer(statusLen)); + StatusResponse statusResponse = StatusResponse.createFromByteBuffer(readByteBuffer(statusLen)); - if (!reader.hasRemaining()){ + if (!hasRemaining()){ // only StatusResponse return TraCIResponse.create(statusResponse); } else { int responseDataLen = getCommandDataLen(); - ByteBuffer buffer = reader.readByteBuffer(responseDataLen); + ByteBuffer buffer = readByteBuffer(responseDataLen); return TraCIResponse.create(statusResponse, buffer); } } private int getCommandDataLen(){ - int cmdLen = reader.readUnsignedByte(); + int cmdLen = readUnsignedByte(); if (cmdLen == 0 ){ // extended cmdLen field used. - cmdLen = reader.readInt() - 5; // subtract cmdLen field: 1 ubyte + 1 int (4) + cmdLen = readInt() - 5; // subtract cmdLen field: 1 ubyte + 1 int (4) } else { cmdLen -= 1; // subtract cmdLen field: 1 ubyte } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java index 63828f51b..8d3300306 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java @@ -22,9 +22,9 @@ public class StatusResponse { StatusResponse ret = new StatusResponse(); TraCICommandBuffer buf = TraCICommandBuffer.wrap(rawCmd); ret.cmdIdentifier = TraCICmd.fromId(buf.readCmdIdentifier()); - ret.response = TraCIStatusResponse.fromId(buf.reader.readUnsignedByte()); + ret.response = TraCIStatusResponse.fromId(buf.readUnsignedByte()); - ret.description = buf.reader.readString(); + ret.description = buf.readString(); return ret; } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java index 6718c337a..0dde50945 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java @@ -34,10 +34,10 @@ public class TraCIGetResponse extends TraCIResponse{ public TraCIGetResponse(StatusResponse statusResponse, TraCICmd responseIdentifier, TraCICommandBuffer buffer) { super(statusResponse, responseIdentifier); - variableIdentifier = buffer.reader.readUnsignedByte(); - elementIdentifier = buffer.reader.readString(); - responseDataType = TraCIDataType.fromId(buffer.reader.readUnsignedByte()); - responseData = buffer.reader.readTypeValue(responseDataType); + variableIdentifier = buffer.readUnsignedByte(); + elementIdentifier = buffer.readString(); + responseDataType = TraCIDataType.fromId(buffer.readUnsignedByte()); + responseData = buffer.readTypeValue(responseDataType); } public TraCIGetResponse(StatusResponse statusResponse, TraCICmd responseIdentifier) { diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java index 88c15fbca..8d71573c0 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java @@ -20,8 +20,8 @@ public class TraCIGetVersionResponse extends TraCIResponse{ // deserialize from buffer (wrap byte[]) public TraCIGetVersionResponse(StatusResponse statusResponse, TraCICommandBuffer buffer) { super(statusResponse, TraCICmd.GET_VERSION); - this.versionId = buffer.reader.readInt(); - this.versionString = buffer.reader.readString(); + this.versionId = buffer.readInt(); + this.versionString = buffer.readString(); } public TraCIGetVersionResponse(){ diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java index 6eed6e969..e7ff5b959 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java @@ -18,8 +18,8 @@ public class TraCISimTimeResponse extends TraCIResponse { public TraCISimTimeResponse (StatusResponse statusResponse, TraCICommandBuffer buffer){ super(statusResponse, TraCICmd.SIM_STEP); - subscriptionDataType = TraCIDataType.fromId(buffer.reader.readUnsignedByte()); - subscriptionData = buffer.reader.readTypeValue(subscriptionDataType); + subscriptionDataType = TraCIDataType.fromId(buffer.readUnsignedByte()); + subscriptionData = buffer.readTypeValue(subscriptionDataType); } public TraCISimTimeResponse( Object subscriptionData, TraCIDataType subscriptionDataType) { diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java index a1bb39e6e..52b80a2da 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java @@ -3,7 +3,7 @@ package org.vadere.manager.stsc; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.vadere.manager.stsc.reader.ByteBufferTraCIReader; +import org.vadere.manager.stsc.reader.TraCIByteBuffer; import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; @@ -23,7 +23,7 @@ import static org.junit.Assert.assertThat; public class TraCIReaderTest { TraCIWriterImpl writer; - ByteBufferTraCIReader reader; + TraCIByteBuffer reader; @Before public void before(){ @@ -36,11 +36,11 @@ public class TraCIReaderTest { } private void createReader(){ - reader = ByteBufferTraCIReader.wrap(writer.asByteArray()); + reader = TraCIByteBuffer.wrap(writer.asByteArray()); } private void checkEmpty(){ - assertThat("ByteBufferTraCIReader must be empty at this point", reader.hasRemaining(), equalTo(false)); + assertThat("TraCIByteBuffer must be empty at this point", reader.hasRemaining(), equalTo(false)); } private void checkIdentifier( int matchWith){ -- GitLab From c73d0bf947f256132459fb8379ef2dc0dd4f51c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Sun, 9 Jun 2019 19:45:38 +0200 Subject: [PATCH 25/58] Refactor TraCIPacket.java --- .../src/org/vadere/manager/ClientHandler.java | 2 +- .../src/org/vadere/manager/TraCISocket.java | 2 +- .../org/vadere/manager/client/TestClient.java | 2 +- .../commandHandler/CommandExecutor.java | 2 +- .../commandHandler/CommandHandler.java | 2 +- .../commandHandler/PolygonCommandHandler.java | 2 +- .../SimulationCommandHandler.java | 2 +- .../manager/stsc/commands/TraCICommand.java | 14 +--- .../stsc/commands/TraCIGetCommand.java | 5 +- .../stsc/commands/TraCISetCommand.java | 2 +- .../commands/control/TraCICloseCommand.java | 5 +- .../control/TraCIGetVersionCommand.java | 5 +- .../commands/control/TraCILoadCommand.java | 2 +- .../control/TraCISendFileCommand.java | 5 +- .../commands/control/TraCISimStepCommand.java | 5 +- ... => ByteArrayOutputStreamTraCIWriter.java} | 6 +- .../stsc/{ => writer}/TraCIPacket.java | 78 ++++++++----------- ...ByteArrayOutputStreamTraCIWriterTest.java} | 8 +- .../vadere/manager/stsc/TraCIReaderTest.java | 6 +- 19 files changed, 66 insertions(+), 89 deletions(-) rename VadereManager/src/org/vadere/manager/stsc/writer/{TraCIWriterImpl.java => ByteArrayOutputStreamTraCIWriter.java} (97%) rename VadereManager/src/org/vadere/manager/stsc/{ => writer}/TraCIPacket.java (71%) rename VadereManager/tests/org/vadere/manager/stsc/{TraCIWriterImplTest.java => ByteArrayOutputStreamTraCIWriterTest.java} (97%) diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index 3b812a2e9..fae4de912 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -2,7 +2,7 @@ package org.vadere.manager; import org.vadere.manager.commandHandler.CommandExecutor; import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; import org.vadere.util.logging.Logger; diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index 0b168582c..1a86179c6 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -1,6 +1,6 @@ package org.vadere.manager; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; import org.vadere.manager.stsc.respons.TraCIResponse; diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index 74c936ff6..41591972e 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -3,7 +3,7 @@ package org.vadere.manager.client; import org.vadere.manager.TraCISocket; import org.vadere.manager.commandHandler.TraCIPersonVar; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.manager.stsc.commands.control.TraCICloseCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index 807e75f0e..a186075ba 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -1,7 +1,7 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.util.logging.Logger; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index fdc68a8f0..63eb1f7ca 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,7 +1,7 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java index ca9c0a91c..4fc515015 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java @@ -1,7 +1,7 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; /** * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Polygon API diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java index a352e226d..0ac837554 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java @@ -1,7 +1,7 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; /** * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Simulation API diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java index 3a59facf2..d0588ed24 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -3,7 +3,7 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.CmdType; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.commands.control.TraCILoadCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.reader.TraCICommandBuffer; @@ -46,9 +46,9 @@ public abstract class TraCICommand { case CTRL: return createControlCommand(cmd, cmdBuffer); case VALUE_GET: - return createGetCommand(cmd, cmdBuffer); + return new TraCIGetCommand(cmd, cmdBuffer); case VALUE_SET: - return createSetCommand(cmd, cmdBuffer); + return new TraCISetCommand(cmd, cmdBuffer); case VALUE_SUB: case CONTEXT_SUB: throw new TraCIException("Subscrtipons not implemente"); @@ -77,14 +77,6 @@ public abstract class TraCICommand { } - private static TraCICommand createGetCommand(TraCICmd cmd, TraCICommandBuffer cmdBuffer){ - return new TraCIGetCommand(cmd, cmdBuffer); - } - - private static TraCICommand createSetCommand(TraCICmd cmd, TraCICommandBuffer cmdBuffer){ - return new TraCISetCommand(cmd, cmdBuffer); - } - protected TraCICommand(TraCICmd traCICmd){ this.traCICmd = traCICmd; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index 4d94b4fd4..c374c57ce 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -1,7 +1,7 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.respons.TraCIGetResponse; @@ -36,8 +36,7 @@ public class TraCIGetCommand extends TraCICommand { public static TraCIPacket build(TraCICmd commandIdentifier, int variableIdentifier, String elementIdentifier){ int cmdLen = 1 + 1 + 1 + 4 + elementIdentifier.getBytes(StandardCharsets.US_ASCII).length; TraCIPacket packet = TraCIPacket.create(); - packet.getWriter() - .writeCommandLength(cmdLen) // [1|5] + packet.writeCommandLength(cmdLen) // [1|5] .writeUnsignedByte(commandIdentifier.id) // 1 .writeUnsignedByte(variableIdentifier) // 1 .writeString(elementIdentifier); // 4+strLen diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java index 7149c054d..33babfc8c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -2,7 +2,7 @@ package org.vadere.manager.stsc.commands; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.TraCIDataType; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java index a8baed30b..4eeb2e418 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java @@ -1,6 +1,6 @@ package org.vadere.manager.stsc.commands.control; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.respons.StatusResponse; @@ -14,8 +14,7 @@ public class TraCICloseCommand extends TraCICommand { public static TraCIPacket build(){ TraCIPacket packet = TraCIPacket.create(6); // 4 - packet.getWriter() - .writeUnsignedByte(2) // 1 + packet.writeUnsignedByte(2) // 1 .writeUnsignedByte(TraCICmd.CLOSE.id); // 1 return packet; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java index 36a389487..dbf1d0808 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java @@ -1,6 +1,6 @@ package org.vadere.manager.stsc.commands.control; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; @@ -11,8 +11,7 @@ public class TraCIGetVersionCommand extends TraCICommand { public static TraCIPacket build(){ TraCIPacket packet = TraCIPacket.create(6); // 4 - packet.getWriter() - .writeCommandLength(2) // 1 + packet.writeCommandLength(2) // 1 .writeUnsignedByte(TraCICmd.GET_VERSION.id); // 1 return packet; } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java index 2c4e5e155..6631c9661 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java @@ -1,7 +1,7 @@ package org.vadere.manager.stsc.commands.control; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.reader.TraCICommandBuffer; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java index ee2cf8173..4919a71ea 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java @@ -1,7 +1,7 @@ package org.vadere.manager.stsc.commands.control; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.reader.TraCICommandBuffer; @@ -14,8 +14,7 @@ public class TraCISendFileCommand extends TraCICommand { public static TraCIPacket TraCISendFileCommand(String file){ int strLen = file.getBytes(StandardCharsets.US_ASCII).length; TraCIPacket packet = TraCIPacket.create(); // 4 (add later) - packet.getWriter() - .writeCommandLength(1 + 1 + 4 + strLen) // [1|5] + packet.writeCommandLength(1 + 1 + 4 + strLen) // [1|5] .writeUnsignedByte(TraCICmd.SEND_FILE.id) // 1 .writeString(file); // 4+strLen return packet; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java index db003765c..1560a2a63 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java @@ -1,7 +1,7 @@ package org.vadere.manager.stsc.commands.control; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIPacket; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; @@ -13,8 +13,7 @@ public class TraCISimStepCommand extends TraCICommand { public static TraCIPacket build(double targetTime){ TraCIPacket packet = TraCIPacket.create(14); // 4 - packet.getWriter() - .writeUnsignedByte(10) // 1 + packet.writeUnsignedByte(10) // 1 .writeUnsignedByte(TraCICmd.SIM_STEP.id) // 1 .writeDouble(targetTime); // 8 return packet; diff --git a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriterImpl.java b/VadereManager/src/org/vadere/manager/stsc/writer/ByteArrayOutputStreamTraCIWriter.java similarity index 97% rename from VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriterImpl.java rename to VadereManager/src/org/vadere/manager/stsc/writer/ByteArrayOutputStreamTraCIWriter.java index 350b93e0c..a286a31ad 100644 --- a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriterImpl.java +++ b/VadereManager/src/org/vadere/manager/stsc/writer/ByteArrayOutputStreamTraCIWriter.java @@ -16,15 +16,15 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; -public class TraCIWriterImpl implements TraCIWriter { +public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { - private static Logger logger = Logger.getLogger(TraCIWriterImpl.class); + private static Logger logger = Logger.getLogger(ByteArrayOutputStreamTraCIWriter.class); ByteArrayOutputStream data; - public TraCIWriterImpl() { + public ByteArrayOutputStreamTraCIWriter() { data = new ByteArrayOutputStream(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java similarity index 71% rename from VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java rename to VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java index 3067b0006..4d6961ae8 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java @@ -1,6 +1,7 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.stsc.writer; import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.respons.StatusResponse; @@ -8,17 +9,15 @@ import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; import org.vadere.manager.stsc.respons.TraCIStatusResponse; -import org.vadere.manager.stsc.writer.TraCIWriter; -import org.vadere.manager.stsc.writer.TraCIWriterImpl; import java.nio.ByteBuffer; /** * //todo comment */ -public class TraCIPacket { +public class TraCIPacket extends ByteArrayOutputStreamTraCIWriter{ - private TraCIWriter writer; +// private TraCIWriter writer; private boolean emptyLengthField; private boolean finalized; // @@ -29,27 +28,27 @@ public class TraCIPacket { public static TraCIPacket create(int packetSize){ TraCIPacket packet = new TraCIPacket(); - packet.writer.writeInt(packetSize); + packet.writeInt(packetSize); return packet; } public static TraCIPacket sendStatus(TraCICmd cmd, TraCIStatusResponse status, String description){ TraCIPacket response = new TraCIPacket(); - int cmdLen = 7 + response.writer.getStringByteCount(description); + int cmdLen = 7 + response.getStringByteCount(description); if (cmdLen > 255){ //extended CMD cmdLen += 4; // add int field - response.writer.writeInt(4 + cmdLen); // packet size (4 + cmdLen) [4] - response.writer.writeUnsignedByte(0); // [1] - response.writer.writeInt(cmdLen); // [4] + response.writeInt(4 + cmdLen); // packet size (4 + cmdLen) [4] + response.writeUnsignedByte(0); // [1] + response.writeInt(cmdLen); // [4] } else { - response.writer.writeInt(4 + cmdLen); // [4] - response.writer.writeUnsignedByte(cmdLen); // [1] + response.writeInt(4 + cmdLen); // [4] + response.writeUnsignedByte(cmdLen); // [1] } - response.writer.writeUnsignedByte(cmd.id); // [1] - response.writer.writeUnsignedByte(status.id); // [1] - response.writer.writeString(description); //[4 + strLen] + response.writeUnsignedByte(cmd.id); // [1] + response.writeUnsignedByte(status.id); // [1] + response.writeString(description); //[4 + strLen] response.finalizePacket(); return response; } @@ -65,7 +64,7 @@ public class TraCIPacket { } private TraCIPacket() { - writer = new TraCIWriterImpl(); + super(); finalized = false; emptyLengthField = false; } @@ -74,7 +73,7 @@ public class TraCIPacket { private TraCIPacket addEmptyLengthField(){ if(emptyLengthField) throw new IllegalStateException("Should only be called at most once."); - writer.writeInt(-1); + writeInt(-1); emptyLengthField = true; return this; } @@ -84,22 +83,22 @@ public class TraCIPacket { // packet is valid TraCI packet an can be send. if (finalized) - return writer.asByteArray(); + return asByteArray(); // packet size must be set to correct value if (emptyLengthField){ - ByteBuffer packet = writer.asByteBuffer(); + ByteBuffer packet = asByteBuffer(); packet.putInt(packet.capacity()); packet.position(0); return packet.array(); } else { - return writer.asByteArray(); + return asByteArray(); } } private TraCIWriter getCmdBuilder(){ - return new TraCIWriterImpl(); + return new ByteArrayOutputStreamTraCIWriter(); } public TraCIPacket wrapGetResponse(TraCIGetResponse res){ @@ -152,12 +151,12 @@ public class TraCIPacket { public void addCommandWithoutLen(byte[] buffer){ if (buffer.length > 255){ - writer.writeUnsignedByte(0); - writer.writeInt(buffer.length + 5); // 1 + 4 length field - writer.writeBytes(buffer); + writeUnsignedByte(0); + writeInt(buffer.length + 5); // 1 + 4 length field + writeBytes(buffer); } else { - writer.writeUnsignedByte(buffer.length + 1); // 1 length field - writer.writeBytes(buffer); + writeUnsignedByte(buffer.length + 1); // 1 length field + writeBytes(buffer); } } @@ -175,10 +174,10 @@ public class TraCIPacket { public TraCIPacket add_OK_StatusResponse(int cmdIdentifier){ throwIfFinalized(); // simple OK Status without description. - writer.writeUnsignedByte(7); - writer.writeUnsignedByte(cmdIdentifier); - writer.writeUnsignedByte(TraCIStatusResponse.OK.id); - writer.writeInt(0); + writeUnsignedByte(7); + writeUnsignedByte(cmdIdentifier); + writeUnsignedByte(TraCIStatusResponse.OK.id); + writeInt(0); return this; } @@ -192,23 +191,14 @@ public class TraCIPacket { // expect single byte cmdLenField. // cmdLenField + cmdIdentifier + cmdResult + strLen + str // 1 + 1 + 1 + 4 + len(strBytes) - int cmdLen = 7 + writer.stringByteCount(description); + int cmdLen = 7 + stringByteCount(description); - writer.writeCommandLength(cmdLen); // 1b - writer.writeUnsignedByte(cmdIdentifier); // 1b - writer.writeUnsignedByte(response.id); // 4b - writer.writeString(description); // 4b + X + writeCommandLength(cmdLen); // 1b + writeUnsignedByte(cmdIdentifier); // 1b + writeUnsignedByte(response.id); // 4b + writeString(description); // 4b + X return this; } - public TraCIWriter getWriter(){ - throwIfFinalized(); - return writer; - } - - public int size(){ - return writer.size(); - } - } diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java b/VadereManager/tests/org/vadere/manager/stsc/ByteArrayOutputStreamTraCIWriterTest.java similarity index 97% rename from VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java rename to VadereManager/tests/org/vadere/manager/stsc/ByteArrayOutputStreamTraCIWriterTest.java index ab52d38b2..0258016d7 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIWriterImplTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/ByteArrayOutputStreamTraCIWriterTest.java @@ -7,7 +7,7 @@ import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; -import org.vadere.manager.stsc.writer.TraCIWriterImpl; +import org.vadere.manager.stsc.writer.ByteArrayOutputStreamTraCIWriter; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; @@ -20,13 +20,13 @@ import java.util.stream.IntStream; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; -public class TraCIWriterImplTest { +public class ByteArrayOutputStreamTraCIWriterTest { - TraCIWriterImpl writer; + ByteArrayOutputStreamTraCIWriter writer; @Before public void before(){ - writer = new TraCIWriterImpl(); + writer = new ByteArrayOutputStreamTraCIWriter(); } @After diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java index 52b80a2da..f9b10c3b9 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java @@ -7,7 +7,7 @@ import org.vadere.manager.stsc.reader.TraCIByteBuffer; import org.vadere.manager.stsc.sumo.LightPhase; import org.vadere.manager.stsc.sumo.RoadMapPosition; import org.vadere.manager.stsc.sumo.TrafficLightPhase; -import org.vadere.manager.stsc.writer.TraCIWriterImpl; +import org.vadere.manager.stsc.writer.ByteArrayOutputStreamTraCIWriter; import org.vadere.util.geometry.GeometryUtils; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; @@ -22,12 +22,12 @@ import static org.junit.Assert.assertThat; public class TraCIReaderTest { - TraCIWriterImpl writer; + ByteArrayOutputStreamTraCIWriter writer; TraCIByteBuffer reader; @Before public void before(){ - writer = new TraCIWriterImpl(); + writer = new ByteArrayOutputStreamTraCIWriter(); } @After -- GitLab From e54c69b2a0fe8d5546a90ead3bd42d354a0e01d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Mon, 10 Jun 2019 21:41:17 +0200 Subject: [PATCH 26/58] implement subscriptions for veins --- .../src/org/vadere/manager/ClientHandler.java | 12 +- .../src/org/vadere/manager/RemoteManager.java | 21 +- .../org/vadere/manager/TraCIException.java | 8 + .../commandHandler/CommandExecutor.java | 9 +- .../commandHandler/CommandHandler.java | 53 ++++ .../commandHandler/ControlCommandHandler.java | 21 +- .../commandHandler/PersonCommandHandler.java | 80 +++-- .../SimulationCommandHandler.java | 112 ++++++- .../manager/commandHandler/Subscription.java | 65 ++++ .../commandHandler/SubscriptionHandler.java | 12 + .../commandHandler/TraCISimulationVar.java | 47 +++ .../commandHandler/TraCIVehicleVar.java | 33 ++ .../commandHandler/VehicleCommandHandler.java | 57 ++++ .../src/org/vadere/manager/stsc/TraCICmd.java | 2 + .../manager/stsc/commands/TraCICommand.java | 3 +- .../stsc/commands/TraCIGetCommand.java | 13 +- .../TraCIValueSubscriptionCommand.java | 103 ++++++ .../commands/control/TraCISimStepCommand.java | 3 +- .../manager/stsc/reader/TraCIByteBuffer.java | 4 + .../stsc/reader/TraCICommandBuffer.java | 2 +- .../stsc/reader/TraCIPacketBuffer.java | 16 +- .../manager/stsc/reader/TraCIReader.java | 2 + .../manager/stsc/respons/TraCIResponse.java | 6 +- .../stsc/respons/TraCISimTimeResponse.java | 56 ++-- .../respons/TraCISubscriptionResponse.java | 182 +++++++++++ .../manager/stsc/writer/TraCIPacket.java | 56 +++- .../scenarios/roVerTest001.scenario | 295 ++++++++++++++++++ 27 files changed, 1185 insertions(+), 88 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/Subscription.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/SubscriptionHandler.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/TraCISimulationVar.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/TraCIVehicleVar.java create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/VehicleCommandHandler.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/commands/TraCIValueSubscriptionCommand.java create mode 100644 VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java create mode 100644 VadereManager/testResources/testProject001/scenarios/roVerTest001.scenario diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index fae4de912..0701158fd 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -2,8 +2,9 @@ package org.vadere.manager; import org.vadere.manager.commandHandler.CommandExecutor; import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; +import org.vadere.manager.stsc.writer.TraCIPacket; +import org.vadere.util.io.IOUtils; import org.vadere.util.logging.Logger; import java.io.EOFException; @@ -48,6 +49,13 @@ public class ClientHandler implements Runnable{ private void handleClient() throws IOException{ try{ logger.info("client connected..."); + String filePath = "/home/stsc/repos/vadere/VadereManager/testResources/testProject001/scenarios/roVerTest001.scenario"; + + String scenario = IOUtils.readTextFile(filePath); + logger.infof("load File..."); + remoteManager.loadScenario(scenario); + remoteManager.run(); + while (true){ TraCIPacketBuffer traCIPacketBuffer = traCISocket.receiveExact(); @@ -66,6 +74,8 @@ public class ClientHandler implements Runnable{ } } + } catch (Exception e) { + logger.error("Error while handling TraCI Message", e); } finally { traCISocket.close(); remoteManager.stopSimulationIfRunning(); diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index 0eff3e760..356457a16 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -1,6 +1,7 @@ package org.vadere.manager; import org.vadere.manager.commandHandler.StateAccessHandler; +import org.vadere.manager.commandHandler.Subscription; import org.vadere.simulator.control.RemoteManagerListener; import org.vadere.simulator.entrypoints.ScenarioFactory; import org.vadere.simulator.projects.RunnableFinishedListener; @@ -9,6 +10,8 @@ import org.vadere.simulator.projects.ScenarioRun; import org.vadere.util.logging.Logger; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.locks.ReentrantLock; /** @@ -25,11 +28,14 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis private ReentrantLock lock; private boolean lastSimulationStep; + private List subscriptions; + public RemoteManager() { waitForLoopEnd = new Object(); lock = new ReentrantLock(); lastSimulationStep = false; + subscriptions = new ArrayList<>(); } public void loadScenario(String scenarioString) { @@ -53,9 +59,19 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis } - synchronized public void accessState(StateAccessHandler stateAccessHandler){ - try { + public void addValueSubscription(Subscription sub){ + subscriptions.add(sub); + } + + public List getSubscriptions(){ + return subscriptions; + } + + synchronized public boolean accessState(StateAccessHandler stateAccessHandler){ + if (currentSimulationRun == null) + return false; + try { if (!currentSimulationRun.isWaitForSimCommand()) { synchronized (waitForLoopEnd){ waitForLoopEnd.wait(); @@ -70,6 +86,7 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis } finally { lock.unlock(); } + return true; } synchronized public void nextStep(double simTime){ diff --git a/VadereManager/src/org/vadere/manager/TraCIException.java b/VadereManager/src/org/vadere/manager/TraCIException.java index 16731edb4..9c7a2f7ee 100644 --- a/VadereManager/src/org/vadere/manager/TraCIException.java +++ b/VadereManager/src/org/vadere/manager/TraCIException.java @@ -9,6 +9,14 @@ public class TraCIException extends RuntimeException { super(message); } + public TraCIException(String message, Object... arg) { + super(String.format(message, arg)); + } + + public TraCIException(String message, Throwable cause, Object... arg) { + super(String.format(message, arg), cause); + } + public TraCIException(String message, Throwable cause) { super(message, cause); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index a186075ba..31009aa5f 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -1,9 +1,9 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.util.logging.Logger; import java.util.HashMap; @@ -44,8 +44,15 @@ public class CommandExecutor { cmdMap.put(TraCICmd.SEND_FILE.id, ControlCommandHandler.instance::process_load_file); cmdMap.put(TraCICmd.GET_PERSON_VALUE.id, PersonCommandHandler.instance::processGet); cmdMap.put(TraCICmd.SET_PERSON_STATE.id, PersonCommandHandler.instance::processSet); + cmdMap.put(TraCICmd.SUB_PERSON_VARIABLE.id, PersonCommandHandler.instance::processValueSub); + cmdMap.put(TraCICmd.GET_SIMULATION_VALUE.id, SimulationCommandHandler.instance::processGet); + cmdMap.put(TraCICmd.SET_SIMULATION_STATE.id, SimulationCommandHandler.instance::processSet); + cmdMap.put(TraCICmd.SUB_SIMULATION_VALUE.id, SimulationCommandHandler.instance::processValueSub); + cmdMap.put(TraCICmd.GET_VEHICLE_VALUE.id, VehicleCommandHandler.instance::processGet); + cmdMap.put(TraCICmd.SUB_VEHICLE_VALUE.id, VehicleCommandHandler.instance::processValueSub); } + public TraCIPacket execute(TraCICommand cmd){ TraCICmdHandler handler = cmdMap.get(cmd.getTraCICmd().id); if (handler == null){ diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 63eb1f7ca..41d543d7f 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -1,10 +1,19 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.stsc.commands.TraCIValueSubscriptionCommand; +import org.vadere.manager.stsc.respons.StatusResponse; +import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.manager.stsc.writer.TraCIPacket; import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; +import java.util.ArrayList; +import java.util.List; + /** * {@link CommandHandler} classes perform the actual request within the command. @@ -28,4 +37,48 @@ public abstract class CommandHandler { TraCIStatusResponse.ERR, "Command " + cmd.getCmdType().toString() + "Unknown")); } + + public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData, TraCICmd apiCmd, TraCICmd apiCmdResponse){ + TraCIGetResponse res = new TraCIGetResponse( + new StatusResponse(apiCmd, TraCIStatusResponse.OK, ""), + apiCmdResponse); + res.setResponseDataType(responseDataType); + res.setResponseData(responseData); + return res; + } + + public TraCIGetResponse responseERR(String err, TraCICmd apiCmd, TraCICmd apiCmdResponse){ + TraCIGetResponse res = new TraCIGetResponse( + new StatusResponse(apiCmd, TraCIStatusResponse.ERR, err), + apiCmdResponse); + return res; + } + + + public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager, + TraCICmdHandler traCICmdHandler, TraCICmd apiCmd, TraCICmd apiCmdResponse){ + TraCIValueSubscriptionCommand cmd = (TraCIValueSubscriptionCommand)rawCmd; + + List getCommands = new ArrayList<>(); + + cmd.getVariables().forEach(var -> { + getCommands.add(new TraCIGetCommand(apiCmd, var, cmd.getElementIdentifier())); + }); + + cmd.setGetCommands(getCommands); + // add correct Get-Handler and the subscription command to the remoteManager + // after each SIM_STEP command the remoteMangers knows how to gather + // the subscribed variables. It is the responsibility of the + // TraCIValueSubscriptionCommand implementation to translate the TraCIGetResponses + // into a single TraCISubscriptionResponse. + Subscription sub = new Subscription(traCICmdHandler, apiCmdResponse, cmd); + remoteManager.addValueSubscription(sub ); + + // process the current subscription to return the initial response for the given subscription + // return value not needed. The result is directly saved in getCmd.setResponse(...) + // in the process_X methods. + sub.executeSubscription(remoteManager); + + return cmd; + } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 9c4296d9c..ee274ef3b 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -3,14 +3,15 @@ package org.vadere.manager.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.manager.VadereServer; -import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.control.TraCICloseCommand; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; +import org.vadere.manager.stsc.respons.StatusResponse; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; +import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.util.logging.Logger; /** @@ -47,13 +48,21 @@ public class ControlCommandHandler extends CommandHandler{ public TraCICommand process_simStep(TraCICommand rawCmd, RemoteManager remoteManager) { TraCISimStepCommand cmd = (TraCISimStepCommand) rawCmd; - remoteManager.nextStep(cmd.getTargetTime()); + logger.infof("Simulate next step %f", cmd.getTargetTime()); +// remoteManager.nextStep(cmd.getTargetTime()); + remoteManager.nextStep(-1); //todo problem if 0.4 is used direclty - remoteManager.accessState((manger, state) -> { - cmd.setResponse(new TraCISimTimeResponse(state.getStep(), TraCIDataType.INTEGER)); - }); + // execute all + remoteManager.getSubscriptions().forEach(sub -> sub.executeSubscription(remoteManager)); - logger.infof("Simulate next step %f", cmd.getTargetTime()); + // get responses + TraCISimTimeResponse response = new TraCISimTimeResponse( + new StatusResponse(cmd.getTraCICmd(), TraCIStatusResponse.OK, "")); + + remoteManager.getSubscriptions().forEach(sub -> { + response.addSubscriptionResponse(sub.getValueSubscriptionCommand().getResponse()); + }); + cmd.setResponse(response); return cmd; } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index 8f3b94361..b098fcb82 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -5,9 +5,7 @@ import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.respons.StatusResponse; import org.vadere.manager.stsc.respons.TraCIGetResponse; -import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.util.geometry.shapes.VPoint; import java.util.List; @@ -42,20 +40,19 @@ public class PersonCommandHandler extends CommandHandler{ // } // } - private TraCIGetResponse response(TraCIDataType responseDataType, Object responseData){ - TraCIGetResponse res = new TraCIGetResponse( - new StatusResponse(TraCICmd.GET_PERSON_VALUE, TraCIStatusResponse.OK, ""), - TraCICmd.RESPONSE_GET_PERSON_VALUE); - res.setResponseDataType(responseDataType); - res.setResponseData(responseData); - return res; + public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ + return responseOK(responseDataType, responseData, TraCICmd.GET_PERSON_VALUE, TraCICmd.RESPONSE_GET_PERSON_VALUE); + } + + public TraCIGetResponse responseERR(String err){ + return responseERR(err, TraCICmd.GET_PERSON_VALUE, TraCICmd.RESPONSE_GET_PERSON_VALUE); } @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, variable = TraCIPersonVar.ID_LIST, clientCommandName = "getIDList") - protected TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + private TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ // elementIdentifier ignored. remoteManager.accessState((manager, state) -> { List data = state.getTopography().getPedestrianDynamicElements() @@ -63,7 +60,7 @@ public class PersonCommandHandler extends CommandHandler{ .stream() .map(p -> Integer.toString(p.getId())) .collect(Collectors.toList()); - TraCIGetResponse res = response(traCIVar.returnType, data); + TraCIGetResponse res = responseOK(traCIVar.returnType, data); cmd.setResponse(res); }); @@ -74,11 +71,11 @@ public class PersonCommandHandler extends CommandHandler{ commandIdentifier = TraCICmd.GET_PERSON_VALUE, variable = TraCIPersonVar.COUNT, clientCommandName = "getIDCount") - protected TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + private TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { int numPeds = state.getTopography().getPedestrianDynamicElements().getElements().size(); - cmd.setResponse(response(traCIVar.returnType, numPeds)); + cmd.setResponse(responseOK(traCIVar.returnType, numPeds)); }); return cmd; @@ -89,14 +86,14 @@ public class PersonCommandHandler extends CommandHandler{ commandIdentifier = TraCICmd.GET_PERSON_VALUE, variable = TraCIPersonVar.SPEED, clientCommandName = "getSpeed") - protected TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + private TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { double speed = state.getTopography() .getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getVelocity().getLength(); - cmd.setResponse(response(traCIVar.returnType, speed)); + cmd.setResponse(responseOK(traCIVar.returnType, speed)); }); return cmd; @@ -106,13 +103,13 @@ public class PersonCommandHandler extends CommandHandler{ commandIdentifier = TraCICmd.GET_PERSON_VALUE, variable = TraCIPersonVar.POS_2D, clientCommandName = "getPosition2D") - protected TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + private TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { VPoint pos = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getPosition(); - cmd.setResponse(response(traCIVar.returnType, pos)); + cmd.setResponse(responseOK(traCIVar.returnType, pos)); }); return cmd; @@ -123,13 +120,13 @@ public class PersonCommandHandler extends CommandHandler{ commandIdentifier = TraCICmd.GET_PERSON_VALUE, variable = TraCIPersonVar.LENGTH, clientCommandName = "getLength") - protected TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + private TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { double pedLength = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getRadius() *2; - cmd.setResponse(response(traCIVar.returnType, pedLength)); + cmd.setResponse(responseOK(traCIVar.returnType, pedLength)); }); return cmd; @@ -140,18 +137,56 @@ public class PersonCommandHandler extends CommandHandler{ commandIdentifier = TraCICmd.GET_PERSON_VALUE, variable = TraCIPersonVar.WIDTH, clientCommandName = "getWidth") - protected TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + private TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { double pedWidth= state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getRadius() *2; - cmd.setResponse(response(traCIVar.returnType, pedWidth)); + cmd.setResponse(responseOK(traCIVar.returnType, pedWidth)); }); return cmd; } + @PersonHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + variable = TraCIPersonVar.ROAD_ID, + clientCommandName = "getRoadId" + ) + private TraCICommand process_getRoadId(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar) { + // return dummy value + cmd.setResponse(responseOK(traCIVar.returnType, "road000")); + return cmd; + } + + @PersonHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + variable = TraCIPersonVar.ANGLE, + clientCommandName = "getAngle" + ) + private TraCICommand process_getAngle(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar) { + // return dummy value + cmd.setResponse(responseOK(traCIVar.returnType, 0.0)); + return cmd; + } + + @PersonHandler( + commandIdentifier = TraCICmd.GET_PERSON_VALUE, + variable = TraCIPersonVar.TYPE, + clientCommandName = "getType" + ) + private TraCICommand process_getType(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar) { + // return dummy value + cmd.setResponse(responseOK(traCIVar.returnType, "pedestrian")); + return cmd; + } + + + public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ + return processValueSub(rawCmd, remoteManager, this::processGet, + TraCICmd.SUB_PERSON_VARIABLE, TraCICmd.RESPONSE_SUB_PERSON_VARIABLE); + } public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; @@ -186,8 +221,11 @@ public class PersonCommandHandler extends CommandHandler{ case WAITING_TIME: case POS_3D: case ANGLE: + return process_getAngle(getCmd, remoteManager, var); case ROAD_ID: + return process_getRoadId(getCmd, remoteManager, var); case TYPE: + return process_getType(getCmd, remoteManager, var); case COLOR: case EDGE_POS: case MIN_GAP: diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java index 0ac837554..a303ebdd5 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java @@ -1,19 +1,119 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.RemoteManager; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.writer.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.util.geometry.shapes.VPoint; + +import java.awt.geom.Rectangle2D; +import java.util.ArrayList; /** * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Simulation API */ -public class SimulationCommandHandler { +public class SimulationCommandHandler extends CommandHandler{ + + public static SimulationCommandHandler instance; + + static { + instance = new SimulationCommandHandler(); + } + + private SimulationCommandHandler(){} + + public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ + return responseOK(responseDataType, responseData, TraCICmd.GET_SIMULATION_VALUE, TraCICmd.RESPONSE_GET_SIMULATION_VALUE); + } + + public TraCIGetResponse responseERR(TraCIDataType responseDataType, Object responseData){ + return responseOK(responseDataType, responseData, TraCICmd.GET_SIMULATION_VALUE, TraCICmd.RESPONSE_GET_SIMULATION_VALUE); + } + + private TraCICommand process_getNetworkBound(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + + remoteManager.accessState((manager, state) -> { + Rectangle2D.Double rec = state.getTopography().getBounds(); + + VPoint lowLeft = new VPoint(rec.getMinX(), rec.getMinY()); + VPoint highRight = new VPoint(rec.getMaxX(), rec.getMaxX()); + ArrayList polyList = new ArrayList<>(); + polyList.add(lowLeft); + polyList.add(highRight); + cmd.setResponse(responseOK(traCIVar.returnType, polyList)); + }); + + return cmd; + } + + private TraCICommand process_getSimTime(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + + remoteManager.accessState((manager, state) -> { + double time = state.getSimTimeInSec(); + cmd.setResponse(responseOK(traCIVar.returnType, time)); + }); + + return cmd; + } - static public TraCIPacket processGet(TraCICommand cmd){ - return null; + private TraCICommand process_getVehiclesStartTeleportIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + + cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + return cmd; + } + + private TraCICommand process_getVehiclesEndTeleportIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + + cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + return cmd; + } + + private TraCICommand process_getVehiclesStartParkingIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + + cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + return cmd; + } + + private TraCICommand process_getVehiclesStopParkingIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + + cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + return cmd; + } + + public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ + return processValueSub(rawCmd, remoteManager, this::processGet, + TraCICmd.SUB_SIMULATION_VALUE, TraCICmd.RESPONSE_SUB_SIMULATION_VALUE); } - static public TraCIPacket processSet(TraCICommand cmd){ - return null; + + public TraCICommand processGet(TraCICommand rawCmd, RemoteManager remoteManager){ + + TraCIGetCommand cmd = (TraCIGetCommand) rawCmd; + TraCISimulationVar var = TraCISimulationVar.fromId(cmd.getVariableIdentifier()); + switch (var){ + case NETWORK_BOUNDING_BOX_2D: + return process_getNetworkBound(cmd, remoteManager, var); + case CURR_SIM_TIME: + return process_getSimTime(cmd, remoteManager, var); + case VEHICLES_START_TELEPORT_IDS: + return process_getVehiclesStartTeleportIDs(cmd, remoteManager, var); + case VEHICLES_END_TELEPORT_IDS: + return process_getVehiclesEndTeleportIDs(cmd, remoteManager, var); + case VEHICLES_START_PARKING_IDS: + return process_getVehiclesStartParkingIDs(cmd, remoteManager, var); + case VEHICLES_STOP_PARKING_IDS: + return process_getVehiclesStopParkingIDs(cmd, remoteManager, var); + + default: + return process_NotImplemented(cmd, remoteManager); + } + } + + public TraCICommand processSet(TraCICommand cmd, RemoteManager remoteManager) { + return process_NotImplemented(cmd, remoteManager); + } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java b/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java new file mode 100644 index 000000000..1a792b533 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java @@ -0,0 +1,65 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.RemoteManager; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.stsc.commands.TraCIValueSubscriptionCommand; +import org.vadere.manager.stsc.respons.StatusResponse; +import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.manager.stsc.respons.TraCIStatusResponse; +import org.vadere.manager.stsc.respons.TraCISubscriptionResponse; + +public class Subscription { + + TraCICmdHandler traCICmdHandler; + TraCICmd responseIdentifier; + TraCIValueSubscriptionCommand valueSubscriptionCommand; + + public Subscription(TraCICmdHandler traCICmdHandler, TraCICmd responseIdentifier, TraCIValueSubscriptionCommand valueSubscriptionCommand) { + this.traCICmdHandler = traCICmdHandler; + this.responseIdentifier = responseIdentifier; + this.valueSubscriptionCommand = valueSubscriptionCommand; + } + + public void executeSubscription(RemoteManager remoteManager){ + TraCISubscriptionResponse subResponse = new TraCISubscriptionResponse( + new StatusResponse(valueSubscriptionCommand.getTraCICmd(), TraCIStatusResponse.OK, ""), + responseIdentifier, valueSubscriptionCommand.getElementIdentifier(), valueSubscriptionCommand.getNumberOfVariables()); + + for (TraCIGetCommand getCmd : valueSubscriptionCommand.getGetCommands()) { + traCICmdHandler.handel(getCmd, remoteManager); + TraCIGetResponse getResponse = getCmd.getResponse(); + subResponse.addVariableResponse(getResponse.getVariableIdentifier(), + getResponse.getStatusResponse().getResponse(), + getResponse.getResponseDataType(), + getResponse.getResponseData()); + } + + valueSubscriptionCommand.setResponse(subResponse); + + } + + public TraCICmdHandler getTraCICmdHandler() { + return traCICmdHandler; + } + + public void setTraCICmdHandler(TraCICmdHandler traCICmdHandler) { + this.traCICmdHandler = traCICmdHandler; + } + + public TraCICmd getResponseIdentifier() { + return responseIdentifier; + } + + public void setResponseIdentifier(TraCICmd responseIdentifier) { + this.responseIdentifier = responseIdentifier; + } + + public TraCIValueSubscriptionCommand getValueSubscriptionCommand() { + return valueSubscriptionCommand; + } + + public void setValueSubscriptionCommand(TraCIValueSubscriptionCommand valueSubscriptionCommand) { + this.valueSubscriptionCommand = valueSubscriptionCommand; + } +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SubscriptionHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/SubscriptionHandler.java new file mode 100644 index 000000000..f97cba537 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/SubscriptionHandler.java @@ -0,0 +1,12 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.stsc.commands.TraCIGetCommand; + +import java.util.List; + +@FunctionalInterface +public interface SubscriptionHandler { + + void handel(List getCommands); + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCISimulationVar.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCISimulationVar.java new file mode 100644 index 000000000..ee2ba010d --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCISimulationVar.java @@ -0,0 +1,47 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCIDataType; + +public enum TraCISimulationVar { + + CURR_SIM_TIME(0x66, TraCIDataType.DOUBLE), + NUM_LOADED_VEHICLES(0x71, TraCIDataType.INTEGER), + LOADED_VEHICLES_IDS(0x72, TraCIDataType.STRING_LIST), + NUM_DEPARTED_VEHICLES(0x73, TraCIDataType.INTEGER), + DEPARTED_VEHICLES_IDS(0x74, TraCIDataType.STRING_LIST), + NUM_VEHICLES_START_TELEPORT(0x75, TraCIDataType.INTEGER), + VEHICLES_START_TELEPORT_IDS(0x76, TraCIDataType.STRING_LIST), + NUM_VEHICLES_END_TELEPORT(0x77, TraCIDataType.INTEGER), + VEHICLES_END_TELEPORT_IDS(0x78, TraCIDataType.STRING_LIST), + VEHICLES_START_PARKING_IDS(0x6d, TraCIDataType.STRING_LIST), + VEHICLES_STOP_PARKING_IDS(0x6f, TraCIDataType.STRING_LIST), + // + NETWORK_BOUNDING_BOX_2D(0x7c, TraCIDataType.POLYGON) + + ; + + public int id; + public TraCIDataType returnType; + + TraCISimulationVar(int id, TraCIDataType retVal) { + this.id = id; + this.returnType = retVal; + } + + public static TraCISimulationVar fromId(int id){ + for(TraCISimulationVar var : values()){ + if (var.id == id) + return var; + } + throw new TraCIException(String.format("No simulation variable found with id: %02X", id)); + } + + @Override + public String toString() { + return "TraCISimulationVar{" + + "id=" + id + + ", returnType=" + returnType + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIVehicleVar.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCIVehicleVar.java new file mode 100644 index 000000000..f4bddae81 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCIVehicleVar.java @@ -0,0 +1,33 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCIDataType; + +public enum TraCIVehicleVar { + ID_LIST(0x00, TraCIDataType.STRING_LIST); + + public int id; + public TraCIDataType returnType; + + TraCIVehicleVar(int id, TraCIDataType retVal) { + this.id = id; + this.returnType = retVal; + } + + + public static TraCIVehicleVar fromId(int id){ + for(TraCIVehicleVar var : values()){ + if (var.id == id) + return var; + } + throw new TraCIException(String.format("No vehicle variable found with id: %02X", id)); + } + + @Override + public String toString() { + return "TraCIVehicleVar{" + + "id=" + id + + ", returnType=" + returnType + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/VehicleCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/VehicleCommandHandler.java new file mode 100644 index 000000000..6ac29593c --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/VehicleCommandHandler.java @@ -0,0 +1,57 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.RemoteManager; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.stsc.respons.TraCIGetResponse; + +import java.util.ArrayList; + +public class VehicleCommandHandler extends CommandHandler{ + + public static VehicleCommandHandler instance; + +// private HashMap handler; + + static { + instance = new VehicleCommandHandler(); + } + + public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ + return responseOK(responseDataType, responseData, TraCICmd.GET_VEHICLE_VALUE, TraCICmd.RESPONSE_GET_VEHICLE_VALUE); + } + + public TraCIGetResponse responseERR(String err){ + return responseERR(err, TraCICmd.GET_VEHICLE_VALUE, TraCICmd.RESPONSE_GET_VEHICLE_VALUE); + } + + private TraCICommand process_getIDList(TraCIGetCommand rawCmd, RemoteManager remoteManager, TraCIVehicleVar traCIVar){ + + // always return an empty list + rawCmd.setResponse(responseOK(TraCIDataType.STRING_LIST, new ArrayList<>())); + + return rawCmd; + } + + + public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ + return processValueSub(rawCmd, remoteManager, this::processGet, + TraCICmd.SUB_VEHICLE_VALUE, TraCICmd.RESPONSE_SUB_VEHICLE_VALUE); + } + + public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager){ + TraCIGetCommand getCmd = (TraCIGetCommand) cmd; + + TraCIVehicleVar var = TraCIVehicleVar.fromId(getCmd.getVariableIdentifier()); + + switch (var){ + case ID_LIST: + return process_getIDList(getCmd, remoteManager, var); + default: + return process_UnknownCommand(getCmd, remoteManager); + } + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java index 04ff591a2..7dffa5f10 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java +++ b/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java @@ -81,6 +81,8 @@ public enum TraCICmd { RESPONSE_SUB_EDGE_VALUE(0xea, CmdType.RESPONSE), SUB_SIMULATION_VALUE(0xdb, CmdType.VALUE_SUB), RESPONSE_SUB_SIMULATION_VALUE(0xeb, CmdType.RESPONSE), + SUB_PERSON_VARIABLE(0xde, CmdType.VALUE_SUB), + RESPONSE_SUB_PERSON_VARIABLE(0xee, CmdType.RESPONSE), // TraCI/Object Context Subscription ; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java index d0588ed24..3746eb00f 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java @@ -50,8 +50,9 @@ public abstract class TraCICommand { case VALUE_SET: return new TraCISetCommand(cmd, cmdBuffer); case VALUE_SUB: + return new TraCIValueSubscriptionCommand(cmd, cmdBuffer); case CONTEXT_SUB: - throw new TraCIException("Subscrtipons not implemente"); + throw new TraCIException("Subscription not implement. Command: 0x%02X", cmd.id); default: throw new IllegalStateException("Should not be reached. All CmdType enums are tested in switch statement"); } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java index c374c57ce..3746e6476 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java @@ -44,6 +44,12 @@ public class TraCIGetCommand extends TraCICommand { return packet; } + public TraCIGetCommand(TraCICmd traCICmd, int variableIdentifier, String elementIdentifier) { + super(traCICmd); + this.variableIdentifier = variableIdentifier; + this.elementIdentifier = elementIdentifier; + } + public TraCIGetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); variableIdentifier = cmdBuffer.readUnsignedByte(); @@ -76,13 +82,8 @@ public class TraCIGetCommand extends TraCICommand { this.response = response; } - - @Override public TraCIPacket buildResponsePacket() { - if (NOK_response != null) - return NOK_response; - else - return TraCIPacket.create().wrapGetResponse(response); + return TraCIPacket.create().wrapGetResponse(response); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIValueSubscriptionCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIValueSubscriptionCommand.java new file mode 100644 index 000000000..85bbdd391 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCIValueSubscriptionCommand.java @@ -0,0 +1,103 @@ +package org.vadere.manager.stsc.commands; + +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.stsc.respons.TraCISubscriptionResponse; +import org.vadere.manager.stsc.writer.TraCIPacket; + +import java.util.ArrayList; +import java.util.List; + +public class TraCIValueSubscriptionCommand extends TraCICommand { + + private double beginTime; + private double endTime; + private String elementIdentifier; + private int numberOfVariables; + private List variables; + + private List getCommands; + + private TraCISubscriptionResponse response; + + + protected TraCIValueSubscriptionCommand(TraCICmd traCICmd, TraCICommandBuffer buffer) { + this(traCICmd); + beginTime = buffer.readDouble(); + endTime = buffer.readDouble(); + elementIdentifier = buffer.readString(); + numberOfVariables = buffer.readUnsignedByte(); + + for (int i = 0; i < numberOfVariables; i++) { + int var = buffer.readUnsignedByte(); + variables.add(var); + } + } + + protected TraCIValueSubscriptionCommand(TraCICmd traCICmd) { + super(traCICmd); + variables = new ArrayList<>(); + getCommands = new ArrayList<>(); + } + + @Override + public TraCIPacket buildResponsePacket() { + return TraCIPacket.create().wrapValueSubscriptionCommand(response); + } + + public double getBeginTime() { + return beginTime; + } + + public void setBeginTime(double beginTime) { + this.beginTime = beginTime; + } + + public double getEndTime() { + return endTime; + } + + public void setEndTime(double endTime) { + this.endTime = endTime; + } + + public String getElementIdentifier() { + return elementIdentifier; + } + + public void setElementIdentifier(String elementIdentifier) { + this.elementIdentifier = elementIdentifier; + } + + public int getNumberOfVariables() { + return numberOfVariables; + } + + public void setNumberOfVariables(int numberOfVariables) { + this.numberOfVariables = numberOfVariables; + } + + public List getVariables() { + return variables; + } + + public void setVariables(List variables) { + this.variables = variables; + } + + public TraCISubscriptionResponse getResponse() { + return response; + } + + public void setResponse(TraCISubscriptionResponse response) { + this.response = response; + } + + public List getGetCommands() { + return getCommands; + } + + public void setGetCommands(List getCommands) { + this.getCommands = getCommands; + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java index 1560a2a63..8afb2530f 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java @@ -28,7 +28,6 @@ public class TraCISimStepCommand extends TraCICommand { return targetTime; } - public void setTargetTime(double targetTime) { this.targetTime = targetTime; } @@ -46,6 +45,6 @@ public class TraCISimStepCommand extends TraCICommand { if (NOK_response != null) return NOK_response; else - return TraCIPacket.create().wrapSimTimeStepCommand(this); // TODO + return TraCIPacket.create().wrapSimTimeStepCommand(response); // TODO } } diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java index 223353396..7cdd11fb2 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java @@ -246,6 +246,10 @@ public class TraCIByteBuffer implements TraCIReader { throw new TraCIException("Not enough bytes left." + "Expected " + num + "Bytes but only " + bytesLeft + " found."); } + @Override + public int limit() { + return byteBuffer.limit(); + } } diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java index 87b02a792..da6943c5d 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java @@ -6,7 +6,7 @@ import java.nio.ByteBuffer; * A simple Wrapper around a {@link TraCIReader} which knows how to traverse a single command. * * The class expects that the given buffer only contains *one* command. The command length filed - * (1 byte or 5 bytes, depending on the command size) must be removed before creating an instance. + * (1 byte or 5 bytes, depending on the command limit) must be removed before creating an instance. * */ public class TraCICommandBuffer extends TraCIByteBuffer { diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java index 8e9f423bf..52d7e51ed 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java @@ -1,5 +1,6 @@ package org.vadere.manager.stsc.reader; +import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.respons.StatusResponse; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.respons.TraCIResponse; @@ -56,9 +57,18 @@ public class TraCIPacketBuffer extends TraCIByteBuffer { // only StatusResponse return TraCIResponse.create(statusResponse); } else { - int responseDataLen = getCommandDataLen(); - ByteBuffer buffer = readByteBuffer(responseDataLen); - return TraCIResponse.create(statusResponse, buffer); + if (statusResponse.getCmdIdentifier().equals(TraCICmd.SIM_STEP)){ + // The sim step command does follow the standard command structure. + // After the status command follows a single int encoding the number of + // subscription results which will follow. Thus in case of SIM_STEP + // give all remaining data to the factory. + return TraCIResponse.create(statusResponse, readByteBuffer(limit())); + } else { + int responseDataLen = getCommandDataLen(); + ByteBuffer buffer = readByteBuffer(responseDataLen); + return TraCIResponse.create(statusResponse, buffer); + } + } } diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java index 1d040b7aa..b2a023d68 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java @@ -59,4 +59,6 @@ public interface TraCIReader { boolean hasRemaining(); void ensureBytes(int num); + + int limit(); } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java index ab2120e09..43338e401 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java @@ -74,12 +74,14 @@ public class TraCIResponse { // instance methods - public TraCIResponse (StatusResponse statusResponse, TraCICmd responseIdentifier - ){ + public TraCIResponse (StatusResponse statusResponse, TraCICmd responseIdentifier){ this.statusResponse = statusResponse; this.responseIdentifier = responseIdentifier; } + public TraCIResponse(TraCICmd responseIdentifier){ + + } public StatusResponse getStatusResponse() { return statusResponse; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java index e7ff5b959..5d73ac932 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java @@ -1,9 +1,11 @@ package org.vadere.manager.stsc.respons; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import java.util.ArrayList; +import java.util.List; + /** * Response object for {@link org.vadere.manager.stsc.commands.control.TraCISimStepCommand} * command. It includes all subscriptions previously added by each client. @@ -12,44 +14,46 @@ import org.vadere.manager.stsc.reader.TraCICommandBuffer; */ public class TraCISimTimeResponse extends TraCIResponse { - private Object subscriptionData; - private TraCIDataType subscriptionDataType; +// private int numberOfSubscriptions; + private List subscriptionResponses; + public TraCISimTimeResponse (StatusResponse statusResponse, TraCICommandBuffer buffer){ - super(statusResponse, TraCICmd.SIM_STEP); - subscriptionDataType = TraCIDataType.fromId(buffer.readUnsignedByte()); - subscriptionData = buffer.readTypeValue(subscriptionDataType); + this(statusResponse); + int numberOfSubscriptions = buffer.readInt(); + for(int i=0; i(); } - public Object getSubscriptionData() { - return subscriptionData; + public int getNumberOfSubscriptions() { + return subscriptionResponses.size(); } - public void setSubscriptionData(Object subscriptionData) { - this.subscriptionData = subscriptionData; + public List getSubscriptionResponses() { + return subscriptionResponses; } - public TraCIDataType getSubscriptionDataType() { - return subscriptionDataType; + public void setSubscriptionResponses(List subscriptionResponses) { + this.subscriptionResponses = subscriptionResponses; } - public void setSubscriptionDataType(TraCIDataType subscriptionDataType) { - this.subscriptionDataType = subscriptionDataType; + public void addSubscriptionResponse(TraCISubscriptionResponse response){ + this.subscriptionResponses.add(response); } - @Override - public String toString() { - return "TraCISimTimeResponse{" + - "subscriptionData=" + subscriptionData + - ", subscriptionDataType=" + subscriptionDataType + - '}'; - } + + + + + } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java new file mode 100644 index 000000000..3b1391394 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java @@ -0,0 +1,182 @@ +package org.vadere.manager.stsc.respons; + +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class TraCISubscriptionResponse extends TraCIResponse { + + private String elementId; + private int numberOfVariables; + private List responses; + + + + + public TraCISubscriptionResponse(StatusResponse statusResponse, TraCICmd responseIdentifier, TraCICommandBuffer buffer) { + this(statusResponse, responseIdentifier); + + elementId = buffer.readString(); + numberOfVariables = buffer.readUnsignedByte(); + for(int i=0; i(); + } + + public void addVariableResponse(int variableId, TraCIStatusResponse status, TraCIDataType dataType, Object value){ + responses.add(new SingeVarResponse(variableId, status, dataType, value)); + } + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public int getNumberOfVariables() { + return numberOfVariables; + } + + public void setNumberOfVariables(int numberOfVariables) { + this.numberOfVariables = numberOfVariables; + } + + public List getResponses() { + return responses; + } + + public void setResponses(List responses) { + this.responses = responses; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TraCISubscriptionResponse that = (TraCISubscriptionResponse) o; + return numberOfVariables == that.numberOfVariables && + elementId.equals(that.elementId) && + responses.equals(that.responses); + } + + @Override + public int hashCode() { + return Objects.hash(elementId, numberOfVariables, responses); + } + + @Override + public String toString() { + return "TraCISubscriptionResponse{" + + "elementId='" + elementId + '\'' + + ", numberOfVariables=" + numberOfVariables + + ", responses=" + responses + + ", statusResponse=" + statusResponse + + '}'; + } + + public class SingeVarResponse { + + int variableId; + TraCIStatusResponse status; + TraCIDataType variableDataType; + Object variableValue; + + public SingeVarResponse(TraCICommandBuffer buffer) { + variableId = buffer.readUnsignedByte(); + status = TraCIStatusResponse.fromId(buffer.readUnsignedByte()); + if(status.equals(TraCIStatusResponse.OK)){ + variableDataType = TraCIDataType.fromId(buffer.readUnsignedByte()); + } else { + variableDataType = TraCIDataType.STRING; // ERR + } + variableValue = buffer.readTypeValue(variableDataType); + } + + public SingeVarResponse(int variableId, TraCIStatusResponse status, TraCIDataType variableDataType, Object variableValue) { + this.variableId = variableId; + this.status = status; + this.variableDataType = variableDataType; + this.variableValue = variableValue; + } + + public boolean isStatusOK(){ + return status.equals(TraCIStatusResponse.OK); + } + + public int getVariableId() { + return variableId; + } + + public void setVariableId(int variableId) { + this.variableId = variableId; + } + + public TraCIStatusResponse getStatus() { + return status; + } + + public void setStatus(TraCIStatusResponse status) { + this.status = status; + } + + public TraCIDataType getVariableDataType() { + return variableDataType; + } + + public void setVariableDataType(TraCIDataType variableDataType) { + this.variableDataType = variableDataType; + } + + public Object getVariableValue() { + return variableValue; + } + + public void setVariableValue(Object variableValue) { + this.variableValue = variableValue; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SingeVarResponse that = (SingeVarResponse) o; + return variableId == that.variableId && + status == that.status && + variableDataType == that.variableDataType && + variableValue.equals(that.variableValue); + } + + @Override + public int hashCode() { + return Objects.hash(variableId, status, variableDataType, variableValue); + } + + @Override + public String toString() { + return "SingeVarResponse{" + + "variableId=" + variableId + + ", status=" + status + + ", variableDataType=" + variableDataType + + ", variableValue=" + variableValue + + '}'; + } + } + +} diff --git a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java index 4d6961ae8..c1bbd9719 100644 --- a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java @@ -3,12 +3,12 @@ package org.vadere.manager.stsc.writer; import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; -import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; import org.vadere.manager.stsc.respons.StatusResponse; import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; import org.vadere.manager.stsc.respons.TraCISimTimeResponse; import org.vadere.manager.stsc.respons.TraCIStatusResponse; +import org.vadere.manager.stsc.respons.TraCISubscriptionResponse; import java.nio.ByteBuffer; @@ -39,7 +39,7 @@ public class TraCIPacket extends ByteArrayOutputStreamTraCIWriter{ if (cmdLen > 255){ //extended CMD cmdLen += 4; // add int field - response.writeInt(4 + cmdLen); // packet size (4 + cmdLen) [4] + response.writeInt(4 + cmdLen); // packet limit (4 + cmdLen) [4] response.writeUnsignedByte(0); // [1] response.writeInt(cmdLen); // [4] } else { @@ -85,7 +85,7 @@ public class TraCIPacket extends ByteArrayOutputStreamTraCIWriter{ if (finalized) return asByteArray(); - // packet size must be set to correct value + // packet limit must be set to correct value if (emptyLengthField){ ByteBuffer packet = asByteBuffer(); packet.putInt(packet.capacity()); @@ -104,6 +104,9 @@ public class TraCIPacket extends ByteArrayOutputStreamTraCIWriter{ public TraCIPacket wrapGetResponse(TraCIGetResponse res){ addStatusResponse(res.getStatusResponse()); + if (!res.getStatusResponse().getResponse().equals(TraCIStatusResponse.OK)) + return this; // ERR or NOT_IMPLEMENTED --> only StatusResponse + TraCIWriter cmdBuilder = getCmdBuilder(); cmdBuilder.writeUnsignedByte(res.getResponseIdentifier().id) .writeUnsignedByte(res.getVariableIdentifier()) @@ -115,6 +118,31 @@ public class TraCIPacket extends ByteArrayOutputStreamTraCIWriter{ return this; } + public TraCIPacket wrapValueSubscriptionCommand(TraCISubscriptionResponse res){ + addStatusResponse(res.getStatusResponse()); + + if (!res.getStatusResponse().getResponse().equals(TraCIStatusResponse.OK)) + return this; // ERR or NOT_IMPLEMENTED --> only StatusResponse + + wrapSubscription(res); + + return this; + } + + private void wrapSubscription(TraCISubscriptionResponse res){ + TraCIWriter cmdBuilder = getCmdBuilder(); + cmdBuilder.writeUnsignedByte(res.getResponseIdentifier().id) // (i.e. TraCICmd.RESPONSE_SUB_PERSON_VARIABLE) + .writeString(res.getElementId()) + .writeUnsignedByte(res.getNumberOfVariables()); + res.getResponses().forEach( var -> { + cmdBuilder.writeUnsignedByte(var.getVariableId()) + .writeUnsignedByte(var.getStatus().id) + .writeObjectWithId(var.getVariableDataType(), var.getVariableValue()); + }); + + addCommandWithExtendedLenField(cmdBuilder.asByteArray()); + } + public TraCIPacket wrapGetVersionCommand(TraCIGetVersionCommand cmd){ TraCIGetVersionResponse res = cmd.getResponse(); @@ -133,21 +161,29 @@ public class TraCIPacket extends ByteArrayOutputStreamTraCIWriter{ return this; } - public TraCIPacket wrapSimTimeStepCommand(TraCISimStepCommand cmd){ - TraCISimTimeResponse res = cmd.getResponse(); - + public TraCIPacket wrapSimTimeStepCommand(TraCISimTimeResponse res){ addStatusResponse(res.getStatusResponse()); + if (!res.getStatusResponse().getResponse().equals(TraCIStatusResponse.OK)) + return this; // ERR or NOT_IMPLEMENTED --> only StatusResponse - TraCIWriter cmdBuilder = getCmdBuilder(); - cmdBuilder.writeUnsignedByte(res.getResponseIdentifier().id) - .writeObjectWithId(res.getSubscriptionDataType(), res.getSubscriptionData()); - addCommandWithoutLen(cmdBuilder.asByteArray()); + // not length field! Directly add number of subscription responses. + writeInt(res.getNumberOfSubscriptions()); + + // add each SubscriptionsResponse as its own command (with length and responseID) + res.getSubscriptionResponses().forEach(this::wrapSubscription); + return this; } + public void addCommandWithExtendedLenField(byte[] buffer){ + writeUnsignedByte(0); + writeInt(buffer.length + 5); // 1 + 4 length field + writeBytes(buffer); + } + public void addCommandWithoutLen(byte[] buffer){ if (buffer.length > 255){ diff --git a/VadereManager/testResources/testProject001/scenarios/roVerTest001.scenario b/VadereManager/testResources/testProject001/scenarios/roVerTest001.scenario new file mode 100644 index 000000000..eac6dee9b --- /dev/null +++ b/VadereManager/testResources/testProject001/scenarios/roVerTest001.scenario @@ -0,0 +1,295 @@ +{ + "name" : "roVerTest001", + "description" : "", + "release" : "0.10", + "processWriters" : { + "files" : [ { + "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.TimestepPedestrianIdOutputFile", + "filename" : "postvis.trajectories", + "processors" : [ 1, 2 ] + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.TimestepPedestrianIdOverlapOutputFile", + "filename" : "overlaps.csv", + "processors" : [ 3 ] + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.NoDataKeyOutputFile", + "filename" : "overlapCount.txt", + "processors" : [ 4 ] + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.BonnMotionTrajectoryFile", + "filename" : "bonnmotion.txt", + "processors" : [ 5 ] + } ], + "processors" : [ { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianPositionProcessor", + "id" : 1 + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianTargetIdProcessor", + "id" : 2 + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianOverlapProcessor", + "id" : 3 + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.NumberOverlapsProcessor", + "id" : 4, + "attributesType" : "org.vadere.state.attributes.processor.AttributesNumberOverlapsProcessor", + "attributes" : { + "pedestrianOverlapProcessorId" : 3 + } + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.BonnMotionTrajectoryProcessor", + "id" : 5, + "attributesType" : "org.vadere.state.attributes.processor.AttributesBonnMotionTrajectoryProcessor", + "attributes" : { + "pedestrianPositionProcessorId" : 1, + "scale" : { + "x" : 1.0, + "y" : -1.0 + }, + "translate" : { + "x" : 0.0, + "y" : 250.0 + } + } + } ], + "isTimestamped" : true, + "isWriteMetaData" : false + }, + "scenario" : { + "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", + "attributesModel" : { + "org.vadere.state.attributes.models.AttributesOSM" : { + "stepCircleResolution" : 4, + "numberOfCircles" : 1, + "optimizationType" : "DISCRETE", + "varyStepDirection" : true, + "movementType" : "ARBITRARY", + "stepLengthIntercept" : 0.4625, + "stepLengthSlopeSpeed" : 0.2345, + "stepLengthSD" : 0.036, + "movementThreshold" : 0.0, + "minStepLength" : 0.1, + "minimumStepLength" : true, + "maxStepDuration" : 1.7976931348623157E308, + "dynamicStepLength" : true, + "updateType" : "EVENT_DRIVEN", + "seeSmallWalls" : false, + "targetPotentialModel" : "org.vadere.simulator.models.potential.fields.PotentialFieldTargetGrid", + "pedestrianPotentialModel" : "org.vadere.simulator.models.potential.PotentialFieldPedestrianCompactSoftshell", + "obstaclePotentialModel" : "org.vadere.simulator.models.potential.PotentialFieldObstacleCompactSoftshell", + "submodels" : [ ] + }, + "org.vadere.state.attributes.models.AttributesPotentialCompactSoftshell" : { + "pedPotentialIntimateSpaceWidth" : 0.45, + "pedPotentialPersonalSpaceWidth" : 1.2, + "pedPotentialHeight" : 50.0, + "obstPotentialWidth" : 0.8, + "obstPotentialHeight" : 6.0, + "intimateSpaceFactor" : 1.2, + "personalSpacePower" : 1, + "intimateSpacePower" : 1 + }, + "org.vadere.state.attributes.models.AttributesFloorField" : { + "createMethod" : "HIGH_ACCURACY_FAST_MARCHING", + "potentialFieldResolution" : 0.1, + "obstacleGridPenalty" : 0.1, + "targetAttractionStrength" : 1.0, + "timeCostAttributes" : { + "standardDeviation" : 0.7, + "type" : "UNIT", + "obstacleDensityWeight" : 3.5, + "pedestrianSameTargetDensityWeight" : 3.5, + "pedestrianOtherTargetDensityWeight" : 3.5, + "pedestrianWeight" : 3.5, + "queueWidthLoading" : 1.0, + "pedestrianDynamicWeight" : 6.0, + "loadingType" : "CONSTANT", + "width" : 0.2, + "height" : 1.0 + } + } + }, + "attributesSimulation" : { + "finishTime" : 800.0, + "simTimeStepLength" : 0.4, + "realTimeSimTimeRatio" : 0.1, + "writeSimulationData" : true, + "visualizationEnabled" : true, + "printFPS" : false, + "digitsPerCoordinate" : 2, + "useFixedSeed" : true, + "fixedSeed" : -359668230868604320, + "simulationSeed" : 0, + "useSalientBehavior" : false + }, + "topography" : { + "attributes" : { + "bounds" : { + "x" : 0.0, + "y" : 0.0, + "width" : 250.0, + "height" : 250.0 + }, + "boundingBoxWidth" : 0.5, + "bounded" : true + }, + "obstacles" : [ { + "shape" : { + "type" : "POLYGON", + "points" : [ { + "x" : 213.3, + "y" : -1.0 + }, { + "x" : 213.3, + "y" : 120.0 + }, { + "x" : 160.0, + "y" : 120.0 + }, { + "x" : 160.0, + "y" : -1.0 + } ] + }, + "id" : 3 + }, { + "shape" : { + "type" : "POLYGON", + "points" : [ { + "x" : 249.5, + "y" : 180.0 + }, { + "x" : 249.5, + "y" : 223.8 + }, { + "x" : 158.6, + "y" : 223.8 + }, { + "x" : 158.6, + "y" : 180.0 + } ] + }, + "id" : 4 + }, { + "shape" : { + "type" : "POLYGON", + "points" : [ { + "x" : 236.60000000000002, + "y" : 44.3 + }, { + "x" : 236.60000000000002, + "y" : 149.5 + }, { + "x" : 236.1999999999998, + "y" : 149.5000000000003 + }, { + "x" : 236.2, + "y" : 159.0 + }, { + "x" : 130.5, + "y" : 158.99999999999997 + }, { + "x" : 130.5, + "y" : 250.0 + }, { + "x" : 41.0, + "y" : 250.0 + }, { + "x" : 41.0, + "y" : 29.0 + }, { + "x" : 130.5, + "y" : 29.0 + }, { + "x" : 130.5, + "y" : 136.7 + }, { + "x" : 224.3, + "y" : 136.7 + }, { + "x" : 224.3, + "y" : 44.3 + } ] + }, + "id" : 5 + } ], + "measurementAreas" : [ ], + "stairs" : [ ], + "targets" : [ { + "id" : 2, + "absorbing" : true, + "shape" : { + "x" : 212.4, + "y" : 227.1, + "width" : 29.5, + "height" : 21.0, + "type" : "RECTANGLE" + }, + "waitingTime" : 0.0, + "waitingTimeYellowPhase" : 0.0, + "parallelWaiters" : 0, + "individualWaiting" : true, + "deletionDistance" : 0.1, + "startingWithRedLight" : false, + "nextSpeed" : -1.0 + } ], + "absorbingAreas" : [ ], + "sources" : [ { + "id" : 1, + "shape" : { + "x" : 1.4, + "y" : 179.5, + "width" : 8.6, + "height" : 41.0, + "type" : "RECTANGLE" + }, + "interSpawnTimeDistribution" : "org.vadere.state.scenario.ConstantDistribution", + "distributionParameters" : [ 1.0 ], + "spawnNumber" : 5, + "maxSpawnNumberTotal" : 15, + "startTime" : 0.0, + "endTime" : 10.0, + "spawnAtRandomPositions" : false, + "useFreeSpaceOnly" : true, + "targetIds" : [ 2 ], + "groupSizeDistribution" : [ 1.0 ], + "dynamicElementType" : "PEDESTRIAN" + } ], + "dynamicElements" : [ ], + "attributesPedestrian" : { + "radius" : 0.2, + "densityDependentSpeed" : false, + "speedDistributionMean" : 1.34, + "speedDistributionStandardDeviation" : 0.26, + "minimumSpeed" : 0.5, + "maximumSpeed" : 2.2, + "acceleration" : 2.0, + "footStepsToStore" : 4, + "searchRadius" : 1.0, + "angleCalculationType" : "USE_CENTER", + "targetOrientationAngleThreshold" : 45.0 + }, + "teleporter" : null, + "attributesCar" : { + "id" : -1, + "radius" : 0.2, + "densityDependentSpeed" : false, + "speedDistributionMean" : 1.34, + "speedDistributionStandardDeviation" : 0.26, + "minimumSpeed" : 0.5, + "maximumSpeed" : 2.2, + "acceleration" : 2.0, + "footStepsToStore" : 4, + "searchRadius" : 1.0, + "angleCalculationType" : "USE_CENTER", + "targetOrientationAngleThreshold" : 45.0, + "length" : 4.5, + "width" : 1.7, + "direction" : { + "x" : 1.0, + "y" : 0.0 + } + } + }, + "eventInfos" : [ ] + } +} \ No newline at end of file -- GitLab From 350d39a3b071dd4cd0edca993c433e403f2bb67f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Wed, 12 Jun 2019 21:21:41 +0200 Subject: [PATCH 27/58] implement subscription, fix rounding error --- .../src/org/vadere/manager/ClientHandler.java | 13 +- .../src/org/vadere/manager/VadereServer.java | 1 + .../commandHandler/CommandExecutor.java | 4 + .../commandHandler/ControlCommandHandler.java | 4 +- .../commandHandler/PersonCommandHandler.java | 8 + .../commandHandler/PolygonCommandHandler.java | 147 +++++++++++++++++- .../SimulationCommandHandler.java | 7 +- .../manager/commandHandler/Subscription.java | 3 +- .../commandHandler/TraCIPolygonVar.java | 35 +++++ .../stsc/commands/TraCISetCommand.java | 20 +-- .../control/TraCISendFileCommand.java | 3 + .../manager/stsc/reader/TraCIByteBuffer.java | 8 + .../manager/stsc/reader/TraCIReader.java | 2 + .../control/OfflineTopographyController.java | 10 +- .../vadere/simulator/control/Simulation.java | 4 +- .../org/vadere/state/scenario/Topography.java | 1 - 16 files changed, 234 insertions(+), 36 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/commandHandler/TraCIPolygonVar.java diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index 0701158fd..15f47fbc2 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -4,7 +4,6 @@ import org.vadere.manager.commandHandler.CommandExecutor; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.reader.TraCIPacketBuffer; import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.util.io.IOUtils; import org.vadere.util.logging.Logger; import java.io.EOFException; @@ -49,12 +48,12 @@ public class ClientHandler implements Runnable{ private void handleClient() throws IOException{ try{ logger.info("client connected..."); - String filePath = "/home/stsc/repos/vadere/VadereManager/testResources/testProject001/scenarios/roVerTest001.scenario"; - - String scenario = IOUtils.readTextFile(filePath); - logger.infof("load File..."); - remoteManager.loadScenario(scenario); - remoteManager.run(); +// String filePath = "/home/stsc/repos/vadere/VadereManager/testResources/testProject001/scenarios/roVerTest001.scenario"; +// +// String scenario = IOUtils.readTextFile(filePath); +// logger.infof("load File..."); +// remoteManager.loadScenario(scenario); +// remoteManager.run(); while (true){ diff --git a/VadereManager/src/org/vadere/manager/VadereServer.java b/VadereManager/src/org/vadere/manager/VadereServer.java index c97647d78..07166cf1c 100644 --- a/VadereManager/src/org/vadere/manager/VadereServer.java +++ b/VadereManager/src/org/vadere/manager/VadereServer.java @@ -16,6 +16,7 @@ public class VadereServer implements Runnable{ private static Logger logger = Logger.getLogger(VadereServer.class); public static int SUPPORTED_TRACI_VERSION = 20; +// public static int SUPPORTED_TRACI_VERSION = 1; public static String SUPPORTED_TRACI_VERSION_STRING = "Vadere Simulator. Supports subset of commands based von TraCI Version " + SUPPORTED_TRACI_VERSION; private final ServerSocket serverSocket; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index 31009aa5f..21ac4d034 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -50,6 +50,10 @@ public class CommandExecutor { cmdMap.put(TraCICmd.SUB_SIMULATION_VALUE.id, SimulationCommandHandler.instance::processValueSub); cmdMap.put(TraCICmd.GET_VEHICLE_VALUE.id, VehicleCommandHandler.instance::processGet); cmdMap.put(TraCICmd.SUB_VEHICLE_VALUE.id, VehicleCommandHandler.instance::processValueSub); + cmdMap.put(TraCICmd.GET_POLYGON.id, PolygonCommandHandler.instance::processGet); + cmdMap.put(TraCICmd.SET_POLYGON_STATE.id, PolygonCommandHandler.instance::processSet); + cmdMap.put(TraCICmd.SUB_POLYGON_VALUE.id, PolygonCommandHandler.instance::processValueSub); + cmdMap.put(TraCICmd.SET_VEHICLE_STATE.id, (cmd, manager) -> cmd ); } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index ee274ef3b..83f500455 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -48,11 +48,12 @@ public class ControlCommandHandler extends CommandHandler{ public TraCICommand process_simStep(TraCICommand rawCmd, RemoteManager remoteManager) { TraCISimStepCommand cmd = (TraCISimStepCommand) rawCmd; - logger.infof("Simulate next step %f", cmd.getTargetTime()); + logger.infof("Simulate to: %f", cmd.getTargetTime()); // remoteManager.nextStep(cmd.getTargetTime()); remoteManager.nextStep(-1); //todo problem if 0.4 is used direclty // execute all + logger.debug("execute subscriptions"); remoteManager.getSubscriptions().forEach(sub -> sub.executeSubscription(remoteManager)); // get responses @@ -64,6 +65,7 @@ public class ControlCommandHandler extends CommandHandler{ }); cmd.setResponse(response); + logger.debug("process_simStep done."); return cmd; } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index b098fcb82..c1544d4b6 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -7,7 +7,9 @@ import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.util.geometry.shapes.VPoint; +import org.vadere.util.logging.Logger; +import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -17,6 +19,7 @@ import java.util.stream.Collectors; */ public class PersonCommandHandler extends CommandHandler{ + private static Logger logger = Logger.getLogger(PersonCommandHandler.class); public static PersonCommandHandler instance; @@ -62,6 +65,7 @@ public class PersonCommandHandler extends CommandHandler{ .collect(Collectors.toList()); TraCIGetResponse res = responseOK(traCIVar.returnType, data); cmd.setResponse(res); + logger.debugf("time: %f ID's: %s", state.getSimTimeInSec(), Arrays.toString(data.toArray(String[]::new))); }); return cmd; @@ -110,6 +114,10 @@ public class PersonCommandHandler extends CommandHandler{ .getElement(Integer.parseInt(cmd.getElementIdentifier())) .getPosition(); cmd.setResponse(responseOK(traCIVar.returnType, pos)); + logger.debugf("time: %f Pedestrian: %s Position: %s", + state.getSimTimeInSec() , + cmd.getElementIdentifier(), + pos.toString()); }); return cmd; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java index 4fc515015..70597bf5d 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java @@ -1,19 +1,154 @@ package org.vadere.manager.commandHandler; +import org.vadere.manager.RemoteManager; +import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.writer.TraCIPacket; +import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.state.scenario.Obstacle; + +import java.awt.*; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; /** * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Polygon API */ -public class PolygonCommandHandler { +public class PolygonCommandHandler extends CommandHandler{ + + public static PolygonCommandHandler instance; + + + static { + instance = new PolygonCommandHandler(); + } + + public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ + return responseOK(responseDataType, responseData, TraCICmd.GET_POLYGON, TraCICmd.RESPONSE_GET_POLYGON); + } + + public TraCIGetResponse responseERR(String err){ + return responseERR(err, TraCICmd.GET_POLYGON, TraCICmd.RESPONSE_GET_POLYGON); + } + + private TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ - static public TraCIPacket processGet(TraCICommand cmd){ - return null; + remoteManager.accessState((manager, state) -> { + List ret = state.getTopography().getObstacles() + .stream() + .map(o -> Integer.toString(o.getId())) + .collect(Collectors.toList()); + cmd.setResponse(responseOK(traCIVar.returnType, ret)); + }); + + return cmd; + } + + private TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + + remoteManager.accessState((manager, state) -> { + int ret = state.getTopography().getObstacles().size(); + cmd.setResponse(responseOK(traCIVar.returnType, ret)); + }); + + return cmd; } - static public TraCIPacket processSet(TraCICommand cmd){ - return null; + private TraCICommand process_getType(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + cmd.setResponse(responseOK(traCIVar.returnType, "building")); + return cmd; } + private TraCICommand process_getShape(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + + remoteManager.accessState((manager, state) -> { + Optional obstacle = state.getTopography().getObstacles().stream() + .filter(o-> cmd.getElementIdentifier().equals(Integer.toString(o.getId()))) + .findFirst(); + if (obstacle.isPresent()) + cmd.setResponse(responseOK(traCIVar.returnType, obstacle.get().getShape().getPath())); + else + cmd.setResponse(responseERR("Cannot find shape with objectId "+ cmd.getElementIdentifier())); + + }); + return cmd; + } + + private TraCICommand process_getColor(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + cmd.setResponse(responseOK(traCIVar.returnType, Color.BLACK)); + return cmd; + } + + private TraCICommand process_getPosition2D(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + remoteManager.accessState((manager, state) -> { + Optional obstacle = state.getTopography().getObstacles().stream() + .filter(o-> cmd.getElementIdentifier().equals(Integer.toString(o.getId()))) + .findFirst(); + if (obstacle.isPresent()) + cmd.setResponse(responseOK(traCIVar.returnType, obstacle.get().getShape().getCentroid())); + else + cmd.setResponse(responseERR("Cannot find shape with objectId "+ cmd.getElementIdentifier())); + + }); + return cmd; + } + + private TraCICommand process_getImageFile(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + cmd.setResponse(responseERR("Not Implemented")); + return cmd; + } + + private TraCICommand process_getImageWidth(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + cmd.setResponse(responseERR("Not Implemented")); + return cmd; + } + + private TraCICommand process_getImageHeight(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + cmd.setResponse(responseERR("Not Implemented")); + return cmd; + } + + private TraCICommand process_getImageAngle(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + cmd.setResponse(responseERR("Not Implemented")); + return cmd; + } + + public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ + return processValueSub(rawCmd, remoteManager, this::processGet, + TraCICmd.SUB_POLYGON_VALUE, TraCICmd.RESPONSE_SUB_POLYGON_VALUE); + } + + public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager) { + TraCIGetCommand getCmd = (TraCIGetCommand) cmd; + + TraCIPolygonVar var = TraCIPolygonVar.fromId(getCmd.getVariableIdentifier()); + + switch (var){ + case ID_LIST: + return process_getIDList(getCmd,remoteManager, var); + case COUNT: + return process_getIDCount(getCmd,remoteManager, var); + case TYPE: + return process_getType(getCmd,remoteManager, var); + case SHAPE: + return process_getShape(getCmd,remoteManager, var); + case COLOR: + return process_getColor(getCmd,remoteManager, var); + case POS_2D: + return process_getPosition2D(getCmd,remoteManager, var); + case IMAGE_FILE: + case WIDTH: + case HEIGHT: + case ANGLE: + default: + return process_UnknownCommand(getCmd, remoteManager); + } + } + + public TraCICommand processSet(TraCICommand cmd, RemoteManager remoteManager) { + // do nothing just say ok... + return cmd; + } } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java index a303ebdd5..b1770aea8 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java @@ -9,6 +9,8 @@ import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.util.geometry.shapes.VPoint; import java.awt.geom.Rectangle2D; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; /** @@ -51,8 +53,9 @@ public class SimulationCommandHandler extends CommandHandler{ private TraCICommand process_getSimTime(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ remoteManager.accessState((manager, state) -> { - double time = state.getSimTimeInSec(); - cmd.setResponse(responseOK(traCIVar.returnType, time)); + // BigDecimal to ensure correct comparison in omentpp + BigDecimal time = BigDecimal.valueOf(state.getSimTimeInSec()); + cmd.setResponse(responseOK(traCIVar.returnType, time.setScale(1, RoundingMode.HALF_UP).doubleValue())); }); return cmd; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java b/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java index 1a792b533..977171bfc 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java @@ -36,9 +36,10 @@ public class Subscription { } valueSubscriptionCommand.setResponse(subResponse); - } + + public TraCICmdHandler getTraCICmdHandler() { return traCICmdHandler; } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPolygonVar.java b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPolygonVar.java new file mode 100644 index 000000000..20290cf44 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/commandHandler/TraCIPolygonVar.java @@ -0,0 +1,35 @@ +package org.vadere.manager.commandHandler; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.stsc.TraCIDataType; + +public enum TraCIPolygonVar { + ID_LIST(0x00, TraCIDataType.STRING_LIST), // get + COUNT(0x01, TraCIDataType.INTEGER), // get + TYPE(0x4f, TraCIDataType.STRING), // get, set + SHAPE(0x4e, TraCIDataType.POLYGON), + COLOR(0x45, TraCIDataType.COLOR), // get, set + POS_2D(0x42, TraCIDataType.POS_2D), // get + IMAGE_FILE(0x93, TraCIDataType.STRING), + WIDTH(0x4d, TraCIDataType.DOUBLE), // get, set + HEIGHT(0xbc, TraCIDataType.DOUBLE), // get, set + ANGLE(0x43, TraCIDataType.DOUBLE) + ; + + public int id; + public TraCIDataType returnType; + + TraCIPolygonVar(int id, TraCIDataType retVal) { + this.id = id; + this.returnType = retVal; + } + + + public static TraCIPolygonVar fromId(int id){ + for(TraCIPolygonVar var : values()){ + if (var.id == id) + return var; + } + throw new TraCIException(String.format("No polygon variable found with id: %02X", id)); + } +} diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java index 33babfc8c..7548e6faa 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java @@ -1,10 +1,9 @@ package org.vadere.manager.stsc.commands; -import org.vadere.manager.TraCIException; import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.stsc.writer.TraCIPacket; /** * Sub class of {@link TraCICommand} which represents a set request to some API. @@ -35,14 +34,11 @@ public class TraCISetCommand extends TraCICommand{ public TraCISetCommand(TraCICmd traCICmd, TraCICommandBuffer cmdBuffer) { super(traCICmd); - try{ - variableId = cmdBuffer.readUnsignedByte(); - elementId = cmdBuffer.readString(); - returnDataType = TraCIDataType.fromId(cmdBuffer.readUnsignedByte()); - variableValue = cmdBuffer.readTypeValue(returnDataType); - } catch (Exception e){ - throw TraCIException.cmdErr(traCICmd, e); - } + variableId = cmdBuffer.readUnsignedByte(); + elementId = cmdBuffer.readString(); + returnDataType = TraCIDataType.fromId(cmdBuffer.readUnsignedByte()); + variableValue = cmdBuffer.readTypeValue(returnDataType); + } public Object getVariableValue(){ @@ -63,6 +59,6 @@ public class TraCISetCommand extends TraCICommand{ @Override public TraCIPacket buildResponsePacket() { - return null; + return TraCIPacket.create().add_OK_StatusResponse(traCICmd); } } diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java index 4919a71ea..ae3876630 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java +++ b/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java @@ -9,6 +9,7 @@ import java.nio.charset.StandardCharsets; public class TraCISendFileCommand extends TraCICommand { + private String fileName; private String file; public static TraCIPacket TraCISendFileCommand(String file){ @@ -22,7 +23,9 @@ public class TraCISendFileCommand extends TraCICommand { public TraCISendFileCommand(TraCICommandBuffer cmdBuffer) { super(TraCICmd.SEND_FILE); + this.fileName = cmdBuffer.readString(); this.file = cmdBuffer.readString(); + } diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java index 7cdd11fb2..d4c09d12b 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java @@ -73,6 +73,13 @@ public class TraCIByteBuffer implements TraCIReader { return byteBuffer.getDouble(); } + @Override + public String readString(int numOfBytes) { + byte [] data = readBytes(numOfBytes); + + return new String(data, StandardCharsets.US_ASCII); + } + @Override public String readString(){ ensureBytes(4); @@ -229,6 +236,7 @@ public class TraCIByteBuffer implements TraCIReader { case COLOR: return readColor(); case COMPOUND_OBJECT: + return null; // todo: simple fix. For now we ignore Compound Objects. default: throw new TraCIException("Unknown Datatype: " + type.toString()); } diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java index b2a023d68..bc87dba43 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java +++ b/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java @@ -34,6 +34,8 @@ public interface TraCIReader { int readInt(); double readDouble(); + String readString(int numOfBytes); + String readString(); List readStringList(); diff --git a/VadereSimulator/src/org/vadere/simulator/control/OfflineTopographyController.java b/VadereSimulator/src/org/vadere/simulator/control/OfflineTopographyController.java index 5a3b29811..601f06b2c 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/OfflineTopographyController.java +++ b/VadereSimulator/src/org/vadere/simulator/control/OfflineTopographyController.java @@ -1,8 +1,5 @@ package org.vadere.simulator.control; -import java.util.function.Function; -import java.util.stream.Collectors; - import org.vadere.simulator.models.potential.fields.IPotentialField; import org.vadere.simulator.models.potential.fields.PotentialFieldDistancesBruteForce; import org.vadere.state.attributes.models.AttributesFloorField; @@ -11,10 +8,11 @@ import org.vadere.state.scenario.Obstacle; import org.vadere.state.scenario.Pedestrian; import org.vadere.state.scenario.Topography; import org.vadere.util.geometry.shapes.IPoint; -import org.vadere.util.geometry.shapes.VPoint; -import org.vadere.util.geometry.shapes.VPolygon; import org.vadere.util.geometry.shapes.VRectangle; +import java.util.function.Function; +import java.util.stream.Collectors; + public class OfflineTopographyController { private final Topography topography; @@ -47,6 +45,8 @@ public class OfflineTopographyController { new AttributesFloorField()); Function obstacleDistance = p -> distanceField.getPotential(p, null); this.topography.setObstacleDistanceFunction(obstacleDistance); + + this.topography.generateUniqueIdIfNotSet(); } /** diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index 6362259ba..fbdeb030f 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -234,6 +234,7 @@ public class Simulation { preLoop(); while (isRunSimulation) { + synchronized (this) { while (isPaused) { try { @@ -256,7 +257,7 @@ public class Simulation { assert assertAllPedestrianInBounds(): "Pedestrians are outside of topography bound."; updateCallbacks(simTimeInSec); - updateWriters(simTimeInSec); + updateWriters(simTimeInSec); // set SimulationState with Time!!! if (attributesSimulation.isWriteSimulationData()) { processorManager.update(this.simulationState); @@ -292,6 +293,7 @@ public class Simulation { } + if (runTimeInSec + startTimeInSec > simTimeInSec + 1e-7) { simTimeInSec += Math.min(attributesSimulation.getSimTimeStepLength(), runTimeInSec + startTimeInSec - simTimeInSec); } else { diff --git a/VadereState/src/org/vadere/state/scenario/Topography.java b/VadereState/src/org/vadere/state/scenario/Topography.java index d799dbc70..690cf68e5 100644 --- a/VadereState/src/org/vadere/state/scenario/Topography.java +++ b/VadereState/src/org/vadere/state/scenario/Topography.java @@ -2,7 +2,6 @@ package org.vadere.state.scenario; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.apache.commons.math3.analysis.function.Abs; import org.jetbrains.annotations.NotNull; import org.vadere.state.attributes.Attributes; import org.vadere.state.attributes.scenario.AttributesAgent; -- GitLab From 8fa274167a062ffbcbe7c1980c58a78117e7f363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Thu, 13 Jun 2019 13:53:41 +0200 Subject: [PATCH 28/58] * add RemoteScenarioRun to hide simulation internal structures * add unsubscribe features * fix problem with simulation time comparison --- .../src/org/vadere/manager/RemoteManager.java | 81 +++++-------------- .../org/vadere/manager/RemoteScenarioRun.java | 78 ++++++++++++++++++ .../commandHandler/CommandExecutor.java | 19 ----- .../commandHandler/CommandHandler.java | 1 + .../commandHandler/ControlCommandHandler.java | 14 +++- .../commandHandler/PersonCommandHandler.java | 58 ++++++++----- .../commandHandler/PolygonCommandHandler.java | 16 ++-- .../manager/commandHandler/Subscription.java | 57 +++++++++---- .../stsc/respons/TraCISimTimeResponse.java | 6 ++ .../respons/TraCISubscriptionResponse.java | 10 +++ ...erListener.java => RemoteRunListener.java} | 2 +- .../{projects => control}/ScenarioRun.java | 44 +++++----- .../vadere/simulator/control/Simulation.java | 38 +++++---- .../cmd/commands/ProjectRunSubCommand.java | 3 +- .../cmd/commands/ScenarioRunSubCommand.java | 2 +- .../cmd/commands/SuqSubCommand.java | 2 +- .../simulator/projects/VadereProject.java | 1 + 17 files changed, 262 insertions(+), 170 deletions(-) create mode 100644 VadereManager/src/org/vadere/manager/RemoteScenarioRun.java rename VadereSimulator/src/org/vadere/simulator/control/{RemoteManagerListener.java => RemoteRunListener.java} (88%) rename VadereSimulator/src/org/vadere/simulator/{projects => control}/ScenarioRun.java (86%) diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index 356457a16..c8a962de9 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -2,39 +2,31 @@ package org.vadere.manager; import org.vadere.manager.commandHandler.StateAccessHandler; import org.vadere.manager.commandHandler.Subscription; -import org.vadere.simulator.control.RemoteManagerListener; import org.vadere.simulator.entrypoints.ScenarioFactory; import org.vadere.simulator.projects.RunnableFinishedListener; import org.vadere.simulator.projects.Scenario; -import org.vadere.simulator.projects.ScenarioRun; import org.vadere.util.logging.Logger; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.locks.ReentrantLock; /** * //todo comment */ -public class RemoteManager implements RemoteManagerListener, RunnableFinishedListener, Runnable { +public class RemoteManager implements RunnableFinishedListener { private static Logger logger = Logger.getLogger(RemoteManager.class); - private ScenarioRun currentSimulationRun; + private RemoteScenarioRun currentSimulationRun; private Thread currentSimulationThread; - private final Object waitForLoopEnd; - private ReentrantLock lock; - private boolean lastSimulationStep; + private boolean simulationFinished; private List subscriptions; public RemoteManager() { - waitForLoopEnd = new Object(); - lock = new ReentrantLock(); - lastSimulationStep = false; subscriptions = new ArrayList<>(); } @@ -45,8 +37,7 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis } catch (IOException e) { throw new TraCIException("Cannot create Scenario from given file."); } - currentSimulationRun = new ScenarioRun(scenario, this, true); - currentSimulationRun.addRemoteManagerListener(this); + currentSimulationRun = new RemoteScenarioRun(scenario, this); } public boolean stopSimulationIfRunning(){ @@ -67,71 +58,37 @@ public class RemoteManager implements RemoteManagerListener, RunnableFinishedLis return subscriptions; } - synchronized public boolean accessState(StateAccessHandler stateAccessHandler){ + public boolean accessState(StateAccessHandler stateAccessHandler){ if (currentSimulationRun == null) return false; - try { - if (!currentSimulationRun.isWaitForSimCommand()) { - synchronized (waitForLoopEnd){ - waitForLoopEnd.wait(); - } - } - lock.lock(); - stateAccessHandler.execute(this, currentSimulationRun.getSimulationState()); - - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new TraCIException("Interrupted while accessing simulation state"); - } finally { - lock.unlock(); - } - return true; - } - - synchronized public void nextStep(double simTime){ - try { - lock.lock(); - currentSimulationRun.nextSimCommand(simTime); + currentSimulationRun.accessState(this, stateAccessHandler); - } finally { - lock.unlock(); - } - } - - @Override - public void simulationStepFinishedListener() { - synchronized (waitForLoopEnd){ - waitForLoopEnd.notify(); - } + return true; } - @Override - public void lastSimulationStepFinishedListener() { - synchronized (waitForLoopEnd){ - lastSimulationStep = true; - waitForLoopEnd.notify(); - } - } + public boolean nextStep(double simTime){ + if (simulationFinished) + return false; - public boolean isLastSimulationStep() { - return lastSimulationStep; + currentSimulationRun.nextStep(simTime); + return true; } @Override public void finished(Runnable runnable) { + simulationFinished = true; logger.infof("Simulation finished."); } - @Override - public void run() { - startSimulation(); - } - - private void startSimulation(){ + public void startSimulation(){ if (currentSimulationRun == null) - throw new IllegalStateException("ScenarioRun object must not be null"); + throw new IllegalStateException("RemoteScenarioRun object must not be null"); + + if (currentSimulationThread != null && currentSimulationThread.isAlive()) + throw new IllegalStateException("A simulation is already running. Stop current simulation before starting new one."); + simulationFinished = false; currentSimulationThread = new Thread(currentSimulationRun); currentSimulationThread.setUncaughtExceptionHandler((t, ex) -> { currentSimulationRun.simulationFailed(ex); diff --git a/VadereManager/src/org/vadere/manager/RemoteScenarioRun.java b/VadereManager/src/org/vadere/manager/RemoteScenarioRun.java new file mode 100644 index 000000000..65d011b51 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/RemoteScenarioRun.java @@ -0,0 +1,78 @@ +package org.vadere.manager; + +import org.vadere.manager.commandHandler.StateAccessHandler; +import org.vadere.manager.commandHandler.Subscription; +import org.vadere.simulator.control.RemoteRunListener; +import org.vadere.simulator.projects.RunnableFinishedListener; +import org.vadere.simulator.projects.Scenario; +import org.vadere.simulator.control.ScenarioRun; + +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; + +public class RemoteScenarioRun extends ScenarioRun implements RemoteRunListener { + + private List subscriptions; + private final Object waitForLoopEnd; + private final ReentrantLock lock; + private boolean lastSimulationStep; + + + public RemoteScenarioRun(Scenario scenario, RunnableFinishedListener scenarioFinishedListener) { + super(scenario, scenarioFinishedListener); + this.singleStepMode = true; + this.waitForLoopEnd = new Object(); + this.lock = new ReentrantLock(); + this.lastSimulationStep = false; + addRemoteManagerListener(this); + } + + synchronized public boolean accessState(RemoteManager remoteManager, StateAccessHandler stateAccessHandler){ + try { + if (!isWaitForSimCommand()) { + synchronized (waitForLoopEnd){ + waitForLoopEnd.wait(); + } + } + lock.lock(); + stateAccessHandler.execute(remoteManager, getSimulationState()); + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new TraCIException("Interrupted while accessing simulation state"); + } finally { + lock.unlock(); + } + return true; + } + + synchronized public void nextStep(double simTime){ + try { + lock.lock(); + nextSimCommand(simTime); + + } finally { + lock.unlock(); + } + } + + @Override + public void simulationStepFinishedListener() { + synchronized (waitForLoopEnd){ + waitForLoopEnd.notify(); + } + } + + @Override + public void lastSimulationStepFinishedListener() { + synchronized (waitForLoopEnd){ + lastSimulationStep = true; + waitForLoopEnd.notify(); + } + } + + public boolean isLastSimulationStep() { + return lastSimulationStep; + } + +} diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java index 21ac4d034..4054b704a 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java @@ -16,22 +16,6 @@ public class CommandExecutor { private static Logger logger = Logger.getLogger(CommandExecutor.class); private HashMap cmdMap; - // TODO: RemoteManager verwaltet die Simulation. - // Sobald ein Simulationsschrit fertig ist, wird der RemoteManager über den - // RemoteManagerListener informiert. Jetzt kann der org.vadere.simulator.control.SimulationState - // ausgelesen werden. - // vorghen: - // 1. LOAD_Command: Laden der String Representation und erzeugen des Scenario Objekts - // 2. erstellen von Subscriptions (später) - // 3. SIM_STEP_Command: - // - wenn die Simulatoin noch nicht gestarter wurde starte simulation - // - erstes RemoteManagerListener kommt - // - Sende Antwort auf SIM_STEP_Command - // 4. Warte auf GET/SET commands und beantworte dies über den RemoteManager - // 5. nächste SIM_STEP_Command: Führe den nächsten Simulatoinsschrit aus - // - remoteManager.currentSimulationRun.nextSimCommand(-1); - // Soll der remoteManager mit in den TraCICmdHandler übergeben werden? - // private RemoteManager remoteManager; public CommandExecutor(RemoteManager remoteManager) { @@ -56,7 +40,6 @@ public class CommandExecutor { cmdMap.put(TraCICmd.SET_VEHICLE_STATE.id, (cmd, manager) -> cmd ); } - public TraCIPacket execute(TraCICommand cmd){ TraCICmdHandler handler = cmdMap.get(cmd.getTraCICmd().id); if (handler == null){ @@ -65,7 +48,5 @@ public class CommandExecutor { } return handler.handel(cmd, remoteManager).buildResponsePacket(); - } - } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java index 41d543d7f..a2c772bab 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java @@ -25,6 +25,7 @@ import java.util.List; */ public abstract class CommandHandler { + public static final String ELEMENT_ID_NOT_FOUND = "No element found with given object id"; public TraCICommand process_NotImplemented(TraCICommand cmd, RemoteManager remoteManager){ return cmd.setNOK_response(TraCIPacket.sendStatus(cmd.getTraCICmd(), diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java index 83f500455..c58c894f1 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java @@ -19,7 +19,7 @@ import org.vadere.util.logging.Logger; */ public class ControlCommandHandler extends CommandHandler{ - private static Logger logger = Logger.getLogger(CommandExecutor.class); + private static Logger logger = Logger.getLogger(ControlCommandHandler.class); public static ControlCommandHandler instance; @@ -50,12 +50,18 @@ public class ControlCommandHandler extends CommandHandler{ logger.infof("Simulate to: %f", cmd.getTargetTime()); // remoteManager.nextStep(cmd.getTargetTime()); - remoteManager.nextStep(-1); //todo problem if 0.4 is used direclty - + if (!remoteManager.nextStep(cmd.getTargetTime())) { + //simulation finished; + cmd.setResponse(TraCISimTimeResponse.simEndReached()); + return cmd; + } // execute all logger.debug("execute subscriptions"); remoteManager.getSubscriptions().forEach(sub -> sub.executeSubscription(remoteManager)); + // remove subscriptions no longer valid + remoteManager.getSubscriptions().removeIf(Subscription::isMarkedForRemoval); + // get responses TraCISimTimeResponse response = new TraCISimTimeResponse( new StatusResponse(cmd.getTraCICmd(), TraCIStatusResponse.OK, "")); @@ -83,7 +89,7 @@ public class ControlCommandHandler extends CommandHandler{ TraCISendFileCommand cmd = (TraCISendFileCommand) rawCmd; remoteManager.loadScenario(cmd.getFile()); - remoteManager.run(); + remoteManager.startSimulation(); return cmd; } diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java index c1544d4b6..27cc43e4c 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java @@ -6,7 +6,7 @@ import org.vadere.manager.stsc.TraCIDataType; import org.vadere.manager.stsc.commands.TraCICommand; import org.vadere.manager.stsc.commands.TraCIGetCommand; import org.vadere.manager.stsc.respons.TraCIGetResponse; -import org.vadere.util.geometry.shapes.VPoint; +import org.vadere.state.scenario.Pedestrian; import org.vadere.util.logging.Logger; import java.util.Arrays; @@ -51,6 +51,15 @@ public class PersonCommandHandler extends CommandHandler{ return responseERR(err, TraCICmd.GET_PERSON_VALUE, TraCICmd.RESPONSE_GET_PERSON_VALUE); } + public boolean checkIfPedestrianExists(Pedestrian ped, TraCIGetCommand cmd){ + if (ped == null) { + cmd.setResponse(responseERR(CommandHandler.ELEMENT_ID_NOT_FOUND)); + logger.debugf("Pedestrian: %s not found.", cmd.getElementIdentifier()); + return false; + } + return true; + } + @PersonHandler( commandIdentifier = TraCICmd.GET_PERSON_VALUE, variable = TraCIPersonVar.ID_LIST, @@ -93,11 +102,12 @@ public class PersonCommandHandler extends CommandHandler{ private TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { - double speed = state.getTopography() - .getPedestrianDynamicElements() - .getElement(Integer.parseInt(cmd.getElementIdentifier())) - .getVelocity().getLength(); - cmd.setResponse(responseOK(traCIVar.returnType, speed)); + Pedestrian ped = state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())); + + if (checkIfPedestrianExists(ped, cmd)) + cmd.setResponse(responseOK(traCIVar.returnType, ped.getVelocity().getLength())); + }); return cmd; @@ -110,14 +120,16 @@ public class PersonCommandHandler extends CommandHandler{ private TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { - VPoint pos = state.getTopography().getPedestrianDynamicElements() - .getElement(Integer.parseInt(cmd.getElementIdentifier())) - .getPosition(); - cmd.setResponse(responseOK(traCIVar.returnType, pos)); - logger.debugf("time: %f Pedestrian: %s Position: %s", - state.getSimTimeInSec() , - cmd.getElementIdentifier(), - pos.toString()); + Pedestrian ped = state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())); + + if (checkIfPedestrianExists(ped, cmd)) { + cmd.setResponse(responseOK(traCIVar.returnType, ped.getPosition())); + logger.debugf("time: %f Pedestrian: %s Position: %s", + state.getSimTimeInSec(), + cmd.getElementIdentifier(), + ped.getPosition().toString()); + } }); return cmd; @@ -131,10 +143,11 @@ public class PersonCommandHandler extends CommandHandler{ private TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { - double pedLength = state.getTopography().getPedestrianDynamicElements() - .getElement(Integer.parseInt(cmd.getElementIdentifier())) - .getRadius() *2; - cmd.setResponse(responseOK(traCIVar.returnType, pedLength)); + Pedestrian ped = state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())); + + if (checkIfPedestrianExists(ped, cmd)) + cmd.setResponse(responseOK(traCIVar.returnType, ped.getRadius()*2)); }); return cmd; @@ -148,10 +161,11 @@ public class PersonCommandHandler extends CommandHandler{ private TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ remoteManager.accessState((manager, state) -> { - double pedWidth= state.getTopography().getPedestrianDynamicElements() - .getElement(Integer.parseInt(cmd.getElementIdentifier())) - .getRadius() *2; - cmd.setResponse(responseOK(traCIVar.returnType, pedWidth)); + Pedestrian ped = state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())); + + if (checkIfPedestrianExists(ped, cmd)) + cmd.setResponse(responseOK(traCIVar.returnType, ped.getRadius()*2)); }); return cmd; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java index 70597bf5d..e3469c19d 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java @@ -33,6 +33,14 @@ public class PolygonCommandHandler extends CommandHandler{ return responseERR(err, TraCICmd.GET_POLYGON, TraCICmd.RESPONSE_GET_POLYGON); } + public boolean checkIfObstacleExists(Obstacle obstacle, TraCIGetCommand cmd){ + if (obstacle == null) { + cmd.setResponse(responseERR(CommandHandler.ELEMENT_ID_NOT_FOUND)); + return false; + } + return true; + } + private TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ remoteManager.accessState((manager, state) -> { @@ -67,10 +75,8 @@ public class PolygonCommandHandler extends CommandHandler{ Optional obstacle = state.getTopography().getObstacles().stream() .filter(o-> cmd.getElementIdentifier().equals(Integer.toString(o.getId()))) .findFirst(); - if (obstacle.isPresent()) + if (checkIfObstacleExists(obstacle.get(), cmd)) cmd.setResponse(responseOK(traCIVar.returnType, obstacle.get().getShape().getPath())); - else - cmd.setResponse(responseERR("Cannot find shape with objectId "+ cmd.getElementIdentifier())); }); return cmd; @@ -86,10 +92,8 @@ public class PolygonCommandHandler extends CommandHandler{ Optional obstacle = state.getTopography().getObstacles().stream() .filter(o-> cmd.getElementIdentifier().equals(Integer.toString(o.getId()))) .findFirst(); - if (obstacle.isPresent()) + if (checkIfObstacleExists(obstacle.get(), cmd)) cmd.setResponse(responseOK(traCIVar.returnType, obstacle.get().getShape().getCentroid())); - else - cmd.setResponse(responseERR("Cannot find shape with objectId "+ cmd.getElementIdentifier())); }); return cmd; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java b/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java index 977171bfc..91f562038 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java +++ b/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java @@ -8,17 +8,24 @@ import org.vadere.manager.stsc.respons.StatusResponse; import org.vadere.manager.stsc.respons.TraCIGetResponse; import org.vadere.manager.stsc.respons.TraCIStatusResponse; import org.vadere.manager.stsc.respons.TraCISubscriptionResponse; +import org.vadere.util.logging.Logger; + +import java.util.Arrays; public class Subscription { - TraCICmdHandler traCICmdHandler; - TraCICmd responseIdentifier; - TraCIValueSubscriptionCommand valueSubscriptionCommand; + private static Logger logger = Logger.getLogger(Subscription.class); + + private final TraCICmdHandler traCICmdHandler; + private final TraCICmd responseIdentifier; + private final TraCIValueSubscriptionCommand valueSubscriptionCommand; + private boolean markedForRemoval; public Subscription(TraCICmdHandler traCICmdHandler, TraCICmd responseIdentifier, TraCIValueSubscriptionCommand valueSubscriptionCommand) { this.traCICmdHandler = traCICmdHandler; this.responseIdentifier = responseIdentifier; this.valueSubscriptionCommand = valueSubscriptionCommand; + this.markedForRemoval = false; } public void executeSubscription(RemoteManager remoteManager){ @@ -29,38 +36,60 @@ public class Subscription { for (TraCIGetCommand getCmd : valueSubscriptionCommand.getGetCommands()) { traCICmdHandler.handel(getCmd, remoteManager); TraCIGetResponse getResponse = getCmd.getResponse(); + + if (getResponse.getStatusResponse().getResponse().equals(TraCIStatusResponse.ERR)){ + logger.warn("Get command returned error: " + getResponse.getStatusResponse().getDescription()); + if (getResponse.getStatusResponse().getDescription().equals(CommandHandler.ELEMENT_ID_NOT_FOUND)){ + logger.warn("Mark Subscription for removal. Subscribed element no longer exists"); + markForRemoval(); + logger.warnf(toString()); + break; + } + } + subResponse.addVariableResponse(getResponse.getVariableIdentifier(), getResponse.getStatusResponse().getResponse(), getResponse.getResponseDataType(), getResponse.getResponseData()); } - valueSubscriptionCommand.setResponse(subResponse); + if (markedForRemoval){ + valueSubscriptionCommand.setResponse( + TraCISubscriptionResponse.removeResponse(valueSubscriptionCommand, responseIdentifier)); + } else { + valueSubscriptionCommand.setResponse(subResponse); + } } + public void markForRemoval(){ + this.markedForRemoval = true; + } + public boolean isMarkedForRemoval() { + return markedForRemoval; + } public TraCICmdHandler getTraCICmdHandler() { return traCICmdHandler; } - public void setTraCICmdHandler(TraCICmdHandler traCICmdHandler) { - this.traCICmdHandler = traCICmdHandler; - } - public TraCICmd getResponseIdentifier() { return responseIdentifier; } - public void setResponseIdentifier(TraCICmd responseIdentifier) { - this.responseIdentifier = responseIdentifier; - } - public TraCIValueSubscriptionCommand getValueSubscriptionCommand() { return valueSubscriptionCommand; } - public void setValueSubscriptionCommand(TraCIValueSubscriptionCommand valueSubscriptionCommand) { - this.valueSubscriptionCommand = valueSubscriptionCommand; + public String getSubscriptionId(){ + return "SubID_" + valueSubscriptionCommand.getTraCICmd().name() + "-" + valueSubscriptionCommand.getElementIdentifier(); + } + + @Override + public String toString() { + String varList = Arrays.toString(valueSubscriptionCommand.getVariables().toArray()); + return "Subscription{ API="+valueSubscriptionCommand.getTraCICmd().name()+ + " objectId='" + valueSubscriptionCommand.getElementIdentifier() + "' " + + "subscribedVariables=" + varList + "}"; } } diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java index 5d73ac932..5288a1892 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java @@ -18,6 +18,12 @@ public class TraCISimTimeResponse extends TraCIResponse { private List subscriptionResponses; + public static TraCISimTimeResponse simEndReached(){ + TraCISimTimeResponse res = new TraCISimTimeResponse( + new StatusResponse(TraCICmd.SIM_STEP, TraCIStatusResponse.ERR, "Simulation end reached.")); + + return res; + } public TraCISimTimeResponse (StatusResponse statusResponse, TraCICommandBuffer buffer){ this(statusResponse); diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java index 3b1391394..abcf6fa05 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java +++ b/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java @@ -2,6 +2,7 @@ package org.vadere.manager.stsc.respons; import org.vadere.manager.stsc.TraCICmd; import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.stsc.commands.TraCIValueSubscriptionCommand; import org.vadere.manager.stsc.reader.TraCICommandBuffer; import java.util.ArrayList; @@ -10,11 +11,20 @@ import java.util.Objects; public class TraCISubscriptionResponse extends TraCIResponse { + public static final String SUB_REMOVED = "Subscription removed."; + private String elementId; private int numberOfVariables; private List responses; + public static TraCISubscriptionResponse removeResponse(TraCIValueSubscriptionCommand cmd, TraCICmd res){ + TraCISubscriptionResponse subResponse = new TraCISubscriptionResponse( + new StatusResponse(cmd.getTraCICmd(), TraCIStatusResponse.ERR, SUB_REMOVED), + res, cmd.getElementIdentifier(), cmd.getNumberOfVariables()); + + return subResponse; + } public TraCISubscriptionResponse(StatusResponse statusResponse, TraCICmd responseIdentifier, TraCICommandBuffer buffer) { diff --git a/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java b/VadereSimulator/src/org/vadere/simulator/control/RemoteRunListener.java similarity index 88% rename from VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java rename to VadereSimulator/src/org/vadere/simulator/control/RemoteRunListener.java index cada7eee0..729822462 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/RemoteManagerListener.java +++ b/VadereSimulator/src/org/vadere/simulator/control/RemoteRunListener.java @@ -1,6 +1,6 @@ package org.vadere.simulator.control; -public interface RemoteManagerListener { +public interface RemoteRunListener { /** * Notify RemoteManger that the simulation reached end of loop and the {@link SimulationState} diff --git a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java b/VadereSimulator/src/org/vadere/simulator/control/ScenarioRun.java similarity index 86% rename from VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java rename to VadereSimulator/src/org/vadere/simulator/control/ScenarioRun.java index 4d7b2446d..58b156436 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java +++ b/VadereSimulator/src/org/vadere/simulator/control/ScenarioRun.java @@ -1,12 +1,12 @@ -package org.vadere.simulator.projects; +package org.vadere.simulator.control; import org.jetbrains.annotations.Nullable; -import org.vadere.simulator.control.PassiveCallback; -import org.vadere.simulator.control.RemoteManagerListener; -import org.vadere.simulator.control.Simulation; -import org.vadere.simulator.control.SimulationState; import org.vadere.simulator.models.MainModel; import org.vadere.simulator.models.MainModelBuilder; +import org.vadere.simulator.projects.RunnableFinishedListener; +import org.vadere.simulator.projects.Scenario; +import org.vadere.simulator.projects.ScenarioStore; +import org.vadere.simulator.projects.SimulationResult; import org.vadere.simulator.projects.dataprocessing.DataProcessingJsonManager; import org.vadere.simulator.projects.dataprocessing.ProcessorManager; import org.vadere.util.io.IOUtils; @@ -32,30 +32,30 @@ import java.util.Random; */ public class ScenarioRun implements Runnable { - private static Logger logger = Logger.getLogger(ScenarioRun.class); + protected static Logger logger = Logger.getLogger(ScenarioRun.class); - private Path outputPath; + protected Path outputPath; - private final List passiveCallbacks = new LinkedList<>(); + protected final List passiveCallbacks = new LinkedList<>(); - private final List remoteManagerListeners = new ArrayList<>(); + protected final List remoteRunListeners = new ArrayList<>(); - private final DataProcessingJsonManager dataProcessingJsonManager; + protected final DataProcessingJsonManager dataProcessingJsonManager; - private Simulation simulation; + protected Simulation simulation; - private boolean singleStepMode = false; + protected boolean singleStepMode = false; // the processor is null if no output is written i.e. if scenarioStore.attributesSimulation.isWriteSimulationData() is false. - private @Nullable + protected @Nullable ProcessorManager processorManager; - private final Scenario scenario; - private final ScenarioStore scenarioStore; // contained in scenario, but here for convenience + protected final Scenario scenario; + protected final ScenarioStore scenarioStore; // contained in scenario, but here for convenience - private final RunnableFinishedListener finishedListener; + protected final RunnableFinishedListener finishedListener; - private SimulationResult simulationResult; + protected SimulationResult simulationResult; public ScenarioRun(final Scenario scenario, RunnableFinishedListener scenarioFinishedListener, boolean singleStepMode) { this(scenario, IOUtils.OUTPUT_DIR, scenarioFinishedListener); @@ -124,7 +124,7 @@ public class ScenarioRun implements Runnable { // Run simulation main loop from start time = 0 seconds simulation = new Simulation(mainModel, 0, scenarioStore.getName(), scenarioStore, passiveCallbacks, random, - processorManager, simulationResult, remoteManagerListeners, singleStepMode); + processorManager, simulationResult, remoteRunListeners, singleStepMode); } simulation.run(); simulationResult.setState("SimulationRun completed"); @@ -194,7 +194,9 @@ public class ScenarioRun implements Runnable { simulation.resume(); } - public SimulationState getSimulationState(){ + // only allow subclasses access to the not final state. + // this is needed to allow vadere to receive SET-Commands. + protected SimulationState getSimulationState(){ return simulation.getSimulationState(); } @@ -202,8 +204,8 @@ public class ScenarioRun implements Runnable { passiveCallbacks.add(pc); } - public void addRemoteManagerListener(final RemoteManagerListener listener){ - remoteManagerListeners.add(listener); + public void addRemoteManagerListener(final RemoteRunListener listener){ + remoteRunListeners.add(listener); } public boolean isSingleStepMode() { diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index fbdeb030f..ca71a57bb 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -47,7 +47,7 @@ public class Simulation { private DynamicElementFactory dynamicElementFactory; private final List passiveCallbacks; - private final List remoteManagerListeners; + private final List remoteRunListeners; private List models; private boolean isRunSimulation = false; @@ -86,7 +86,7 @@ public class Simulation { public Simulation(MainModel mainModel, double startTimeInSec, final String name, ScenarioStore scenarioStore, List passiveCallbacks, Random random, ProcessorManager processorManager, - SimulationResult simulationResult, List remoteManagerListeners, boolean singleStepMode) { + SimulationResult simulationResult, List remoteRunListeners, boolean singleStepMode) { this.name = name; this.mainModel = mainModel; @@ -110,7 +110,7 @@ public class Simulation { this.processorManager = processorManager; this.passiveCallbacks = passiveCallbacks; - this.remoteManagerListeners = remoteManagerListeners; + this.remoteRunListeners = remoteRunListeners; this.singleStepMode = singleStepMode; // "eventController" is final. Therefore, create object here and not in helper method. @@ -218,7 +218,8 @@ public class Simulation { // notify remoteManger that simulation ended. If a command waited for the next // simulation step notify it and execute command with current SimulationState. - remoteManagerListeners.forEach(RemoteManagerListener::lastSimulationStepFinishedListener); + setWaitForSimCommand(true); // its save to read the state now. + remoteRunListeners.forEach(RemoteRunListener::lastSimulationStepFinishedListener); } /** @@ -273,11 +274,13 @@ public class Simulation { synchronized (this){ if (singleStepMode){ // check reached next simTime (-1 simulate one step) - if (simTimeInSec >= simulateUntilInSec || simulateUntilInSec == -1){ + // round to long to ensure correct trap. + boolean timeReached = Math.round(simTimeInSec) >= Math.round(simulateUntilInSec); + if (timeReached || simulateUntilInSec == -1){ logger.warnf("Simulated until: %.4f", simTimeInSec); setWaitForSimCommand(true); - remoteManagerListeners.forEach(RemoteManagerListener::simulationStepFinishedListener); + remoteRunListeners.forEach(RemoteRunListener::simulationStepFinishedListener); while (waitForSimCommand){ logger.warn("wait for next SimCommand..."); try { @@ -395,11 +398,11 @@ public class Simulation { } } - public synchronized void pause() { + synchronized void pause() { isPaused = true; } - public synchronized boolean isPaused() { + private synchronized boolean isPaused() { return isPaused; } @@ -407,34 +410,38 @@ public class Simulation { return isRunSimulation && !isPaused() && !isWaitForSimCommand(); } - public synchronized boolean isSingleStepMode(){ return singleStepMode;} + synchronized boolean isSingleStepMode(){ return singleStepMode;} - public void setSingleStepMode(boolean singleStepMode) { + void setSingleStepMode(boolean singleStepMode) { this.singleStepMode = singleStepMode; } - public boolean isWaitForSimCommand() { + boolean isWaitForSimCommand() { return waitForSimCommand; } - public void setWaitForSimCommand(boolean waitForSimCommand) { + private void setWaitForSimCommand(boolean waitForSimCommand) { this.waitForSimCommand = waitForSimCommand; } - public synchronized void nextSimCommand(double simulateUntilInSec){ + synchronized void nextSimCommand(double simulateUntilInSec){ this.simulateUntilInSec = simulateUntilInSec; waitForSimCommand = false; isPaused = false; notify(); } - public synchronized void resume() { + synchronized void resume() { isPaused = false; waitForSimCommand = false; singleStepMode = false; notify(); } + synchronized SimulationState getSimulationState(){ + return simulationState; + } + /** * If visualization is enabled, wait until time elapsed since last frame * matches a given time span. This ensures that the speed of the simulation @@ -470,7 +477,4 @@ public class Simulation { this.startTimeInSec = startTimeInSec; } - public synchronized SimulationState getSimulationState(){ - return simulationState; - } } diff --git a/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ProjectRunSubCommand.java b/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ProjectRunSubCommand.java index 0003b760f..fa492eed1 100644 --- a/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ProjectRunSubCommand.java +++ b/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ProjectRunSubCommand.java @@ -6,12 +6,11 @@ import net.sourceforge.argparse4j.inf.Namespace; import org.vadere.simulator.entrypoints.ScenarioFactory; import org.vadere.simulator.entrypoints.cmd.SubCommandRunner; import org.vadere.simulator.projects.Scenario; -import org.vadere.simulator.projects.ScenarioRun; +import org.vadere.simulator.control.ScenarioRun; import org.vadere.util.io.IOUtils; import org.vadere.util.logging.Logger; import java.io.IOException; -import java.nio.file.FileVisitOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ScenarioRunSubCommand.java b/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ScenarioRunSubCommand.java index 064f67b30..4909471df 100644 --- a/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ScenarioRunSubCommand.java +++ b/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/ScenarioRunSubCommand.java @@ -6,7 +6,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import org.vadere.simulator.entrypoints.ScenarioFactory; import org.vadere.simulator.entrypoints.cmd.SubCommandRunner; import org.vadere.simulator.projects.Scenario; -import org.vadere.simulator.projects.ScenarioRun; +import org.vadere.simulator.control.ScenarioRun; import org.vadere.simulator.utils.scenariochecker.ConsoleScenarioCheckerMessageFormatter; import org.vadere.simulator.utils.scenariochecker.ScenarioChecker; import org.vadere.simulator.utils.scenariochecker.ScenarioCheckerMessage; diff --git a/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/SuqSubCommand.java b/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/SuqSubCommand.java index 327fe4c52..8d774434c 100644 --- a/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/SuqSubCommand.java +++ b/VadereSimulator/src/org/vadere/simulator/entrypoints/cmd/commands/SuqSubCommand.java @@ -6,7 +6,7 @@ import net.sourceforge.argparse4j.inf.Namespace; import org.vadere.simulator.entrypoints.ScenarioFactory; import org.vadere.simulator.entrypoints.cmd.SubCommandRunner; import org.vadere.simulator.projects.Scenario; -import org.vadere.simulator.projects.ScenarioRun; +import org.vadere.simulator.control.ScenarioRun; import org.vadere.util.logging.Logger; import java.nio.file.Path; diff --git a/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java b/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java index c8acdcbd4..ab3bab86c 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/VadereProject.java @@ -1,6 +1,7 @@ package org.vadere.simulator.projects; import org.vadere.simulator.control.PassiveCallback; +import org.vadere.simulator.control.ScenarioRun; import org.vadere.simulator.projects.migration.MigrationResult; import org.vadere.util.logging.Logger; -- GitLab From 515af5e67688e42d188378fecd431f81f08fe1a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Thu, 13 Jun 2019 18:02:33 +0200 Subject: [PATCH 29/58] refactor package stsc to traci. add simple cli for vadere server --- VadereManager/pom.xml | 27 +++++++ .../src/org/vadere/manager/ClientHandler.java | 8 +- .../src/org/vadere/manager/Manager.java | 75 +++++++++++++++++-- .../src/org/vadere/manager/RemoteManager.java | 13 +++- .../org/vadere/manager/RemoteScenarioRun.java | 3 +- .../{commandHandler => }/Subscription.java | 21 +++--- .../org/vadere/manager/TraCIException.java | 4 +- .../src/org/vadere/manager/TraCISocket.java | 6 +- .../org/vadere/manager/client/TestClient.java | 24 +++--- .../manager/{stsc => traci}/CmdType.java | 2 +- .../manager/{stsc => traci}/TraCICmd.java | 2 +- .../{stsc => traci}/TraCIDataType.java | 2 +- .../commandHandler/CommandExecutor.java | 8 +- .../commandHandler/CommandHandler.java | 21 +++--- .../commandHandler/ControlCommandHandler.java | 28 +++---- .../commandHandler/PersonCommandHandler.java | 14 ++-- .../commandHandler/PersonHandler.java | 4 +- .../commandHandler/PolygonCommandHandler.java | 14 ++-- .../SimulationCommandHandler.java | 14 ++-- .../commandHandler/StateAccessHandler.java | 2 +- .../commandHandler/SubscriptionHandler.java | 4 +- .../commandHandler/TraCICmdHandler.java | 4 +- .../commandHandler/TraCIPersonVar.java | 4 +- .../commandHandler/TraCIPolygonVar.java | 4 +- .../commandHandler/TraCISimulationVar.java | 4 +- .../commandHandler/TraCIVehicleVar.java | 4 +- .../commandHandler/VehicleCommandHandler.java | 12 +-- .../commands/TraCICommand.java | 24 +++--- .../commands/TraCIGetCommand.java | 14 ++-- .../commands/TraCISetCommand.java | 14 ++-- .../TraCIValueSubscriptionCommand.java | 10 +-- .../commands/control/TraCICloseCommand.java | 16 ++-- .../control/TraCIGetVersionCommand.java | 10 +-- .../commands/control/TraCILoadCommand.java | 10 +-- .../control/TraCISendFileCommand.java | 10 +-- .../commands/control/TraCISimStepCommand.java | 12 +-- .../reader/TraCIByteBuffer.java | 10 +-- .../reader/TraCICommandBuffer.java | 2 +- .../reader/TraCIPacketBuffer.java | 10 +-- .../{stsc => traci}/reader/TraCIReader.java | 8 +- .../respons/StatusResponse.java | 6 +- .../respons/TraCIGetResponse.java | 10 +-- .../respons/TraCIGetVersionResponse.java | 8 +- .../respons/TraCIResponse.java | 8 +- .../respons/TraCISimTimeResponse.java | 8 +- .../respons/TraCIStatusResponse.java | 2 +- .../respons/TraCISubscriptionResponse.java | 10 +-- .../{stsc => traci}/sumo/LightPhase.java | 2 +- .../{stsc => traci}/sumo/RoadMapPosition.java | 2 +- .../sumo/TrafficLightPhase.java | 2 +- .../ByteArrayOutputStreamTraCIWriter.java | 8 +- .../{stsc => traci}/writer/TraCIPacket.java | 18 ++--- .../{stsc => traci}/writer/TraCIWriter.java | 8 +- .../ByteArrayOutputStreamTraCIWriterTest.java | 10 +-- .../{stsc => traci}/TraCIReaderTest.java | 12 +-- .../respons/StatusResponseTest.java | 4 +- .../respons/TraCIGetResponseTest.java | 10 +-- .../respons/TraCIGetVersionResponseTest.java | 6 +- .../vadere/simulator/control/Simulation.java | 4 +- 59 files changed, 359 insertions(+), 257 deletions(-) rename VadereManager/src/org/vadere/manager/{commandHandler => }/Subscription.java (84%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/CmdType.java (81%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/TraCICmd.java (99%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/TraCIDataType.java (97%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/CommandExecutor.java (92%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/CommandHandler.java (83%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/ControlCommandHandler.java (74%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/PersonCommandHandler.java (95%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/PersonHandler.java (88%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/PolygonCommandHandler.java (92%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/SimulationCommandHandler.java (90%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/StateAccessHandler.java (93%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/SubscriptionHandler.java (56%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/TraCICmdHandler.java (72%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/TraCIPersonVar.java (94%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/TraCIPolygonVar.java (90%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/TraCISimulationVar.java (93%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/TraCIVehicleVar.java (86%) rename VadereManager/src/org/vadere/manager/{ => traci}/commandHandler/VehicleCommandHandler.java (83%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/TraCICommand.java (80%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/TraCIGetCommand.java (84%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/TraCISetCommand.java (77%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/TraCIValueSubscriptionCommand.java (89%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/control/TraCICloseCommand.java (68%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/control/TraCIGetVersionCommand.java (74%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/control/TraCILoadCommand.java (63%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/control/TraCISendFileCommand.java (80%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/commands/control/TraCISimStepCommand.java (75%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/reader/TraCIByteBuffer.java (96%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/reader/TraCICommandBuffer.java (96%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/reader/TraCIPacketBuffer.java (89%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/reader/TraCIReader.java (86%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/respons/StatusResponse.java (93%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/respons/TraCIGetResponse.java (90%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/respons/TraCIGetVersionResponse.java (89%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/respons/TraCIResponse.java (95%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/respons/TraCISimTimeResponse.java (87%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/respons/TraCIStatusResponse.java (94%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/respons/TraCISubscriptionResponse.java (95%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/sumo/LightPhase.java (90%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/sumo/RoadMapPosition.java (96%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/sumo/TrafficLightPhase.java (96%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/writer/ByteArrayOutputStreamTraCIWriter.java (97%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/writer/TraCIPacket.java (92%) rename VadereManager/src/org/vadere/manager/{stsc => traci}/writer/TraCIWriter.java (91%) rename VadereManager/tests/org/vadere/manager/{stsc => traci}/ByteArrayOutputStreamTraCIWriterTest.java (97%) rename VadereManager/tests/org/vadere/manager/{stsc => traci}/TraCIReaderTest.java (94%) rename VadereManager/tests/org/vadere/manager/{stsc => traci}/respons/StatusResponseTest.java (96%) rename VadereManager/tests/org/vadere/manager/{stsc => traci}/respons/TraCIGetResponseTest.java (78%) rename VadereManager/tests/org/vadere/manager/{stsc => traci}/respons/TraCIGetVersionResponseTest.java (83%) diff --git a/VadereManager/pom.xml b/VadereManager/pom.xml index 21524652e..7a6850b0b 100644 --- a/VadereManager/pom.xml +++ b/VadereManager/pom.xml @@ -118,6 +118,33 @@ + + + maven-assembly-plugin + 2.4 + + + build-vadere-server + package + + single + + + + + org.vadere.manager.Manager + + + + jar-with-dependencies + + vadere-server + false + false + + + + diff --git a/VadereManager/src/org/vadere/manager/ClientHandler.java b/VadereManager/src/org/vadere/manager/ClientHandler.java index 15f47fbc2..099018ab3 100644 --- a/VadereManager/src/org/vadere/manager/ClientHandler.java +++ b/VadereManager/src/org/vadere/manager/ClientHandler.java @@ -1,9 +1,9 @@ package org.vadere.manager; -import org.vadere.manager.commandHandler.CommandExecutor; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.reader.TraCIPacketBuffer; -import org.vadere.manager.stsc.writer.TraCIPacket; +import org.vadere.manager.traci.commandHandler.CommandExecutor; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.reader.TraCIPacketBuffer; +import org.vadere.manager.traci.writer.TraCIPacket; import org.vadere.util.logging.Logger; import java.io.EOFException; diff --git a/VadereManager/src/org/vadere/manager/Manager.java b/VadereManager/src/org/vadere/manager/Manager.java index 5db86fc40..604eb2569 100644 --- a/VadereManager/src/org/vadere/manager/Manager.java +++ b/VadereManager/src/org/vadere/manager/Manager.java @@ -1,7 +1,13 @@ package org.vadere.manager; -import java.io.IOException; +import net.sourceforge.argparse4j.ArgumentParsers; +import net.sourceforge.argparse4j.inf.ArgumentParser; +import net.sourceforge.argparse4j.inf.Namespace; +import net.sourceforge.argparse4j.internal.HelpScreenException; + +import org.vadere.util.logging.Logger; + import java.net.ServerSocket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -9,15 +15,72 @@ import java.util.concurrent.Executors; public class Manager { - public static void main(String[] args) throws IOException { + public static void main(String[] args) { + Logger.setMainArguments(args); + ArgumentParser p = createArgumentParser(); + Namespace ns; + + try { + ns = p.parseArgs(args); + ExecutorService pool = Executors.newFixedThreadPool(ns.getInt("clientNum")); + ServerSocket serverSocket = new ServerSocket(ns.getInt("port")); + + VadereServer server = new VadereServer(serverSocket, pool); + server.run(); - ExecutorService pool = Executors.newFixedThreadPool(4); - ServerSocket serverSocket = new ServerSocket(9999); + } catch (HelpScreenException ignored) { + + } catch (Exception e) { + e.printStackTrace(); + } - VadereServer server = new VadereServer(serverSocket, pool); - server.run(); } + private static ArgumentParser createArgumentParser() { + ArgumentParser parser = ArgumentParsers.newArgumentParser("Vadere Server") + .defaultHelp(true) + .description("Runs the VADERE pedestrian simulator as a server."); + + addOptionsToParser(parser); + + return parser; + } + private static void addOptionsToParser(ArgumentParser parser) { + // no action required call to Logger.setMainArguments(args) already configured Logger. + parser.addArgument("--loglevel") + .required(false) + .type(String.class) + .dest("loglevel") + .choices("OFF", "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE", "ALL") + .setDefault("INFO") + .help("Set Log Level."); + + // no action required call to Logger.setMainArguments(args) already configured Logger. + parser.addArgument("--logname") + .required(false) + .type(String.class) + .dest("logname") + .help("Write log to given file."); + + + // no action required call to Logger.setMainArguments(args) already configured Logger. + parser.addArgument("--port") + .required(false) + .type(Integer.class) + .setDefault(9999) + .dest("port") + .help("Set port number."); + + // no action required call to Logger.setMainArguments(args) already configured Logger. + parser.addArgument("--clientNum") + .required(false) + .type(Integer.class) + .setDefault(4) + .dest("clientNum") + .help("Set number of clients to manager. Important: Each client has a separate simulation. No communication between clients"); + + + } } diff --git a/VadereManager/src/org/vadere/manager/RemoteManager.java b/VadereManager/src/org/vadere/manager/RemoteManager.java index c8a962de9..6647f27d4 100644 --- a/VadereManager/src/org/vadere/manager/RemoteManager.java +++ b/VadereManager/src/org/vadere/manager/RemoteManager.java @@ -1,7 +1,6 @@ package org.vadere.manager; -import org.vadere.manager.commandHandler.StateAccessHandler; -import org.vadere.manager.commandHandler.Subscription; +import org.vadere.manager.traci.commandHandler.StateAccessHandler; import org.vadere.simulator.entrypoints.ScenarioFactory; import org.vadere.simulator.projects.RunnableFinishedListener; import org.vadere.simulator.projects.Scenario; @@ -22,12 +21,14 @@ public class RemoteManager implements RunnableFinishedListener { private RemoteScenarioRun currentSimulationRun; private Thread currentSimulationThread; private boolean simulationFinished; + private boolean clientCloseCommandReceived; private List subscriptions; public RemoteManager() { subscriptions = new ArrayList<>(); + clientCloseCommandReceived = false; } public void loadScenario(String scenarioString) { @@ -75,6 +76,14 @@ public class RemoteManager implements RunnableFinishedListener { return true; } + public boolean isClientCloseCommandReceived() { + return clientCloseCommandReceived; + } + + public void setClientCloseCommandReceived(boolean clientCloseCommandReceived) { + this.clientCloseCommandReceived = clientCloseCommandReceived; + } + @Override public void finished(Runnable runnable) { simulationFinished = true; diff --git a/VadereManager/src/org/vadere/manager/RemoteScenarioRun.java b/VadereManager/src/org/vadere/manager/RemoteScenarioRun.java index 65d011b51..8ea9cb461 100644 --- a/VadereManager/src/org/vadere/manager/RemoteScenarioRun.java +++ b/VadereManager/src/org/vadere/manager/RemoteScenarioRun.java @@ -1,7 +1,6 @@ package org.vadere.manager; -import org.vadere.manager.commandHandler.StateAccessHandler; -import org.vadere.manager.commandHandler.Subscription; +import org.vadere.manager.traci.commandHandler.StateAccessHandler; import org.vadere.simulator.control.RemoteRunListener; import org.vadere.simulator.projects.RunnableFinishedListener; import org.vadere.simulator.projects.Scenario; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java b/VadereManager/src/org/vadere/manager/Subscription.java similarity index 84% rename from VadereManager/src/org/vadere/manager/commandHandler/Subscription.java rename to VadereManager/src/org/vadere/manager/Subscription.java index 91f562038..acd7efa78 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/Subscription.java +++ b/VadereManager/src/org/vadere/manager/Subscription.java @@ -1,13 +1,14 @@ -package org.vadere.manager.commandHandler; - -import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.commands.TraCIValueSubscriptionCommand; -import org.vadere.manager.stsc.respons.StatusResponse; -import org.vadere.manager.stsc.respons.TraCIGetResponse; -import org.vadere.manager.stsc.respons.TraCIStatusResponse; -import org.vadere.manager.stsc.respons.TraCISubscriptionResponse; +package org.vadere.manager; + +import org.vadere.manager.traci.commandHandler.CommandHandler; +import org.vadere.manager.traci.commandHandler.TraCICmdHandler; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.commands.TraCIValueSubscriptionCommand; +import org.vadere.manager.traci.respons.StatusResponse; +import org.vadere.manager.traci.respons.TraCIGetResponse; +import org.vadere.manager.traci.respons.TraCIStatusResponse; +import org.vadere.manager.traci.respons.TraCISubscriptionResponse; import org.vadere.util.logging.Logger; import java.util.Arrays; diff --git a/VadereManager/src/org/vadere/manager/TraCIException.java b/VadereManager/src/org/vadere/manager/TraCIException.java index 9c7a2f7ee..d1832a70e 100644 --- a/VadereManager/src/org/vadere/manager/TraCIException.java +++ b/VadereManager/src/org/vadere/manager/TraCIException.java @@ -1,7 +1,7 @@ package org.vadere.manager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commands.TraCIGetCommand; public class TraCIException extends RuntimeException { diff --git a/VadereManager/src/org/vadere/manager/TraCISocket.java b/VadereManager/src/org/vadere/manager/TraCISocket.java index 1a86179c6..10b6f3b64 100644 --- a/VadereManager/src/org/vadere/manager/TraCISocket.java +++ b/VadereManager/src/org/vadere/manager/TraCISocket.java @@ -1,8 +1,8 @@ package org.vadere.manager; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.reader.TraCIPacketBuffer; -import org.vadere.manager.stsc.respons.TraCIResponse; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.reader.TraCIPacketBuffer; +import org.vadere.manager.traci.respons.TraCIResponse; import java.io.Closeable; import java.io.DataInputStream; diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index 41591972e..48bf5e846 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -1,18 +1,18 @@ package org.vadere.manager.client; import org.vadere.manager.TraCISocket; -import org.vadere.manager.commandHandler.TraCIPersonVar; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.commands.control.TraCICloseCommand; -import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; -import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; -import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; -import org.vadere.manager.stsc.reader.TraCIPacketBuffer; -import org.vadere.manager.stsc.respons.TraCIGetResponse; -import org.vadere.manager.stsc.respons.TraCIResponse; -import org.vadere.manager.stsc.respons.TraCISimTimeResponse; +import org.vadere.manager.traci.commandHandler.TraCIPersonVar; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.commands.control.TraCICloseCommand; +import org.vadere.manager.traci.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.traci.commands.control.TraCISendFileCommand; +import org.vadere.manager.traci.commands.control.TraCISimStepCommand; +import org.vadere.manager.traci.reader.TraCIPacketBuffer; +import org.vadere.manager.traci.respons.TraCIGetResponse; +import org.vadere.manager.traci.respons.TraCIResponse; +import org.vadere.manager.traci.respons.TraCISimTimeResponse; import org.vadere.util.geometry.shapes.VPoint; import org.vadere.util.io.IOUtils; diff --git a/VadereManager/src/org/vadere/manager/stsc/CmdType.java b/VadereManager/src/org/vadere/manager/traci/CmdType.java similarity index 81% rename from VadereManager/src/org/vadere/manager/stsc/CmdType.java rename to VadereManager/src/org/vadere/manager/traci/CmdType.java index f036f1ceb..4b33dbd3f 100644 --- a/VadereManager/src/org/vadere/manager/stsc/CmdType.java +++ b/VadereManager/src/org/vadere/manager/traci/CmdType.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.traci; /** * Command Types of TraCI. Used to cluster commands. diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java b/VadereManager/src/org/vadere/manager/traci/TraCICmd.java similarity index 99% rename from VadereManager/src/org/vadere/manager/stsc/TraCICmd.java rename to VadereManager/src/org/vadere/manager/traci/TraCICmd.java index 7dffa5f10..b1affd6ba 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCICmd.java +++ b/VadereManager/src/org/vadere/manager/traci/TraCICmd.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.traci; import org.vadere.manager.TraCIException; diff --git a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java b/VadereManager/src/org/vadere/manager/traci/TraCIDataType.java similarity index 97% rename from VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java rename to VadereManager/src/org/vadere/manager/traci/TraCIDataType.java index c9ed5cc16..6705a79ad 100644 --- a/VadereManager/src/org/vadere/manager/stsc/TraCIDataType.java +++ b/VadereManager/src/org/vadere/manager/traci/TraCIDataType.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.traci; import org.vadere.manager.TraCIException; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandExecutor.java similarity index 92% rename from VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/CommandExecutor.java index 4054b704a..3fc7c1610 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandExecutor.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandExecutor.java @@ -1,9 +1,9 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.writer.TraCIPacket; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.writer.TraCIPacket; import org.vadere.util.logging.Logger; import java.util.HashMap; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandHandler.java similarity index 83% rename from VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/CommandHandler.java index a2c772bab..6f9994474 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandHandler.java @@ -1,15 +1,16 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.commands.TraCIValueSubscriptionCommand; -import org.vadere.manager.stsc.respons.StatusResponse; -import org.vadere.manager.stsc.respons.TraCIGetResponse; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.respons.TraCIStatusResponse; -import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.Subscription; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.commands.TraCIValueSubscriptionCommand; +import org.vadere.manager.traci.respons.StatusResponse; +import org.vadere.manager.traci.respons.TraCIGetResponse; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.respons.TraCIStatusResponse; +import org.vadere.manager.traci.commands.TraCICommand; import java.util.ArrayList; import java.util.List; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/ControlCommandHandler.java similarity index 74% rename from VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/ControlCommandHandler.java index c58c894f1..2b677f465 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/ControlCommandHandler.java @@ -1,21 +1,22 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; +import org.vadere.manager.Subscription; import org.vadere.manager.VadereServer; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.commands.control.TraCICloseCommand; -import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; -import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; -import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; -import org.vadere.manager.stsc.respons.StatusResponse; -import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; -import org.vadere.manager.stsc.respons.TraCISimTimeResponse; -import org.vadere.manager.stsc.respons.TraCIStatusResponse; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.commands.control.TraCICloseCommand; +import org.vadere.manager.traci.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.traci.commands.control.TraCISendFileCommand; +import org.vadere.manager.traci.commands.control.TraCISimStepCommand; +import org.vadere.manager.traci.respons.StatusResponse; +import org.vadere.manager.traci.respons.TraCIGetVersionResponse; +import org.vadere.manager.traci.respons.TraCISimTimeResponse; +import org.vadere.manager.traci.respons.TraCIStatusResponse; import org.vadere.util.logging.Logger; /** - * Handel {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Control API + * Handel {@link org.vadere.manager.traci.commands.TraCICommand}s for the Control API */ public class ControlCommandHandler extends CommandHandler{ @@ -37,18 +38,19 @@ public class ControlCommandHandler extends CommandHandler{ TraCICloseCommand cmd = (TraCICloseCommand)rawCmd; + remoteManager.setClientCloseCommandReceived(true); + if (remoteManager.stopSimulationIfRunning()) cmd.getResponse().getStatusResponse().setDescription("Stop simulation waiting for client close EOF"); else cmd.getResponse().getStatusResponse().setDescription("waiting for client close EOF"); - return cmd; } public TraCICommand process_simStep(TraCICommand rawCmd, RemoteManager remoteManager) { TraCISimStepCommand cmd = (TraCISimStepCommand) rawCmd; - logger.infof("Simulate to: %f", cmd.getTargetTime()); + logger.debugf("Simulate to: %f", cmd.getTargetTime()); // remoteManager.nextStep(cmd.getTargetTime()); if (!remoteManager.nextStep(cmd.getTargetTime())) { //simulation finished; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonCommandHandler.java similarity index 95% rename from VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/PersonCommandHandler.java index 27cc43e4c..795785c3e 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonCommandHandler.java @@ -1,11 +1,11 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.respons.TraCIGetResponse; import org.vadere.state.scenario.Pedestrian; import org.vadere.util.logging.Logger; @@ -15,7 +15,7 @@ import java.util.stream.Collectors; /** - * Handel GET/SET {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Person API + * Handel GET/SET {@link org.vadere.manager.traci.commands.TraCICommand}s for the Person API */ public class PersonCommandHandler extends CommandHandler{ diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PersonHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonHandler.java similarity index 88% rename from VadereManager/src/org/vadere/manager/commandHandler/PersonHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/PersonHandler.java index 54a30d250..52a4d78d3 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PersonHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonHandler.java @@ -1,6 +1,6 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; -import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.traci.TraCICmd; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/PolygonCommandHandler.java similarity index 92% rename from VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/PolygonCommandHandler.java index e3469c19d..8f9d3c004 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/PolygonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/PolygonCommandHandler.java @@ -1,11 +1,11 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.respons.TraCIGetResponse; import org.vadere.state.scenario.Obstacle; import java.awt.*; @@ -14,7 +14,7 @@ import java.util.Optional; import java.util.stream.Collectors; /** - * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Polygon API + * Handel GET/SET/SUB {@link org.vadere.manager.traci.commands.TraCICommand}s for the Polygon API */ public class PolygonCommandHandler extends CommandHandler{ diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/SimulationCommandHandler.java similarity index 90% rename from VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/SimulationCommandHandler.java index b1770aea8..a6d44c48a 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/SimulationCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/SimulationCommandHandler.java @@ -1,11 +1,11 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.respons.TraCIGetResponse; import org.vadere.util.geometry.shapes.VPoint; import java.awt.geom.Rectangle2D; @@ -14,7 +14,7 @@ import java.math.RoundingMode; import java.util.ArrayList; /** - * Handel GET/SET/SUB {@link org.vadere.manager.stsc.commands.TraCICommand}s for the Simulation API + * Handel GET/SET/SUB {@link org.vadere.manager.traci.commands.TraCICommand}s for the Simulation API */ public class SimulationCommandHandler extends CommandHandler{ diff --git a/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/StateAccessHandler.java similarity index 93% rename from VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/StateAccessHandler.java index b2feeee97..328cac216 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/StateAccessHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/StateAccessHandler.java @@ -1,4 +1,4 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.simulator.control.SimulationState; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/SubscriptionHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/SubscriptionHandler.java similarity index 56% rename from VadereManager/src/org/vadere/manager/commandHandler/SubscriptionHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/SubscriptionHandler.java index f97cba537..75bf277f9 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/SubscriptionHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/SubscriptionHandler.java @@ -1,6 +1,6 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; -import org.vadere.manager.stsc.commands.TraCIGetCommand; +import org.vadere.manager.traci.commands.TraCIGetCommand; import java.util.List; diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCICmdHandler.java similarity index 72% rename from VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/TraCICmdHandler.java index f4f0dee18..30dc9801c 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCICmdHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCICmdHandler.java @@ -1,7 +1,7 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.commands.TraCICommand; +import org.vadere.manager.traci.commands.TraCICommand; /** * Interface used to dispatch command handling to the correct {@link CommandHandler} subclass diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPersonVar.java similarity index 94% rename from VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPersonVar.java index b019f8c55..9c5f367bb 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPersonVar.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPersonVar.java @@ -1,7 +1,7 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.traci.TraCIDataType; /** diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPolygonVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPolygonVar.java similarity index 90% rename from VadereManager/src/org/vadere/manager/commandHandler/TraCIPolygonVar.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPolygonVar.java index 20290cf44..f6747fb7f 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCIPolygonVar.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPolygonVar.java @@ -1,7 +1,7 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.traci.TraCIDataType; public enum TraCIPolygonVar { ID_LIST(0x00, TraCIDataType.STRING_LIST), // get diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCISimulationVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCISimulationVar.java similarity index 93% rename from VadereManager/src/org/vadere/manager/commandHandler/TraCISimulationVar.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/TraCISimulationVar.java index ee2ba010d..69c536021 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCISimulationVar.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCISimulationVar.java @@ -1,7 +1,7 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.traci.TraCIDataType; public enum TraCISimulationVar { diff --git a/VadereManager/src/org/vadere/manager/commandHandler/TraCIVehicleVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIVehicleVar.java similarity index 86% rename from VadereManager/src/org/vadere/manager/commandHandler/TraCIVehicleVar.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIVehicleVar.java index f4bddae81..57071565d 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/TraCIVehicleVar.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIVehicleVar.java @@ -1,7 +1,7 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCIDataType; +import org.vadere.manager.traci.TraCIDataType; public enum TraCIVehicleVar { ID_LIST(0x00, TraCIDataType.STRING_LIST); diff --git a/VadereManager/src/org/vadere/manager/commandHandler/VehicleCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/VehicleCommandHandler.java similarity index 83% rename from VadereManager/src/org/vadere/manager/commandHandler/VehicleCommandHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/VehicleCommandHandler.java index 6ac29593c..e2988f804 100644 --- a/VadereManager/src/org/vadere/manager/commandHandler/VehicleCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/VehicleCommandHandler.java @@ -1,11 +1,11 @@ -package org.vadere.manager.commandHandler; +package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.commands.TraCIGetCommand; -import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.respons.TraCIGetResponse; import java.util.ArrayList; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/traci/commands/TraCICommand.java similarity index 80% rename from VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/TraCICommand.java index 3746eb00f..fee965fdd 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/TraCICommand.java @@ -1,15 +1,15 @@ -package org.vadere.manager.stsc.commands; +package org.vadere.manager.traci.commands; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.CmdType; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.commands.control.TraCILoadCommand; -import org.vadere.manager.stsc.commands.control.TraCISendFileCommand; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; -import org.vadere.manager.stsc.commands.control.TraCICloseCommand; -import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; -import org.vadere.manager.stsc.commands.control.TraCISimStepCommand; +import org.vadere.manager.traci.CmdType; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.commands.control.TraCILoadCommand; +import org.vadere.manager.traci.commands.control.TraCISendFileCommand; +import org.vadere.manager.traci.reader.TraCICommandBuffer; +import org.vadere.manager.traci.commands.control.TraCICloseCommand; +import org.vadere.manager.traci.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.traci.commands.control.TraCISimStepCommand; import java.nio.ByteBuffer; @@ -17,14 +17,14 @@ import java.nio.ByteBuffer; * Abstract Class for TraCICommands. * * Object of this Class only hold the state (input parameters, response data) for each - * command. The execution is handed by {@link org.vadere.manager.commandHandler.CommandHandler} + * command. The execution is handed by {@link org.vadere.manager.traci.commandHandler.CommandHandler} * classes. * * Each command has an Id managed as an enum {@link TraCICmd}. This enum also contains * the type of the command (i.e. GET, SET, Control). Depending on the type (and sometimes on * the variable queried) different sub classes are used to manage the command. * - * Construction Methods: (compare with {@link org.vadere.manager.stsc.respons.TraCIResponse}) + * Construction Methods: (compare with {@link org.vadere.manager.traci.respons.TraCIResponse}) * * 1) created from serialized data (byte[] / {@link ByteBuffer} / {@link TraCICommandBuffer}) * diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/TraCIGetCommand.java similarity index 84% rename from VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/TraCIGetCommand.java index 3746e6476..78b1c987c 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/TraCIGetCommand.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.commands; +package org.vadere.manager.traci.commands; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; -import org.vadere.manager.stsc.respons.TraCIGetResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.reader.TraCICommandBuffer; +import org.vadere.manager.traci.respons.TraCIGetResponse; import java.nio.charset.StandardCharsets; @@ -19,10 +19,10 @@ import java.nio.charset.StandardCharsets; * * - cmdIdentifier(based on API): see {@link TraCICmd} enum GET_**** * - variableId: Id for the variable. The numbers may be the same between different APIs - * see {@link org.vadere.manager.commandHandler.TraCIPersonVar} enum + * see {@link org.vadere.manager.traci.commandHandler.TraCIPersonVar} enum * - elementId: String based identifier for the object (i.e. a pedestrianId) * - * see {@link org.vadere.manager.commandHandler.PersonCommandHandler} for execution handing. + * see {@link org.vadere.manager.traci.commandHandler.PersonCommandHandler} for execution handing. * */ public class TraCIGetCommand extends TraCICommand { diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/TraCISetCommand.java similarity index 77% rename from VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/TraCISetCommand.java index 7548e6faa..30d549953 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/TraCISetCommand.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.commands; +package org.vadere.manager.traci.commands; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; -import org.vadere.manager.stsc.writer.TraCIPacket; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.reader.TraCICommandBuffer; +import org.vadere.manager.traci.writer.TraCIPacket; /** * Sub class of {@link TraCICommand} which represents a set request to some API. @@ -16,12 +16,12 @@ import org.vadere.manager.stsc.writer.TraCIPacket; * * - cmdIdentifier(based on API): see {@link TraCICmd} enum GET_**** * - variableId: Id for the variable. The numbers may be the same between different APIs - * see {@link org.vadere.manager.commandHandler.TraCIPersonVar} enum + * see {@link org.vadere.manager.traci.commandHandler.TraCIPersonVar} enum * - elementId: String based identifier for the object (i.e. a pedestrianId) * - dataTypeId: see {@link TraCIDataType} * - data: data to be returned. * - * see {@link org.vadere.manager.commandHandler.PersonCommandHandler} for execution handing. + * see {@link org.vadere.manager.traci.commandHandler.PersonCommandHandler} for execution handing. * */ public class TraCISetCommand extends TraCICommand{ diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIValueSubscriptionCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/TraCIValueSubscriptionCommand.java similarity index 89% rename from VadereManager/src/org/vadere/manager/stsc/commands/TraCIValueSubscriptionCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/TraCIValueSubscriptionCommand.java index 85bbdd391..897f8d674 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/TraCIValueSubscriptionCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/TraCIValueSubscriptionCommand.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.commands; +package org.vadere.manager.traci.commands; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; -import org.vadere.manager.stsc.respons.TraCISubscriptionResponse; -import org.vadere.manager.stsc.writer.TraCIPacket; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.reader.TraCICommandBuffer; +import org.vadere.manager.traci.respons.TraCISubscriptionResponse; +import org.vadere.manager.traci.writer.TraCIPacket; import java.util.ArrayList; import java.util.List; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCICloseCommand.java similarity index 68% rename from VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/control/TraCICloseCommand.java index 4eeb2e418..f9cc935d2 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCICloseCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCICloseCommand.java @@ -1,11 +1,11 @@ -package org.vadere.manager.stsc.commands.control; - -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.respons.StatusResponse; -import org.vadere.manager.stsc.respons.TraCIResponse; -import org.vadere.manager.stsc.respons.TraCIStatusResponse; +package org.vadere.manager.traci.commands.control; + +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.respons.StatusResponse; +import org.vadere.manager.traci.respons.TraCIResponse; +import org.vadere.manager.traci.respons.TraCIStatusResponse; public class TraCICloseCommand extends TraCICommand { diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCIGetVersionCommand.java similarity index 74% rename from VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/control/TraCIGetVersionCommand.java index dbf1d0808..a797cae69 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCIGetVersionCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCIGetVersionCommand.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.commands.control; +package org.vadere.manager.traci.commands.control; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.respons.TraCIGetVersionResponse; public class TraCIGetVersionCommand extends TraCICommand { diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCILoadCommand.java similarity index 63% rename from VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/control/TraCILoadCommand.java index 6631c9661..cb1e5b2b3 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCILoadCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCILoadCommand.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.commands.control; +package org.vadere.manager.traci.commands.control; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.util.List; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCISendFileCommand.java similarity index 80% rename from VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/control/TraCISendFileCommand.java index ae3876630..fd370d66b 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISendFileCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCISendFileCommand.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.commands.control; +package org.vadere.manager.traci.commands.control; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.nio.charset.StandardCharsets; diff --git a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCISimStepCommand.java similarity index 75% rename from VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java rename to VadereManager/src/org/vadere/manager/traci/commands/control/TraCISimStepCommand.java index 8afb2530f..f066054b5 100644 --- a/VadereManager/src/org/vadere/manager/stsc/commands/control/TraCISimStepCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/control/TraCISimStepCommand.java @@ -1,10 +1,10 @@ -package org.vadere.manager.stsc.commands.control; +package org.vadere.manager.traci.commands.control; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.writer.TraCIPacket; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; -import org.vadere.manager.stsc.respons.TraCISimTimeResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.reader.TraCICommandBuffer; +import org.vadere.manager.traci.respons.TraCISimTimeResponse; public class TraCISimStepCommand extends TraCICommand { diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java b/VadereManager/src/org/vadere/manager/traci/reader/TraCIByteBuffer.java similarity index 96% rename from VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java rename to VadereManager/src/org/vadere/manager/traci/reader/TraCIByteBuffer.java index d4c09d12b..2af75fab7 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIByteBuffer.java +++ b/VadereManager/src/org/vadere/manager/traci/reader/TraCIByteBuffer.java @@ -1,10 +1,10 @@ -package org.vadere.manager.stsc.reader; +package org.vadere.manager.traci.reader; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.sumo.LightPhase; -import org.vadere.manager.stsc.sumo.RoadMapPosition; -import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.sumo.LightPhase; +import org.vadere.manager.traci.sumo.RoadMapPosition; +import org.vadere.manager.traci.sumo.TrafficLightPhase; import org.vadere.util.geometry.GeometryUtils; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.IPoint; diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java b/VadereManager/src/org/vadere/manager/traci/reader/TraCICommandBuffer.java similarity index 96% rename from VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java rename to VadereManager/src/org/vadere/manager/traci/reader/TraCICommandBuffer.java index da6943c5d..4d69e9f03 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCICommandBuffer.java +++ b/VadereManager/src/org/vadere/manager/traci/reader/TraCICommandBuffer.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc.reader; +package org.vadere.manager.traci.reader; import java.nio.ByteBuffer; diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java b/VadereManager/src/org/vadere/manager/traci/reader/TraCIPacketBuffer.java similarity index 89% rename from VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java rename to VadereManager/src/org/vadere/manager/traci/reader/TraCIPacketBuffer.java index 52d7e51ed..f13d54980 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIPacketBuffer.java +++ b/VadereManager/src/org/vadere/manager/traci/reader/TraCIPacketBuffer.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.reader; +package org.vadere.manager.traci.reader; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.respons.StatusResponse; -import org.vadere.manager.stsc.commands.TraCICommand; -import org.vadere.manager.stsc.respons.TraCIResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.respons.StatusResponse; +import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.respons.TraCIResponse; import java.nio.ByteBuffer; diff --git a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java b/VadereManager/src/org/vadere/manager/traci/reader/TraCIReader.java similarity index 86% rename from VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java rename to VadereManager/src/org/vadere/manager/traci/reader/TraCIReader.java index bc87dba43..672a498b4 100644 --- a/VadereManager/src/org/vadere/manager/stsc/reader/TraCIReader.java +++ b/VadereManager/src/org/vadere/manager/traci/reader/TraCIReader.java @@ -1,8 +1,8 @@ -package org.vadere.manager.stsc.reader; +package org.vadere.manager.traci.reader; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.sumo.RoadMapPosition; -import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.sumo.RoadMapPosition; +import org.vadere.manager.traci.sumo.TrafficLightPhase; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; import org.vadere.util.geometry.shapes.VPolygon; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/StatusResponse.java similarity index 93% rename from VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java rename to VadereManager/src/org/vadere/manager/traci/respons/StatusResponse.java index 8d3300306..d25b138d0 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/StatusResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/StatusResponse.java @@ -1,7 +1,7 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.nio.ByteBuffer; import java.util.Objects; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetResponse.java similarity index 90% rename from VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java rename to VadereManager/src/org/vadere/manager/traci/respons/TraCIGetResponse.java index 0dde50945..8d2ad7a39 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetResponse.java @@ -1,14 +1,14 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.util.Objects; /** - * Response object for {@link org.vadere.manager.stsc.commands.TraCIGetCommand} + * Response object for {@link org.vadere.manager.traci.commands.TraCIGetCommand} * command. This command is used to retrieve generic data from the simulator. * * The structure of the response: diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetVersionResponse.java similarity index 89% rename from VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java rename to VadereManager/src/org/vadere/manager/traci/respons/TraCIGetVersionResponse.java index 8d71573c0..68388f406 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIGetVersionResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetVersionResponse.java @@ -1,12 +1,12 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.util.Objects; /** - * Response object for {@link org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand} + * Response object for {@link org.vadere.manager.traci.commands.control.TraCIGetVersionCommand} * command. It returns the numerical {@link #versionId} and string {@link #versionString} * representation of the current TraCI version. * diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCIResponse.java similarity index 95% rename from VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java rename to VadereManager/src/org/vadere/manager/traci/respons/TraCIResponse.java index 43338e401..3198d5394 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCIResponse.java @@ -1,8 +1,8 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.nio.ByteBuffer; @@ -13,7 +13,7 @@ import java.nio.ByteBuffer; * * If no additional data is send the responseIdentifier will be ignored. * - * Construction Methods: (compare with {@link org.vadere.manager.stsc.commands.TraCICommand}) + * Construction Methods: (compare with {@link org.vadere.manager.traci.commands.TraCICommand}) * * Each {@link TraCIResponse} class is build in two ways. Either it is created from bytes * (i.e. some byte[] wrapped in a {@link ByteBuffer} or {@link TraCICommandBuffer} for ease of use) diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCISimTimeResponse.java similarity index 87% rename from VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java rename to VadereManager/src/org/vadere/manager/traci/respons/TraCISimTimeResponse.java index 5288a1892..6fb2c5b92 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISimTimeResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCISimTimeResponse.java @@ -1,13 +1,13 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.util.ArrayList; import java.util.List; /** - * Response object for {@link org.vadere.manager.stsc.commands.control.TraCISimStepCommand} + * Response object for {@link org.vadere.manager.traci.commands.control.TraCISimStepCommand} * command. It includes all subscriptions previously added by each client. * * See {@link TraCIResponse} for static factory methods used to create objects from byte[] diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCIStatusResponse.java similarity index 94% rename from VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java rename to VadereManager/src/org/vadere/manager/traci/respons/TraCIStatusResponse.java index 13143ab99..7afe9a25a 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCIStatusResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCIStatusResponse.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; import org.vadere.manager.TraCIException; diff --git a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCISubscriptionResponse.java similarity index 95% rename from VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java rename to VadereManager/src/org/vadere/manager/traci/respons/TraCISubscriptionResponse.java index abcf6fa05..73ee18b9e 100644 --- a/VadereManager/src/org/vadere/manager/stsc/respons/TraCISubscriptionResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCISubscriptionResponse.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.commands.TraCIValueSubscriptionCommand; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commands.TraCIValueSubscriptionCommand; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import java.util.ArrayList; import java.util.List; diff --git a/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java b/VadereManager/src/org/vadere/manager/traci/sumo/LightPhase.java similarity index 90% rename from VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java rename to VadereManager/src/org/vadere/manager/traci/sumo/LightPhase.java index 85a01da80..aa82f1818 100644 --- a/VadereManager/src/org/vadere/manager/stsc/sumo/LightPhase.java +++ b/VadereManager/src/org/vadere/manager/traci/sumo/LightPhase.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc.sumo; +package org.vadere.manager.traci.sumo; public enum LightPhase { diff --git a/VadereManager/src/org/vadere/manager/stsc/sumo/RoadMapPosition.java b/VadereManager/src/org/vadere/manager/traci/sumo/RoadMapPosition.java similarity index 96% rename from VadereManager/src/org/vadere/manager/stsc/sumo/RoadMapPosition.java rename to VadereManager/src/org/vadere/manager/traci/sumo/RoadMapPosition.java index 853e848a7..4360cd05d 100644 --- a/VadereManager/src/org/vadere/manager/stsc/sumo/RoadMapPosition.java +++ b/VadereManager/src/org/vadere/manager/traci/sumo/RoadMapPosition.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc.sumo; +package org.vadere.manager.traci.sumo; import java.util.Objects; diff --git a/VadereManager/src/org/vadere/manager/stsc/sumo/TrafficLightPhase.java b/VadereManager/src/org/vadere/manager/traci/sumo/TrafficLightPhase.java similarity index 96% rename from VadereManager/src/org/vadere/manager/stsc/sumo/TrafficLightPhase.java rename to VadereManager/src/org/vadere/manager/traci/sumo/TrafficLightPhase.java index 0c3e68dbd..8b18bfab6 100644 --- a/VadereManager/src/org/vadere/manager/stsc/sumo/TrafficLightPhase.java +++ b/VadereManager/src/org/vadere/manager/traci/sumo/TrafficLightPhase.java @@ -1,4 +1,4 @@ -package org.vadere.manager.stsc.sumo; +package org.vadere.manager.traci.sumo; import java.util.Objects; diff --git a/VadereManager/src/org/vadere/manager/stsc/writer/ByteArrayOutputStreamTraCIWriter.java b/VadereManager/src/org/vadere/manager/traci/writer/ByteArrayOutputStreamTraCIWriter.java similarity index 97% rename from VadereManager/src/org/vadere/manager/stsc/writer/ByteArrayOutputStreamTraCIWriter.java rename to VadereManager/src/org/vadere/manager/traci/writer/ByteArrayOutputStreamTraCIWriter.java index a286a31ad..869e21136 100644 --- a/VadereManager/src/org/vadere/manager/stsc/writer/ByteArrayOutputStreamTraCIWriter.java +++ b/VadereManager/src/org/vadere/manager/traci/writer/ByteArrayOutputStreamTraCIWriter.java @@ -1,9 +1,9 @@ -package org.vadere.manager.stsc.writer; +package org.vadere.manager.traci.writer; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.sumo.RoadMapPosition; -import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.sumo.RoadMapPosition; +import org.vadere.manager.traci.sumo.TrafficLightPhase; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; import org.vadere.util.logging.Logger; diff --git a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java b/VadereManager/src/org/vadere/manager/traci/writer/TraCIPacket.java similarity index 92% rename from VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java rename to VadereManager/src/org/vadere/manager/traci/writer/TraCIPacket.java index c1bbd9719..c883d6275 100644 --- a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIPacket.java +++ b/VadereManager/src/org/vadere/manager/traci/writer/TraCIPacket.java @@ -1,14 +1,14 @@ -package org.vadere.manager.stsc.writer; +package org.vadere.manager.traci.writer; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.commands.control.TraCIGetVersionCommand; -import org.vadere.manager.stsc.respons.StatusResponse; -import org.vadere.manager.stsc.respons.TraCIGetResponse; -import org.vadere.manager.stsc.respons.TraCIGetVersionResponse; -import org.vadere.manager.stsc.respons.TraCISimTimeResponse; -import org.vadere.manager.stsc.respons.TraCIStatusResponse; -import org.vadere.manager.stsc.respons.TraCISubscriptionResponse; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commands.control.TraCIGetVersionCommand; +import org.vadere.manager.traci.respons.StatusResponse; +import org.vadere.manager.traci.respons.TraCIGetResponse; +import org.vadere.manager.traci.respons.TraCIGetVersionResponse; +import org.vadere.manager.traci.respons.TraCISimTimeResponse; +import org.vadere.manager.traci.respons.TraCIStatusResponse; +import org.vadere.manager.traci.respons.TraCISubscriptionResponse; import java.nio.ByteBuffer; diff --git a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriter.java b/VadereManager/src/org/vadere/manager/traci/writer/TraCIWriter.java similarity index 91% rename from VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriter.java rename to VadereManager/src/org/vadere/manager/traci/writer/TraCIWriter.java index 0d1997a75..99d5fc6c1 100644 --- a/VadereManager/src/org/vadere/manager/stsc/writer/TraCIWriter.java +++ b/VadereManager/src/org/vadere/manager/traci/writer/TraCIWriter.java @@ -1,8 +1,8 @@ -package org.vadere.manager.stsc.writer; +package org.vadere.manager.traci.writer; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.sumo.RoadMapPosition; -import org.vadere.manager.stsc.sumo.TrafficLightPhase; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.sumo.RoadMapPosition; +import org.vadere.manager.traci.sumo.TrafficLightPhase; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; diff --git a/VadereManager/tests/org/vadere/manager/stsc/ByteArrayOutputStreamTraCIWriterTest.java b/VadereManager/tests/org/vadere/manager/traci/ByteArrayOutputStreamTraCIWriterTest.java similarity index 97% rename from VadereManager/tests/org/vadere/manager/stsc/ByteArrayOutputStreamTraCIWriterTest.java rename to VadereManager/tests/org/vadere/manager/traci/ByteArrayOutputStreamTraCIWriterTest.java index 0258016d7..baeeb9b97 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/ByteArrayOutputStreamTraCIWriterTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/ByteArrayOutputStreamTraCIWriterTest.java @@ -1,13 +1,13 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.traci; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.vadere.manager.TraCIException; -import org.vadere.manager.stsc.sumo.LightPhase; -import org.vadere.manager.stsc.sumo.RoadMapPosition; -import org.vadere.manager.stsc.sumo.TrafficLightPhase; -import org.vadere.manager.stsc.writer.ByteArrayOutputStreamTraCIWriter; +import org.vadere.manager.traci.sumo.LightPhase; +import org.vadere.manager.traci.sumo.RoadMapPosition; +import org.vadere.manager.traci.sumo.TrafficLightPhase; +import org.vadere.manager.traci.writer.ByteArrayOutputStreamTraCIWriter; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; diff --git a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/traci/TraCIReaderTest.java similarity index 94% rename from VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java rename to VadereManager/tests/org/vadere/manager/traci/TraCIReaderTest.java index f9b10c3b9..04781f18c 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/TraCIReaderTest.java @@ -1,13 +1,13 @@ -package org.vadere.manager.stsc; +package org.vadere.manager.traci; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.vadere.manager.stsc.reader.TraCIByteBuffer; -import org.vadere.manager.stsc.sumo.LightPhase; -import org.vadere.manager.stsc.sumo.RoadMapPosition; -import org.vadere.manager.stsc.sumo.TrafficLightPhase; -import org.vadere.manager.stsc.writer.ByteArrayOutputStreamTraCIWriter; +import org.vadere.manager.traci.reader.TraCIByteBuffer; +import org.vadere.manager.traci.sumo.LightPhase; +import org.vadere.manager.traci.sumo.RoadMapPosition; +import org.vadere.manager.traci.sumo.TrafficLightPhase; +import org.vadere.manager.traci.writer.ByteArrayOutputStreamTraCIWriter; import org.vadere.util.geometry.GeometryUtils; import org.vadere.util.geometry.Vector3D; import org.vadere.util.geometry.shapes.VPoint; diff --git a/VadereManager/tests/org/vadere/manager/stsc/respons/StatusResponseTest.java b/VadereManager/tests/org/vadere/manager/traci/respons/StatusResponseTest.java similarity index 96% rename from VadereManager/tests/org/vadere/manager/stsc/respons/StatusResponseTest.java rename to VadereManager/tests/org/vadere/manager/traci/respons/StatusResponseTest.java index e5794a569..db39e617b 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/respons/StatusResponseTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/respons/StatusResponseTest.java @@ -1,7 +1,7 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; import org.junit.Test; -import org.vadere.manager.stsc.TraCICmd; +import org.vadere.manager.traci.TraCICmd; import java.nio.ByteBuffer; diff --git a/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetResponseTest.java b/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetResponseTest.java similarity index 78% rename from VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetResponseTest.java rename to VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetResponseTest.java index eb32ee27c..3949d014f 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetResponseTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetResponseTest.java @@ -1,10 +1,10 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; import org.junit.Test; -import org.vadere.manager.commandHandler.TraCIPersonVar; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.TraCIDataType; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.commandHandler.TraCIPersonVar; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; diff --git a/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetVersionResponseTest.java b/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetVersionResponseTest.java similarity index 83% rename from VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetVersionResponseTest.java rename to VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetVersionResponseTest.java index dea937263..98cfcb6c5 100644 --- a/VadereManager/tests/org/vadere/manager/stsc/respons/TraCIGetVersionResponseTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetVersionResponseTest.java @@ -1,8 +1,8 @@ -package org.vadere.manager.stsc.respons; +package org.vadere.manager.traci.respons; import org.junit.Test; -import org.vadere.manager.stsc.TraCICmd; -import org.vadere.manager.stsc.reader.TraCICommandBuffer; +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.reader.TraCICommandBuffer; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index ca71a57bb..9ddda157e 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -277,12 +277,12 @@ public class Simulation { // round to long to ensure correct trap. boolean timeReached = Math.round(simTimeInSec) >= Math.round(simulateUntilInSec); if (timeReached || simulateUntilInSec == -1){ - logger.warnf("Simulated until: %.4f", simTimeInSec); + logger.debugf("Simulated until: %.4f", simTimeInSec); setWaitForSimCommand(true); remoteRunListeners.forEach(RemoteRunListener::simulationStepFinishedListener); while (waitForSimCommand){ - logger.warn("wait for next SimCommand..."); + logger.debugf("wait for next SimCommand..."); try { wait(); } catch (InterruptedException e) { -- GitLab From 5a1dc0198db10c871b5fd6c8c9376e3036d7517c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Fri, 14 Jun 2019 19:09:37 +0200 Subject: [PATCH 30/58] refactor CommandHandler.java to use Handler Annotations. --- .../org/vadere/manager/TraCIException.java | 2 +- .../org/vadere/manager/client/TestClient.java | 6 +- .../org/vadere/manager/traci/TraCICmd.java | 2 +- .../vadere/manager/traci/TraCIDataType.java | 11 +- .../traci/commandHandler/CommandHandler.java | 67 +++++- .../commandHandler/ControlCommandHandler.java | 26 ++- .../commandHandler/PersonCommandHandler.java | 217 ++++++++---------- .../commandHandler/PolygonCommandHandler.java | 51 ++-- .../SimulationCommandHandler.java | 53 +++-- .../traci/commandHandler/TraCIVehicleVar.java | 33 --- .../commandHandler/VehicleCommandHandler.java | 33 ++- .../annotation/ControlHandler.java | 20 ++ .../annotation/ControlHandlers.java | 13 ++ .../{ => annotation}/PersonHandler.java | 11 +- .../annotation/PersonHandlers.java | 13 ++ .../annotation/PolygonHandler.java | 28 +++ .../annotation/PolygonHandlers.java | 13 ++ .../annotation/SimulationHandler.java | 28 +++ .../annotation/SimulationHandlers.java | 13 ++ .../annotation/VehicleHandler.java | 28 +++ .../annotation/VehicleHandlers.java | 13 ++ .../commandHandler/variables/ControlVar.java | 33 +++ .../PersonVar.java} | 23 +- .../PolygonVar.java} | 12 +- .../SimulationVar.java} | 20 +- .../commandHandler/variables/VehicleVar.java | 33 +++ .../manager/traci/commands/TraCICommand.java | 2 +- .../traci/commands/TraCIGetCommand.java | 7 +- .../traci/commands/TraCISetCommand.java | 7 +- .../manager/traci/reader/TraCIByteBuffer.java | 16 +- .../traci/respons/TraCIGetResponse.java | 4 +- .../manager/traci/respons/TraCIResponse.java | 4 +- .../ByteArrayOutputStreamTraCIWriter.java | 28 +-- .../ByteArrayOutputStreamTraCIWriterTest.java | 32 +-- .../vadere/manager/traci/TraCIReaderTest.java | 16 +- .../traci/respons/TraCIGetResponseTest.java | 4 +- 36 files changed, 630 insertions(+), 292 deletions(-) delete mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIVehicleVar.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandler.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandlers.java rename VadereManager/src/org/vadere/manager/traci/commandHandler/{ => annotation}/PersonHandler.java (69%) create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PersonHandlers.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandler.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandlers.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandler.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandlers.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandler.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandlers.java create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/variables/ControlVar.java rename VadereManager/src/org/vadere/manager/traci/commandHandler/{TraCIPersonVar.java => variables/PersonVar.java} (75%) rename VadereManager/src/org/vadere/manager/traci/commandHandler/{TraCIPolygonVar.java => variables/PolygonVar.java} (69%) rename VadereManager/src/org/vadere/manager/traci/commandHandler/{TraCISimulationVar.java => variables/SimulationVar.java} (67%) create mode 100644 VadereManager/src/org/vadere/manager/traci/commandHandler/variables/VehicleVar.java diff --git a/VadereManager/src/org/vadere/manager/TraCIException.java b/VadereManager/src/org/vadere/manager/TraCIException.java index d1832a70e..ffbb568ff 100644 --- a/VadereManager/src/org/vadere/manager/TraCIException.java +++ b/VadereManager/src/org/vadere/manager/TraCIException.java @@ -30,7 +30,7 @@ public class TraCIException extends RuntimeException { } public static TraCIException cmdErrVariableType(TraCICmd cmd, Throwable cause){ - return new TraCIException("Error creating TraCIPersonVar: " + cmd.toString(), cause); + return new TraCIException("Error creating PersonVar: " + cmd.toString(), cause); } public static TraCIException getNotImplemented(TraCIGetCommand cmd){ diff --git a/VadereManager/src/org/vadere/manager/client/TestClient.java b/VadereManager/src/org/vadere/manager/client/TestClient.java index 48bf5e846..b035cf664 100644 --- a/VadereManager/src/org/vadere/manager/client/TestClient.java +++ b/VadereManager/src/org/vadere/manager/client/TestClient.java @@ -1,7 +1,7 @@ package org.vadere.manager.client; import org.vadere.manager.TraCISocket; -import org.vadere.manager.traci.commandHandler.TraCIPersonVar; +import org.vadere.manager.traci.commandHandler.variables.PersonVar; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.writer.TraCIPacket; import org.vadere.manager.traci.commands.TraCIGetCommand; @@ -128,7 +128,7 @@ public class TestClient implements Runnable{ } void getIDs(String[] args) throws IOException { - TraCIPacket p = TraCIGetCommand.build(TraCICmd.GET_PERSON_VALUE, TraCIPersonVar.ID_LIST.id, "1"); + TraCIPacket p = TraCIGetCommand.build(TraCICmd.GET_PERSON_VALUE, PersonVar.ID_LIST.id, "1"); traCISocket.sendExact(p); TraCIGetResponse res = (TraCIGetResponse) traCISocket.receiveResponse(); @@ -144,7 +144,7 @@ public class TestClient implements Runnable{ } String elementIdentifier = args[1]; - traCISocket.sendExact(TraCIGetCommand.build(TraCICmd.GET_PERSON_VALUE, TraCIPersonVar.POS_2D.id, elementIdentifier)); + traCISocket.sendExact(TraCIGetCommand.build(TraCICmd.GET_PERSON_VALUE, PersonVar.POS_2D.id, elementIdentifier)); TraCIGetResponse res = (TraCIGetResponse) traCISocket.receiveResponse(); VPoint p = (VPoint) res.getResponseData(); diff --git a/VadereManager/src/org/vadere/manager/traci/TraCICmd.java b/VadereManager/src/org/vadere/manager/traci/TraCICmd.java index b1affd6ba..6d79a6183 100644 --- a/VadereManager/src/org/vadere/manager/traci/TraCICmd.java +++ b/VadereManager/src/org/vadere/manager/traci/TraCICmd.java @@ -106,6 +106,6 @@ public enum TraCICmd { @Override public String toString() { - return String.format("TraCICmd{id=0x%02X, type=%s}", id, type ); + return String.format("TraCICmd{%s: id=0x%02X, type=%s}", name(), id, type ); } } diff --git a/VadereManager/src/org/vadere/manager/traci/TraCIDataType.java b/VadereManager/src/org/vadere/manager/traci/TraCIDataType.java index 6705a79ad..f44ebb81f 100644 --- a/VadereManager/src/org/vadere/manager/traci/TraCIDataType.java +++ b/VadereManager/src/org/vadere/manager/traci/TraCIDataType.java @@ -25,20 +25,20 @@ public enum TraCIDataType { - public int identifier; + public int id; public int size_in_byte; public boolean isAtomar; TraCIDataType(int identifier, int size_in_byte, boolean isAtomar){ - this.identifier = identifier; + this.id = identifier; this.size_in_byte = size_in_byte; this.isAtomar = isAtomar; } public static TraCIDataType fromId(int id){ for(TraCIDataType dataType : values()){ - if (dataType.identifier == id) + if (dataType.id == id) return dataType; } throw new TraCIException(String.format("No TraCI data type found for given id: %02X", id)); @@ -47,9 +47,8 @@ public enum TraCIDataType { @Override public String toString() { return "TraCIDataType{" + - "identifier=" + identifier + - ", size_in_byte=" + size_in_byte + - ", isAtomar=" + isAtomar + + name() + + ": id=" + id + '}'; } } diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandHandler.java index 6f9994474..41d54194b 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/CommandHandler.java @@ -1,18 +1,24 @@ package org.vadere.manager.traci.commandHandler; +import org.apache.commons.lang3.tuple.Pair; import org.vadere.manager.RemoteManager; import org.vadere.manager.Subscription; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commands.TraCICommand; import org.vadere.manager.traci.commands.TraCIGetCommand; import org.vadere.manager.traci.commands.TraCIValueSubscriptionCommand; import org.vadere.manager.traci.respons.StatusResponse; import org.vadere.manager.traci.respons.TraCIGetResponse; -import org.vadere.manager.traci.writer.TraCIPacket; import org.vadere.manager.traci.respons.TraCIStatusResponse; -import org.vadere.manager.traci.commands.TraCICommand; +import org.vadere.manager.traci.writer.TraCIPacket; +import org.vadere.util.logging.Logger; +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; @@ -24,9 +30,60 @@ import java.util.List; * methods are used by the {@link CommandExecutor} for dispatching. * */ -public abstract class CommandHandler { +public abstract class CommandHandler { + + private static Logger logger = Logger.getLogger(CommandHandler.class); public static final String ELEMENT_ID_NOT_FOUND = "No element found with given object id"; + protected HashMap, Method> handler; + private final Method processNotImplemented; + + public CommandHandler() { + handler = new HashMap<>(); + Method tmp = null; + for (Method m : CommandHandler.class.getMethods()){ + if (m.getName().equals("process_NotImplemented")){ + tmp = m; + break; + } + } + assert (tmp != null) : "No Method found with name 'process_NotImplemented'"; + processNotImplemented = tmp; + } + + protected Method getHandler(TraCICmd cmd, VAR var){ + return handler.getOrDefault(Pair.of(cmd, var), processNotImplemented); + } + + protected abstract void init_HandlerSingle(Method m); + protected abstract void init_HandlerMult(Method m); + + protected void putHandler(TraCICmd cmd, VAR var, Method m){ + logger.debugf("Pair: %s | %s Method: %s", cmd.name(), var.name(), m.getName()); + handler.put(Pair.of(cmd, var), m); + } + + protected void init(Class singleAnnotation, Class multAnnotation){ + for (Method m : this.getClass().getDeclaredMethods()){ + logger.infof(m.getName()); + if (m.isAnnotationPresent(singleAnnotation)){ + init_HandlerSingle(m); + } + if (m.isAnnotationPresent(multAnnotation)){ + init_HandlerMult(m); + } + } + } + + protected TraCICommand invokeHandler(Method m, Object obj, TraCICommand cmd, RemoteManager manager){ + try { + return (TraCIGetCommand) m.invoke(obj, cmd, manager); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + return process_UnknownCommand(cmd, manager); + } + public TraCICommand process_NotImplemented(TraCICommand cmd, RemoteManager remoteManager){ return cmd.setNOK_response(TraCIPacket.sendStatus(cmd.getTraCICmd(), @@ -58,13 +115,13 @@ public abstract class CommandHandler { public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager, - TraCICmdHandler traCICmdHandler, TraCICmd apiCmd, TraCICmd apiCmdResponse){ + TraCICmdHandler traCICmdHandler, TraCICmd getCommand, TraCICmd apiCmdResponse){ TraCIValueSubscriptionCommand cmd = (TraCIValueSubscriptionCommand)rawCmd; List getCommands = new ArrayList<>(); cmd.getVariables().forEach(var -> { - getCommands.add(new TraCIGetCommand(apiCmd, var, cmd.getElementIdentifier())); + getCommands.add(new TraCIGetCommand(getCommand, var, cmd.getElementIdentifier())); }); cmd.setGetCommands(getCommands); diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/ControlCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/ControlCommandHandler.java index 2b677f465..8d0a0da0a 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/ControlCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/ControlCommandHandler.java @@ -4,6 +4,9 @@ package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.manager.Subscription; import org.vadere.manager.VadereServer; +import org.vadere.manager.traci.commandHandler.annotation.ControlHandler; +import org.vadere.manager.traci.commandHandler.annotation.ControlHandlers; +import org.vadere.manager.traci.commandHandler.variables.ControlVar; import org.vadere.manager.traci.commands.TraCICommand; import org.vadere.manager.traci.commands.control.TraCICloseCommand; import org.vadere.manager.traci.commands.control.TraCIGetVersionCommand; @@ -15,10 +18,12 @@ import org.vadere.manager.traci.respons.TraCISimTimeResponse; import org.vadere.manager.traci.respons.TraCIStatusResponse; import org.vadere.util.logging.Logger; +import java.lang.reflect.Method; + /** * Handel {@link org.vadere.manager.traci.commands.TraCICommand}s for the Control API */ -public class ControlCommandHandler extends CommandHandler{ +public class ControlCommandHandler extends CommandHandler{ private static Logger logger = Logger.getLogger(ControlCommandHandler.class); @@ -28,7 +33,24 @@ public class ControlCommandHandler extends CommandHandler{ instance = new ControlCommandHandler(); } - private ControlCommandHandler(){} + private ControlCommandHandler(){ + super(); + init(ControlHandler.class, ControlHandlers.class); + } + + @Override + protected void init_HandlerSingle(Method m) { + ControlHandler an = m.getAnnotation(ControlHandler.class); + putHandler(an.cmd(), an.var(), m); + } + + @Override + protected void init_HandlerMult(Method m) { + ControlHandler[] ans = m.getAnnotation(ControlHandlers.class).value(); + for(ControlHandler a : ans){ + putHandler(a.cmd(), a.var(), m); + } + } public TraCICommand process_load(TraCICommand rawCmd, RemoteManager remoteManager) { return null; diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonCommandHandler.java index 795785c3e..db4de68bb 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonCommandHandler.java @@ -3,12 +3,18 @@ package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commandHandler.annotation.PersonHandler; +import org.vadere.manager.traci.commandHandler.annotation.PersonHandlers; +import org.vadere.manager.traci.commandHandler.variables.PersonVar; import org.vadere.manager.traci.commands.TraCICommand; import org.vadere.manager.traci.commands.TraCIGetCommand; +import org.vadere.manager.traci.commands.TraCISetCommand; import org.vadere.manager.traci.respons.TraCIGetResponse; import org.vadere.state.scenario.Pedestrian; +import org.vadere.util.geometry.Vector3D; import org.vadere.util.logging.Logger; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -17,31 +23,40 @@ import java.util.stream.Collectors; /** * Handel GET/SET {@link org.vadere.manager.traci.commands.TraCICommand}s for the Person API */ -public class PersonCommandHandler extends CommandHandler{ +public class PersonCommandHandler extends CommandHandler{ private static Logger logger = Logger.getLogger(PersonCommandHandler.class); public static PersonCommandHandler instance; -// private HashMap handler; - static { instance = new PersonCommandHandler(); } private PersonCommandHandler(){ -// handler = new HashMap<>(); -// init(); + super(); + init(PersonHandler.class, PersonHandlers.class); + } + + @Override + protected void init_HandlerSingle(Method m) { + PersonHandler an = m.getAnnotation(PersonHandler.class); + putHandler(an.cmd(), an.var(), m); } -// private void init(){ -// for (Method m : this.getClass().getDeclaredMethods()){ -// if (m.isAnnotationPresent(PersonHandler.class)){ -// PersonHandler an = m.getAnnotation(PersonHandler.class); -// handler.put(an.variable(), m); -// } -// } -// } + @Override + protected void init_HandlerMult(Method m) { + PersonHandler[] ans = m.getAnnotation(PersonHandlers.class).value(); + for(PersonHandler a : ans){ + putHandler(a.cmd(), a.var(), m); + } + } + + + public static void main(String[] arg){ + PersonCommandHandler h = instance; + + } public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ return responseOK(responseDataType, responseData, TraCICmd.GET_PERSON_VALUE, TraCICmd.RESPONSE_GET_PERSON_VALUE); @@ -60,11 +75,10 @@ public class PersonCommandHandler extends CommandHandler{ return true; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.ID_LIST, - clientCommandName = "getIDList") - private TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + ///////////////////////////// Handler ///////////////////////////// + + @PersonHandler(cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.ID_LIST, name = "getIDList") + public TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager){ // elementIdentifier ignored. remoteManager.accessState((manager, state) -> { List data = state.getTopography().getPedestrianDynamicElements() @@ -72,7 +86,7 @@ public class PersonCommandHandler extends CommandHandler{ .stream() .map(p -> Integer.toString(p.getId())) .collect(Collectors.toList()); - TraCIGetResponse res = responseOK(traCIVar.returnType, data); + TraCIGetResponse res = responseOK(PersonVar.ID_LIST.type, data); cmd.setResponse(res); logger.debugf("time: %f ID's: %s", state.getSimTimeInSec(), Arrays.toString(data.toArray(String[]::new))); }); @@ -80,51 +94,61 @@ public class PersonCommandHandler extends CommandHandler{ return cmd; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.COUNT, - clientCommandName = "getIDCount") - private TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + @PersonHandler(cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.COUNT, name = "getIDCount") + public TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { int numPeds = state.getTopography().getPedestrianDynamicElements().getElements().size(); - cmd.setResponse(responseOK(traCIVar.returnType, numPeds)); + cmd.setResponse(responseOK(PersonVar.COUNT.type, numPeds)); }); return cmd; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.SPEED, - clientCommandName = "getSpeed") - private TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + @PersonHandler( cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.SPEED, name = "getSpeed") + public TraCICommand process_getSpeed(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { Pedestrian ped = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())); if (checkIfPedestrianExists(ped, cmd)) - cmd.setResponse(responseOK(traCIVar.returnType, ped.getVelocity().getLength())); + cmd.setResponse(responseOK(PersonVar.SPEED.type, ped.getVelocity().getLength())); + + }); + + return cmd; + } + + @PersonHandler(cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.POS_2D, name = "getPosition2D") + public TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager){ + + remoteManager.accessState((manager, state) -> { + Pedestrian ped = state.getTopography().getPedestrianDynamicElements() + .getElement(Integer.parseInt(cmd.getElementIdentifier())); + if (checkIfPedestrianExists(ped, cmd)) { + cmd.setResponse(responseOK(PersonVar.POS_2D.type, ped.getPosition())); + logger.debugf("time: %f Pedestrian: %s Position: %s", + state.getSimTimeInSec(), + cmd.getElementIdentifier(), + ped.getPosition().toString()); + } }); return cmd; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.POS_2D, - clientCommandName = "getPosition2D") - private TraCICommand process_getPosition(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + @PersonHandler(cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.POS_3D, name = "getPosition3D") + public TraCICommand process_getPosition3D(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { Pedestrian ped = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())); if (checkIfPedestrianExists(ped, cmd)) { - cmd.setResponse(responseOK(traCIVar.returnType, ped.getPosition())); + cmd.setResponse(responseOK(PersonVar.POS_3D.type, new Vector3D(ped.getPosition().x, ped.getPosition().y, 0.0))); logger.debugf("time: %f Pedestrian: %s Position: %s", state.getSimTimeInSec(), cmd.getElementIdentifier(), @@ -136,132 +160,91 @@ public class PersonCommandHandler extends CommandHandler{ } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.LENGTH, - clientCommandName = "getLength") - private TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + @PersonHandler( cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.LENGTH, name = "getLength") + public TraCICommand process_getLength(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { Pedestrian ped = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())); if (checkIfPedestrianExists(ped, cmd)) - cmd.setResponse(responseOK(traCIVar.returnType, ped.getRadius()*2)); + cmd.setResponse(responseOK(PersonVar.LENGTH.type, ped.getRadius()*2)); }); return cmd; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.WIDTH, - clientCommandName = "getWidth") - private TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar){ + @PersonHandler( cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.WIDTH, name = "getWidth") + public TraCICommand process_getWidth(TraCIGetCommand cmd, RemoteManager remoteManager){ remoteManager.accessState((manager, state) -> { Pedestrian ped = state.getTopography().getPedestrianDynamicElements() .getElement(Integer.parseInt(cmd.getElementIdentifier())); if (checkIfPedestrianExists(ped, cmd)) - cmd.setResponse(responseOK(traCIVar.returnType, ped.getRadius()*2)); + cmd.setResponse(responseOK(PersonVar.WIDTH.type, ped.getRadius()*2)); }); return cmd; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.ROAD_ID, - clientCommandName = "getRoadId" - ) - private TraCICommand process_getRoadId(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar) { + @PersonHandler( cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.ROAD_ID, name = "getRoadId") + public TraCICommand process_getRoadId(TraCIGetCommand cmd, RemoteManager remoteManager) { // return dummy value - cmd.setResponse(responseOK(traCIVar.returnType, "road000")); + cmd.setResponse(responseOK(PersonVar.ROAD_ID.type, "road000")); return cmd; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.ANGLE, - clientCommandName = "getAngle" - ) - private TraCICommand process_getAngle(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar) { + @PersonHandler( cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.ANGLE, name = "getAngle" ) + public TraCICommand process_getAngle(TraCIGetCommand cmd, RemoteManager remoteManager) { // return dummy value - cmd.setResponse(responseOK(traCIVar.returnType, 0.0)); + cmd.setResponse(responseOK(PersonVar.ANGLE.type, 0.0)); return cmd; } - @PersonHandler( - commandIdentifier = TraCICmd.GET_PERSON_VALUE, - variable = TraCIPersonVar.TYPE, - clientCommandName = "getType" - ) - private TraCICommand process_getType(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPersonVar traCIVar) { + @PersonHandler(cmd = TraCICmd.GET_PERSON_VALUE, var = PersonVar.TYPE, name = "getType" ) + public TraCICommand process_getType(TraCIGetCommand cmd, RemoteManager remoteManager) { // return dummy value - cmd.setResponse(responseOK(traCIVar.returnType, "pedestrian")); + cmd.setResponse(responseOK(PersonVar.TYPE.type, "pedestrian")); return cmd; } + @PersonHandler(cmd=TraCICmd.GET_PERSON_VALUE, var= PersonVar.WAITING_TIME, name="getWaitingTime") + @PersonHandler(cmd=TraCICmd.GET_PERSON_VALUE, var= PersonVar.COLOR, name="getColor") + @PersonHandler(cmd=TraCICmd.GET_PERSON_VALUE, var= PersonVar.EDGE_POS, name="getEdgePos") + @PersonHandler(cmd=TraCICmd.GET_PERSON_VALUE, var= PersonVar.MIN_GAP, name="getMinGap") + @PersonHandler(cmd=TraCICmd.GET_PERSON_VALUE, var= PersonVar.NEXT_EDGE, name="getNextEdge") + @PersonHandler(cmd=TraCICmd.GET_PERSON_VALUE, var= PersonVar.REMAINING_STAGES, name="getRemainingStages") + @PersonHandler(cmd=TraCICmd.GET_PERSON_VALUE, var= PersonVar.VEHICLE, name="getVehicle") + public TraCICommand process_NotImplemented(TraCIGetCommand cmd, RemoteManager remoteManager){ + return super.process_NotImplemented(cmd, remoteManager); + } + + + public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ return processValueSub(rawCmd, remoteManager, this::processGet, - TraCICmd.SUB_PERSON_VARIABLE, TraCICmd.RESPONSE_SUB_PERSON_VARIABLE); + TraCICmd.GET_PERSON_VALUE, TraCICmd.RESPONSE_SUB_PERSON_VARIABLE); } public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; - TraCIPersonVar var = TraCIPersonVar.fromId(getCmd.getVariableIdentifier()); - -// Method m = handler.getOrDefault(var, null); -// if(m == null){ -// return process_NotImplemented(getCmd, remoteManager); -// } else { -// try { -// return (TraCIGetCommand) m.invoke(this, getCmd, remoteManager, var); -// } catch (IllegalAccessException | InvocationTargetException e) { -// e.printStackTrace(); -// } -// return process_UnknownCommand(getCmd, remoteManager); -// } - - switch (var){ - case ID_LIST: - return process_getIDList(getCmd, remoteManager, var); - case COUNT: - return process_getIDCount(getCmd, remoteManager, var); - case SPEED: - return process_getSpeed(getCmd, remoteManager, var); - case POS_2D: - return process_getPosition(getCmd, remoteManager, var); - case LENGTH: - return process_getLength(getCmd, remoteManager, var); - case WIDTH: - return process_getWidth(getCmd, remoteManager, var); - case WAITING_TIME: - case POS_3D: - case ANGLE: - return process_getAngle(getCmd, remoteManager, var); - case ROAD_ID: - return process_getRoadId(getCmd, remoteManager, var); - case TYPE: - return process_getType(getCmd, remoteManager, var); - case COLOR: - case EDGE_POS: - case MIN_GAP: - case NEXT_EDGE: - case REMAINING_STAGES: - case VEHICLE: - return process_NotImplemented(getCmd, remoteManager); - default: - return process_UnknownCommand(getCmd, remoteManager); - } + PersonVar var = PersonVar.fromId(getCmd.getVariableIdentifier()); + Method m = getHandler(getCmd.getTraCICmd(), var); + + return invokeHandler(m, this, getCmd, remoteManager); } public TraCICommand processSet(TraCICommand cmd, RemoteManager remoteManager){ - return process_NotImplemented(cmd, remoteManager); + TraCISetCommand setCmd = (TraCISetCommand) cmd; + + PersonVar var = PersonVar.fromId(setCmd.getVariableId()); + Method m = getHandler(setCmd.getTraCICmd(), var); + + return invokeHandler(m, this, setCmd, remoteManager); } diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/PolygonCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/PolygonCommandHandler.java index 8f9d3c004..38476f2bc 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/PolygonCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/PolygonCommandHandler.java @@ -3,12 +3,16 @@ package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commandHandler.annotation.PolygonHandler; +import org.vadere.manager.traci.commandHandler.annotation.PolygonHandlers; +import org.vadere.manager.traci.commandHandler.variables.PolygonVar; import org.vadere.manager.traci.commands.TraCICommand; import org.vadere.manager.traci.commands.TraCIGetCommand; import org.vadere.manager.traci.respons.TraCIGetResponse; import org.vadere.state.scenario.Obstacle; import java.awt.*; +import java.lang.reflect.Method; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -16,7 +20,7 @@ import java.util.stream.Collectors; /** * Handel GET/SET/SUB {@link org.vadere.manager.traci.commands.TraCICommand}s for the Polygon API */ -public class PolygonCommandHandler extends CommandHandler{ +public class PolygonCommandHandler extends CommandHandler{ public static PolygonCommandHandler instance; @@ -25,6 +29,26 @@ public class PolygonCommandHandler extends CommandHandler{ instance = new PolygonCommandHandler(); } + public PolygonCommandHandler() { + super(); + init(PolygonHandler.class, PolygonHandlers.class); + } + + @Override + protected void init_HandlerSingle(Method m) { + PolygonHandler an = m.getAnnotation(PolygonHandler.class); + putHandler(an.cmd(), an.var(), m); + } + + @Override + protected void init_HandlerMult(Method m) { + PolygonHandler[] ans = m.getAnnotation(PolygonHandlers.class).value(); + for(PolygonHandler a : ans){ + putHandler(a.cmd(), a.var(), m); + } + } + + public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ return responseOK(responseDataType, responseData, TraCICmd.GET_POLYGON, TraCICmd.RESPONSE_GET_POLYGON); } @@ -41,7 +65,7 @@ public class PolygonCommandHandler extends CommandHandler{ return true; } - private TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getIDList(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ remoteManager.accessState((manager, state) -> { List ret = state.getTopography().getObstacles() @@ -54,7 +78,7 @@ public class PolygonCommandHandler extends CommandHandler{ return cmd; } - private TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getIDCount(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ remoteManager.accessState((manager, state) -> { int ret = state.getTopography().getObstacles().size(); @@ -64,12 +88,12 @@ public class PolygonCommandHandler extends CommandHandler{ return cmd; } - private TraCICommand process_getType(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getType(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ cmd.setResponse(responseOK(traCIVar.returnType, "building")); return cmd; } - private TraCICommand process_getShape(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getShape(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ remoteManager.accessState((manager, state) -> { Optional obstacle = state.getTopography().getObstacles().stream() @@ -82,12 +106,12 @@ public class PolygonCommandHandler extends CommandHandler{ return cmd; } - private TraCICommand process_getColor(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getColor(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ cmd.setResponse(responseOK(traCIVar.returnType, Color.BLACK)); return cmd; } - private TraCICommand process_getPosition2D(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getPosition2D(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ remoteManager.accessState((manager, state) -> { Optional obstacle = state.getTopography().getObstacles().stream() .filter(o-> cmd.getElementIdentifier().equals(Integer.toString(o.getId()))) @@ -99,35 +123,35 @@ public class PolygonCommandHandler extends CommandHandler{ return cmd; } - private TraCICommand process_getImageFile(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getImageFile(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ cmd.setResponse(responseERR("Not Implemented")); return cmd; } - private TraCICommand process_getImageWidth(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getImageWidth(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ cmd.setResponse(responseERR("Not Implemented")); return cmd; } - private TraCICommand process_getImageHeight(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getImageHeight(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ cmd.setResponse(responseERR("Not Implemented")); return cmd; } - private TraCICommand process_getImageAngle(TraCIGetCommand cmd, RemoteManager remoteManager, TraCIPolygonVar traCIVar){ + public TraCICommand process_getImageAngle(TraCIGetCommand cmd, RemoteManager remoteManager, PolygonVar traCIVar){ cmd.setResponse(responseERR("Not Implemented")); return cmd; } public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ return processValueSub(rawCmd, remoteManager, this::processGet, - TraCICmd.SUB_POLYGON_VALUE, TraCICmd.RESPONSE_SUB_POLYGON_VALUE); + TraCICmd.GET_POLYGON, TraCICmd.RESPONSE_SUB_POLYGON_VALUE); } public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager) { TraCIGetCommand getCmd = (TraCIGetCommand) cmd; - TraCIPolygonVar var = TraCIPolygonVar.fromId(getCmd.getVariableIdentifier()); + PolygonVar var = PolygonVar.fromId(getCmd.getVariableIdentifier()); switch (var){ case ID_LIST: @@ -155,4 +179,5 @@ public class PolygonCommandHandler extends CommandHandler{ // do nothing just say ok... return cmd; } + } diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/SimulationCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/SimulationCommandHandler.java index a6d44c48a..93b0f0178 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/SimulationCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/SimulationCommandHandler.java @@ -3,12 +3,16 @@ package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commandHandler.annotation.SimulationHandler; +import org.vadere.manager.traci.commandHandler.annotation.SimulationHandlers; +import org.vadere.manager.traci.commandHandler.variables.SimulationVar; import org.vadere.manager.traci.commands.TraCICommand; import org.vadere.manager.traci.commands.TraCIGetCommand; import org.vadere.manager.traci.respons.TraCIGetResponse; import org.vadere.util.geometry.shapes.VPoint; import java.awt.geom.Rectangle2D; +import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; @@ -16,7 +20,7 @@ import java.util.ArrayList; /** * Handel GET/SET/SUB {@link org.vadere.manager.traci.commands.TraCICommand}s for the Simulation API */ -public class SimulationCommandHandler extends CommandHandler{ +public class SimulationCommandHandler extends CommandHandler{ public static SimulationCommandHandler instance; @@ -24,7 +28,24 @@ public class SimulationCommandHandler extends CommandHandler{ instance = new SimulationCommandHandler(); } - private SimulationCommandHandler(){} + private SimulationCommandHandler(){ + super(); + init(SimulationHandler.class, SimulationHandlers.class); + } + + @Override + protected void init_HandlerSingle(Method m) { + SimulationHandler an = m.getAnnotation(SimulationHandler.class); + putHandler(an.cmd(), an.var(), m); + } + + @Override + protected void init_HandlerMult(Method m) { + SimulationHandler[] ans = m.getAnnotation(SimulationHandlers.class).value(); + for(SimulationHandler a : ans){ + putHandler(a.cmd(), a.var(), m); + } + } public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ return responseOK(responseDataType, responseData, TraCICmd.GET_SIMULATION_VALUE, TraCICmd.RESPONSE_GET_SIMULATION_VALUE); @@ -34,7 +55,7 @@ public class SimulationCommandHandler extends CommandHandler{ return responseOK(responseDataType, responseData, TraCICmd.GET_SIMULATION_VALUE, TraCICmd.RESPONSE_GET_SIMULATION_VALUE); } - private TraCICommand process_getNetworkBound(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + public TraCICommand process_getNetworkBound(TraCIGetCommand cmd, RemoteManager remoteManager, SimulationVar traCIVar){ remoteManager.accessState((manager, state) -> { Rectangle2D.Double rec = state.getTopography().getBounds(); @@ -44,57 +65,57 @@ public class SimulationCommandHandler extends CommandHandler{ ArrayList polyList = new ArrayList<>(); polyList.add(lowLeft); polyList.add(highRight); - cmd.setResponse(responseOK(traCIVar.returnType, polyList)); + cmd.setResponse(responseOK(traCIVar.type, polyList)); }); return cmd; } - private TraCICommand process_getSimTime(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + public TraCICommand process_getSimTime(TraCIGetCommand cmd, RemoteManager remoteManager, SimulationVar traCIVar){ remoteManager.accessState((manager, state) -> { // BigDecimal to ensure correct comparison in omentpp BigDecimal time = BigDecimal.valueOf(state.getSimTimeInSec()); - cmd.setResponse(responseOK(traCIVar.returnType, time.setScale(1, RoundingMode.HALF_UP).doubleValue())); + cmd.setResponse(responseOK(traCIVar.type, time.setScale(1, RoundingMode.HALF_UP).doubleValue())); }); return cmd; } - private TraCICommand process_getVehiclesStartTeleportIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + public TraCICommand process_getVehiclesStartTeleportIDs(TraCIGetCommand cmd, RemoteManager remoteManager, SimulationVar traCIVar){ - cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + cmd.setResponse(responseOK(traCIVar.type, new ArrayList<>())); return cmd; } - private TraCICommand process_getVehiclesEndTeleportIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + public TraCICommand process_getVehiclesEndTeleportIDs(TraCIGetCommand cmd, RemoteManager remoteManager, SimulationVar traCIVar){ - cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + cmd.setResponse(responseOK(traCIVar.type, new ArrayList<>())); return cmd; } - private TraCICommand process_getVehiclesStartParkingIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + public TraCICommand process_getVehiclesStartParkingIDs(TraCIGetCommand cmd, RemoteManager remoteManager, SimulationVar traCIVar){ - cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + cmd.setResponse(responseOK(traCIVar.type, new ArrayList<>())); return cmd; } - private TraCICommand process_getVehiclesStopParkingIDs(TraCIGetCommand cmd, RemoteManager remoteManager, TraCISimulationVar traCIVar){ + public TraCICommand process_getVehiclesStopParkingIDs(TraCIGetCommand cmd, RemoteManager remoteManager, SimulationVar traCIVar){ - cmd.setResponse(responseOK(traCIVar.returnType, new ArrayList<>())); + cmd.setResponse(responseOK(traCIVar.type, new ArrayList<>())); return cmd; } public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ return processValueSub(rawCmd, remoteManager, this::processGet, - TraCICmd.SUB_SIMULATION_VALUE, TraCICmd.RESPONSE_SUB_SIMULATION_VALUE); + TraCICmd.GET_SIMULATION_VALUE, TraCICmd.RESPONSE_SUB_SIMULATION_VALUE); } public TraCICommand processGet(TraCICommand rawCmd, RemoteManager remoteManager){ TraCIGetCommand cmd = (TraCIGetCommand) rawCmd; - TraCISimulationVar var = TraCISimulationVar.fromId(cmd.getVariableIdentifier()); + SimulationVar var = SimulationVar.fromId(cmd.getVariableIdentifier()); switch (var){ case NETWORK_BOUNDING_BOX_2D: return process_getNetworkBound(cmd, remoteManager, var); diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIVehicleVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIVehicleVar.java deleted file mode 100644 index 57071565d..000000000 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIVehicleVar.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.vadere.manager.traci.commandHandler; - -import org.vadere.manager.TraCIException; -import org.vadere.manager.traci.TraCIDataType; - -public enum TraCIVehicleVar { - ID_LIST(0x00, TraCIDataType.STRING_LIST); - - public int id; - public TraCIDataType returnType; - - TraCIVehicleVar(int id, TraCIDataType retVal) { - this.id = id; - this.returnType = retVal; - } - - - public static TraCIVehicleVar fromId(int id){ - for(TraCIVehicleVar var : values()){ - if (var.id == id) - return var; - } - throw new TraCIException(String.format("No vehicle variable found with id: %02X", id)); - } - - @Override - public String toString() { - return "TraCIVehicleVar{" + - "id=" + id + - ", returnType=" + returnType + - '}'; - } -} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/VehicleCommandHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/VehicleCommandHandler.java index e2988f804..9e9b8d53a 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/VehicleCommandHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/VehicleCommandHandler.java @@ -3,22 +3,45 @@ package org.vadere.manager.traci.commandHandler; import org.vadere.manager.RemoteManager; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commandHandler.annotation.VehicleHandler; +import org.vadere.manager.traci.commandHandler.annotation.VehicleHandlers; +import org.vadere.manager.traci.commandHandler.variables.VehicleVar; import org.vadere.manager.traci.commands.TraCICommand; import org.vadere.manager.traci.commands.TraCIGetCommand; import org.vadere.manager.traci.respons.TraCIGetResponse; +import java.lang.reflect.Method; import java.util.ArrayList; -public class VehicleCommandHandler extends CommandHandler{ +public class VehicleCommandHandler extends CommandHandler{ public static VehicleCommandHandler instance; -// private HashMap handler; +// private HashMap handler; static { instance = new VehicleCommandHandler(); } + public VehicleCommandHandler() { + super(); + init(VehicleHandler.class, VehicleHandlers.class); + } + + @Override + protected void init_HandlerSingle(Method m) { + VehicleHandler an = m.getAnnotation(VehicleHandler.class); + putHandler(an.cmd(), an.var(), m); + } + + @Override + protected void init_HandlerMult(Method m) { + VehicleHandler[] ans = m.getAnnotation(VehicleHandlers.class).value(); + for(VehicleHandler a : ans){ + putHandler(a.cmd(), a.var(), m); + } + } + public TraCIGetResponse responseOK(TraCIDataType responseDataType, Object responseData){ return responseOK(responseDataType, responseData, TraCICmd.GET_VEHICLE_VALUE, TraCICmd.RESPONSE_GET_VEHICLE_VALUE); } @@ -27,7 +50,7 @@ public class VehicleCommandHandler extends CommandHandler{ return responseERR(err, TraCICmd.GET_VEHICLE_VALUE, TraCICmd.RESPONSE_GET_VEHICLE_VALUE); } - private TraCICommand process_getIDList(TraCIGetCommand rawCmd, RemoteManager remoteManager, TraCIVehicleVar traCIVar){ + public TraCICommand process_getIDList(TraCIGetCommand rawCmd, RemoteManager remoteManager, VehicleVar traCIVar){ // always return an empty list rawCmd.setResponse(responseOK(TraCIDataType.STRING_LIST, new ArrayList<>())); @@ -38,13 +61,13 @@ public class VehicleCommandHandler extends CommandHandler{ public TraCICommand processValueSub(TraCICommand rawCmd, RemoteManager remoteManager){ return processValueSub(rawCmd, remoteManager, this::processGet, - TraCICmd.SUB_VEHICLE_VALUE, TraCICmd.RESPONSE_SUB_VEHICLE_VALUE); + TraCICmd.GET_VEHICLE_VALUE, TraCICmd.RESPONSE_SUB_VEHICLE_VALUE); } public TraCICommand processGet(TraCICommand cmd, RemoteManager remoteManager){ TraCIGetCommand getCmd = (TraCIGetCommand) cmd; - TraCIVehicleVar var = TraCIVehicleVar.fromId(getCmd.getVariableIdentifier()); + VehicleVar var = VehicleVar.fromId(getCmd.getVariableIdentifier()); switch (var){ case ID_LIST: diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandler.java new file mode 100644 index 000000000..23ba12f2a --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandler.java @@ -0,0 +1,20 @@ +package org.vadere.manager.traci.commandHandler.annotation; + +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commandHandler.variables.ControlVar; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Repeatable(ControlHandlers.class) + +public @interface ControlHandler { + TraCICmd cmd(); + ControlVar var() default ControlVar.NONE; + String name(); // name of client function. +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandlers.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandlers.java new file mode 100644 index 000000000..e8c29364e --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/ControlHandlers.java @@ -0,0 +1,13 @@ +package org.vadere.manager.traci.commandHandler.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ControlHandlers { + ControlHandler[] value(); +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PersonHandler.java similarity index 69% rename from VadereManager/src/org/vadere/manager/traci/commandHandler/PersonHandler.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PersonHandler.java index 52a4d78d3..5cc13b2c6 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/PersonHandler.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PersonHandler.java @@ -1,8 +1,10 @@ -package org.vadere.manager.traci.commandHandler; +package org.vadere.manager.traci.commandHandler.annotation; import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commandHandler.variables.PersonVar; import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -18,8 +20,9 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) +@Repeatable(PersonHandlers.class) public @interface PersonHandler { - TraCICmd commandIdentifier(); - TraCIPersonVar variable(); - String clientCommandName(); + TraCICmd cmd(); + PersonVar var() ; + String name(); // name of client function. } diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PersonHandlers.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PersonHandlers.java new file mode 100644 index 000000000..b9acbe380 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PersonHandlers.java @@ -0,0 +1,13 @@ +package org.vadere.manager.traci.commandHandler.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface PersonHandlers { + PersonHandler[] value(); +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandler.java new file mode 100644 index 000000000..cfd82bfb9 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandler.java @@ -0,0 +1,28 @@ +package org.vadere.manager.traci.commandHandler.annotation; + +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commandHandler.variables.PolygonVar; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Experimental annotation interface which removes long manually create switch statements by + * creating a dynamic HashMap connecting commands(using variableIDs) to the corresponding + * handler methods. + * + * Reflection is minimized to a single startup routine at object creation. At runtime only + * HashMap access is performed. + */ + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Repeatable(PolygonHandlers.class) +public @interface PolygonHandler { + TraCICmd cmd(); + PolygonVar var() ; + String name(); // name of client function. +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandlers.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandlers.java new file mode 100644 index 000000000..f7ee9f0ea --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/PolygonHandlers.java @@ -0,0 +1,13 @@ +package org.vadere.manager.traci.commandHandler.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface PolygonHandlers { + PolygonHandler[] value(); +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandler.java new file mode 100644 index 000000000..dafaa38d8 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandler.java @@ -0,0 +1,28 @@ +package org.vadere.manager.traci.commandHandler.annotation; + +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commandHandler.variables.SimulationVar; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Experimental annotation interface which removes long manually create switch statements by + * creating a dynamic HashMap connecting commands(using variableIDs) to the corresponding + * handler methods. + * + * Reflection is minimized to a single startup routine at object creation. At runtime only + * HashMap access is performed. + */ + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Repeatable(SimulationHandlers.class) +public @interface SimulationHandler { + TraCICmd cmd(); + SimulationVar var() ; + String name(); // name of client function. +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandlers.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandlers.java new file mode 100644 index 000000000..230f57888 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/SimulationHandlers.java @@ -0,0 +1,13 @@ +package org.vadere.manager.traci.commandHandler.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface SimulationHandlers { + SimulationHandler[] value(); +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandler.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandler.java new file mode 100644 index 000000000..464c9a18f --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandler.java @@ -0,0 +1,28 @@ +package org.vadere.manager.traci.commandHandler.annotation; + +import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commandHandler.variables.VehicleVar; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Experimental annotation interface which removes long manually create switch statements by + * creating a dynamic HashMap connecting commands(using variableIDs) to the corresponding + * handler methods. + * + * Reflection is minimized to a single startup routine at object creation. At runtime only + * HashMap access is performed. + */ + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Repeatable(VehicleHandlers.class) +public @interface VehicleHandler { + TraCICmd cmd(); + VehicleVar var() ; + String name(); // name of client function. +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandlers.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandlers.java new file mode 100644 index 000000000..afef18316 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/annotation/VehicleHandlers.java @@ -0,0 +1,13 @@ +package org.vadere.manager.traci.commandHandler.annotation; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface VehicleHandlers { + VehicleHandler[] value(); +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/ControlVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/ControlVar.java new file mode 100644 index 000000000..8758984c9 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/ControlVar.java @@ -0,0 +1,33 @@ +package org.vadere.manager.traci.commandHandler.variables; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.traci.TraCIDataType; + +public enum ControlVar { + NONE(-1, TraCIDataType.INTEGER); + + public int id; + public TraCIDataType returnType; + + ControlVar(int id, TraCIDataType retVal) { + this.id = id; + this.returnType = retVal; + } + + + public static ControlVar fromId(int id){ + for(ControlVar var : values()){ + if (var.id == id) + return var; + } + throw new TraCIException(String.format("No ControlVar var found with id: %02X", id)); + } + + @Override + public String toString() { + return "ControlVar{" + + "id=" + id + + ", type=" + returnType + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPersonVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/PersonVar.java similarity index 75% rename from VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPersonVar.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/variables/PersonVar.java index 9c5f367bb..569159df1 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPersonVar.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/PersonVar.java @@ -1,4 +1,4 @@ -package org.vadere.manager.traci.commandHandler; +package org.vadere.manager.traci.commandHandler.variables; import org.vadere.manager.TraCIException; import org.vadere.manager.traci.TraCIDataType; @@ -7,7 +7,7 @@ import org.vadere.manager.traci.TraCIDataType; /** * VariableId list for Person API. */ -public enum TraCIPersonVar { +public enum PersonVar { ID_LIST(0x00, TraCIDataType.STRING_LIST), // get COUNT(0x01, TraCIDataType.INTEGER), // get @@ -35,27 +35,28 @@ public enum TraCIPersonVar { public int id; - public TraCIDataType returnType; + public TraCIDataType type; - TraCIPersonVar(int id, TraCIDataType retVal) { + PersonVar(int id, TraCIDataType retVal) { this.id = id; - this.returnType = retVal; + this.type = retVal; } - public static TraCIPersonVar fromId(int id){ - for(TraCIPersonVar var : values()){ + public static PersonVar fromId(int id){ + for(PersonVar var : values()){ if (var.id == id) return var; } - throw new TraCIException(String.format("No person variable found with id: %02X", id)); + throw new TraCIException(String.format("No person var found with id: %02X", id)); } @Override public String toString() { - return "TraCIPersonVar{" + - "id=" + id + - ", returnType=" + returnType + + return "PersonVar{" + + name() + + ": id=" + id + + ", type=" + type + '}'; } } diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPolygonVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/PolygonVar.java similarity index 69% rename from VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPolygonVar.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/variables/PolygonVar.java index f6747fb7f..37b9fb97b 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCIPolygonVar.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/PolygonVar.java @@ -1,9 +1,9 @@ -package org.vadere.manager.traci.commandHandler; +package org.vadere.manager.traci.commandHandler.variables; import org.vadere.manager.TraCIException; import org.vadere.manager.traci.TraCIDataType; -public enum TraCIPolygonVar { +public enum PolygonVar { ID_LIST(0x00, TraCIDataType.STRING_LIST), // get COUNT(0x01, TraCIDataType.INTEGER), // get TYPE(0x4f, TraCIDataType.STRING), // get, set @@ -19,17 +19,17 @@ public enum TraCIPolygonVar { public int id; public TraCIDataType returnType; - TraCIPolygonVar(int id, TraCIDataType retVal) { + PolygonVar(int id, TraCIDataType retVal) { this.id = id; this.returnType = retVal; } - public static TraCIPolygonVar fromId(int id){ - for(TraCIPolygonVar var : values()){ + public static PolygonVar fromId(int id){ + for(PolygonVar var : values()){ if (var.id == id) return var; } - throw new TraCIException(String.format("No polygon variable found with id: %02X", id)); + throw new TraCIException(String.format("No polygon var found with id: %02X", id)); } } diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCISimulationVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/SimulationVar.java similarity index 67% rename from VadereManager/src/org/vadere/manager/traci/commandHandler/TraCISimulationVar.java rename to VadereManager/src/org/vadere/manager/traci/commandHandler/variables/SimulationVar.java index 69c536021..eb6d7c799 100644 --- a/VadereManager/src/org/vadere/manager/traci/commandHandler/TraCISimulationVar.java +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/SimulationVar.java @@ -1,9 +1,9 @@ -package org.vadere.manager.traci.commandHandler; +package org.vadere.manager.traci.commandHandler.variables; import org.vadere.manager.TraCIException; import org.vadere.manager.traci.TraCIDataType; -public enum TraCISimulationVar { +public enum SimulationVar { CURR_SIM_TIME(0x66, TraCIDataType.DOUBLE), NUM_LOADED_VEHICLES(0x71, TraCIDataType.INTEGER), @@ -22,26 +22,26 @@ public enum TraCISimulationVar { ; public int id; - public TraCIDataType returnType; + public TraCIDataType type; - TraCISimulationVar(int id, TraCIDataType retVal) { + SimulationVar(int id, TraCIDataType retVal) { this.id = id; - this.returnType = retVal; + this.type = retVal; } - public static TraCISimulationVar fromId(int id){ - for(TraCISimulationVar var : values()){ + public static SimulationVar fromId(int id){ + for(SimulationVar var : values()){ if (var.id == id) return var; } - throw new TraCIException(String.format("No simulation variable found with id: %02X", id)); + throw new TraCIException(String.format("No simulation var found with id: %02X", id)); } @Override public String toString() { - return "TraCISimulationVar{" + + return "SimulationVar{" + "id=" + id + - ", returnType=" + returnType + + ", type=" + type + '}'; } } diff --git a/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/VehicleVar.java b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/VehicleVar.java new file mode 100644 index 000000000..dcda5a346 --- /dev/null +++ b/VadereManager/src/org/vadere/manager/traci/commandHandler/variables/VehicleVar.java @@ -0,0 +1,33 @@ +package org.vadere.manager.traci.commandHandler.variables; + +import org.vadere.manager.TraCIException; +import org.vadere.manager.traci.TraCIDataType; + +public enum VehicleVar { + ID_LIST(0x00, TraCIDataType.STRING_LIST); + + public int id; + public TraCIDataType returnType; + + VehicleVar(int id, TraCIDataType retVal) { + this.id = id; + this.returnType = retVal; + } + + + public static VehicleVar fromId(int id){ + for(VehicleVar var : values()){ + if (var.id == id) + return var; + } + throw new TraCIException(String.format("No vehicle var found with id: %02X", id)); + } + + @Override + public String toString() { + return "VehicleVar{" + + "id=" + id + + ", type=" + returnType + + '}'; + } +} diff --git a/VadereManager/src/org/vadere/manager/traci/commands/TraCICommand.java b/VadereManager/src/org/vadere/manager/traci/commands/TraCICommand.java index fee965fdd..83cb9e911 100644 --- a/VadereManager/src/org/vadere/manager/traci/commands/TraCICommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/TraCICommand.java @@ -22,7 +22,7 @@ import java.nio.ByteBuffer; * * Each command has an Id managed as an enum {@link TraCICmd}. This enum also contains * the type of the command (i.e. GET, SET, Control). Depending on the type (and sometimes on - * the variable queried) different sub classes are used to manage the command. + * the var queried) different sub classes are used to manage the command. * * Construction Methods: (compare with {@link org.vadere.manager.traci.respons.TraCIResponse}) * diff --git a/VadereManager/src/org/vadere/manager/traci/commands/TraCIGetCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/TraCIGetCommand.java index 78b1c987c..e6687b64e 100644 --- a/VadereManager/src/org/vadere/manager/traci/commands/TraCIGetCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/TraCIGetCommand.java @@ -1,6 +1,7 @@ package org.vadere.manager.traci.commands; import org.vadere.manager.traci.TraCICmd; +import org.vadere.manager.traci.commandHandler.variables.PersonVar; import org.vadere.manager.traci.writer.TraCIPacket; import org.vadere.manager.traci.reader.TraCICommandBuffer; import org.vadere.manager.traci.respons.TraCIGetResponse; @@ -18,9 +19,9 @@ import java.nio.charset.StandardCharsets; * [ cmdIdentifier(based on API) ] [ variableId ] [ elementId] * * - cmdIdentifier(based on API): see {@link TraCICmd} enum GET_**** - * - variableId: Id for the variable. The numbers may be the same between different APIs - * see {@link org.vadere.manager.traci.commandHandler.TraCIPersonVar} enum - * - elementId: String based identifier for the object (i.e. a pedestrianId) + * - variableId: Id for the var. The numbers may be the same between different APIs + * see {@link PersonVar} enum + * - elementId: String based id for the object (i.e. a pedestrianId) * * see {@link org.vadere.manager.traci.commandHandler.PersonCommandHandler} for execution handing. * diff --git a/VadereManager/src/org/vadere/manager/traci/commands/TraCISetCommand.java b/VadereManager/src/org/vadere/manager/traci/commands/TraCISetCommand.java index 30d549953..75efde96b 100644 --- a/VadereManager/src/org/vadere/manager/traci/commands/TraCISetCommand.java +++ b/VadereManager/src/org/vadere/manager/traci/commands/TraCISetCommand.java @@ -2,6 +2,7 @@ package org.vadere.manager.traci.commands; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.TraCIDataType; +import org.vadere.manager.traci.commandHandler.variables.PersonVar; import org.vadere.manager.traci.reader.TraCICommandBuffer; import org.vadere.manager.traci.writer.TraCIPacket; @@ -15,9 +16,9 @@ import org.vadere.manager.traci.writer.TraCIPacket; * [ cmdIdentifier(based on API) ] [ variableId ] [ elementId] [ dataTypeId ] [ data ] * * - cmdIdentifier(based on API): see {@link TraCICmd} enum GET_**** - * - variableId: Id for the variable. The numbers may be the same between different APIs - * see {@link org.vadere.manager.traci.commandHandler.TraCIPersonVar} enum - * - elementId: String based identifier for the object (i.e. a pedestrianId) + * - variableId: Id for the var. The numbers may be the same between different APIs + * see {@link PersonVar} enum + * - elementId: String based id for the object (i.e. a pedestrianId) * - dataTypeId: see {@link TraCIDataType} * - data: data to be returned. * diff --git a/VadereManager/src/org/vadere/manager/traci/reader/TraCIByteBuffer.java b/VadereManager/src/org/vadere/manager/traci/reader/TraCIByteBuffer.java index 2af75fab7..f4f43d80e 100644 --- a/VadereManager/src/org/vadere/manager/traci/reader/TraCIByteBuffer.java +++ b/VadereManager/src/org/vadere/manager/traci/reader/TraCIByteBuffer.java @@ -110,7 +110,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public VPoint read2DPosition(){ - // identifier already consumed + // id already consumed ensureBytes(16); // 2x double double x = byteBuffer.getDouble(); double y = byteBuffer.getDouble(); @@ -119,7 +119,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public Vector3D read3DPosition(){ - // identifier already consumed + // id already consumed ensureBytes(24); // 3x double double x = byteBuffer.getDouble(); double y = byteBuffer.getDouble(); @@ -129,7 +129,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public RoadMapPosition readRoadMapPosition(){ - // identifier already consumed + // id already consumed String roadId = readString(); ensureBytes(9); // double + ubyte double pos = readDouble(); @@ -139,7 +139,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public VPoint readLonLatPosition(){ - // identifier already consumed + // id already consumed ensureBytes(16); // 2x double double lon = byteBuffer.getDouble(); double lat = byteBuffer.getDouble(); @@ -148,7 +148,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public Vector3D readLonLatAltPosition(){ - // identifier already consumed + // id already consumed ensureBytes(24); // 3x double double lon = byteBuffer.getDouble(); double lat = byteBuffer.getDouble(); @@ -158,7 +158,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public VPolygon readPolygon(){ - // identifier already consumed + // id already consumed ensureBytes(1); // ubyte int numberOfPoints = readUnsignedByte(); @@ -174,7 +174,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public List readTrafficLightPhaseList(){ - // identifier already consumed + // id already consumed ensureBytes(1); // 1x ubyte int numberOfPhases = readUnsignedByte(); @@ -192,7 +192,7 @@ public class TraCIByteBuffer implements TraCIReader { @Override public Color readColor(){ - // identifier already consumed + // id already consumed ensureBytes(4); // 4x ubyte (RGBA) int r = readUnsignedByte(); diff --git a/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetResponse.java index 8d2ad7a39..01d740e24 100644 --- a/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCIGetResponse.java @@ -16,8 +16,8 @@ import java.util.Objects; * [ responseID(based on API) ] [ variableId ] [ elementId ] [ dataTypeId ] [ data ] * * - responseID(based on API): Each API (Person, Vehicle, Simulation, ...) has a different Id. - * - variableId: Id for the variable. The numbers may be the same between different APIs - * - elementId: String based identifier for the object (i.e. a pedestrianId) + * - variableId: Id for the var. The numbers may be the same between different APIs + * - elementId: String based id for the object (i.e. a pedestrianId) * - dataTypeId: see {@link TraCIDataType} * - data: data to be returned. * diff --git a/VadereManager/src/org/vadere/manager/traci/respons/TraCIResponse.java b/VadereManager/src/org/vadere/manager/traci/respons/TraCIResponse.java index 3198d5394..c51035cff 100644 --- a/VadereManager/src/org/vadere/manager/traci/respons/TraCIResponse.java +++ b/VadereManager/src/org/vadere/manager/traci/respons/TraCIResponse.java @@ -47,9 +47,9 @@ public class TraCIResponse { case VALUE_SET: return createSetResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer, statusResponse); case VALUE_SUB: -// return createControlResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer); +// return createControlResponse(cmd, responseIdentifier, cmdResponseBuffer); case CONTEXT_SUB: -// return createControlResponse(commandIdentifier, responseIdentifier, cmdResponseBuffer); +// return createControlResponse(cmd, responseIdentifier, cmdResponseBuffer); default: throw new TraCIException("Response Object not implemented for command: " + commandIdentifier.toString()); } diff --git a/VadereManager/src/org/vadere/manager/traci/writer/ByteArrayOutputStreamTraCIWriter.java b/VadereManager/src/org/vadere/manager/traci/writer/ByteArrayOutputStreamTraCIWriter.java index 869e21136..fd579917b 100644 --- a/VadereManager/src/org/vadere/manager/traci/writer/ByteArrayOutputStreamTraCIWriter.java +++ b/VadereManager/src/org/vadere/manager/traci/writer/ByteArrayOutputStreamTraCIWriter.java @@ -119,42 +119,42 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter writeUnsignedByteWithId(int val) { - writeUnsignedByte(TraCIDataType.U_BYTE.identifier); + writeUnsignedByte(TraCIDataType.U_BYTE.id); writeUnsignedByte(val); return this; } @Override public TraCIWriter writeByteWithId(byte val) { - writeUnsignedByte(TraCIDataType.BYTE.identifier); + writeUnsignedByte(TraCIDataType.BYTE.id); writeByte(val); return this; } @Override public TraCIWriter writeIntWithId(int val) { - writeUnsignedByte(TraCIDataType.INTEGER.identifier); + writeUnsignedByte(TraCIDataType.INTEGER.id); writeInt(val); return this; } @Override public TraCIWriter writeDoubleWithId(double val) { - writeUnsignedByte(TraCIDataType.DOUBLE.identifier); + writeUnsignedByte(TraCIDataType.DOUBLE.id); writeDouble(val); return this; } @Override public TraCIWriter writeStringWithId(String val) { - writeUnsignedByte(TraCIDataType.STRING.identifier); + writeUnsignedByte(TraCIDataType.STRING.id); writeString(val); return this; } @Override public TraCIWriter writeStringListWithId(List val) { - writeUnsignedByte(TraCIDataType.STRING_LIST.identifier); + writeUnsignedByte(TraCIDataType.STRING_LIST.id); writeStringList(val); return this; } @@ -187,7 +187,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter write2DPosition(VPoint val){ - writeUnsignedByte(TraCIDataType.POS_2D.identifier); + writeUnsignedByte(TraCIDataType.POS_2D.id); writeDouble(val.x); writeDouble(val.y); return this; @@ -195,7 +195,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter write3DPosition(Vector3D val){ - writeUnsignedByte(TraCIDataType.POS_3D.identifier); + writeUnsignedByte(TraCIDataType.POS_3D.id); writeDouble(val.x); writeDouble(val.y); writeDouble(val.z); @@ -205,7 +205,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter writeRoadMapPosition(RoadMapPosition val){ - writeUnsignedByte(TraCIDataType.POS_ROAD_MAP.identifier); + writeUnsignedByte(TraCIDataType.POS_ROAD_MAP.id); writeString(val.getRoadId()); writeDouble(val.getPos()); writeUnsignedByte(val.getLaneId()); @@ -214,7 +214,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter writeLonLatPosition(VPoint lonLat){ - writeUnsignedByte(TraCIDataType.POS_LON_LAT.identifier); + writeUnsignedByte(TraCIDataType.POS_LON_LAT.id); writeDouble(lonLat.x); writeDouble(lonLat.y); return this; @@ -222,7 +222,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter writeLonLatAltPosition(Vector3D lonLatAlt){ - writeUnsignedByte(TraCIDataType.POS_LON_LAT_ALT.identifier); + writeUnsignedByte(TraCIDataType.POS_LON_LAT_ALT.id); writeDouble(lonLatAlt.x); writeDouble(lonLatAlt.y); writeDouble(lonLatAlt.z); @@ -237,7 +237,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter writePolygon(List points){ - writeUnsignedByte(TraCIDataType.POLYGON.identifier); + writeUnsignedByte(TraCIDataType.POLYGON.id); if(points.size() > 255) throw new TraCIException("Polygon to big. TraCI only supports polygon up to 255 points."); writeUnsignedByte(points.size()); @@ -250,7 +250,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter writeTrafficLightPhaseList(List phases){ - writeUnsignedByte(TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.identifier); + writeUnsignedByte(TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.id); if(phases.size() > 255) throw new TraCIException("Traffic Light Phase List to big. TraCI only supports list up to 255 elements."); writeUnsignedByte(phases.size()); @@ -264,7 +264,7 @@ public class ByteArrayOutputStreamTraCIWriter implements TraCIWriter { @Override public TraCIWriter writeColor(Color color){ - writeUnsignedByte(TraCIDataType.COLOR.identifier); + writeUnsignedByte(TraCIDataType.COLOR.id); writeUnsignedByte(color.getRed()); writeUnsignedByte(color.getGreen()); writeUnsignedByte(color.getBlue()); diff --git a/VadereManager/tests/org/vadere/manager/traci/ByteArrayOutputStreamTraCIWriterTest.java b/VadereManager/tests/org/vadere/manager/traci/ByteArrayOutputStreamTraCIWriterTest.java index baeeb9b97..48ab54d76 100644 --- a/VadereManager/tests/org/vadere/manager/traci/ByteArrayOutputStreamTraCIWriterTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/ByteArrayOutputStreamTraCIWriterTest.java @@ -168,8 +168,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { writer.write2DPosition(new VPoint(23.456,3.3)); ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.POS_2D.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.POS_2D.id); // check x, y assertThat(buf.getDouble(), equalTo(23.456)); @@ -184,8 +184,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { writer.write3DPosition(new Vector3D(3.34, 12.33, 56.8889)); ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.POS_3D.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.POS_3D.id); // check x, y, z assertThat(buf.getDouble(), equalTo(3.34)); @@ -203,8 +203,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { int roadIdLen = "r001".getBytes(StandardCharsets.US_ASCII).length; ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.POS_ROAD_MAP.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.POS_ROAD_MAP.id); // check roadId checkString(buf, "r001"); @@ -224,8 +224,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { writer.writeLonLatPosition(new VPoint(49.3345, 10.10453)); ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.POS_LON_LAT.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.POS_LON_LAT.id); // check lon, lat assertThat(buf.getDouble(), equalTo(49.3345)); @@ -240,8 +240,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { writer.writeLonLatAltPosition(new Vector3D(49.33, 15.223, 12.33)); ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.POS_LON_LAT_ALT.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.POS_LON_LAT_ALT.id); // check lon, lat, alt assertThat(buf.getDouble(), equalTo(49.33)); @@ -270,8 +270,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { writer.writePolygon(points); ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.POLYGON.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.POLYGON.id); // check number of points (ubyte) assertThat(buf.get() & 0xff, equalTo(3)); @@ -310,8 +310,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { writer.writeTrafficLightPhaseList(phases); ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.id); // check number of phases assertThat(buf.get() & 0xff, equalTo(1)); @@ -332,8 +332,8 @@ public class ByteArrayOutputStreamTraCIWriterTest { writer.writeColor(new Color(10, 20, 40, 50)); ByteBuffer buf = writer.asByteBuffer(); - // identifier (ubyte) - checkIdentifier(buf.get(), TraCIDataType.COLOR.identifier); + // id (ubyte) + checkIdentifier(buf.get(), TraCIDataType.COLOR.id); // check color rgba assertThat(buf.get() & 0xff, equalTo(10) ); diff --git a/VadereManager/tests/org/vadere/manager/traci/TraCIReaderTest.java b/VadereManager/tests/org/vadere/manager/traci/TraCIReaderTest.java index 04781f18c..bc2bf5205 100644 --- a/VadereManager/tests/org/vadere/manager/traci/TraCIReaderTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/TraCIReaderTest.java @@ -126,7 +126,7 @@ public class TraCIReaderTest { writer.write2DPosition(new VPoint(22.3, 4.0)); createReader(); - checkIdentifier(TraCIDataType.POS_2D.identifier); + checkIdentifier(TraCIDataType.POS_2D.id); VPoint p = reader.read2DPosition(); assertThat(p.x, equalTo(22.3)); assertThat(p.y, equalTo(4.0)); @@ -140,7 +140,7 @@ public class TraCIReaderTest { writer.write3DPosition(new Vector3D(11.1, 22.2, 33.3)); createReader(); - checkIdentifier(TraCIDataType.POS_3D.identifier); + checkIdentifier(TraCIDataType.POS_3D.id); Vector3D vec = reader.read3DPosition(); assertThat(vec.x, equalTo(11.1)); assertThat(vec.y, equalTo(22.2)); @@ -155,7 +155,7 @@ public class TraCIReaderTest { writer.writeRoadMapPosition(new RoadMapPosition("road_001", 12.5, 0)); createReader(); - checkIdentifier(TraCIDataType.POS_ROAD_MAP.identifier); + checkIdentifier(TraCIDataType.POS_ROAD_MAP.id); RoadMapPosition roadMapPosition = reader.readRoadMapPosition(); assertThat(roadMapPosition.getRoadId(), equalTo("road_001")); assertThat(roadMapPosition.getPos(), equalTo(12.5)); @@ -170,7 +170,7 @@ public class TraCIReaderTest { writer.writeLonLatPosition(new VPoint(23.3, 11.9)); createReader(); - checkIdentifier(TraCIDataType.POS_LON_LAT.identifier); + checkIdentifier(TraCIDataType.POS_LON_LAT.id); VPoint lonLat = reader.readLonLatPosition(); assertThat(lonLat.x, equalTo(23.3)); assertThat(lonLat.y, equalTo(11.9)); @@ -184,7 +184,7 @@ public class TraCIReaderTest { writer.writeLonLatAltPosition(new Vector3D(34.5, 34.0, 11.3436)); createReader(); - checkIdentifier(TraCIDataType.POS_LON_LAT_ALT.identifier); + checkIdentifier(TraCIDataType.POS_LON_LAT_ALT.id); Vector3D lonlatalt = reader.readLonLatAltPosition(); assertThat(lonlatalt.x, equalTo(34.5)); assertThat(lonlatalt.y, equalTo(34.0)); @@ -201,7 +201,7 @@ public class TraCIReaderTest { createReader(); VPolygon match = GeometryUtils.polygonFromPoints2D(points); - checkIdentifier(TraCIDataType.POLYGON.identifier); + checkIdentifier(TraCIDataType.POLYGON.id); VPolygon actual = reader.readPolygon(); assertThat(actual, equalTo(match)); @@ -217,7 +217,7 @@ public class TraCIReaderTest { writer.writeTrafficLightPhaseList(phases); createReader(); - checkIdentifier(TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.identifier); + checkIdentifier(TraCIDataType.TRAFFIC_LIGHT_PHASE_LIST.id); List actualPhases = reader.readTrafficLightPhaseList(); assertThat(actualPhases, equalTo(phases)); @@ -231,7 +231,7 @@ public class TraCIReaderTest { writer.writeColor(color); createReader(); - checkIdentifier(TraCIDataType.COLOR.identifier); + checkIdentifier(TraCIDataType.COLOR.id); assertThat(reader.readColor(), equalTo(color)); // buf must be empty diff --git a/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetResponseTest.java b/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetResponseTest.java index 3949d014f..2aac62f02 100644 --- a/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetResponseTest.java +++ b/VadereManager/tests/org/vadere/manager/traci/respons/TraCIGetResponseTest.java @@ -1,7 +1,7 @@ package org.vadere.manager.traci.respons; import org.junit.Test; -import org.vadere.manager.traci.commandHandler.TraCIPersonVar; +import org.vadere.manager.traci.commandHandler.variables.PersonVar; import org.vadere.manager.traci.TraCICmd; import org.vadere.manager.traci.TraCIDataType; import org.vadere.manager.traci.reader.TraCICommandBuffer; @@ -14,7 +14,7 @@ public class TraCIGetResponseTest { @Test public void createFromBuffer(){ - byte[] data = new byte[]{(byte)TraCIPersonVar.COUNT.id, 0,0,0,2, 65, 65, (byte)TraCIDataType.INTEGER.identifier, 0,0,0,78}; + byte[] data = new byte[]{(byte) PersonVar.COUNT.id, 0,0,0,2, 65, 65, (byte)TraCIDataType.INTEGER.id, 0,0,0,78}; TraCIGetResponse response = new TraCIGetResponse( new StatusResponse(TraCICmd.GET_PERSON_VALUE, TraCIStatusResponse.OK, ""), TraCICmd.RESPONSE_GET_PERSON_VALUE, -- GitLab From d053a1dcb800542f7664e861b49ec4f6e98c93ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schuhb=C3=A4ck?= Date: Mon, 24 Jun 2019 14:20:08 +0200 Subject: [PATCH 31/58] extend open street map parser to pars paths to polygons --- Tools/Converters/osm2vadere/map_mf_small.osm | 19097 ++++++++ .../osm2vadere/map_mf_small_modified.osm | 19071 ++++++++ .../osm2vadere/maps/map_mf_small.osm | 19097 ++++++++ Tools/Converters/osm2vadere/mf.osm | 37108 ++++++++++++++++ Tools/Converters/osm2vadere/osm2vadere.py | 249 +- Tools/Converters/osm2vadere/requirements.txt | 1 + .../Converters/osm2vadere/test_osm2vadere.py | 59 +- .../testProject001/scenarios/mf_001.scenario | 10802 +++++ .../scenarios/mf_small.scenario | 3156 ++ .../scenarios/mf_small_simple.scenario | 1849 + 10 files changed, 110453 insertions(+), 36 deletions(-) create mode 100644 Tools/Converters/osm2vadere/map_mf_small.osm create mode 100644 Tools/Converters/osm2vadere/map_mf_small_modified.osm create mode 100644 Tools/Converters/osm2vadere/maps/map_mf_small.osm create mode 100644 Tools/Converters/osm2vadere/mf.osm create mode 100644 VadereManager/testResources/testProject001/scenarios/mf_001.scenario create mode 100644 VadereManager/testResources/testProject001/scenarios/mf_small.scenario create mode 100644 VadereManager/testResources/testProject001/scenarios/mf_small_simple.scenario diff --git a/Tools/Converters/osm2vadere/map_mf_small.osm b/Tools/Converters/osm2vadere/map_mf_small.osm new file mode 100644 index 000000000..ea49cea07 --- /dev/null +++ b/Tools/Converters/osm2vadere/map_mf_small.osm @@ -0,0 +1,19097 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +