Skip to content
Snippets Groups Projects
Commit 41a34e83 authored by Sebastian Ebert's avatar Sebastian Ebert
Browse files

petri net subscriber + publisher

parent 37835fda
No related branches found
No related tags found
No related merge requests found
...@@ -107,10 +107,10 @@ dependencies { ...@@ -107,10 +107,10 @@ dependencies {
} }
/* run { run {
mainClassName = 'de.tudresden.inf.st.pnml.engine.Main' mainClassName = 'de.tudresden.inf.st.pnml.engine.Main'
standardInput = System.in standardInput = System.in
} */ }
jar { jar {
manifest { manifest {
......
...@@ -75,8 +75,34 @@ aspect BalloonExecution { ...@@ -75,8 +75,34 @@ aspect BalloonExecution {
return null; return null;
} }
public Optional<BalloonMarking> BalloonMarking.fireTopicPublisherTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) { public java.lang.String BalloonMarking.fireTopicPublisherTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
return null;
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) { public Optional<BalloonMarking> BalloonMarking.fireServiceServerTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
......
...@@ -9,7 +9,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.*; ...@@ -9,7 +9,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.*;
import org.ros.node.DefaultNodeMainExecutor; import org.ros.node.DefaultNodeMainExecutor;
import org.ros.node.NodeConfiguration; import org.ros.node.NodeConfiguration;
import org.ros.node.NodeMainExecutor; import org.ros.node.NodeMainExecutor;
import org.ros.node.topic.Publisher;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import std_msgs.String;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException; import java.io.IOException;
...@@ -17,18 +19,24 @@ import java.util.ArrayList; ...@@ -17,18 +19,24 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.net.URI; import java.net.URI;
import java.util.Map;
public class Main { public class Main {
private static NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault(); private static NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault();
private static NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic("localhost"); 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); 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(); BalloonCallbackStorage bcs = petriNet.initializeCallbackStorage();
TransitionCallback tc = new DefaultFinalTransitionCallback("default_final_cb", 1); TransitionCallback tc = new DefaultFinalTransitionCallback("default_final_cb", 1);
...@@ -37,7 +45,6 @@ public class Main { ...@@ -37,7 +45,6 @@ public class Main {
System.out.println("----- BEFORE -----"); System.out.println("----- BEFORE -----");
System.out.println(bm.print()); System.out.println(bm.print());
for(Transition t : petriNet.allTransitions()){ for(Transition t : petriNet.allTransitions()){
if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) { if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
bcs.resolveBalloonTransition(t).setBalloonCallbacks(tcl); bcs.resolveBalloonTransition(t).setBalloonCallbacks(tcl);
...@@ -55,6 +62,21 @@ public class Main { ...@@ -55,6 +62,21 @@ public class Main {
start(); 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"; String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-4.pnml";
PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0); PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
......
package de.tudresden.inf.st.pnml.engine.ros; package de.tudresden.inf.st.pnml.engine.ros;
import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; 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 de.tudresden.inf.st.pnml.jastadd.model.*;
import org.ros.message.MessageListener;
import org.ros.namespace.GraphName; import org.ros.namespace.GraphName;
import org.ros.node.AbstractNodeMain; import org.ros.node.AbstractNodeMain;
import org.ros.node.ConnectedNode; import org.ros.node.ConnectedNode;
import org.ros.node.topic.Publisher;
import org.ros.node.topic.Subscriber; import org.ros.node.topic.Subscriber;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import std_msgs.String; import std_msgs.String;
...@@ -25,6 +24,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -25,6 +24,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
private BalloonMarking marking; private BalloonMarking marking;
private BalloonCallbackStorage callbackStorage; private BalloonCallbackStorage callbackStorage;
private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>(); 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){ public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){
this.nodeName = nodeName; this.nodeName = nodeName;
...@@ -64,32 +64,33 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -64,32 +64,33 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
@Override @Override
public void onStart(final ConnectedNode connectedNode) { public void onStart(final ConnectedNode connectedNode) {
int inCount = 0; System.out.println("Initializing node: " + nodeName);
// setup publishers
for(Transition t : petriNet.allTransitions()) { for(Transition t : petriNet.allTransitions()) {
if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TOPIC_SUBSCRIBER) if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT)
|| t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN) || 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.TRANSITION_TYPE_TOPIC_LIMITED_IN)
|| t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)){ || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)){
Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition() Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition()
.getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE); .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE);
int finalInCount = inCount;
subscriber.addMessageListener(message -> { subscriber.addMessageListener(message -> {
System.out.println("I heard: \"" + message.getData() + "\""); 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()) { for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) {
if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){ if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){
...@@ -102,41 +103,18 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -102,41 +103,18 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
// execute // execute
entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet()); 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 // flush
petriNet.flushTreeCache(); petriNet.flushTreeCache();
marking.flushTreeCache(); marking.flushTreeCache();
callbackStorage.flushTreeCache(); callbackStorage.flushTreeCache();
break;
}
}
});
inCount++; System.out.println(marking.print());
} break;
}
} }
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){ public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet){
...@@ -157,4 +135,25 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -157,4 +135,25 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() { public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() {
return dinerosSubscribers; 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;
}
} }
...@@ -55,10 +55,13 @@ ...@@ -55,10 +55,13 @@
<text>channelInPlace</text> <text>channelInPlace</text>
</name> </name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<location>loc2</location> <location>loc2</location>
<subnet>locA</subnet> <subnet>locA</subnet>
<balloonMarking>
<tokens>
<token> {"samplefield1": "data", "samplefield2": "more data"} </token>
</tokens>
</balloonMarking>
</toolspecific> </toolspecific>
<initialMarking> <initialMarking>
<text>0</text> <text>0</text>
...@@ -70,7 +73,14 @@ ...@@ -70,7 +73,14 @@
</name> </name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> <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> <location>loc2</location>
<type>limitedChannelOutType</type>
<subnet>locA</subnet>
<topic>sampleTopic</topic>
<inputlimit>10</inputlimit>
<outputlimit>10</outputlimit>
<inputsignalbindings/>
</toolspecific>
</transition> </transition>
<arc id="a1" source="channelInPlace" target="channelTransition-publisher-0"> <arc id="a1" source="channelInPlace" target="channelTransition-publisher-0">
</arc> </arc>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment