diff --git a/build.gradle b/build.gradle index 70547ab248b0540b13acbf8aca8ce87d0eb902bf..9bdec6da4a5e897a2547432830df98da8b2c9612 100644 --- a/build.gradle +++ b/build.gradle @@ -107,10 +107,10 @@ dependencies { } -/* run { + run { mainClassName = 'de.tudresden.inf.st.pnml.engine.Main' standardInput = System.in -} */ +} jar { manifest { diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd index 205d5e84b3c290cac6ed4bccb30bd3e4bedb0c6a..213e45dcddbc39ba01b26b5b67cc35d78b6812f5 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd +++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd @@ -75,8 +75,34 @@ aspect BalloonExecution { return null; } - public Optional<BalloonMarking> BalloonMarking.fireTopicPublisherTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { - return null; + public java.lang.String BalloonMarking.fireTopicPublisherTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { + + synchronized(this){ + + BalloonToken inToken = null; + + // build set of direct / indirect outgoing places and remove from them + Set<Place> incomming = transition.resolveInputPlaces(); + + // place a token in each outgoing place + for(Place place : incomming){ + + BalloonMarkedPlace bmp = this.resolveBalloonPlace(place); + + Random rand = new Random(); + int randVal = rand.nextInt(bmp.getNumBalloonMarking()); + inToken = bmp.getBalloonMarking(randVal); + + bmp.getBalloonMarking(randVal).removeSelf(); + } + + if(requireFlush){ + // flush the entire marking tree + this.flushTreeCache(); + } + + return inToken.getValue(); + } } public Optional<BalloonMarking> BalloonMarking.fireServiceServerTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { 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 23369cc0a42f6730fc245f98422fc8fc07fc8794..4550063df32d0fa90b789ef99de875aef1db5465 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 @@ -9,7 +9,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.*; import org.ros.node.DefaultNodeMainExecutor; import org.ros.node.NodeConfiguration; import org.ros.node.NodeMainExecutor; +import org.ros.node.topic.Publisher; import org.xml.sax.SAXException; +import std_msgs.String; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; @@ -17,18 +19,24 @@ import java.util.ArrayList; import java.util.List; import java.net.URI; +import java.util.Map; public class Main { private static NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault(); private static NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic("localhost"); - public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { + public static void main(java.lang.String[] args) { - String pnmlPath = "../pnml-relast-engine/src/main/resources/nets/subscriber-test-1.pnml"; + java.lang.String pnmlPath = "../pnml-relast-engine/src/main/resources/nets/publisher-test-1.pnml"; PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0); - BalloonMarking bm = petriNet.initializeBalloonMarking(); + BalloonMarking bm = null; + try { + bm = petriNet.initializeBalloonMarking(); + } catch (IOException | SAXException | ParserConfigurationException e) { + e.printStackTrace(); + } BalloonCallbackStorage bcs = petriNet.initializeCallbackStorage(); TransitionCallback tc = new DefaultFinalTransitionCallback("default_final_cb", 1); @@ -37,7 +45,6 @@ public class Main { System.out.println("----- BEFORE -----"); System.out.println(bm.print()); - for(Transition t : petriNet.allTransitions()){ if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) { bcs.resolveBalloonTransition(t).setBalloonCallbacks(tcl); @@ -55,6 +62,21 @@ public class Main { start(); }}; + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + for (Map.Entry<InputSignalTransition, Publisher<String>> entry : diNeRosNode.getDinerosPublishers().entrySet()) { + System.out.println("Firing publisher of:" + entry.getKey().getId()); + diNeRosNode.firePublisherTransition(entry.getKey()); + } + + System.out.println("----- AFTER -----"); + System.out.println(bm.print()); + + /* String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-4.pnml"; PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0); 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 c6da92890f194d39142af7a572463fc4522330d7..d09927445ad0a1a926b97275f46571f92e3c1028 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,12 +1,11 @@ package de.tudresden.inf.st.pnml.engine.ros; import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; -import de.tudresden.inf.st.pnml.engine.transform.TopicTransformer; import de.tudresden.inf.st.pnml.jastadd.model.*; -import org.ros.message.MessageListener; 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; @@ -25,6 +24,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { private BalloonMarking marking; private BalloonCallbackStorage callbackStorage; private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>(); + private final Map<InputSignalTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>(); public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){ this.nodeName = nodeName; @@ -64,32 +64,33 @@ public abstract class DiNeRosNode extends AbstractNodeMain { @Override public void onStart(final ConnectedNode connectedNode) { - int inCount = 0; + System.out.println("Initializing node: " + nodeName); + // setup publishers + for(Transition t : petriNet.allTransitions()) { + if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT) + || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)) { + + final Publisher<std_msgs.String> publisher = connectedNode.newPublisher(t.asInputSignalTransition(). + getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE); + + dinerosPublishers.put(t.asInputSignalTransition(), publisher); + + } + } + + // setup subscribers for(Transition t : petriNet.allTransitions()){ - if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TOPIC_SUBSCRIBER) - || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN) + if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN) || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)){ Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition() .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE); - int finalInCount = inCount; subscriber.addMessageListener(message -> { System.out.println("I heard: \"" + message.getData() + "\""); - List<java.lang.String> addedElementIds = new ArrayList<>(); - TopicTransformer.includeSubscriberInstance(petriNet, t.asInputSignalTransition() - .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(finalInCount), addedElementIds); - - try { - marking.initializeSubnetBalloonMarking(getSubnetPlacesByIds(addedElementIds, petriNet)); - callbackStorage.initializeSubnetCallbackStorage(getSubnetTransitionsByIds(addedElementIds, petriNet), petriNet); - } catch (IOException | ParserConfigurationException | SAXException e) { - e.printStackTrace(); - } - for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) { if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){ @@ -102,41 +103,18 @@ public abstract class DiNeRosNode extends AbstractNodeMain { // execute entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()); - // clean - try { - marking.deinitializeSubnet(getSubnetPlacesByIds(addedElementIds, petriNet), getSubnetTransitionsByIds(addedElementIds, petriNet), callbackStorage); - TopicTransformer.removeSubscriberInstance(petriNet, addedElementIds); - } catch (IOException | ParserConfigurationException | SAXException e) { - e.printStackTrace(); - } - // flush petriNet.flushTreeCache(); marking.flushTreeCache(); callbackStorage.flushTreeCache(); + + System.out.println(marking.print()); break; } } - }); - - inCount++; - } - } - } - - public List<Place> getSubnetPlacesByIds(List<java.lang.String> ids, PetriNet petriNet){ - - List<Place> places = new ArrayList<>(); - - for(java.lang.String id : ids){ - for(Place p : petriNet.allPlaces()){ - if(p.getId().equals(id)){ - places.add(p); - } + }, t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit()); } } - - return places; } public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet){ @@ -157,4 +135,25 @@ public abstract class DiNeRosNode extends AbstractNodeMain { public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() { return dinerosSubscribers; } + + public Map<InputSignalTransition, Publisher<std_msgs.String>> getDinerosPublishers() { + return dinerosPublishers; + } + + public BalloonMarking firePublisherTransition(InputSignalTransition transition){ + + java.lang.String msgString = this.marking.fireTopicPublisherTransition(transition, this.callbackStorage, true); + + for (Map.Entry<InputSignalTransition, Publisher<std_msgs.String>> entry : getDinerosPublishers().entrySet()) { + + if(transition.getId().equals(entry.getKey().getId())){ + + std_msgs.String msg = entry.getValue().newMessage(); + msg.setData(msgString); + entry.getValue().publish(msg); + } + } + + return this.marking; + } } diff --git a/src/main/resources/nets/publisher-test-1.pnml b/src/main/resources/nets/publisher-test-1.pnml index 466379c32325e9a84767a0a20c996772d7aef52c..f6a47db5639e3a16a9f57a543444b67f4a94b65f 100644 --- a/src/main/resources/nets/publisher-test-1.pnml +++ b/src/main/resources/nets/publisher-test-1.pnml @@ -1,85 +1,95 @@ <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> - <net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet"> - <page id="top"> - <page id="sourcePage"> - <referencePlace id="rp1" ref="channelInPlace"> - <name> - <text>rp1</text> - </name> - <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet"> + <page id="top"> + <page id="sourcePage"> + <referencePlace id="rp1" ref="channelInPlace"> + <name> + <text>rp1</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>loc2</location> <subnet>locA</subnet> - </toolspecific> - </referencePlace> - </page> - <page id="targetPage"> - <transition id="t1"> - <name> - <text>t1</text> - </name> - <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + </toolspecific> + </referencePlace> + </page> + <page id="targetPage"> + <transition id="t1"> + <name> + <text>t1</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>loc3</location> <subnet>locB</subnet> - </toolspecific> - </transition> - <transition id="t3"> - <name> - <text>t3</text> - </name> - <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + </toolspecific> + </transition> + <transition id="t3"> + <name> + <text>t3</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>loc3</location> <subnet>locB</subnet> - </toolspecific> - </transition> - <transition id="t2"> - <name> - <text>t2</text> - </name> - <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + </toolspecific> + </transition> + <transition id="t2"> + <name> + <text>t2</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>loc3</location> <subnet>locB</subnet> - </toolspecific> - </transition> - </page> - <page id="channelPage"> - <place id="channelInPlace"> - <name> - <text>channelInPlace</text> - </name> - <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> - - + </toolspecific> + </transition> + </page> + <page id="channelPage"> + <place id="channelInPlace"> + <name> + <text>channelInPlace</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>loc2</location> <subnet>locA</subnet> - </toolspecific> - <initialMarking> - <text>0</text> - </initialMarking> - </place> - <transition id="channelTransition-publisher-0"> - <name> - <text>channelTransition-publisher-0</text> - </name> - <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <balloonMarking> + <tokens> + <token> {"samplefield1": "data", "samplefield2": "more data"} </token> + </tokens> + </balloonMarking> + </toolspecific> + <initialMarking> + <text>0</text> + </initialMarking> + </place> + <transition id="channelTransition-publisher-0"> + <name> + <text>channelTransition-publisher-0</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> -<location>loc2</location><type>limitedChannelOutType</type><subnet>locA</subnet><topic>sampleTopic</topic><inputlimit>10</inputlimit><outputlimit>10</outputlimit><inputsignalbindings/> </toolspecific> - </transition> - <arc id="a1" source="channelInPlace" target="channelTransition-publisher-0"> - </arc> - </page> - </page> - <name> - <text>topicTest2</text> - </name> - <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>loc2</location> + <type>limitedChannelOutType</type> + <subnet>locA</subnet> + <topic>sampleTopic</topic> + <inputlimit>10</inputlimit> + <outputlimit>10</outputlimit> + <inputsignalbindings/> + </toolspecific> + </transition> + <arc id="a1" source="channelInPlace" target="channelTransition-publisher-0"> + </arc> + </page> + </page> + <name> + <text>topicTest2</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <communicators> @@ -88,6 +98,6 @@ <cSubnet>locB</cSubnet> </communicator> </communicators> - </toolspecific> - </net> + </toolspecific> + </net> </pnml>