| /** |
| * Copyright (c) 2020 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.commons.m2t.generators; |
| |
| import java.util.ArrayList; |
| import java.util.LinkedHashSet; |
| import java.util.LinkedList; |
| 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.RunnableCall; |
| import org.eclipse.app4mc.amalthea.model.Tag; |
| import org.eclipse.app4mc.amalthea.model.Task; |
| import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.LabelTransformer; |
| import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.RunnableTransformer; |
| import org.eclipse.app4mc.transformation.util.OutputBuffer; |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.xtext.xbase.lib.Functions.Function1; |
| import org.eclipse.xtext.xbase.lib.IterableExtensions; |
| |
| public class TaskTranslationUnit extends TranslationUnit { |
| public RunnableTransformer runnableTransformer; |
| |
| public LabelTransformer labelTransformer; |
| |
| public String getBasePath() { |
| return ""; |
| } |
| |
| public String getModuleName() { |
| return this.task.getName(); |
| } |
| |
| private final Task task; |
| |
| private OutputBuffer outputBuffer; |
| |
| public TaskTranslationUnit(final OutputBuffer outputBuffer, final RunnableTransformer runnableTransformer, |
| final LabelTransformer labelTransformer, final Task task, final Component component) { |
| super(); |
| this.runnableTransformer = runnableTransformer; |
| this.labelTransformer = labelTransformer; |
| this.task = task; |
| this.outputBuffer = outputBuffer; |
| this.genFiles(); |
| } |
| |
| public TaskTranslationUnit(final OutputBuffer outputBuffer, final RunnableTransformer runnableTransformer, |
| final LabelTransformer labelTransformer, final Task task) { |
| super(); |
| this.task = task; |
| this.runnableTransformer = runnableTransformer; |
| this.labelTransformer = labelTransformer; |
| this.outputBuffer = outputBuffer; |
| } |
| |
| public void genFiles() { |
| |
| final LinkedHashSet<String> includes = new LinkedHashSet<>(); |
| final LinkedList<String> initCalls = new LinkedList<>(); |
| final LinkedList<String> stepCalls = new LinkedList<>(); |
| ActivityGraph _activityGraph = null; |
| if (this.task != null) { |
| _activityGraph = this.task.getActivityGraph(); |
| } |
| EList<ActivityGraphItem> _items = null; |
| if (_activityGraph != null) { |
| _items = _activityGraph.getItems(); |
| } |
| final Consumer<ActivityGraphItem> _function = item -> { |
| if ((item instanceof RunnableCall)) { |
| final org.eclipse.app4mc.amalthea.model.Runnable runnable = ((RunnableCall) item).getRunnable(); |
| final RunnableTranslationUnit tu = TaskTranslationUnit.this.runnableTransformer |
| .transform(((org.eclipse.app4mc.amalthea.model.Runnable) runnable)); |
| includes.add(tu.getIncFile()); |
| final Function1<Tag, Boolean> _function1 = tag -> Boolean.valueOf("initialize".equals(tag.getName())); |
| boolean _isEmpty = IterableExtensions |
| .isEmpty(IterableExtensions.<Tag>filter(((RunnableCall) item).getTags(), _function1)); |
| boolean _not = (!_isEmpty); |
| if (_not) { |
| initCalls.add(tu.getCall()); |
| } else { |
| stepCalls.add(tu.getCall()); |
| } |
| } |
| }; |
| _items.forEach(_function); |
| labelTransformer.getCache().forEach((BiConsumer<ArrayList<?>, LabelTranslationUnit>) (label, tu) -> { |
| includes.add(tu.getIncFile()); |
| initCalls.add(tu.getInitCall()); |
| }); |
| this.incAppend(TaskGenerator.toH(getModuleName())); |
| this.srcAppend(TaskGenerator.toCpp(getModuleName(), getIncFile(), includes, initCalls, stepCalls)); |
| |
| } |
| |
| public String getModulePath() { return getBasePath() + "/" + getModuleName(); } |
| |
| @Override |
| public String getIncFile() { return getModuleName() + ".hpp"; } |
| |
| @Override |
| public String getSrcFile() { return getModuleName() + ".cpp"; } |
| |
| public String getIncPath() { return getModulePath() + "/_inc/" + getIncFile(); } |
| |
| public String getSrcPath() { return getModulePath() + "/_src/" + getSrcFile(); } |
| |
| public boolean isIncFileEmpty() { |
| return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName()); |
| } |
| |
| public boolean isSrcFileEmpty() { |
| return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName()); |
| } |
| |
| public boolean incAppend(final String str) { |
| return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str); |
| } |
| |
| public boolean srcAppend(final String str) { |
| return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str); |
| } |
| } |