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 76f99e14b1abfbb9e8ae9236bdcad55981d08bd6..61141e8085823647eb25c4c41f891dfa8627c059 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 @@ -1,5 +1,6 @@ package de.tudresden.inf.st.pnml.engine.ros; +import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.base.data.ClauseValuesDefinition; import de.tudresden.inf.st.pnml.engine.transform.PetriNetInitializer; import de.tudresden.inf.st.pnml.jastadd.model.*; @@ -8,7 +9,10 @@ import org.ros.concurrent.CancellableLoop; import org.ros.namespace.GraphName; import org.ros.node.AbstractNodeMain; import org.ros.node.ConnectedNode; +import org.ros.node.topic.Publisher; +import org.ros.node.topic.Subscriber; import org.xml.sax.SAXException; +import std_msgs.String; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; @@ -20,7 +24,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { public static final java.lang.String NOTIFICATION_MARKING_CHANGE = "markingChange"; public static final java.lang.String NOTIFICATION_SIGNAL_CHANGE = "signalChange"; public static final java.lang.String NOTIFICATION_WAIT_ENDED = "waitEnded"; - public static final java.lang.String NOTIFICATION_STARTUP_ENDED = "waitEnded"; + public static final java.lang.String NOTIFICATION_STARTUP_ENDED = "startEnded"; public final java.lang.String nodeName; public final PetriNet petriNet; @@ -30,7 +34,10 @@ public abstract class DiNeRosNode extends AbstractNodeMain { protected InputSignalConnector inputSignalConnector = new InputSignalConnector(); private boolean stopNode = false; - public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, String rcHost, String gcProtocol) { + final Map<DinerosPlace, Subscriber> dinerosSubscribers = new HashMap<>(); + final Map<DinerosPlace, Publisher<String>> dinerosPublishers = new HashMap<>(); + + public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, java.lang.String rcHost, java.lang.String gcProtocol) { this.nodeName = nodeName; this.petriNet = petriNet; @@ -52,13 +59,13 @@ public abstract class DiNeRosNode extends AbstractNodeMain { this.inputSignalConnector = inputSignalConnector; } - private final void internalNodeLoop() { + private void internalNodeLoop() { this.connectedNode.executeCancellableLoop(new CancellableLoop() { @Override protected void loop() { - if(!stopNode) { + if (!stopNode) { nodeLoop(); } } @@ -67,23 +74,28 @@ public abstract class DiNeRosNode extends AbstractNodeMain { protected abstract void nodeLoop(); - protected final void stop(){ + protected final void stop() { stopNode = true; this.connectedNode.shutdown(); } - public synchronized void notify(java.lang.String notificationType){ + public synchronized void notify(java.lang.String notificationType) { Set<Transition> signalFilteredTransitions = getSignalFilteredTransitions(); - if (notificationType.equals(NOTIFICATION_MARKING_CHANGE)) { - onMarkingChangeInternal(signalFilteredTransitions); - } else if (notificationType.equals(NOTIFICATION_SIGNAL_CHANGE)) { - onSignalChangeInternal(signalFilteredTransitions); - } else if (notificationType.equals(NOTIFICATION_WAIT_ENDED)) { - onWaitEndedInternal(signalFilteredTransitions); - } else if (notificationType.equals(NOTIFICATION_STARTUP_ENDED)) { - onStartupEndedInternal(signalFilteredTransitions); + switch (notificationType) { + case NOTIFICATION_MARKING_CHANGE: + onMarkingChangeInternal(signalFilteredTransitions); + break; + case NOTIFICATION_SIGNAL_CHANGE: + onSignalChangeInternal(signalFilteredTransitions); + break; + case NOTIFICATION_WAIT_ENDED: + onWaitEndedInternal(signalFilteredTransitions); + break; + case NOTIFICATION_STARTUP_ENDED: + onStartupEndedInternal(signalFilteredTransitions); + break; } } @@ -94,10 +106,10 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ClauseValuesDefinition clauseValuesDefinition = new ClauseValuesDefinition(); - for(Transition transition : marking.enabledBalloonTransitions()) { + for (Transition transition : marking.enabledBalloonTransitions()) { if (transition.asDinerosTransition().getStaticTransitionInformation() .asSignalTransitionInformation().getClause() != null) { - for (String signalId : transition.asDinerosTransition().getStaticTransitionInformation() + for (java.lang.String signalId : transition.asDinerosTransition().getStaticTransitionInformation() .asSignalTransitionInformation().getClause().signals()) { for (SignalConnection sc : inputSignalConnector.getSignalConnections()) { if (signalId.equals(sc.getId())) { @@ -130,19 +142,19 @@ public abstract class DiNeRosNode extends AbstractNodeMain { } } - if(res.isFiringSelectionFail()){ + if (res.isFiringSelectionFail()) { System.err.println("[DiNeROS-Node] [" + nodeName + "] Firing selection action failed!"); return res; } System.out.println("FIRING TRANSITION"); marking.fireTransition(res.asFiringSelectionSuccess() - .getTransition(), callbackStorage, inputSignalConnector, this,true); + .getTransition(), callbackStorage, inputSignalConnector, this, true); return res; } - private void onStartupEndedInternal(Set<Transition> enabledTransitions){ + private void onStartupEndedInternal(Set<Transition> enabledTransitions) { System.out.println("Calling onStartupEndedInternal"); @@ -150,7 +162,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { getTransitionSelectionResult(res); } - private void onMarkingChangeInternal(Set<Transition> enabledTransitions){ + private void onMarkingChangeInternal(Set<Transition> enabledTransitions) { System.out.println("Calling onMarkingChangeInternal"); @@ -158,7 +170,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { getTransitionSelectionResult(res); } - private void onSignalChangeInternal(Set<Transition> enabledTransitions){ + private void onSignalChangeInternal(Set<Transition> enabledTransitions) { System.out.println("Calling onSignalChangeInternal"); @@ -167,7 +179,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { } - private void onWaitEndedInternal(Set<Transition> enabledTransitions){ + private void onWaitEndedInternal(Set<Transition> enabledTransitions) { System.out.println("Calling onWaitEndedInternal"); @@ -203,18 +215,45 @@ public abstract class DiNeRosNode extends AbstractNodeMain { // TODO // init publishers - // TODO + HashMap<java.lang.String, ArrayList<java.lang.String>> channelPubElementMap + = petriNet.getChannelElemensByKey(PnmlConstants.CHANNEL_PLACE_TYPE_PUB_KEY); + + for (java.lang.String key : channelPubElementMap.keySet()) { + // TODO: modify fire method -> if a target is publisher-place, than it has to fire; thus, add node-param to it for all needed data + for (java.lang.String placeId : channelPubElementMap.get(key)) { + final Publisher<String> publisher = connectedNode.newPublisher(key, String._TYPE); + dinerosPublishers.put(petriNet.getPlaceById(placeId).asDinerosPlace(), publisher); + } + } // init subscribers - // TODO + HashMap<java.lang.String, ArrayList<java.lang.String>> channelSubElementMap + = petriNet.getChannelElemensByKey(PnmlConstants.CHANNEL_PLACE_TYPE_SUB_KEY); + + for (java.lang.String key : channelSubElementMap.keySet()) { + for (java.lang.String placeId : channelSubElementMap.get(key)) { + + Subscriber<String> subscriber = connectedNode.newSubscriber(key, String._TYPE); + + + subscriber.addMessageListener(message -> { + // TODO + + }, petriNet.getChannelElementLimitById(placeId)); + + dinerosSubscribers.put(petriNet.getPlaceById(placeId).asDinerosPlace(), subscriber); + + } + } System.out.println("[INIT NODE] Executing first marking query."); - TransitionSelectionResult firstFiringResult = onStartupEnded(marking.enabledBalloonTransitions()); + // TransitionSelectionResult firstFiringResult = + this.notify(NOTIFICATION_STARTUP_ENDED); - if(firstFiringResult.isFiringSelectionSuccess()){ + /* if(firstFiringResult.isFiringSelectionSuccess()){ marking.fireTransition(firstFiringResult.asFiringSelectionSuccess() .getTransition(), callbackStorage, inputSignalConnector, this,true); - } + }*/ this.internalNodeLoop(); } 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 089696d9f5e0abff908621eb125baaec52bc1f20..af9ff830a7b3330332f3bf89968171b51c0633d7 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 @@ -1,7 +1,6 @@ package de.tudresden.inf.st.pnml.engine.transform; import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode; -import de.tudresden.inf.st.pnml.engine.testNodes.DinerosTestNode; import de.tudresden.inf.st.pnml.jastadd.model.*; import java.io.IOException;