Updated ROS translation units
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java
index 9806951..0dc2cb1 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxActivityGraphItemTransformer.java
@@ -15,8 +15,6 @@
package org.eclipse.app4mc.slg.linux.transformers.sw;
-import java.util.Arrays;
-
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
import org.eclipse.app4mc.amalthea.model.LabelAccess;
import org.eclipse.app4mc.amalthea.model.Ticks;
@@ -31,17 +29,18 @@
@Inject private LinuxTicksTransformer linuxTicksTransformer;
public LinuxTranslationUnit transform(final ActivityGraphItem graphItem) {
+ if (graphItem == null) {
+ throw new IllegalArgumentException("Unhandled parameter type: null");
+ }
+
if (graphItem instanceof LabelAccess) {
return linuxLabelAccessTransformer.transform((LabelAccess) graphItem);
} else if (graphItem instanceof Ticks) {
return linuxTicksTransformer.transform((Ticks) graphItem);
- } else if (graphItem != null) {
- String warning = "/*[feature " + graphItem.eClass().getName() + " in not supported]";
- return new LinuxTranslationUnit(warning);
- } else {
- throw new IllegalArgumentException(
- "Unhandled parameter types: " + Arrays.<Object>asList(graphItem).toString());
}
+
+ String warning = "/*[feature " + graphItem.eClass().getName() + " in not supported]";
+ return new LinuxTranslationUnit(warning);
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend
index 05610b5..b54dcf1 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlGenerator.xtend
@@ -15,6 +15,11 @@
class RosAmlGenerator {
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
static def String toCpp() '''
#include "aml.h"
#include <mutex>
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsGenerator.xtend
similarity index 79%
rename from load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsGenerator.xtend
rename to load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsGenerator.xtend
index aa1729e..e1a1a75 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosChannelSendUtilsGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsGenerator.xtend
@@ -11,18 +11,23 @@
* Robert Bosch GmbH - initial API and implementation
*/
-package org.eclipse.app4mc.slg.ros2.transformers
+package org.eclipse.app4mc.slg.ros2.generators
import org.eclipse.app4mc.amalthea.model.ChannelSend
class RosChannelSendUtilsGenerator {
- static def toCPPHead() '''
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
+ static def String toCPPHead() '''
#include "channelSendUtils.h"
'''
- static def toCPP(ChannelSend cs) '''
+ static def String toCPP(ChannelSend cs) '''
void publish_to_«cs.data.name»(rclcpp::Publisher<std_msgs::msg::String>::SharedPtr& publisher) {
@@ -32,7 +37,7 @@
}
'''
- static def toHeader() '''
+ static def String toHeader() '''
#include <string>
#include "rclcpp/rclcpp.hpp"
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java
index c09cdbb..b81a9b3 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java
@@ -18,10 +18,14 @@
import org.eclipse.app4mc.amalthea.model.ChannelSend;
import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.ros2.transformers.RosChannelSendUtilsGenerator;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
public class RosChannelSendUtilsTranslationUnit extends TranslationUnit {
+ public static final String LIB_NAME = "CHANNELSEND_UTIL";
+ public static final String MODULE_NAME = "channelSendUtils";
+ public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
private ChannelSend cs;
private OutputBuffer outputBuffer;
@@ -35,29 +39,13 @@
private static List<String> topic_list = new ArrayList<>();
- public static String getModulePathStatic() {
- return "synthetic_gen" + "/" + RosChannelSendUtilsTranslationUnit.getModuleNameStatic();
- }
-
- public static String getMakeFilePathStatic() {
- return RosChannelSendUtilsTranslationUnit.getModulePathStatic() + "/" + "CMakeLists.txt";
- }
-
- public static String getModuleNameStatic() {
- return "channelSendUtils";
- }
-
- public static String getLibName() {
- return "CHANNELSEND_UTIL";
- }
-
public String getModuleName() {
- return getModuleNameStatic();
+ return MODULE_NAME;
}
@Override
public String getIncFile() {
- return (getModuleName() + ".h");
+ return (MODULE_NAME + ".h");
}
public String getExecCall(final String param) {
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
index 7c5a2a8..8b2d0ed 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
@@ -18,6 +18,11 @@
class RosInterProcessTriggerUtilsGenerator {
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
static def String toCPPHead() '''
#include "interProcessTriggerUtils.h"
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java
index 31e534d..3c127de 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java
@@ -15,11 +15,14 @@
import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtend2.lib.StringConcatenation;
public class RosInterProcessTriggerUtilsTranslationUnit extends TranslationUnit {
+ public static final String LIB_NAME = "INTERPROCESSTRIGGER_UTIL";
+ public static final String MODULE_NAME = "interProcessTriggerUtils";
+ public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
private InterProcessTrigger ip;
private OutputBuffer outputBuffer;
@@ -30,29 +33,13 @@
this.genFiles();
}
- public static String getModulePathStatic() {
- return "synthetic_gen" + "/" + getModuleNameStatic();
- }
-
- public static String getMakeFilePathStatic() {
- return getModulePathStatic() + "/" + "CMakeLists.txt";
- }
-
- public static String getModuleNameStatic() {
- return "interProcessTriggerUtils";
- }
-
- public static String getLibName() {
- return "INTERPROCESSTRIGGER_UTIL";
- }
-
public String getModuleName() {
- return getModuleNameStatic();
+ return MODULE_NAME;
}
@Override
public String getIncFile() {
- return getModuleName() + ".h";
+ return MODULE_NAME + ".h";
}
public String getExecCall(final String param) {
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
index d35f7d6..eaba3c2 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
@@ -15,6 +15,11 @@
class RosLabelGenerator {
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
static def String toH(String name, String readCall, String writeCall) '''
typedef struct «name»_CacheLine
{
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java
index becce25..9813d5d 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java
@@ -18,36 +18,23 @@
import org.eclipse.app4mc.transformation.util.OutputBuffer;
public class RosLabelTranslationUnit extends LabelTranslationUnit {
+ public static final String MODULLIB_NAME = "LABELS_LIB";
+ public static final String MODULE_NAME = "labels";
+ public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
public RosLabelTranslationUnit(final OutputBuffer outputBuffer, final Label label) {
super(outputBuffer, label);
}
- // static helper functions (cannot be put to base class)
- public static String getModulePathStatic() {
- return "synthetic_gen" + "/" + getModuleNameStatic();
- }
-
- public static String getMakeFilePathStatic() {
- return getModulePathStatic() + "/" + "CMakeLists.txt";
- }
-
- // translation unit specific settings
- public static String getModuleNameStatic() {
- return "labels";
- }
-
- public static String getLibName() {
- return "LABELS_LIB";
- }
-
@Override
public String getModuleName() {
- return getModuleNameStatic();
+ return MODULE_NAME;
}
@Override
public String getIncFile() {
- return getModuleName() + ".h";
+ return MODULE_NAME + ".h";
}
@Override
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
new file mode 100644
index 0000000..1173798
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Robert Bosch GmbH - initial API and implementation
+ */
+
+package org.eclipse.app4mc.slg.ros2.generators
+
+import org.eclipse.app4mc.amalthea.model.Runnable
+import java.util.HashSet
+import java.util.List
+
+class RosRunnableGenerator {
+
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
+ static def String toH(String call, HashSet<String> includes) {
+ val builder = new StringBuilder()
+
+ includes.forEach [ include |
+ builder.append("#include \"" + include + "\"\n")
+ ]
+ builder.append('''void «call»;
+ ''')
+
+ builder.toString
+ }
+
+ static def String toCpp(Runnable runnable, HashSet<String> includes, String call, List<String> calls,
+ boolean measure_performance) {
+ val builder = new StringBuilder()
+
+ // write runnable body
+ builder.append("void " + call + "{\n")
+ if (measure_performance) {
+ builder.append('''
+ uint64_t event_list[] = {0x11, 0x13, 0x17}; //CPU CYCLES, MEM ACCESS, L2 Cache Refill
+ int total_events = sizeof(event_list)/sizeof(event_list[0]);
+ int fd = instrument_start(0,event_list, total_events);
+ ''')
+ }
+ calls.forEach [ c |
+ builder.append("\t" + c + ";\n")
+ ]
+ if (measure_performance) {
+ builder.append('''
+ instrument_stop(fd, "«runnable.name».log");
+ ''')
+ }
+ builder.append("}\n\n")
+
+ builder.toString
+ }
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend
index 7c99b81..882eb09 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTagGenerator.xtend
@@ -20,6 +20,11 @@
class RosTagGenerator {
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
static def String toCpp(Tag tag, String moduleName, HashSet<String> headers, List<String> declarations,
List<String> inits, List<String> calls, List<String> serviceCallbacks) '''
#include <chrono>
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
new file mode 100644
index 0000000..2b81adf
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Robert Bosch GmbH - initial API and implementation
+ */
+
+package org.eclipse.app4mc.slg.ros2.generators
+
+import java.util.List
+import java.util.Set
+import org.eclipse.app4mc.amalthea.model.EventStimulus
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
+import org.eclipse.app4mc.amalthea.model.PeriodicStimulus
+import org.eclipse.app4mc.amalthea.model.Stimulus
+import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils
+
+class RosTaskGenerator {
+
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
+ static def String getDeclaration(List<Stimulus> stimuli, List<String> publishers, List<String> clientDeclarations) '''
+ «FOR stimulus : stimuli»
+ «IF stimulus instanceof PeriodicStimulus»
+ rclcpp::TimerBase::SharedPtr «(stimulus as PeriodicStimulus).name»_timer_;
+ «ENDIF»
+ «IF stimulus instanceof EventStimulus»
+ rclcpp::Subscription<std_msgs::msg::String>::SharedPtr «(stimulus as EventStimulus).name»_subscription_;
+ «ENDIF»
+ «IF stimulus instanceof InterProcessStimulus»
+ rclcpp::Service<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»>::SharedPtr «(stimulus as InterProcessStimulus).name»_service;
+ «ENDIF»
+ «ENDFOR»
+ «FOR publisher : publishers»
+ rclcpp::Publisher<std_msgs::msg::String>::SharedPtr «publisher»;
+ «ENDFOR»
+ «FOR decl: clientDeclarations»
+ «decl»;
+ «ENDFOR»
+ '''
+
+ static def String getInitialisation(String nodeName, List<Stimulus> stimuli, List<String> publishers, List<String> clientInits) '''
+ «FOR stimulus : stimuli»
+ «IF stimulus instanceof PeriodicStimulus»
+ «(stimulus as PeriodicStimulus).name»_timer_ = this->create_wall_timer(
+ «(stimulus as PeriodicStimulus).recurrence.value»«(stimulus as PeriodicStimulus).recurrence.unit», std::bind(&«nodeName»::«(stimulus as PeriodicStimulus).name»_timer_callback, this));
+ «ENDIF»
+ «IF stimulus instanceof EventStimulus»
+ «(stimulus as EventStimulus).name»_subscription_ = this->create_subscription<std_msgs::msg::String>(
+ "«(stimulus as EventStimulus).name»", 10, std::bind(&«nodeName»::«(stimulus as EventStimulus).name»_subscription_callback, this, _1));
+ «ENDIF»
+ «IF stimulus instanceof InterProcessStimulus»
+ «(stimulus as InterProcessStimulus).name»_service = this->create_service<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»>("«(stimulus as InterProcessStimulus).name»_service", &«(stimulus as InterProcessStimulus).name»_service_callback);
+ «ENDIF»
+ «ENDFOR»
+ «FOR publisher : publishers»
+ «publisher» = this->create_publisher<std_msgs::msg::String>("«publisher.replace("_publisher", "")»", 10);
+ «ENDFOR»
+ «FOR init : clientInits»
+ «init»;
+ «ENDFOR»
+ '''
+
+ static def String getServiceCallback(List<Stimulus> stimuli, List<String> stepCalls) '''
+ «FOR stimulus : stimuli»
+ «IF stimulus instanceof InterProcessStimulus»
+ void «(stimulus as InterProcessStimulus).name»_service_callback(const std::shared_ptr<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»::Request> request,
+ std::shared_ptr<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»::Response> response) {
+ «FOR call : stepCalls»
+ «""» «call»;
+ «ENDFOR»
+ }
+ «ENDIF»
+
+
+ «ENDFOR»
+ '''
+
+ static def String getCallback(List<Stimulus> stimuli, List<String> stepCalls) '''
+ «FOR stimulus : stimuli»
+ «IF stimulus instanceof PeriodicStimulus»
+ void «(stimulus as PeriodicStimulus).name»_timer_callback() {
+ «FOR call : stepCalls»
+ «""» «call»;
+ «ENDFOR»
+ }
+ «ENDIF»
+ «IF stimulus instanceof EventStimulus»
+ void «(stimulus as EventStimulus).name»_subscription_callback(const std_msgs::msg::String::SharedPtr msg) {
+ «FOR call : stepCalls»
+ «""» «call»;
+ «ENDFOR»
+ }
+ «ENDIF»
+ «ENDFOR»
+ '''
+
+ static def String getHeaders(Set<String> includes) '''
+ «FOR include : includes»
+ #include "«include»"
+ «ENDFOR»
+ '''
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java
index 3ff80ce..d572e49 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java
@@ -13,411 +13,166 @@
package org.eclipse.app4mc.slg.ros2.generators;
-import java.math.BigInteger;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import org.eclipse.app4mc.amalthea.model.ActivityGraph;
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
import org.eclipse.app4mc.amalthea.model.Component;
-import org.eclipse.app4mc.amalthea.model.EventStimulus;
import org.eclipse.app4mc.amalthea.model.Group;
+import org.eclipse.app4mc.amalthea.model.ITaggable;
import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
-import org.eclipse.app4mc.amalthea.model.PeriodicStimulus;
+import org.eclipse.app4mc.amalthea.model.Runnable;
import org.eclipse.app4mc.amalthea.model.RunnableCall;
import org.eclipse.app4mc.amalthea.model.Stimulus;
import org.eclipse.app4mc.amalthea.model.Tag;
import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.amalthea.model.TimeUnit;
import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
import org.eclipse.app4mc.slg.ros2.transformers.RosInterProcessStimulusTransformer;
import org.eclipse.app4mc.slg.ros2.transformers.RosLabelTransformer;
import org.eclipse.app4mc.slg.ros2.transformers.RosRunnableTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.xtend2.lib.StringConcatenation;
-import org.eclipse.xtext.xbase.lib.Functions.Function1;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
public class RosTaskTranslationUnit extends TaskTranslationUnit {
- private RosInterProcessStimulusTransformer ipStimulusTransformer;
-
- private Task task;
-
- private final LinkedHashSet<String> includes = new LinkedHashSet<>();
-
- private final LinkedList<String> initCalls = new LinkedList<>();
-
- private final LinkedList<String> stepCalls = new LinkedList<>();
-
- private final ArrayList<Stimulus> stimuli = new ArrayList<>();
-
- private ArrayList<String> publishers = new ArrayList<>();
-
- private ArrayList<String> clientDeclarations = new ArrayList<>();
-
- private ArrayList<String> clientInits = new ArrayList<>();
-
- public RosTaskTranslationUnit(final OutputBuffer outputBuffer, final RosRunnableTransformer transformerRunnable, final RosLabelTransformer transformerLabel, final RosInterProcessStimulusTransformer ipStimulusTransformer, final Task task, final Component c) {
- super(outputBuffer, transformerRunnable, transformerLabel, task);
- this.ipStimulusTransformer = ipStimulusTransformer;
- this.task = task;
- this.genFiles();
- }
-
- @Override
- public String getBasePath() {
- return "";
- }
-
- @Override
- public String getModuleName() {
- return this.task.getName();
- }
-
- @Override
- public boolean genFiles() {
- boolean _xblockexpression = false;
- {
- ActivityGraph _activityGraph = null;
- if (this.task!=null) {
- _activityGraph=this.task.getActivityGraph();
- }
- EList<ActivityGraphItem> _items = null;
- if (_activityGraph!=null) {
- _items=_activityGraph.getItems();
- }
- if (_items!=null) {
- final Consumer<ActivityGraphItem> _function = (ActivityGraphItem item) -> {
- if ((item instanceof RunnableCall)) {
- final org.eclipse.app4mc.amalthea.model.Runnable runnable = ((RunnableCall) item).getRunnable();
- RunnableTranslationUnit _transform = this.runnableTransformer.transform(runnable);
- final RosRunnableTranslationUnit tu = ((RosRunnableTranslationUnit) _transform);
- this.includes.add(tu.getIncFile());
- final Function1<Tag, Boolean> _function_1 = (Tag tag) -> {
- return Boolean.valueOf("initialize".equals(tag.getName()));
- };
- boolean _isEmpty = IterableExtensions.isEmpty(IterableExtensions.<Tag>filter(((RunnableCall)item).getTags(), _function_1));
- boolean _not = (!_isEmpty);
- if (_not) {
- this.initCalls.add(tu.getNodeCall());
- } else {
- this.stepCalls.add(tu.getNodeCall());
- }
- this.publishers.addAll(tu.getPublishers());
- this.clientDeclarations.addAll(tu.getClientDeclarations());
- this.clientInits.addAll(tu.getClientInits());
- } else {
- if ((item instanceof Group)) {
- final Group group = ((Group) item);
- final Consumer<ActivityGraphItem> _function_2 = (ActivityGraphItem groupitem) -> {
- if ((groupitem instanceof RunnableCall)) {
- final org.eclipse.app4mc.amalthea.model.Runnable runnable_1 = ((RunnableCall) groupitem).getRunnable();
- RunnableTranslationUnit _transform_1 = this.runnableTransformer.transform(((org.eclipse.app4mc.amalthea.model.Runnable) runnable_1));
- final RosRunnableTranslationUnit tu_1 = ((RosRunnableTranslationUnit) _transform_1);
- this.includes.add(tu_1.getIncFile());
- final Function1<Tag, Boolean> _function_3 = (Tag tag) -> {
- return Boolean.valueOf("initialize".equals(tag.getName()));
- };
- boolean _isEmpty_1 = IterableExtensions.isEmpty(IterableExtensions.<Tag>filter(((RunnableCall)groupitem).getTags(), _function_3));
- boolean _not_1 = (!_isEmpty_1);
- if (_not_1) {
- this.initCalls.add(tu_1.getNodeCall());
- } else {
- this.stepCalls.add(tu_1.getNodeCall());
- }
- }
- };
- group.getItems().forEach(_function_2);
- }
- }
- };
- _items.forEach(_function);
- }
- final BiConsumer<ArrayList<?>, LabelTranslationUnit> _function_1 = (ArrayList<?> label, LabelTranslationUnit tu) -> {
- this.includes.add(tu.getIncFile());
- this.initCalls.add(tu.getInitCall());
- };
- this.labelTransformer.getCache().forEach(_function_1);
- final Function1<Stimulus, Boolean> _function_2 = (Stimulus stimulus) -> {
- return Boolean.valueOf((stimulus instanceof InterProcessStimulus));
- };
- final Consumer<Stimulus> _function_3 = (Stimulus stimulus) -> {
- StringConcatenation _builder = new StringConcatenation();
- String _name = stimulus.getName();
- _builder.append(_name);
- _builder.append("_service/srv/");
- String _name_1 = stimulus.getName();
- _builder.append(_name_1);
- _builder.append("_service.hpp");
- this.includes.add(_builder.toString());
- this.ipStimulusTransformer.transform(((InterProcessStimulus) stimulus));
- };
- IterableExtensions.<Stimulus>filter(IterableExtensions.<Stimulus>toList(this.task.getStimuli()), _function_2).forEach(_function_3);
- _xblockexpression = this.stimuli.addAll(IterableExtensions.<Stimulus>toList(this.task.getStimuli()));
- }
- return _xblockexpression;
- }
-
- public CharSequence getDeclaration() {
- StringConcatenation _builder = new StringConcatenation();
- {
- for(final Stimulus stimulus : this.stimuli) {
- {
- if ((stimulus instanceof PeriodicStimulus)) {
- _builder.append("rclcpp::TimerBase::SharedPtr ");
- String _name = ((PeriodicStimulus) stimulus).getName();
- _builder.append(_name);
- _builder.append("_timer_;");
- _builder.newLineIfNotEmpty();
- }
- }
- {
- if ((stimulus instanceof EventStimulus)) {
- _builder.append("rclcpp::Subscription<std_msgs::msg::String>::SharedPtr ");
- String _name_1 = ((EventStimulus) stimulus).getName();
- _builder.append(_name_1);
- _builder.append("_subscription_;");
- _builder.newLineIfNotEmpty();
- }
- }
- {
- if ((stimulus instanceof InterProcessStimulus)) {
- _builder.append("rclcpp::Service<");
- String _name_2 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_2);
- _builder.append("_service::srv::");
- String _name_3 = ((InterProcessStimulus) stimulus).getName();
- String _plus = (_name_3 + "_service");
- String _idlCompliantName = Utils.toIdlCompliantName(_plus);
- _builder.append(_idlCompliantName);
- _builder.append(">::SharedPtr ");
- String _name_4 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_4);
- _builder.append("_service;");
- _builder.newLineIfNotEmpty();
- }
- }
- }
- }
- {
- for(final String publisher : this.publishers) {
- _builder.append("rclcpp::Publisher<std_msgs::msg::String>::SharedPtr ");
- _builder.append(publisher);
- _builder.append(";");
- _builder.newLineIfNotEmpty();
- }
- }
- {
- for(final String decl : this.clientDeclarations) {
- _builder.append(decl);
- _builder.append(";");
- _builder.newLineIfNotEmpty();
- }
- }
- return _builder;
- }
-
- public CharSequence getInitialisation(final String nodeName) {
- StringConcatenation _builder = new StringConcatenation();
- {
- for(final Stimulus stimulus : this.stimuli) {
- {
- if ((stimulus instanceof PeriodicStimulus)) {
- String _name = ((PeriodicStimulus) stimulus).getName();
- _builder.append(_name);
- _builder.append("_timer_ = this->create_wall_timer(");
- _builder.newLineIfNotEmpty();
- _builder.append("\t\t");
- BigInteger _value = ((PeriodicStimulus) stimulus).getRecurrence().getValue();
- _builder.append(_value, "\t\t");
- TimeUnit _unit = ((PeriodicStimulus) stimulus).getRecurrence().getUnit();
- _builder.append(_unit, "\t\t");
- _builder.append(", std::bind(&");
- _builder.append(nodeName, "\t\t");
- _builder.append("::");
- String _name_1 = ((PeriodicStimulus) stimulus).getName();
- _builder.append(_name_1, "\t\t");
- _builder.append("_timer_callback, this));");
- _builder.newLineIfNotEmpty();
- }
- }
- {
- if ((stimulus instanceof EventStimulus)) {
- String _name_2 = ((EventStimulus) stimulus).getName();
- _builder.append(_name_2);
- _builder.append("_subscription_ = this->create_subscription<std_msgs::msg::String>(");
- _builder.newLineIfNotEmpty();
- _builder.append("\t");
- _builder.append("\"");
- String _name_3 = ((EventStimulus) stimulus).getName();
- _builder.append(_name_3, "\t");
- _builder.append("\", 10, std::bind(&");
- _builder.append(nodeName, "\t");
- _builder.append("::");
- String _name_4 = ((EventStimulus) stimulus).getName();
- _builder.append(_name_4, "\t");
- _builder.append("_subscription_callback, this, _1));");
- _builder.newLineIfNotEmpty();
- }
- }
- {
- if ((stimulus instanceof InterProcessStimulus)) {
- String _name_5 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_5);
- _builder.append("_service = this->create_service<");
- String _name_6 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_6);
- _builder.append("_service::srv::");
- String _name_7 = ((InterProcessStimulus) stimulus).getName();
- String _plus = (_name_7 + "_service");
- String _idlCompliantName = Utils.toIdlCompliantName(_plus);
- _builder.append(_idlCompliantName);
- _builder.append(">(\"");
- String _name_8 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_8);
- _builder.append("_service\", &");
- String _name_9 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_9);
- _builder.append("_service_callback);");
- _builder.newLineIfNotEmpty();
- }
- }
- }
- }
- {
- for(final String publisher : this.publishers) {
- _builder.append(publisher);
- _builder.append(" = this->create_publisher<std_msgs::msg::String>(\"");
- String _replace = publisher.replace("_publisher", "");
- _builder.append(_replace);
- _builder.append("\", 10);");
- _builder.newLineIfNotEmpty();
- }
- }
- {
- for(final String init : this.clientInits) {
- _builder.append(init);
- _builder.append(";");
- _builder.newLineIfNotEmpty();
- }
- }
- return _builder;
- }
-
- public CharSequence getServiceCallback() {
- StringConcatenation _builder = new StringConcatenation();
- {
- for(final Stimulus stimulus : this.stimuli) {
- {
- if ((stimulus instanceof InterProcessStimulus)) {
- _builder.append("void ");
- String _name = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name);
- _builder.append("_service_callback(const std::shared_ptr<");
- String _name_1 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_1);
- _builder.append("_service::srv::");
- String _name_2 = ((InterProcessStimulus) stimulus).getName();
- String _plus = (_name_2 + "_service");
- String _idlCompliantName = Utils.toIdlCompliantName(_plus);
- _builder.append(_idlCompliantName);
- _builder.append("::Request> request,");
- _builder.newLineIfNotEmpty();
- _builder.append("\t");
- _builder.append("std::shared_ptr<");
- String _name_3 = ((InterProcessStimulus) stimulus).getName();
- _builder.append(_name_3, "\t");
- _builder.append("_service::srv::");
- String _name_4 = ((InterProcessStimulus) stimulus).getName();
- String _plus_1 = (_name_4 + "_service");
- String _idlCompliantName_1 = Utils.toIdlCompliantName(_plus_1);
- _builder.append(_idlCompliantName_1, "\t");
- _builder.append("::Response> response) {");
- _builder.newLineIfNotEmpty();
- {
- for(final String call : this.stepCalls) {
- _builder.append("\t\t");
- _builder.append(call);
- _builder.append(";");
- _builder.newLineIfNotEmpty();
- }
- }
- _builder.append("\t");
- _builder.append("}");
- _builder.newLine();
- }
- }
- _builder.newLine();
- _builder.newLine();
- }
- }
- return _builder;
- }
-
- public CharSequence getCallback() {
- StringConcatenation _builder = new StringConcatenation();
- {
- for(final Stimulus stimulus : this.stimuli) {
- {
- if ((stimulus instanceof PeriodicStimulus)) {
- _builder.append("void ");
- String _name = ((PeriodicStimulus) stimulus).getName();
- _builder.append(_name);
- _builder.append("_timer_callback() {");
- _builder.newLineIfNotEmpty();
- {
- for(final String call : this.stepCalls) {
- _builder.append("\t");
- _builder.append(call);
- _builder.append(";");
- _builder.newLineIfNotEmpty();
- }
- }
- _builder.append("}");
- _builder.newLine();
- }
- }
- {
- if ((stimulus instanceof EventStimulus)) {
- _builder.append("void ");
- String _name_1 = ((EventStimulus) stimulus).getName();
- _builder.append(_name_1);
- _builder.append("_subscription_callback(const std_msgs::msg::String::SharedPtr msg) {");
- _builder.newLineIfNotEmpty();
- {
- for(final String call_1 : this.stepCalls) {
- _builder.append("\t");
- _builder.append(call_1);
- _builder.append(";");
- _builder.newLineIfNotEmpty();
- }
- }
- _builder.append("}");
- _builder.newLine();
- }
- }
- }
- }
- return _builder;
- }
-
- public CharSequence getHeaders() {
- StringConcatenation _builder = new StringConcatenation();
- {
- for(final String include : this.includes) {
- _builder.append("#include \"");
- _builder.append(include);
- _builder.append("\"");
- _builder.newLineIfNotEmpty();
- }
- }
- return _builder;
- }
+ private RosInterProcessStimulusTransformer ipStimulusTransformer;
+ private Task task;
+
+ private final Set<String> includes = new LinkedHashSet<>();
+ private final List<String> initCalls = new LinkedList<>();
+ private final List<String> stepCalls = new LinkedList<>();
+ private final List<Stimulus> stimuli = new ArrayList<>();
+ private final List<String> publishers = new ArrayList<>();
+ private final List<String> clientDeclarations = new ArrayList<>();
+ private final List<String> clientInits = new ArrayList<>();
+
+ public RosTaskTranslationUnit(final OutputBuffer outputBuffer, final RosRunnableTransformer transformerRunnable,
+ final RosLabelTransformer transformerLabel, final RosInterProcessStimulusTransformer ipStimulusTransformer,
+ final Task task, final Component c) {
+ super(outputBuffer, transformerRunnable, transformerLabel, task);
+ this.ipStimulusTransformer = ipStimulusTransformer;
+ this.task = task;
+
+ this.genFiles();
+ }
+
+ @Override
+ public String getBasePath() {
+ return "";
+ }
+
+ @Override
+ public String getModuleName() {
+ return this.task.getName();
+ }
+
+ @Override
+ public boolean genFiles() {
+
+
+ if (task != null && task.getActivityGraph() != null) {
+ for (ActivityGraphItem item : task.getActivityGraph().getItems()) {
+
+ if ((item instanceof RunnableCall)) {
+ final RunnableCall runnableCall = (RunnableCall) item;
+ final Runnable runnable = runnableCall.getRunnable();
+
+ RosRunnableTranslationUnit tu = (RosRunnableTranslationUnit) runnableTransformer.transform(runnable);
+ includes.add(tu.getIncFile());
+
+ if (hasTagNamed(runnableCall, "initialize")) {
+ initCalls.add(tu.getNodeCall());
+ } else {
+ stepCalls.add(tu.getNodeCall());
+ }
+
+ // TODO: Make set
+ publishers.addAll(tu.getPublishers());
+ clientDeclarations.addAll(tu.getClientDeclarations());
+ clientInits.addAll(tu.getClientInits());
+ // TODO: add terminate function, if requested
+
+ } else if (item instanceof Group) {
+ final Group group = ((Group) item);
+ for (ActivityGraphItem groupitem : group.getItems()) {
+ if ((groupitem instanceof RunnableCall)) {
+ final RunnableCall runnableCall = (RunnableCall) groupitem;
+ final Runnable runnable = runnableCall.getRunnable();
+
+ RosRunnableTranslationUnit tu = (RosRunnableTranslationUnit) runnableTransformer.transform(runnable);
+ includes.add(tu.getIncFile());
+
+ if (hasTagNamed(runnableCall, "initialize")) {
+ initCalls.add((tu).getNodeCall());
+ } else {
+ stepCalls.add((tu).getNodeCall());
+ }
+ //TODO: add terminate function, if requested
+ }
+ }
+ }
+ }
+ }
+
+ // labels must be initialized before usage, generated labels provide this method
+
+ for (LabelTranslationUnit tu : labelTransformer.getCache().values()) {
+ includes.add(tu.getIncFile());
+ initCalls.add(tu.getInitCall());
+ }
+
+ labelTransformer.getCache().forEach(
+ (BiConsumer<ArrayList<?>, LabelTranslationUnit>) (ArrayList<?> label, LabelTranslationUnit tu) -> {
+
+ });
+
+ // add header for srv file in case of an interprocessstimulus
+ // create .srv file for the messages to be translated
+
+ if (task != null) {
+ for (Stimulus stimulus : task.getStimuli()) {
+ if (stimulus instanceof InterProcessStimulus) {
+ String name = stimulus.getName();
+ includes.add(name + "_service/srv/" + name + "_service.hpp");
+
+ ipStimulusTransformer.transform(((InterProcessStimulus) stimulus));
+ }
+ }
+
+ stimuli.addAll(task.getStimuli());
+ }
+
+ return true;
+ }
+
+ private boolean hasTagNamed(ITaggable element, String name) {
+ for (Tag tag : element.getTags()) {
+ if (tag.getName().equals(name))
+ return true;
+ }
+ return false;
+ }
+
+ public String getDeclaration() {
+ return RosTaskGenerator.getDeclaration(stimuli, publishers, clientDeclarations);
+ }
+
+ public String getInitialisation(String nodeName) {
+ return RosTaskGenerator.getInitialisation(nodeName, stimuli, publishers, clientInits);
+ }
+
+ public String getServiceCallback() {
+ return RosTaskGenerator.getServiceCallback(stimuli, stepCalls);
+ }
+
+ public String getCallback() {
+ return RosTaskGenerator.getCallback(stimuli, stepCalls);
+ }
+
+ public String getHeaders() {
+ return RosTaskGenerator.getHeaders(includes);
+ }
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend
index 6ad0d0b..574672f 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosLabelTransformer.xtend
@@ -23,6 +23,8 @@
@Inject OutputBuffer outputBuffer
+ static final String LIB_NAME = "LABELS_LIB"
+
override create new RosLabelTranslationUnit(outputBuffer, label)
transform(Label label) {
}
@@ -30,19 +32,19 @@
override getCache() { return this._createCache_transform }
override createCMake() {
- outputBuffer.appendTo("OTHER", RosLabelTranslationUnit.makeFilePathStatic, toCMake())
+ outputBuffer.appendTo("OTHER", RosLabelTranslationUnit.MAKEFILE_PATH, toCMake())
}
override String toCMake() '''
- # «RosLabelTranslationUnit.libName» ################################################################
+ # «LIB_NAME» ################################################################
####
- add_library(«RosLabelTranslationUnit.libName» STATIC
+ add_library(«LIB_NAME» STATIC
«FOR srcFile : getSrcFiles()»
«""» ${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
«ENDFOR»
)
-
- target_include_directories(«RosLabelTranslationUnit.getLibName()»
+
+ target_include_directories(«LIB_NAME»
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc
)
'''