diff --git a/build.gradle b/build.gradle index 9bdec6da4a5e897a2547432830df98da8b2c9612..5ef1f5ce28289fbad648173fd639bbe9b02dafae 100644 --- a/build.gradle +++ b/build.gradle @@ -100,6 +100,7 @@ dependencies { // ros java messages compile fileTree(include: ['std_msgs-0.5.11.jar'], dir: './libs') + compile fileTree(include: ['rosjava_srv-0.1.0.jar'], dir: './libs') compile fileTree(include: ['rosgraph_msgs-1.10.12.jar'], dir: './libs') // testing diff --git a/libs/rosjava_srv-0.1.0.jar b/libs/rosjava_srv-0.1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..bcbab7745004a18c14f524861dd1c343be0ec1ff Binary files /dev/null and b/libs/rosjava_srv-0.1.0.jar differ 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 d09927445ad0a1a926b97275f46571f92e3c1028..68b915fec1f361c19006276fea8a43f5bf4efd3d 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 @@ -2,12 +2,18 @@ package de.tudresden.inf.st.pnml.engine.ros; import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.jastadd.model.*; +import org.ros.concurrent.CancellableLoop; import org.ros.namespace.GraphName; import org.ros.node.AbstractNodeMain; import org.ros.node.ConnectedNode; +import org.ros.node.service.ServiceResponseBuilder; +import org.ros.node.service.ServiceServer; import org.ros.node.topic.Publisher; import org.ros.node.topic.Subscriber; import org.xml.sax.SAXException; +import rosjava_srv.StringService; +import rosjava_srv.StringServiceRequest; +import rosjava_srv.StringServiceResponse; import std_msgs.String; import javax.xml.parsers.ParserConfigurationException; @@ -25,6 +31,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { private BalloonCallbackStorage callbackStorage; private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>(); private final Map<InputSignalTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>(); + private final Map<InputSignalTransition, ServiceServer<StringServiceRequest, StringServiceResponse>> dinerosServiceServers = new HashMap<>(); + private ConnectedNode connectedNode; public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){ this.nodeName = nodeName; @@ -44,6 +52,19 @@ public abstract class DiNeRosNode extends AbstractNodeMain { this.callbackStorage = callbackStorage; } + protected void nodeLoop(){ + + 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); + } + }); + } + @Override public GraphName getDefaultNodeName() { return GraphName.of(nodeName); @@ -64,6 +85,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { @Override public void onStart(final ConnectedNode connectedNode) { + this.connectedNode = connectedNode; + System.out.println("Initializing node: " + nodeName); // setup publishers @@ -89,7 +112,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { subscriber.addMessageListener(message -> { - System.out.println("I heard: \"" + message.getData() + "\""); + 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())){ @@ -115,6 +138,25 @@ public abstract class DiNeRosNode extends AbstractNodeMain { }, t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit()); } } + + // setup services + for(Transition t : petriNet.allTransitions()){ + + if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_IN)){ + + connectedNode.newServiceServer(t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE, + (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> { + + System.out.println("Service Input: \"" + request.getInput() + "\""); + response.setOutput("..."); + + }); + + } + + } + + this.nodeLoop(); } public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet){ @@ -140,6 +182,10 @@ public abstract class DiNeRosNode extends AbstractNodeMain { return dinerosPublishers; } + public Map<InputSignalTransition, ServiceServer<StringServiceRequest, StringServiceResponse>> getDinerosServiceServers() { + return dinerosServiceServers; + } + public BalloonMarking firePublisherTransition(InputSignalTransition transition){ java.lang.String msgString = this.marking.fireTopicPublisherTransition(transition, this.callbackStorage, true);