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

first rework of core firing and notification mechanisms

parent 93d9fa55
Branches
No related tags found
No related merge requests found
Showing
with 169 additions and 539 deletions
aspect BalloonExecution{
public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
syn FiringSelectionSuccess TransitionSelectionResult.asFiringSelectionSuccess()=null;
eq FiringSelectionSuccess.asFiringSelectionSuccess()=this;
if(!transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) return Optional.empty();
syn FiringSelectionWait TransitionSelectionResult.asFiringSelectionWait()=null;
eq FiringSelectionWait.asFiringSelectionWait()=this;
syn FiringSelectionFail TransitionSelectionResult.asFiringSelectionFail()=null;
eq FiringSelectionFail.asFiringSelectionFail()=this;
syn boolean TransitionSelectionResult.isFiringSelectionSuccess()=false;
eq FiringSelectionSuccess.isFiringSelectionSuccess()=true;
syn boolean TransitionSelectionResult.isFiringSelectionWait()=false;
eq FiringSelectionWait.isFiringSelectionWait()=true;
syn boolean TransitionSelectionResult.isFiringSelectionFail()=false;
eq FiringSelectionFail.isFiringSelectionFail()=true;
public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage,
InputSignalConnector inputSignalConnector,de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode node, boolean requireFlush) {
if(!transition.asDinerosTransition().getStaticTransitionInformation().isSignalTransitionInformation()) return Optional.empty();
// synchronize marking modification to prevent concurrent modifications
synchronized(this){
......@@ -11,14 +30,19 @@ aspect BalloonExecution {
ClauseValuesDefinition clauseValuesDefinition = new ClauseValuesDefinition();
for(InputSignalBinding inputSignalBinding : transition.asInputSignalTransition().getMutualInputSignalBindingList()){
boolean inputVal = inputSignalBinding.getInputSignalValue() == 1 ? true : false;
clauseValuesDefinition.addDef(inputSignalBinding.getInputSignalID(), inputVal);
for(String signalId : transition.asDinerosTransition().getStaticTransitionInformation()
.asSignalTransitionInformation().getClause().signals()){
for(SignalConnection sc : inputSignalConnector.getSignalConnections()){
if(signalId.equals(sc.getId())){
clauseValuesDefinition.addDef(sc.getId(), sc.getCurrentValue());
break;
}
}
}
if((clauseValuesDefinition.getDefs().size() > 0) &&
(!transition.asInputSignalTransition().getInputSignalClause().getExp().eval(clauseValuesDefinition))){
(!transition.asDinerosTransition().getStaticTransitionInformation().
asSignalTransitionInformation().getClause().evalClause(clauseValuesDefinition))){
return Optional.of(this);
}
......@@ -42,7 +66,7 @@ aspect BalloonExecution {
BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition);
BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks());
BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerExecutor.execute(inToken,balloonTransition.getBalloonCallbacks());
// build set of direct / indirect outgoing places and remove from them
Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
......@@ -57,181 +81,14 @@ aspect BalloonExecution {
// flush the entire marking tree
this.flushTreeCache();
}
}
return Optional.of(this);
}
public Optional<BalloonMarking> BalloonMarking.fireTopicSubscriberTransition(Transition transition, BalloonToken bt, boolean requireFlush) {
synchronized(this){
// build set of direct / indirect outgoing places and remove from them
Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
// place a token in each outgoing place
for(Place place : outgoingPlaces){
BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
bmp.getBalloonMarkingList().add(bt);
}
if(requireFlush){
// flush the entire marking tree
this.flushTreeCache();
}
}
return Optional.of(this);
}
public java.lang.String BalloonMarking.fireServiceClientInputTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
synchronized(this){
if(!isBalloonEnabled(transition)){
System.out.println("Cannon fire service client input transition" + transition.getId() + " because it is not enabled.");
return null;
}
BalloonToken inToken = null;
// build set of direct / indirect outgoing places and remove from them
Set<Place> incomming = transition.resolveInputPlaces();
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.fireServiceClientOutputTransition(Transition transition, BalloonCallbackStorage callbackStorage, BalloonToken bt, boolean requireFlush) {
synchronized(this){
// build set of direct / indirect outgoing places and remove from them
Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
// place a token in each outgoing place
for(Place place : outgoingPlaces){
BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
bmp.getBalloonMarkingList().add(bt);
}
if(requireFlush){
// flush the entire marking tree
this.flushTreeCache();
}
}
return Optional.of(this);
}
public java.lang.String BalloonMarking.fireTopicPublisherTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
synchronized(this){
if(!isBalloonEnabled(transition)){
System.out.println("Cannon fire publisher transition" + transition.getId() + " because it is not enabled.");
return null;
}
BalloonToken inToken = null;
// build set of direct / indirect outgoing places and remove from them
Set<Place> incomming = transition.resolveInputPlaces();
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.fireServiceServerInputTransition(Transition transition, BalloonToken bt, boolean requireFlush) {
synchronized(this){
// build set of direct / indirect outgoing places and remove from them
Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
// place a token in each outgoing place
for(Place place : outgoingPlaces){
BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
bmp.getBalloonMarkingList().add(bt);
}
if(requireFlush){
// flush the entire marking tree
this.flushTreeCache();
}
node.notify(node.NOTIFICATION_MARKING_CHANGE);
}
return Optional.of(this);
}
public java.lang.String BalloonMarking.fireServiceServerOutputTransition(Transition transition, boolean requireFlush) {
String output = null;
synchronized(this){
// build set of direct / indirect outgoing places and remove from them
Set<Place> incommingPlaces = transition.resolveInputPlaces();
if(incommingPlaces.size() != 1){
System.out.println("Warning: Not exactly one input place for server output transition. Choosing first input.");
}
// place a token in each outgoing place
for(Place place : incommingPlaces){
BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
Random rand = new Random();
int randVal = rand.nextInt(bmp.getNumBalloonMarking());
BalloonToken bt = bmp.getBalloonMarking(randVal);
output = bt.getValue();
bmp.getBalloonMarking(randVal).removeSelf();
break;
}
if(requireFlush){
// flush the entire marking tree
this.flushTreeCache();
}
}
return output;
}
public BalloonCallbackStorage PetriNet.initializeCallbackStorage(){
......@@ -239,9 +96,7 @@ aspect BalloonExecution {
storage.setPetriNet(this);
for(Transition transition:allTransitions()){
if(transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){
BalloonTransition balloonTransition=new BalloonTransition();
balloonTransition.setTransition(transition);
storage.addTransition(balloonTransition);
......@@ -262,9 +117,7 @@ aspect BalloonExecution {
this.addTransition(balloonTransition);
for(Transition t:petriNet.allTransitions()){
int splitIdx=newT.getId().lastIndexOf("-");
if(t.getId().equals(newT.getId().substring(0,splitIdx))){
balloonTransition.setBalloonCallbacks(resolveBalloonTransition(t).getBalloonCallbacks());
}
......
BalloonCallbackStorage ::= PetriNet:PetriNet Transition:BalloonTransition*;
BalloonTransition ::= <BalloonCallbacks:java.util.List<de.tudresden.inf.st.pnml.engine.execution.TransitionCallback>>;
BalloonTransition ::= <BalloonCallbacks:java.util.List<de.tudresden.inf.st.pnml.engine.execution.TransitionHandler>>;
rel BalloonTransition.Transition -> Transition;
abstract TransitionSelectionResult;
FiringSelectionSuccess : TransitionSelectionResult ::= Transition:Transition;
FiringSelectionWait : TransitionSelectionResult ::= <WaitingTime:int>;
FiringSelectionFail : TransitionSelectionResult;
\ No newline at end of file
package de.tudresden.inf.st.pnml.engine;
import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
import de.tudresden.inf.st.pnml.engine.execution.DefaultFinalTransitionCallback;
import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultNode;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultServer;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultSubscriber;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
import de.tudresden.inf.st.pnml.engine.testNodes.DinerosTestClientNode;
import de.tudresden.inf.st.pnml.engine.transform.PetriNetInitializer;
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 javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.net.URI;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class Main {
......
......@@ -5,9 +5,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import java.util.ArrayList;
import java.util.List;
public class DefaultFinalTransitionCallback extends TransitionCallback{
public class DefaultFinalTransitionHandler extends TransitionCallback{
public DefaultFinalTransitionCallback(String id, int priority) {
public DefaultFinalTransitionHandler(String id, int priority) {
super(id, priority);
}
......
......@@ -4,9 +4,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import java.util.List;
public class DefaultTransitionCallback extends TransitionCallback{
public class DefaultTransitionHandler extends TransitionCallback{
public DefaultTransitionCallback(String id, int priority) {
public DefaultTransitionHandler(String id, int priority) {
super(id, priority);
}
......
......@@ -8,21 +8,21 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public abstract class TransitionCallback{
public abstract class TransitionHandler{
protected static final Logger logger = LoggerFactory.getLogger(TransitionCallback.class);
protected static final Logger logger = LoggerFactory.getLogger(TransitionHandler.class);
private String id;
private int priority;
private List<String> params = new ArrayList<>();
public TransitionCallback(String id, int priority, List<String> params) {
public TransitionHandler(String id, int priority, List<String> params) {
this.id = id;
this.priority = priority;
this.params.addAll(params);
}
public TransitionCallback(String id, int priority) {
public TransitionHandler(String id, int priority) {
this.id = id;
this.priority = priority;
}
......
......@@ -12,18 +12,18 @@ import java.util.List;
/**
* Automatically sort and call the callbacks.
*/
public class TransitionCallbackExecutor {
public class TransitionHandlerExecutor {
protected static final Logger logger = LoggerFactory.getLogger(TransitionCallbackExecutor.class);
protected static final Logger logger = LoggerFactory.getLogger(TransitionHandlerExecutor.class);
public static final BalloonToken execute(List<BalloonToken> inTokens, List<TransitionCallback> callbacks){
public static final BalloonToken execute(List<BalloonToken> inTokens, List<TransitionHandler> callbacks){
List<TransitionCallback> callbacksSorted = new ArrayList<>();
List<TransitionHandler> callbacksSorted = new ArrayList<>();
List<BalloonToken> outTokens = new ArrayList<>();
outTokens.addAll(inTokens);
callbacksSorted.addAll(callbacks);
Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionCallback::getPriority));
Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionHandler::getPriority));
for(int i = 0; i < callbacksSorted.size(); i++){
if(i < callbacksSorted.size() - 1){
......
......@@ -3,23 +3,24 @@ package de.tudresden.inf.st.pnml.engine.execution;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonTransition;
import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
import fr.lip6.move.pnml.ptnet.hlapi.TransitionHLAPI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TransitionCallbackService {
public class TransitionHandlerService {
public static TransitionCallbackService INSTANCE = null;
public static TransitionHandlerService INSTANCE = null;
private Map<String, BalloonCallbackStorage> balloonCallbackStorages = new HashMap<>();
private TransitionCallbackService() {}
private TransitionHandlerService() {}
public static TransitionCallbackService getInstance() {
public static TransitionHandlerService getInstance() {
if(INSTANCE == null) {
INSTANCE = new TransitionCallbackService();
INSTANCE = new TransitionHandlerService();
}
return INSTANCE;
......@@ -29,19 +30,19 @@ public class TransitionCallbackService {
balloonCallbackStorages.put(petriNetId, balloonCallbackStorage);
}
public void registerCallback(PetriNet petriNet, String transitionId, TransitionCallback transitionCallback){
public void registerCallback(PetriNet petriNet, String transitionId, TransitionHandler transitionCallback){
if(balloonCallbackStorages.get(petriNet.getId()) == null){
return;
}
List<TransitionCallback> transitionCallbacks = new ArrayList<>();
List<TransitionHandler> transitionCallbacks = new ArrayList<>();
transitionCallbacks.add(transitionCallback);
registerCallback(petriNet, transitionId, transitionCallbacks);
}
public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionCallback> transitionCallbacks){
public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionHandler> transitionCallbacks){
if(balloonCallbackStorages.get(petriNet.getId()) == null){
return;
......
......@@ -23,22 +23,20 @@ import std_msgs.String;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
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 final java.lang.String nodeName;
public final PetriNet petriNet;
protected BalloonMarking marking;
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<DinerosTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>();
private final Map<DinerosTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> dinerosServiceClients = new HashMap<>();
protected ConnectedNode connectedNode;
protected InputSignalConnector inputSignalConnector;
private boolean stopNode = false;
public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet) {
......@@ -52,11 +50,13 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
}
}
public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, BalloonMarking marking,
BalloonCallbackStorage callbackStorage, InputSignalConnector inputSignalConnector) {
this.nodeName = nodeName;
this.petriNet = petriNet;
this.marking = marking;
this.callbackStorage = callbackStorage;
this.inputSignalConnector = inputSignalConnector;
}
private final void internalNodeLoop() {
......@@ -79,170 +79,62 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
this.connectedNode.shutdown();
}
@Override
public GraphName getDefaultNodeName() {
return GraphName.of(nodeName);
}
@Override
public void onStart(final ConnectedNode connectedNode) {
this.connectedNode = connectedNode;
System.out.println("[INIT NODE] 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<String> publisher = connectedNode.newPublisher(t.asInputSignalTransition().
getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE);
public void notify(java.lang.String notificationType){
dinerosPublishers.put(t.asInputSignalTransition(), publisher);
}
if (notificationType.equals(NOTIFICATION_MARKING_CHANGE)) {
onMarkingChange(marking.enabledBalloonTransitions());
} else if (notificationType.equals(NOTIFICATION_SIGNAL_CHANGE)) {
onSignalChange(marking.enabledBalloonTransitions());
} else if (notificationType.equals(NOTIFICATION_WAIT_ENDED)) {
onWaitEnded(marking.enabledBalloonTransitions());
}
// 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)) {
Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition()
.getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE);
subscriber.addMessageListener(message -> {
System.out.println("Subscriber Input: \"" + message.getData() + "\"");
for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) {
if (entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())) {
// fire input
BalloonToken bt = new BalloonToken();
bt.setValue(message.getData());
System.out.println("Firing topic subscriber transition.");
marking.fireTopicSubscriberTransition(t, bt, true);
// execute
entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet());
// flush
petriNet.flushTreeCache();
marking.flushTreeCache();
callbackStorage.flushTreeCache();
System.out.println(marking.print());
break;
}
}
}, t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit());
}
}
// setup service clients
for (Transition t : petriNet.allTransitions()) {
if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_IN)){
ServiceClient<StringServiceRequest, StringServiceResponse> serviceClient;
try {
serviceClient = connectedNode.newServiceClient(t.asInputSignalTransition().
getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE);
} catch (ServiceNotFoundException e) {
throw new RosRuntimeException(e);
}
System.out.println("Adding new service client to " + nodeName);
getDinerosServiceClients().put(t.asInputSignalTransition(), serviceClient);
}
}
protected abstract TransitionSelectionResult onMarkingChange(Set<Transition> enabledTransitions);
// setup service servers
int baseInCount = 0;
protected abstract TransitionSelectionResult onSignalChange(Set<Transition> enabledTransitions);
for (Transition t : petriNet.allTransitions()) {
if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT)) {
int inCount = baseInCount;
System.out.println("Adding new Service Server");
protected abstract TransitionSelectionResult onWaitEnded(Set<Transition> enabledTransitions);
connectedNode.newServiceServer(t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE,
(ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> {
protected abstract TransitionSelectionResult onStartupEnded(Set<Transition> enabledTransitions);
// clone base server net
List<java.lang.String> addedElementIds = new ArrayList<>();
InputSignalTransition serverInstanceInputTransition = ServiceTransformer.includeServerInstance(petriNet, t.asInputSignalTransition()
.getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(inCount), addedElementIds);
// init marking and callback storage
try {
marking.initializeSubnetBalloonMarking(getSubnetPlacesByIds(addedElementIds, petriNet), true);
callbackStorage.initializeSubnetCallbackStorage(getSubnetTransitionsByIds(addedElementIds, petriNet), petriNet, true);
} catch (IOException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
@Override
public GraphName getDefaultNodeName() {
return GraphName.of(nodeName);
}
// call bound dineros server and clean up after execution
for (Map.Entry<java.lang.String, DiNeRosServer> entry : getDinerosServiceServers().entrySet()) {
if (entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())) {
@Override
public void onStart(final ConnectedNode connectedNode) {
// fire input
BalloonToken bt = new BalloonToken();
bt.setValue(request.getInput());
System.out.println("Firing service server input transition: " + serverInstanceInputTransition.getId());
marking.fireServiceServerInputTransition(serverInstanceInputTransition, bt, true);
this.connectedNode = connectedNode;
// execute
entry.getValue().execute(marking, callbackStorage, petriNet, serverInstanceInputTransition.getStaticTransitionInformation().getSubNet());
System.out.println("[INIT NODE] Initializing node: " + nodeName);
// server transitions
try {
// fire response transition
for(java.lang.String id : addedElementIds){
for(Transition tById : petriNet.allTransitions()){
if(id.equals(tById.getId()) && tById.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation()
&& tById.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_IN)){
System.out.println("Firing service server output transition: " + id);
response.setOutput(marking.fireServiceServerOutputTransition(tById, true));
}
}
}
// init service clients
// TODO
System.out.println(" -- BEFORE DEINIT --");
System.out.println(marking.print());
// init service servers (deep copies)
// TODO
// deinit
marking.deinitializeSubnet(getSubnetPlacesByIds(addedElementIds, petriNet), getSubnetTransitionsByIds(addedElementIds, petriNet), callbackStorage);
ServiceTransformer.removeServiceServerInstance(petriNet, addedElementIds);
// init publishers
// TODO
} catch (IOException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
}
// init subscribers
// TODO
// flush
petriNet.flushTreeCache();
marking.flushTreeCache();
callbackStorage.flushTreeCache();
break;
}
}
System.out.println("[INIT NODE] Executing first marking query.");
TransitionSelectionResult firstFiringResult = onStartupEnded(marking.enabledBalloonTransitions());
// send error if no subnet for service
if(response.getOutput().equals("") || response.getOutput() == null) {
System.out.println("Error: No returning transition.");
response.setOutput(null);
}
});
baseInCount++;
}
if(firstFiringResult.isFiringSelectionSuccess()){
marking.fireTransition(firstFiringResult.asFiringSelectionSuccess()
.getTransition(), callbackStorage, inputSignalConnector, this,false);
}
this.internalNodeLoop();
}
public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet) {
List<Transition> transitions = new ArrayList<>();
......@@ -258,22 +150,6 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
return transitions;
}
public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() {
return dinerosSubscribers;
}
public Map<InputSignalTransition, Publisher<std_msgs.String>> getDinerosPublishers() {
return dinerosPublishers;
}
public Map<java.lang.String, DiNeRosServer> getDinerosServiceServers() {
return dinerosServiceServers;
}
public Map<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> getDinerosServiceClients() {
return dinerosServiceClients;
}
public List<Place> getSubnetPlacesByIds(List<java.lang.String> ids, PetriNet petriNet) {
List<Place> places = new ArrayList<>();
......@@ -288,88 +164,4 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
return places;
}
public BalloonMarking firePublisherTransition(InputSignalTransition transition) {
java.lang.String msgString = this.marking.fireTopicPublisherTransition(transition, this.callbackStorage, true);
if(msgString == null){
return this.marking;
}
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;
}
public BalloonMarking fireServiceClientTransition(InputSignalTransition transition){
java.lang.String msgString = this.marking.fireServiceClientInputTransition(transition, this.callbackStorage, true);
if(msgString == null){
return this.marking;
}
for (Map.Entry<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> entry : getDinerosServiceClients().entrySet()) {
if (transition.getId().equals(entry.getKey().getId())) {
final StringServiceRequest request = entry.getValue().newMessage();
request.setInput(msgString);
entry.getValue().call(request, new ServiceResponseListener<StringServiceResponse>() {
@Override
public void onSuccess(StringServiceResponse response) {
// get corresponding response transition
Page channelPage = null;
for(Page p : petriNet.allPages()){
for(PnObject po : p.getObjectList()){
if(po.getId().equals(transition.getId())){
channelPage = p;
break ;
}
}
if(channelPage != null){
break;
}
}
for(PnObject po : channelPage.getObjectList()){
Transition tr = petriNet.getTransitionById(po.getId());
if(tr != null && tr.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_OUT)){
// now we have the response transition, which ist the only other transition in the
// channel on client side
BalloonToken btOut = new BalloonToken();
btOut.setValue(response.getOutput());
System.out.println("Firing client service response transition: " + tr.getId());
marking.fireServiceClientOutputTransition(tr, callbackStorage, btOut, true);
}
}
}
@Override
public void onFailure(RemoteException e) {
throw new RosRuntimeException(e);
}
});
}
}
return this.marking;
}
}
\ No newline at end of file
......@@ -3,7 +3,7 @@ package de.tudresden.inf.st.pnml.engine.testNodes;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking;
import de.tudresden.inf.st.pnml.jastadd.model.InputSignalTransition;
import de.tudresden.inf.st.pnml.jastadd.model.DinerosTransition;
import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
import org.ros.concurrent.CancellableLoop;
import org.ros.node.service.ServiceClient;
......@@ -39,11 +39,11 @@ public class DinerosTestClientNode extends DiNeRosNode {
System.out.println("----- BEFORE (C) -----");
System.out.println(marking.print());
for (Map.Entry<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>>
for (Map.Entry<DinerosTransition, ServiceClient<StringServiceRequest, StringServiceResponse>>
entry : getDinerosServiceClients().entrySet()) {
System.out.println("Firing service client of:" + entry.getKey().getId());
fireServiceClientTransition(entry.getKey());
// fireServiceClientTransition(entry.getKey());
}
execOnce = true;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment