diff --git a/build.gradle b/build.gradle index 4cc2a5e10639453219127b35508f02ffc6866f85..a416f7a0e9b4af47e2e8a618d24f076d709f32f7 100644 --- a/build.gradle +++ b/build.gradle @@ -134,19 +134,8 @@ dependencies { jar { manifest { - // attributes "Main-Class": "de.tudresden.inf.st.pnml.engine.Main" + attributes "Main-Class": "de.tudresden.inf.st.pnml.engine.Main" } - - from { - configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } - } - - exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' - - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - - archiveBaseName = 'pnml-engine' - } task fatJar(type: Jar) { @@ -159,7 +148,13 @@ task fatJar(type: Jar) { configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it) } } - manifest.attributes "Main-Class": "${mainClassName}" + manifest.attributes "Main-Class": "de.tudresden.inf.st.sample.Main" + + exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + archiveBaseName = 'pnml-relast-engine' } // Generated files diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag index 6e8dd4e46376055a25e00f4771c212aabdb984d7..3e251d12d6f7c6025c17884addf408510c187d30 100644 --- a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag +++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag @@ -1,9 +1,65 @@ aspect BalloonMarking { + inh BalloonMarking OutputSignalPlace.balloonMarking(); + + eq PetriNetDoc.getChild().balloonMarking() = null; + + eq BalloonMarking.getPetriNet().balloonMarking() = this; + eq BalloonCallbackStorage.getPetriNet().marking() = null; eq BalloonMarking.getPetriNet().marking() = null; + // updates automatically based on dependencies to the corresponding place + syn String OutputSignalBinding.outputSignalValue(){ + + OutputSignalPlace osp = this.containingPlace().asOutputSignalPlace(); + BalloonMarking marking = osp.balloonMarking(); + BalloonMarkedPlace markedPlace = marking.resolveBalloonPlaceById(this.getPlaceID()); + + JastAddList<EqualityOutputMapping> eomList = this.getEqualityOMListNoTransform(); + JastAddList<ThresholdOutputMapping> tomList = this.getThresholdOMListNoTransform(); + JastAddList<RangeOutputMapping> romList = this.getRangeOMListNoTransform(); + + // eom + int result = -1; + for (EqualityOutputMapping eom : eomList) { + if ((eom.getValue() == markedPlace.getNumBalloonMarking()) && result == -1) { + result = eom.getResult(); + break; + } + } + + // tom + // if (result > -1) { + for (ThresholdOutputMapping tom : tomList) { + if (tom.getValue() <= markedPlace.getNumBalloonMarking()) { + result = tom.getResult(); + break; + } + } + // } + + // rom + // if (result > -1) { + for (RangeOutputMapping rom : romList) { + if ((rom.getLowerBound() <= markedPlace.getNumBalloonMarking()) && (rom.getUpperBound() >= markedPlace.getNumBalloonMarking())) { + result = rom.getResult(); + break; + } + } + // } + + // 0 (disabled Signal) is default + if (result == -1) { + result = 0; + } + + String output = String.valueOf(result) + "-" + this.getOutputSignalID(); + + return output; + } + public BalloonMarking PetriNet.initializeBalloonMarking() throws IOException, SAXException, ParserConfigurationException { BalloonMarking marking = new BalloonMarking(); 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 b81634a2807531cc1a5d281be34156ed5d49edb3..06bd21be0568b07eff9bac656678bc6a88662acf 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 @@ -43,7 +43,7 @@ public class Main { // isTest(); - //osTest(); + // osTest(); } @SuppressWarnings("unused") diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java index a68f3a7427bb81f235a178eff1685f6905d70cec..74897fe4dc6ac9b0cbc3dd91de7f01f4c6ef4b81 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java @@ -5,13 +5,15 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonTransition; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class TransitionCallbackService { public static TransitionCallbackService INSTANCE = null; - private BalloonCallbackStorage balloonCallbackStorage = null; + private Map<String, BalloonCallbackStorage> balloonCallbackStorages = new HashMap<>(); private TransitionCallbackService() {} @@ -23,17 +25,16 @@ public class TransitionCallbackService { return INSTANCE; } - public void init(BalloonCallbackStorage balloonCallbackStorage) { - this.balloonCallbackStorage = balloonCallbackStorage; + public void init(String petriNetId, BalloonCallbackStorage balloonCallbackStorage) { + balloonCallbackStorages.put(petriNetId, balloonCallbackStorage); } public void registerCallback(PetriNet petriNet, String transitionId, TransitionCallback transitionCallback){ - if(balloonCallbackStorage == null){ + if(balloonCallbackStorages.get(petriNet.getId()) == null){ return; } - BalloonTransition balloonTransition = balloonCallbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId)); List<TransitionCallback> transitionCallbacks = new ArrayList<>(); transitionCallbacks.add(transitionCallback); registerCallback(petriNet, transitionId, transitionCallbacks); @@ -42,11 +43,11 @@ public class TransitionCallbackService { public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionCallback> transitionCallbacks){ - if(balloonCallbackStorage == null){ + if(balloonCallbackStorages.get(petriNet.getId()) == null){ return; } - BalloonTransition balloonTransition = balloonCallbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId)); + BalloonTransition balloonTransition = balloonCallbackStorages.get(petriNet.getId()).resolveBalloonTransition(petriNet.getTransitionById(transitionId)); balloonTransition.setBalloonCallbacks(transitionCallbacks); } diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java index 74e5c9ad2ed26dda51fcd637e42dab27110eb35e..865fe6bfab2fe2f10e5e5c1b2db929a12df6a4f5 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java @@ -14,4 +14,11 @@ public class DiNeRosDefaultNode extends DiNeRosNode{ public DiNeRosDefaultNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) { super(nodeName, petriNet, marking, callbackStorage); } + + @Override + protected void nodeLoop() { + + System.out.println("No node loop implemented .."); + + } } 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 60dfa570349856eb88f91aac32ba97895d97d9e3..746925ef3463fa58cf5a4ec5d8a509795249c23d 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 @@ -33,12 +33,13 @@ public abstract class DiNeRosNode extends AbstractNodeMain { public final java.lang.String nodeName; public final PetriNet petriNet; protected BalloonMarking marking; - private BalloonCallbackStorage callbackStorage; + protected BalloonCallbackStorage callbackStorage; private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>(); private final Map<java.lang.String, DiNeRosServer> dinerosServiceServers = new HashMap<>(); private final Map<InputSignalTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>(); private final Map<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> dinerosServiceClients = new HashMap<>(); protected ConnectedNode connectedNode; + private boolean stopNode = false; public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet) { this.nodeName = nodeName; @@ -58,50 +59,31 @@ public abstract class DiNeRosNode extends AbstractNodeMain { this.callbackStorage = callbackStorage; } - protected void nodeLoop() { + private final void internalNodeLoop() { this.connectedNode.executeCancellableLoop(new CancellableLoop() { @Override - protected void loop() throws InterruptedException { - - System.out.println("No main loop specified for node " + nodeName + " Executing default..."); - Thread.sleep(1000); + protected void loop() { + if(!stopNode) { + nodeLoop(); + } } }); } + protected abstract void nodeLoop(); + + protected final void stop(){ + stopNode = true; + this.connectedNode.shutdown(); + } + @Override public GraphName getDefaultNodeName() { return GraphName.of(nodeName); } - /* @Override - public void onStart(ConnectedNode connectedNode) { - - Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE); - subscriber.addMessageListener(new MessageListener<String>() { - @Override - public void onNewMessage(std_msgs.String message) { - System.out.println("I heard: \"" + message.getData() + "\""); - } - }); - - connectedNode.newServiceServer("sampleService", StringService._TYPE, - (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> { - - System.out.println("Service Input: \"" + request.getInput() + "\""); - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.out.println("Finished sleep."); - response.setOutput("..."); - - }); - }*/ - @Override public void onStart(final ConnectedNode connectedNode) { @@ -114,8 +96,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { 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); + final Publisher<String> publisher = connectedNode.newPublisher(t.asInputSignalTransition(). + getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE); dinerosPublishers.put(t.asInputSignalTransition(), publisher); @@ -128,7 +110,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { || 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); + .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE); subscriber.addMessageListener(message -> { @@ -258,7 +240,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { } } - this.nodeLoop(); + this.internalNodeLoop(); } public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet) { diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java index e4b8b3f8fa4cfe83093340c4af9ebec27688b12e..80b5f95900920086a3e902a5d30b41bd042e9f80 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java +++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java @@ -27,7 +27,7 @@ public class DiNeRosNodeUtil { return hasFired; } - private static boolean hasEnabledTransition(PetriNet petriNet, String subnet, BalloonMarking balloonMarking){ + public static boolean hasEnabledTransition(PetriNet petriNet, String subnet, BalloonMarking balloonMarking){ for(Transition transition : petriNet.allTransitions()) { if (transition.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)) {