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

feature: orphan-place service calls

parent e03b8c54
No related branches found
No related tags found
No related merge requests found
import de.tudresden.inf.st.pnml.engine.event.*; import de.tudresden.inf.st.pnml.engine.event.*;
import de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerService; import de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerService;
import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
import java.util.function.Function; import java.util.function.Function;
...@@ -23,8 +24,25 @@ aspect BalloonExecution{ ...@@ -23,8 +24,25 @@ aspect BalloonExecution{
syn boolean TransitionSelectionResult.isFiringSelectionNone()=false; syn boolean TransitionSelectionResult.isFiringSelectionNone()=false;
eq FiringSelectionNone.isFiringSelectionNone()=true; eq FiringSelectionNone.isFiringSelectionNone()=true;
public boolean BalloonMarking.callServiceIfRequest(BalloonMarkedPlace bmp, DiNeRosNode node ) {
HashMap<String, ArrayList<String>> reqMap = getPetriNet().getChannelElemensByKey(PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_REQ_KEY);
for(Map.Entry<String, ArrayList<String>> entry : reqMap.entrySet()){
for(String s : entry.getValue()){
if(s.equals(bmp.getPlace().getId()) ||
(bmp.getPlace().getId().startsWith(s) && bmp.getPlace().getId().contains("-INSTANCE-"))){
System.out.println("Calling service from orphan request place: " + bmp.getPlace().getId());
node.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_SERVICE_REQ_CLIENT, bmp.getPlace().getId()));
return true;
}
}
}
return false;
}
public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage,
InputSignalConnector inputSignalConnector,de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode node, boolean requireFlush) { InputSignalConnector inputSignalConnector, DiNeRosNode node, boolean requireFlush) {
//if(!transition.asDinerosTransition().getStaticTransitionInformation().isSignalTransitionInformation()) return Optional.empty(); //if(!transition.asDinerosTransition().getStaticTransitionInformation().isSignalTransitionInformation()) return Optional.empty();
......
package de.tudresden.inf.st.pnml.engine; package de.tudresden.inf.st.pnml.engine;
import de.tudresden.inf.st.pnml.engine.example.Client; import de.tudresden.inf.st.pnml.engine.fake.FakeClientNode;
import de.tudresden.inf.st.pnml.engine.example.Server; import de.tudresden.inf.st.pnml.engine.fake.FakeServerNode;
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;
...@@ -18,20 +18,28 @@ public class Main { ...@@ -18,20 +18,28 @@ public class Main {
public static void main(java.lang.String[] args) { public static void main(java.lang.String[] args) {
Server server = new Server(); //Server server = new Server();
Client client = new Client(); // FakeClientNode client = new FakeClientNode();
nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI)); // nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI));
/*System.out.println("---- STARTING SERVER ----"); //System.out.println("---- STARTING SERVER ----");
new Thread(() -> nodeMainExecutor.execute(server, nodeConfiguration)) {{start();}}; //new Thread(() -> nodeMainExecutor.execute(server, nodeConfiguration)) {{start();}};
/* System.out.println("---- STARTING sampleService0 ----");
new Thread(() -> nodeMainExecutor.execute(new FakeServerNode("sampleService0", "sampleServiceNode0"), nodeConfiguration)) {{start();}};
try { try {
Thread.sleep(3000); Thread.sleep(3000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
}*/ }
// System.out.println("---- STARTING CLIENT ----");
// new Thread(() -> nodeMainExecutor.execute(client, nodeConfiguration)) {{start();}};
System.out.println("---- STARTING CLIENT ----"); System.out.println("---- STARTING sampleService1 ----");
new Thread(() -> nodeMainExecutor.execute(client, nodeConfiguration)) {{start();}}; new Thread(() -> nodeMainExecutor.execute(new FakeServerNode("sampleService1", "sampleServiceNode1"), nodeConfiguration)) {{start();}};*/
} }
} }
package de.tudresden.inf.st.pnml.engine.example; package de.tudresden.inf.st.pnml.engine.fake;
import org.ros.exception.RemoteException; import org.ros.exception.RemoteException;
import org.ros.exception.RosRuntimeException; import org.ros.exception.RosRuntimeException;
...@@ -12,7 +12,7 @@ import rosjava_srv.StringService; ...@@ -12,7 +12,7 @@ import rosjava_srv.StringService;
import rosjava_srv.StringServiceRequest; import rosjava_srv.StringServiceRequest;
import rosjava_srv.StringServiceResponse; import rosjava_srv.StringServiceResponse;
public class Client extends AbstractNodeMain { public class FakeClientNode extends AbstractNodeMain {
@Override @Override
public GraphName getDefaultNodeName() { public GraphName getDefaultNodeName() {
...@@ -30,7 +30,7 @@ public class Client extends AbstractNodeMain { ...@@ -30,7 +30,7 @@ public class Client extends AbstractNodeMain {
ServiceClient<StringServiceRequest, StringServiceResponse> serviceClient; ServiceClient<StringServiceRequest, StringServiceResponse> serviceClient;
try { try {
serviceClient = connectedNode.newServiceClient("sampleService", StringService._TYPE); serviceClient = connectedNode.newServiceClient("sampleService0", StringService._TYPE);
} catch (ServiceNotFoundException e) { } catch (ServiceNotFoundException e) {
throw new RosRuntimeException(e); throw new RosRuntimeException(e);
} }
......
package de.tudresden.inf.st.pnml.engine.example; package de.tudresden.inf.st.pnml.engine.fake;
import org.ros.namespace.GraphName; import org.ros.namespace.GraphName;
import org.ros.node.AbstractNodeMain; import org.ros.node.AbstractNodeMain;
...@@ -8,27 +8,37 @@ import rosjava_srv.StringService; ...@@ -8,27 +8,37 @@ import rosjava_srv.StringService;
import rosjava_srv.StringServiceRequest; import rosjava_srv.StringServiceRequest;
import rosjava_srv.StringServiceResponse; import rosjava_srv.StringServiceResponse;
public class Server extends AbstractNodeMain { public class FakeServerNode extends AbstractNodeMain {
private java.lang.String serviceName;
private java.lang.String nodeName;
public FakeServerNode(String serviceName, String nodeName) {
this.serviceName = serviceName;
this.nodeName = nodeName;
}
@Override @Override
public GraphName getDefaultNodeName() { public GraphName getDefaultNodeName() {
return GraphName.of("rosjava_srv_test/server"); return GraphName.of("fake/" + nodeName);
} }
@Override @Override
public void onStart(final ConnectedNode connectedNode) { public void onStart(final ConnectedNode connectedNode) {
connectedNode.newServiceServer("sampleService", StringService._TYPE,
System.out.println("[" + nodeName + "] Starting node.");
connectedNode.newServiceServer(serviceName, StringService._TYPE,
(ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> { (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> {
System.out.println("Service Input: \"" + request.getInput() + "\""); System.out.println("[" + nodeName + "] Service Input: \"" + request.getInput() + "\"");
try { try {
Thread.sleep(10000); Thread.sleep(4000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
System.out.println("Finished sleep."); System.out.println("[" + nodeName + "] Finished sleep.");
response.setOutput("..."); response.setOutput(request.getInput());
}); });
} }
} }
...@@ -63,7 +63,17 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -63,7 +63,17 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
List<Map<java.lang.String, Object>>> processTokenFunction) { List<Map<java.lang.String, Object>>> processTokenFunction) {
TransitionHandler transitionHandler = new TransitionHandler(priority, processTokenFunction); TransitionHandler transitionHandler = new TransitionHandler(priority, processTokenFunction);
if(petriNet.getTransitionById(transitionId) == null){
return;
}
BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId)); BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId));
if(balloonTransition == null){
return;
}
balloonTransition.getTransitionHandlers().add(transitionHandler); balloonTransition.getTransitionHandlers().add(transitionHandler);
} }
...@@ -164,13 +174,23 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -164,13 +174,23 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
java.lang.String serviceName = petriNet.getPortNameByPlaceId(originalId); java.lang.String serviceName = petriNet.getPortNameByPlaceId(originalId);
java.lang.String cResPlaceId = petriNet.getServiceClientResponsePlaceId(originalId) + "-INSTANCE-" + placeId.split("-")[split.length - 1]; java.lang.String cResPlaceId;
if(split.length > 1){
cResPlaceId = petriNet.getServiceClientResponsePlaceId(originalId) + "-INSTANCE-" + placeId.split("-")[split.length - 1];
} else {
cResPlaceId = petriNet.getServiceClientResponsePlaceId(originalId);
}
Place targetPlace = petriNet.getPlaceById(cResPlaceId); Place targetPlace = petriNet.getPlaceById(cResPlaceId);
Place sourcePlace = petriNet.getPlaceById(placeId); Place sourcePlace = petriNet.getPlaceById(placeId);
BalloonMarkedPlace bmpSource = this.marking.resolveBalloonPlace(sourcePlace); BalloonMarkedPlace bmpSource = this.marking.resolveBalloonPlace(sourcePlace);
BalloonMarkedPlace bmpTarget = this.marking.resolveBalloonPlace(targetPlace); BalloonMarkedPlace bmpTarget = this.marking.resolveBalloonPlace(targetPlace);
DiNeRosNode self = this;
try { try {
System.out.println("[DiNeROS-Node] [" + nodeName + "] Creating client for service: " + serviceName);
serviceClient = connectedNode.newServiceClient(serviceName, StringService._TYPE); serviceClient = connectedNode.newServiceClient(serviceName, StringService._TYPE);
final StringServiceRequest request = serviceClient.newMessage(); final StringServiceRequest request = serviceClient.newMessage();
request.setInput(bmpSource.getBalloonMarking(0).getValue()); request.setInput(bmpSource.getBalloonMarking(0).getValue());
...@@ -181,17 +201,18 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -181,17 +201,18 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
public void onSuccess(StringServiceResponse stringServiceResponse) { public void onSuccess(StringServiceResponse stringServiceResponse) {
bmpSource.getBalloonMarking(0).removeSelf(); bmpSource.getBalloonMarking(0).removeSelf();
bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput(), System.currentTimeMillis())); bmpTarget.addBalloonMarking(new BalloonToken(stringServiceResponse.getOutput(), System.currentTimeMillis()));
marking.callServiceIfRequest(bmpTarget, self);
self.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
serviceClient.shutdown();
} }
@Override @Override
public void onFailure(RemoteException e) { public void onFailure(RemoteException e) {
System.err.println("Error while calling: token will not be removed!"); System.err.println("Error while calling: token will not be removed!");
serviceClient.shutdown();
} }
}); });
serviceClient.shutdown();
this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
} catch (ServiceNotFoundException e) { } catch (ServiceNotFoundException e) {
System.err.println("Error while calling service."); System.err.println("Error while calling service.");
} }
...@@ -338,20 +359,6 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -338,20 +359,6 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
} }
} }
/* for(Transition t : petriNet.allTransitions()){
System.out.println("Checking Transition: " + t.getId());
for(Arc a : petriNet.allArcs()){
if(a.getTarget().getId().equals(t.getId())){
System.out.println(">> Match: " + a.getSource().getId());
}
}
for(Place p1 : t.incomingPlaces()){
System.out.println(">> Checking incoming place: " + p1.getId());
}
}*/
connectedNode.newServiceServer(key, StringService._TYPE, connectedNode.newServiceServer(key, StringService._TYPE,
(ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> { (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> {
...@@ -436,7 +443,6 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -436,7 +443,6 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
}, petriNet.getChannelElementLimitById(placeId)); }, petriNet.getChannelElementLimitById(placeId));
//dinerosSubscribers.put(targetPlace, subscriber);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment