diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java index 48b5da803a1206b1f01da3c16a7733e54d67ad0a..4ea1f62e243e0065aae1ab6892cb147fae7b1283 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java @@ -26,7 +26,6 @@ public class Main { //new Thread(() -> nodeMainExecutor.execute(server, nodeConfiguration)) {{start();}}; - /* System.out.println("---- STARTING sampleService0 ----"); new Thread(() -> nodeMainExecutor.execute(new FakeServerNode("sampleService0", "sampleServiceNode0"), nodeConfiguration)) {{start();}}; diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java index b59f7428e1c227a274ff7b82647aa02bb74d36a2..61947d4217a70920598bfa43ce4c87fa18a9ecbb 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java @@ -8,6 +8,7 @@ import de.tudresden.inf.st.pnml.base.data.ClauseValuesDefinition; import de.tudresden.inf.st.pnml.engine.event.DiNeRosEvent; import de.tudresden.inf.st.pnml.engine.event.DiNeRosEventTypes; import de.tudresden.inf.st.pnml.engine.execution.TransitionHandler; +import de.tudresden.inf.st.pnml.engine.tracing.TracePublishing; import de.tudresden.inf.st.pnml.engine.transform.PetriNetInitializer; import de.tudresden.inf.st.pnml.engine.transform.ServiceInstanceUtil; import de.tudresden.inf.st.pnml.jastadd.model.*; @@ -41,13 +42,14 @@ public abstract class DiNeRosNode extends AbstractNodeMain { public final PetriNet petriNet; protected BalloonMarking marking; public BalloonCallbackStorage callbackStorage; - protected ConnectedNode connectedNode; + public ConnectedNode connectedNode; protected InputSignalConnector inputSignalConnector; private boolean stopNode = false; private final Map<DinerosPlace, Publisher<String>> dinerosPublishers = new HashMap<>(); private final Set<java.lang.String> responsePlaces = new HashSet<>(); private final Set<java.lang.String> activeServerInstances = new HashSet<>(); + public Publisher<String> tracePublisher = null; public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, java.lang.String rcHost, java.lang.String gcProtocol) { this.nodeName = nodeName; @@ -125,7 +127,21 @@ public abstract class DiNeRosNode extends AbstractNodeMain { switch (event.eventType) { case DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE: + onChangeInternal(signalFilteredTransitions); + break; case DiNeRosEventTypes.NOTIFICATION_SIGNAL_CHANGE: + + Boolean newVal = false; + + for(SignalConnection sc : this.inputSignalConnector.getSignalConnections()){ + if(sc.getId().equals(event.payload)){ + newVal = sc.getCurrentValue(); + } + } + + TracePublishing.publish(TracePublishing.TraceTypeSignalChanged, + this.getDefaultNodeName()+ " " + event.payload + " " + newVal, + this.connectedNode, this.tracePublisher); onChangeInternal(signalFilteredTransitions); break; case DiNeRosEventTypes.NOTIFICATION_STARTUP_ENDED: @@ -153,6 +169,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { RosCommunicationUtil.publish(topicName, bmp.getBalloonMarking(0).getValue().getBytes(), this.connectedNode, getPublisherByPlaceId(placeId)); System.out.println("[DiNeROS-Node] [" + nodeName + "] Published msg: " + bmp.getBalloonMarking(0).getValue()); + TracePublishing.publish(TracePublishing.TraceTypeTopicSend, + this.nodeName + " " + topicName + "-" + placeId, this.connectedNode, this.tracePublisher); bmp.getBalloonMarking(0).removeSelf(); petriNet.flushTreeCache(); this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); @@ -209,6 +227,9 @@ public abstract class DiNeRosNode extends AbstractNodeMain { final StringServiceRequest request = serviceClient.newMessage(); request.setInput(bmpSource.getBalloonMarking(0).getValue()); + TracePublishing.publish(TracePublishing.TraceTypeServiceClientSend, + self.nodeName + " " + serviceName + "-" + placeId, self.connectedNode, self.tracePublisher); + serviceClient.call(request, new ServiceResponseListener<>() { @Override @@ -225,6 +246,10 @@ public abstract class DiNeRosNode extends AbstractNodeMain { } else { self.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); } + + TracePublishing.publish(TracePublishing.TraceTypeServiceClientReceive, + self.nodeName + " " + serviceName + " " + cResPlaceId, self.connectedNode, self.tracePublisher); + // serviceClient.shutdown(); } @@ -309,6 +334,13 @@ public abstract class DiNeRosNode extends AbstractNodeMain { System.out.println("Calling onChangeInternal"); TransitionSelectionResult res = onChange(enabledTransitions); + + if(res.isFiringSelectionSuccess()){ + TracePublishing.publish(TracePublishing.TraceTypeTransitionFired, + this.getDefaultNodeName() + " " + res.asFiringSelectionSuccess().getTransition().getId(), + this.connectedNode, this.tracePublisher); + } + getTransitionSelectionResult(res); } @@ -331,6 +363,9 @@ public abstract class DiNeRosNode extends AbstractNodeMain { System.out.println("[" + nodeName + "] Setting Default Names for Objects"); setDefaultNames(); + System.out.println("[" + nodeName + "] Initializing tracing publisher."); + tracePublisher = connectedNode.newPublisher("DinerosTracing", String._TYPE); + System.out.println("[" + nodeName + "] Initializing servers"); // init service servers mechanism // is a 1:1 mapping, because there is always just on server @@ -412,6 +447,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { } System.out.println("[" + nodeName + "] Inserting request in " + selectedInstanceInId); + TracePublishing.publish(TracePublishing.TraceTypeServiceServerReceive, + this.nodeName + " " + key + " " + selectedInstanceInId, this.connectedNode, this.tracePublisher); Place instanceEntryPlace = petriNet.getPlaceById(selectedInstanceInId); marking.resolveBalloonPlace(instanceEntryPlace).addBalloonMarking( new BalloonToken(request.getInput(), System.currentTimeMillis())); @@ -419,6 +456,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { while(activeServerInstances.contains(selectedInstanceOutId)){} System.out.println("[" + nodeName + "] Instance " + selectedInstanceOutId + " is ready to return"); + TracePublishing.publish(TracePublishing.TraceTypeServiceServerSend, + this.nodeName + " " + key + " " + selectedInstanceOutId, this.connectedNode, this.tracePublisher); for(java.lang.String entry : responsePlaces){ if(entry.equals(selectedInstanceOutId)){ @@ -475,6 +514,9 @@ public abstract class DiNeRosNode extends AbstractNodeMain { bmp.getBalloonMarkingList().add(bt); petriNet.flushTreeCache(); + TracePublishing.publish(TracePublishing.TraceTypeTopicReceive, + this.nodeName + " " + key + " " + placeId, this.connectedNode, this.tracePublisher); + if(!marking.callServiceIfRequest(bmp, self)){ this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TraceEntry.java b/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TraceEntry.java new file mode 100644 index 0000000000000000000000000000000000000000..2db3bca50d0c226588897a6bd27b7f2a0669dcbd --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TraceEntry.java @@ -0,0 +1,12 @@ +package de.tudresden.inf.st.pnml.engine.tracing; + +public class TraceEntry { + + public String traceType; + public String traceValue; + + public TraceEntry(String traceType, String traceValue) { + this.traceType = traceType; + this.traceValue = traceValue; + } +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TracePublishing.java b/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TracePublishing.java new file mode 100644 index 0000000000000000000000000000000000000000..937357b647826416c458b557c9639104781ecfe4 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TracePublishing.java @@ -0,0 +1,23 @@ +package de.tudresden.inf.st.pnml.engine.tracing; + +import de.tudresden.inf.st.pnml.engine.ros.RosCommunicationUtil; +import org.ros.node.ConnectedNode; +import org.ros.node.topic.Publisher; + +public class TracePublishing { + + public static java.lang.String TraceTypeTransitionFired = "transitionFired"; + public static java.lang.String TraceTypeSignalChanged = "signalChanged"; + public static java.lang.String TraceTypeTopicSend = "topicSend"; + public static java.lang.String TraceTypeTopicReceive = "topicReceive"; + public static java.lang.String TraceTypeServiceClientSend = "serviceClientSend"; + public static java.lang.String TraceTypeServiceClientReceive = "serviceClientReceive"; + public static java.lang.String TraceTypeServiceServerSend = "serviceServerSend"; + public static java.lang.String TraceTypeServiceServerReceive = "serviceServerReceive"; + + public static void publish(java.lang.String traceType, java.lang.String traceValue, ConnectedNode connectedNode, + Publisher<std_msgs.String> publisherObj) { + java.lang.String msgString = traceType + "," + traceValue; + RosCommunicationUtil.publish("DinerosTracing", msgString.getBytes(), connectedNode, publisherObj); + } +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TracingNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TracingNode.java new file mode 100644 index 0000000000000000000000000000000000000000..cf2174e282d11b618e21ba5bae40f01ba65f73a1 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/tracing/TracingNode.java @@ -0,0 +1,57 @@ +package de.tudresden.inf.st.pnml.engine.tracing; + +import org.ros.namespace.GraphName; +import org.ros.node.AbstractNodeMain; +import org.ros.node.ConnectedNode; +import org.ros.node.topic.Subscriber; +import std_msgs.String; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class TracingNode extends AbstractNodeMain { + + @Override + public GraphName getDefaultNodeName() { + return GraphName.of("DinerosTracingNode"); + } + + @Override + public void onStart(final ConnectedNode connectedNode) { + + File f = new File("DinerosTrace-" + System.currentTimeMillis() + ".txt"); + + try { + if (f.createNewFile()) { + System.out.println("[Trace] Created trace file: " + f.getName()); + } else { + System.out.println("[Trace] Trace file already exists: " + f.getName()); + } + } catch (IOException e) { + e.printStackTrace(); + } + + Subscriber<String> subscriber = connectedNode.newSubscriber("DinerosTracing", String._TYPE); + + subscriber.addMessageListener(message -> { + java.lang.String[] splitEntry = message.getData().split(","); + updateTrace(new TraceEntry(splitEntry[0], splitEntry[1]), f); + }, 1000); + + } + + private synchronized void updateTrace(TraceEntry traceEntry, File traceFile){ + + try { + FileWriter writer = new FileWriter(traceFile.getName(), true); + java.lang.String line = System.currentTimeMillis() + " " + + traceEntry.traceType + " " + traceEntry.traceValue; + writer.write(line + "\n"); + writer.close(); + System.out.println("[Trace] " + line); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java index 319861167dc8c19e5bedec4c0e1c25d86a82741a..f61f9b1373d30a96de63015e280d2b3079a8e1c3 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java @@ -105,16 +105,16 @@ public class PetriNetInitializer { //inputSignalConnector.ragconnectJavaRegisterConsumer("java://localhost:00/" + signalId, // bytes -> node.notify(DiNeRosNode.NOTIFICATION_SIGNAL_CHANGE)); - inputSignalConnector.ragconnectJavaRegisterConsumer(signalId, bytes -> notifyOnSignalChange(node)); + inputSignalConnector.ragconnectJavaRegisterConsumer(signalId, bytes -> notifyOnSignalChange(node, signalId)); } else { System.out.println("Skipping unused signal: " + signalId); } } } - public static void notifyOnSignalChange(DiNeRosNode node){ + public static void notifyOnSignalChange(DiNeRosNode node, String signalId){ System.out.println("NOTIFY ON SIGNAL CHANGE"); - node.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_SIGNAL_CHANGE)); + node.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_SIGNAL_CHANGE, signalId)); } public void init(PetriNet petriNet, String host, String protocol, InputSignalConnector isc, DiNeRosNode node){