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

simplifications on nodes, added utils for communication

parent b74d6a68
No related branches found
No related tags found
No related merge requests found
...@@ -30,7 +30,7 @@ aspect BalloonExecution{ ...@@ -30,7 +30,7 @@ aspect BalloonExecution{
for(Map.Entry<String, ArrayList<String>> entry : reqMap.entrySet()){ for(Map.Entry<String, ArrayList<String>> entry : reqMap.entrySet()){
for(String s : entry.getValue()){ for(String s : entry.getValue()){
if(s.equals(bmp.getPlace().getId()) || if(s.replace("\n", "").replace(" ", "").equals(bmp.getPlace().getId().replace(" ", "").replace("\n", "")) ||
(bmp.getPlace().getId().startsWith(s) && bmp.getPlace().getId().contains("-INSTANCE-"))){ (bmp.getPlace().getId().startsWith(s) && bmp.getPlace().getId().contains("-INSTANCE-"))){
System.out.println("Calling service from orphan request place: " + bmp.getPlace().getId()); System.out.println("Calling service from orphan request place: " + bmp.getPlace().getId());
node.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_SERVICE_REQ_CLIENT, bmp.getPlace().getId())); node.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_SERVICE_REQ_CLIENT, bmp.getPlace().getId()));
......
...@@ -25,10 +25,34 @@ public class DiNeRosDefaultNode extends DiNeRosNode{ ...@@ -25,10 +25,34 @@ public class DiNeRosDefaultNode extends DiNeRosNode{
} }
protected TransitionSelectionResult onChange(List<Transition> enabledTransitions){ protected TransitionSelectionResult onChange(List<Transition> enabledTransitions){
return null;
printTransitions(enabledTransitions);
if(enabledTransitions.size() == 0){
return new FiringSelectionNone();
}
TransitionSelectionResult res = fireRandomEnabledTransition(enabledTransitions);
System.out.println("Selected transition: " + res.asFiringSelectionSuccess().getTransition().getId());
return res;
} }
protected TransitionSelectionResult onStartupEnded(List<Transition> enabledTransitions){ protected TransitionSelectionResult onStartupEnded(List<Transition> enabledTransitions){
return null;
printTransitions(enabledTransitions);
if(enabledTransitions.size() == 0){
return new FiringSelectionNone();
}
TransitionSelectionResult res = fireRandomEnabledTransition(enabledTransitions);
System.out.println("Selected transition: " + res.asFiringSelectionSuccess().getTransition().getId());
return res;
}
public static void printTransitions(List<Transition> list){
for(Transition t : list){
System.out.println("Enabled t: " + t.getId());
}
} }
} }
package de.tudresden.inf.st.pnml.engine.ros; package de.tudresden.inf.st.pnml.engine.ros;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
import de.tudresden.inf.st.pnml.base.data.ClauseValuesDefinition; import de.tudresden.inf.st.pnml.base.data.ClauseValuesDefinition;
import de.tudresden.inf.st.pnml.engine.event.DiNeRosEvent; import de.tudresden.inf.st.pnml.engine.event.DiNeRosEvent;
...@@ -28,6 +31,7 @@ import std_msgs.String; ...@@ -28,6 +31,7 @@ import std_msgs.String;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Type;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
...@@ -141,13 +145,14 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -141,13 +145,14 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
private void onTopicPublisherAvailable(java.lang.String placeId) { private void onTopicPublisherAvailable(java.lang.String placeId) {
java.lang.String[] split = placeId.split("-"); java.lang.String[] split = placeId.split("-INSTANCE-");
java.lang.String originalId = split[0]; java.lang.String originalId = split[0];
java.lang.String topicName = petriNet.getPortNameByPlaceId(originalId); java.lang.String topicName = petriNet.getPortNameByPlaceId(originalId, PnmlConstants.CHANNEL_PLACE_TYPE_PUB_KEY);
Place place = petriNet.getPlaceById(placeId); Place place = petriNet.getPlaceById(placeId);
BalloonMarkedPlace bmp = this.marking.resolveBalloonPlace(place); BalloonMarkedPlace bmp = this.marking.resolveBalloonPlace(place);
RosCommunicationUtil.publish(topicName, bmp.getBalloonMarking(0).getValue().getBytes(), RosCommunicationUtil.publish(topicName, bmp.getBalloonMarking(0).getValue().getBytes(),
this.connectedNode, getPublisherByPlaceId(placeId)); this.connectedNode, getPublisherByPlaceId(placeId));
System.out.println("[DiNeROS-Node] [" + nodeName + "] Published msg: " + bmp.getBalloonMarking(0).getValue());
bmp.getBalloonMarking(0).removeSelf(); bmp.getBalloonMarking(0).removeSelf();
petriNet.flushTreeCache(); petriNet.flushTreeCache();
this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
...@@ -178,15 +183,15 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -178,15 +183,15 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
// crop name if place is within a server instance // crop name if place is within a server instance
// Naming pattern is here: original PlaceID + "-INSTANCE-" + instanceId // Naming pattern is here: original PlaceID + "-INSTANCE-" + instanceId
java.lang.String[] split = placeId.split("-"); java.lang.String[] split = placeId.split("-INSTANCE-");
java.lang.String originalId = split[0]; java.lang.String originalId = split[0];
java.lang.String serviceName = petriNet.getPortNameByPlaceId(originalId); java.lang.String serviceName = petriNet.getPortNameByPlaceId(originalId, PnmlConstants.CHANNEL_PLACE_TYPE_CLIENT_REQ_KEY);
java.lang.String cResPlaceId; java.lang.String cResPlaceId;
if(split.length > 1){ if(split.length > 1){
cResPlaceId = petriNet.getServiceClientResponsePlaceId(originalId) + "-INSTANCE-" + placeId.split("-")[split.length - 1]; cResPlaceId = petriNet.getServiceClientResponsePlaceId(originalId) + "-INSTANCE-" + placeId.split("-INSTANCE-")[split.length - 1];
} else { } else {
cResPlaceId = petriNet.getServiceClientResponsePlaceId(originalId); cResPlaceId = petriNet.getServiceClientResponsePlaceId(originalId);
} }
...@@ -208,16 +213,23 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -208,16 +213,23 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
@Override @Override
public void onSuccess(StringServiceResponse stringServiceResponse) { public void onSuccess(StringServiceResponse stringServiceResponse) {
System.out.println("[DiNeROS-Node] [" + nodeName + "] Received response from service: " + serviceName);
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); marking.callServiceIfRequest(bmpTarget, self);
if(petriNet.getPortNameByPlaceId(cResPlaceId, PnmlConstants.CHANNEL_PLACE_TYPE_PUB_KEY) != null ){
System.out.println("[DiNeROS-Node] [" + nodeName + "] Orphan publisher place ready: " + cResPlaceId);
self.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_TOPIC_PUB, cResPlaceId));
} else {
self.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); self.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
}
serviceClient.shutdown(); 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("[DiNeROS-Node] [" + nodeName + "] Error while calling: token will not be removed!");
serviceClient.shutdown(); serviceClient.shutdown();
} }
}); });
...@@ -311,6 +323,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -311,6 +323,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
@Override @Override
public void onStart(final ConnectedNode connectedNode) { public void onStart(final ConnectedNode connectedNode) {
DiNeRosNode self = this;
this.connectedNode = connectedNode; this.connectedNode = connectedNode;
System.out.println("[" + nodeName + "] Initializing node"); System.out.println("[" + nodeName + "] Initializing node");
...@@ -451,6 +464,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -451,6 +464,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
subscriber.addMessageListener(message -> { subscriber.addMessageListener(message -> {
System.out.println("Received new message on " + key + " : " + message.getData());
BalloonToken bt = new BalloonToken(); BalloonToken bt = new BalloonToken();
bt.setValue(message.getData()); bt.setValue(message.getData());
bt.setCreationTime(System.currentTimeMillis()); bt.setCreationTime(System.currentTimeMillis());
...@@ -458,7 +473,10 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -458,7 +473,10 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
BalloonMarkedPlace bmp = marking.resolveBalloonPlace(targetPlace); BalloonMarkedPlace bmp = marking.resolveBalloonPlace(targetPlace);
bmp.getBalloonMarkingList().add(bt); bmp.getBalloonMarkingList().add(bt);
petriNet.flushTreeCache(); petriNet.flushTreeCache();
if(!marking.callServiceIfRequest(bmp, self)){
this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE)); this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
}
}, petriNet.getChannelElementLimitById(placeId)); }, petriNet.getChannelElementLimitById(placeId));
} }
...@@ -499,6 +517,12 @@ public abstract class DiNeRosNode extends AbstractNodeMain { ...@@ -499,6 +517,12 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
return fsc; return fsc;
} }
protected Map<java.lang.String, Object> parseToken(java.lang.String s) {
Gson gson = new GsonBuilder().create();
Type mapType = new TypeToken<Map<java.lang.String, Object>>(){}.getType();
return gson.fromJson(s, mapType);
}
public boolean isServerInstancePlace(java.lang.String placeId) { public boolean isServerInstancePlace(java.lang.String placeId) {
return responsePlaces.contains(placeId); return responsePlaces.contains(placeId);
} }
......
...@@ -15,7 +15,7 @@ public class RosCommunicationUtil { ...@@ -15,7 +15,7 @@ public class RosCommunicationUtil {
pub = node.newPublisher(topic, std_msgs.String._TYPE); pub = node.newPublisher(topic, std_msgs.String._TYPE);
} }
if(pub == null){ if(pub != null){
while(true){ while(true){
if(node != null){ if(node != null){
break; break;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment