| /** |
| ******************************************************************************** |
| * 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.transformers; |
| |
| import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.OTHER_TYPE; |
| |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.app4mc.amalthea.model.ActivityGraphItem; |
| import org.eclipse.app4mc.amalthea.model.Amalthea; |
| import org.eclipse.app4mc.amalthea.model.BooleanObject; |
| import org.eclipse.app4mc.amalthea.model.ChannelSend; |
| import org.eclipse.app4mc.amalthea.model.CommonElements; |
| import org.eclipse.app4mc.amalthea.model.InterProcessStimulus; |
| import org.eclipse.app4mc.amalthea.model.InterProcessTrigger; |
| import org.eclipse.app4mc.amalthea.model.LabelAccess; |
| import org.eclipse.app4mc.amalthea.model.Runnable; |
| import org.eclipse.app4mc.amalthea.model.SWModel; |
| 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.Ticks; |
| import org.eclipse.app4mc.amalthea.model.Value; |
| import org.eclipse.app4mc.amalthea.model.util.ModelUtil; |
| import org.eclipse.app4mc.amalthea.model.util.SoftwareUtil; |
| import org.eclipse.app4mc.slg.commons.m2t.transformers.AmaltheaModel2TextTransformer; |
| import org.eclipse.app4mc.slg.commons.m2t.transformers.TicksUtilsTransformer; |
| import org.eclipse.app4mc.slg.ros2.generators.RosAmlTranslationUnit; |
| import org.eclipse.app4mc.slg.ros2.generators.RosModel2TextGenerator; |
| import org.eclipse.app4mc.slg.ros2.transformers.common.RosTagTransformer; |
| import org.eclipse.app4mc.slg.ros2.transformers.sw.RosLabelTransformer; |
| import org.eclipse.app4mc.transformation.util.OutputBuffer; |
| |
| import com.google.inject.Inject; |
| import com.google.inject.Singleton; |
| |
| @Singleton |
| public class RosModel2TextTransformer extends AmaltheaModel2TextTransformer { |
| |
| @Inject private OutputBuffer outputBuffer; |
| @Inject private RosTagTransformer tagTransformer; |
| @Inject private TicksUtilsTransformer ticksUtilsTransformer; |
| @Inject private RosLabelTransformer labelTransformer; |
| |
| private boolean label = false; |
| private boolean ticks = false; |
| private boolean interprocess = false; |
| private boolean channelSend = false; |
| private boolean performance_measurement = false; |
| |
| @Override |
| public void transform(final Amalthea model, final String outputFolder) { |
| |
| RosBaseSettings.initializeOutputBuffer(this.outputBuffer, outputFolder); |
| |
| Set<String> nodes = new HashSet<>(); |
| Set<String> services = new HashSet<>(); |
| |
| CommonElements commonElements = ModelUtil.getOrCreateCommonElements(model); |
| SWModel swModel = ModelUtil.getOrCreateSwModel(model); |
| |
| for (Tag tag : commonElements.getTags()) { |
| // instance to know which node published a message |
| tagTransformer.transform(tag, model); |
| } |
| |
| /* extract information needed for top-level CMake file */ |
| /* find runnables that use service files and use the tag to set the dependencies */ |
| |
| for (Task task : swModel.getTasks()) { |
| |
| Stimulus stimulus = task.getStimuli().get(0); // Mc: Why only the first ? |
| for (final Tag tag : task.getTags()) { |
| nodes.add(tag.getName()); |
| } |
| |
| // check if task has interprocess stimulus, if so task is service callback |
| if ((stimulus instanceof InterProcessStimulus)) { |
| services.add(((InterProcessStimulus) stimulus).getName() + "_service"); |
| } else { |
| // search for runnables called by task |
| for (Runnable run : SoftwareUtil.getRunnableList(task, null)) { |
| // check custom properties |
| Value perf = run.getCustomProperties().get("measure_performance"); |
| if (perf instanceof BooleanObject && ((BooleanObject) perf).isValue()) { |
| performance_measurement = true; |
| } |
| |
| // check activity graph |
| for (ActivityGraphItem item : run.getRunnableItems()) { |
| if (item instanceof LabelAccess) { |
| label = true; |
| } |
| if (item instanceof Ticks) { |
| ticks = true; |
| } |
| if (item instanceof InterProcessTrigger) { |
| interprocess = true; |
| } |
| if (item instanceof ChannelSend) { |
| channelSend = true; |
| } |
| } |
| } |
| } |
| } |
| |
| this.ticksUtilsTransformer.createCMake(); |
| this.labelTransformer.createCMake(); |
| new RosAmlTranslationUnit(this.outputBuffer); |
| this.outputBuffer.appendTo(OTHER_TYPE, "CMakeLists.txt", RosModel2TextGenerator.toCmake(nodes, services, label, |
| ticks, interprocess, channelSend, performance_measurement)); |
| this.outputBuffer.appendTo(OTHER_TYPE, "package.xml", RosModel2TextGenerator.toPackageXml(services)); |
| this.outputBuffer.appendTo(OTHER_TYPE, "build.sh", RosModel2TextGenerator.toBuildScript(services)); |
| this.outputBuffer.appendTo(OTHER_TYPE, "launch.py", RosModel2TextGenerator.toLaunchFile(nodes)); |
| this.outputBuffer.finish(); |
| } |
| |
| } |