From 83f11b1fcd139521396ccc4bd7420655ebf9a846 Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Mon, 9 Oct 2017 13:06:34 +0000
Subject: [PATCH] Started RasPi code generation. refs 3079

---
 .../trunk/plugin.xml                          |  10 +
 .../ActuatorPWMPropertySection.java           |  71 ++++
 .../BoundedIntPositiveZeroValidator.java      |  58 +++
 ...spberryPiExecutionUnitPropertySection.java |   8 +-
 .../executable/RaspberryPIExecutable.java     | 170 +++------
 .../generator/templates/ProjectFile.stg       |  30 ++
 .../generator/templates/RasPiCTemplates.java  |  70 ++++
 .../trunk/test-data/model/SCA-CAN-Test.af3_23 | 357 ++++++++++++++++++
 8 files changed, 655 insertions(+), 119 deletions(-)
 create mode 100644 org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/ActuatorPWMPropertySection.java
 create mode 100644 org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/BoundedIntPositiveZeroValidator.java
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/ProjectFile.stg
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/RasPiCTemplates.java
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/test-data/model/SCA-CAN-Test.af3_23

diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/plugin.xml b/org.fortiss.af3.platform.raspberry.ui/trunk/plugin.xml
index ac775ed5..ad58509f 100644
--- a/org.fortiss.af3.platform.raspberry.ui/trunk/plugin.xml
+++ b/org.fortiss.af3.platform.raspberry.ui/trunk/plugin.xml
@@ -151,6 +151,16 @@
                   type="org.fortiss.af3.platform.raspberry.model.RaspberryPi">
             </input>
          </propertySection>
+         <propertySection
+               afterSection="org.fortiss.tooling.kernel.ui.internal.properties.NamedCommentedPropertySection"
+               class="org.fortiss.af3.platform.raspberry.ui.properties.ActuatorPWMPropertySection"
+               enablesFor="1"
+               id="org.fortiss.af3.platform.raspberry.ui.properties.ActuatorPWMPropertySection"
+               tab="org.fortiss.tooling.kernel.ui.property.tab.general">
+            <input
+                  type="org.fortiss.af3.platform.raspberry.model.ActuatorPWM">
+            </input>
+         </propertySection>
       </propertySections>
    </extension>
 </plugin>
diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/ActuatorPWMPropertySection.java b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/ActuatorPWMPropertySection.java
new file mode 100644
index 00000000..bf48ea02
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/ActuatorPWMPropertySection.java
@@ -0,0 +1,71 @@
+/*--------------------------------------------------------------------------+
+$Id$
+|                                                                          |
+| Copyright 2013 ForTISS GmbH                     |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.platform.raspberry.ui.properties;
+
+import static org.fortiss.af3.expression.ui.databinding.validate.IntToStringConverter.INT_STRING_CONVERTER;
+import static org.fortiss.af3.expression.ui.databinding.validate.StringToIntConverter.STRING_INT_CONVERTER;
+import static org.fortiss.tooling.kernel.ui.util.DataBindingUtils.performComplexTextBinding;
+import static org.fortiss.tooling.kernel.ui.util.ObservableUtils.observeValue;
+
+import org.conqat.ide.commons.ui.databinding.validate.TextToIntegerValidator;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.fortiss.af3.platform.raspberry.model.ActuatorPWM;
+import org.fortiss.af3.platform.raspberry.model.RaspberryPiModelPackage;
+import org.fortiss.tooling.kernel.ui.extension.base.PropertySectionBase;
+
+/**
+ * Property section for {@link ActuatorPWM}s.
+ * 
+ * @author hoelzl
+ * @author $Author$
+ * @version $Rev$
+ * @ConQAT.Rating GREEN Hash: 9E768B733BD37201F97399293FA0DFA7
+ */
+public class ActuatorPWMPropertySection extends PropertySectionBase {
+	/** The actuator. */
+	private ActuatorPWM actuator;
+	/** The PWM channel widget. */
+	private Text pwmChannelText;
+
+	/** {@inheritDoc} */
+	@Override
+	public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
+		super.createControls(parent, tabbedPropertySheetPage);
+		pwmChannelText = createDecoratedText("PWM Channel (0, 1)");
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void setSectionInput(Object input) {
+		actuator = (ActuatorPWM)input;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void refresh() {
+		super.refresh();
+		IObservableValue modelObservable =
+				observeValue(actuator, RaspberryPiModelPackage.Literals.ACTUATOR_PWM__CHANNEL_ID);
+		performComplexTextBinding(dbc, pwmChannelText, modelObservable, INT_STRING_CONVERTER,
+				STRING_INT_CONVERTER, TextToIntegerValidator.INSTANCE,
+				new BoundedIntPositiveZeroValidator(0, 1));
+	}
+}
diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/BoundedIntPositiveZeroValidator.java b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/BoundedIntPositiveZeroValidator.java
new file mode 100644
index 00000000..7b5f5c6a
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/BoundedIntPositiveZeroValidator.java
@@ -0,0 +1,58 @@
+/*--------------------------------------------------------------------------+
+$Id$
+|                                                                          |
+| Copyright 2017 fortiss GmbH                     |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.platform.raspberry.ui.properties;
+
+import org.eclipse.core.databinding.validation.ValidationStatus;
+import org.eclipse.core.runtime.IStatus;
+import org.fortiss.tooling.base.ui.databinding.NumberPositiveZeroValidator;
+
+/**
+ * A {@link NumberPositiveZeroValidator} with boundary checking for int values.
+ * 
+ * @author hoelzl
+ * @author $Author$
+ * @version $Rev$
+ * @ConQAT.Rating RED Hash:
+ */
+public class BoundedIntPositiveZeroValidator extends NumberPositiveZeroValidator {
+	/** The lower bound. */
+	private final int lowerBound;
+	/** The upper bound. */
+	private final int upperBound;
+
+	/** Constructor. */
+	public BoundedIntPositiveZeroValidator(int lower, int upper) {
+		this.lowerBound = lower;
+		this.upperBound = upper;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IStatus validate(Object value) {
+		IStatus status = super.validate(value);
+		if(status == ValidationStatus.ok()) {
+			double dval = ((Number)value).doubleValue();
+			if(dval >= lowerBound && dval <= upperBound) {
+				return ValidationStatus.ok();
+			}
+			return ValidationStatus.cancel("Value must be between " + lowerBound + " and " +
+					upperBound + "!");
+		}
+		return status;
+	}
+}
diff --git a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/RaspberryPiExecutionUnitPropertySection.java b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/RaspberryPiExecutionUnitPropertySection.java
index 548aada7..11190dff 100644
--- a/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/RaspberryPiExecutionUnitPropertySection.java
+++ b/org.fortiss.af3.platform.raspberry.ui/trunk/src/org/fortiss/af3/platform/raspberry/ui/properties/RaspberryPiExecutionUnitPropertySection.java
@@ -24,7 +24,6 @@ import static org.fortiss.af3.expression.ui.databinding.validate.StringToIntConv
 import static org.fortiss.tooling.kernel.ui.util.DataBindingUtils.performComplexTextBinding;
 import static org.fortiss.tooling.kernel.ui.util.ObservableUtils.observeValue;
 
-import org.conqat.ide.commons.ui.databinding.validate.NumberPositiveValidator;
 import org.conqat.ide.commons.ui.databinding.validate.TextToIntegerValidator;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
 import org.eclipse.swt.SWT;
@@ -45,10 +44,9 @@ import org.fortiss.tooling.kernel.ui.extension.base.PropertySectionBase;
  * @ConQAT.Rating GREEN Hash: 9E768B733BD37201F97399293FA0DFA7
  */
 public class RaspberryPiExecutionUnitPropertySection extends PropertySectionBase {
-
 	/** The execution unit. */
 	private RaspberryPi unit;
-	/** The virtual keyboard port number widget. */
+	/** The CAN ID of this unit. */
 	private Text canCoordinationIDText;
 	/** The cycle time widget. */
 	private Text cycleTimeText;
@@ -85,13 +83,13 @@ public class RaspberryPiExecutionUnitPropertySection extends PropertySectionBase
 						RaspberryPiModelPackage.Literals.RASPBERRY_PI__CAN_COORDINATION_ID);
 		performComplexTextBinding(dbc, canCoordinationIDText, modelObservable,
 				INT_STRING_CONVERTER, STRING_INT_CONVERTER, TextToIntegerValidator.INSTANCE,
-				new NumberPositiveValidator());
+				new BoundedIntPositiveZeroValidator(245, 255));
 
 		modelObservable =
 				observeValue(unit, RaspberryPiModelPackage.Literals.RASPBERRY_PI__CYCLE_TIME);
 		performComplexTextBinding(dbc, cycleTimeText, modelObservable, INT_STRING_CONVERTER,
 				STRING_INT_CONVERTER, TextToIntegerValidator.INSTANCE,
-				new NumberPositiveValidator());
+				new BoundedIntPositiveZeroValidator(20, 10000));
 
 		modelObservable =
 				observeValue(unit, RaspberryPiModelPackage.Literals.RASPBERRY_PI__IP_ADDRESS);
diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/RaspberryPIExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/RaspberryPIExecutable.java
index 6417443a..2eec8c5c 100644
--- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/RaspberryPIExecutable.java
+++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/RaspberryPIExecutable.java
@@ -17,55 +17,51 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
 +--------------------------------------------------------------------------*/
 package org.fortiss.af3.platform.raspberry.generator.executable;
 
-import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.funcCall;
+import static org.fortiss.af3.expression.utils.ExpressionModelElementFactory.createDataDictionary;
 import static org.fortiss.af3.generator.common.utils.CLanguageModelElementFacade.addUserHeaderInclude;
+import static org.fortiss.af3.generator.common.utils.CLanguageModelElementFactory.createCSourcePackage;
 import static org.fortiss.af3.generator.common.utils.SourceModelElementFactory.createByteContentUnitForPluginFile;
+import static org.fortiss.af3.platform.raspberry.generator.templates.RasPiCTemplates.getEclipseProjectFile;
+import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.getRootElement;
+import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
+import static org.fortiss.tooling.kernel.utils.TransformationUtils.createTransformedObjectFor;
 
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.util.List;
-import java.util.Set;
 
 import org.conqat.lib.commons.collections.Pair;
 import org.fortiss.af3.component.model.Component;
-import org.fortiss.af3.component.model.InputPort;
-import org.fortiss.af3.component.model.OutputPort;
 import org.fortiss.af3.component.model.Port;
-import org.fortiss.af3.component.model.generator.ComponentFunction;
-import org.fortiss.af3.component.model.generator.LocalFunction;
+import org.fortiss.af3.component.model.generator.ComponentProgram;
+import org.fortiss.af3.expression.model.DataDictionary;
 import org.fortiss.af3.expression.model.terms.IExpressionTerm;
-import org.fortiss.af3.expression.model.terms.imperative.IStatementTerm;
 import org.fortiss.af3.generator.common.model.c.CSourcePackage;
 import org.fortiss.af3.generator.common.model.source.SourceUnit;
-import org.fortiss.af3.platform.generic.generator.executable.GenericExecutionUnitExecutable;
-import org.fortiss.af3.platform.language.executable.IInitializableExecutable;
-import org.fortiss.af3.platform.language.executable.IReadableExecutable;
-import org.fortiss.af3.platform.language.executable.ITerminatableExecutable;
-import org.fortiss.af3.platform.language.executable.IWritableExecutable;
+import org.fortiss.af3.platform.language.executable.ExecutionUnitExecutableBase;
 import org.fortiss.af3.platform.model.ExecutionUnit;
 import org.fortiss.af3.platform.model.PlatformConnectorUnit;
-import org.fortiss.af3.platform.model.generic.GenericTransceiver;
 import org.fortiss.af3.platform.raspberry.AF3PlatformRaspberryActivator;
 import org.fortiss.af3.platform.raspberry.model.RaspberryPi;
 import org.fortiss.tooling.kernel.extension.data.ITransformationContext;
+import org.fortiss.tooling.kernel.extension.exception.ChainTransformationFailedException;
 
 /**
- * {@link IInitializableExecutable} and {@link ITerminatableExecutable} for the {@link RaspberryPi}
- * platform.
- * 
+ * {@link ExecutionUnitExecutableBase} for the {@link RaspberryPi} platform.
  * 
  * @author eder
+ * @author hoelzl
  * @author $Author: eder $
  * @version $Rev: 18709 $
  * @ConQAT.Rating RED Hash:
  */
-public class RaspberryPIExecutable extends GenericExecutionUnitExecutable {
+public class RaspberryPIExecutable extends ExecutionUnitExecutableBase<RaspberryPi, CSourcePackage> {
 
 	private static final String SRC_LIB_SUB_PACKAGE_NAME = "src-lib";
 	private static final String INC_LIB_SUB_PACKAGE_NAME = "inc-lib";
 
 	/** Constructor. */
-	public RaspberryPIExecutable(ExecutionUnit modelElement) {
+	public RaspberryPIExecutable(RaspberryPi modelElement) {
 		super(modelElement);
 	}
 
@@ -74,60 +70,51 @@ public class RaspberryPIExecutable extends GenericExecutionUnitExecutable {
 	protected CSourcePackage createExecutionUnitSourcePackage(String name,
 			List<Pair<ExecutionUnit, Component>> deployedComponents,
 			List<Pair<PlatformConnectorUnit, Port>> deployedPorts, ITransformationContext context) {
-
-		CSourcePackage pkg =
-				super.createExecutionUnitSourcePackage(name, deployedComponents, deployedPorts,
-						context);
-
-		// get system.h to add references to self-defined inc files
-		SourceUnit system = pkg.getSrcGenPackage().findSourceUnitByName("system.c");
-
-		// Add source/header files here to be copied into the deployment directory
+		// create the result package
+		CSourcePackage sourcePackage = createCSourcePackage();
+		sourcePackage.setBaseLocation(name);
 		try {
-			/** COMPONENTS **/
-
-			addFile(pkg, "src/main.c");
-
-			// reference is added by GenericExecutableBase -> only add file
-			addFile(pkg, "inc/io.h");
-			addFile(pkg, "src/io.c");
-
-			// add all components including references
-			addFilesWithReference(pkg, system, "CanConnector");
-			addFilesWithReference(pkg, system, "Gamepad");
-			addFilesWithReference(pkg, system, "GPIO");
-			addFilesWithReference(pkg, system, "IMU");
-			addFilesWithReference(pkg, system, "LaserRangeFinder");
-			addFilesWithReference(pkg, system, "LaserScanner");
-			addFilesWithReference(pkg, system, "PWM");
-
-			/** LIBRARIES **/
-
-			// add UART lib
-			addFile(pkg, "inc/libuart.h");
-			addFile(pkg, "src/libuart.c");
-			addFile(pkg, "inc/libmaestro.h");
-			addFile(pkg, "src/libmaestro.c");
-			addFile(pkg, "inc/libcansocket.h");
-			addFile(pkg, "src/libcansocket.c");
-
-			/** FIXES AND PATCHES **/
-
-			// overwrite data_dictionary, the new one has all functions
-			// required for the simulation commented out so there are no
-			// conflicts
-			addFile(pkg, "inc-gen/data_dictionary.h");
-			addFile(pkg, "src-gen/data_dictionary.c");
+			addDataDictionaryCode(context, sourcePackage);
+			addLogicalComponentCode(deployedComponents, context, sourcePackage);
+			addEclipseCProjectFiles(sourcePackage, modelElement.getName());
+		} catch(Exception ex) {
+			error(AF3PlatformRaspberryActivator.getDefault(), ex.getMessage(), ex);
+			ex.printStackTrace();
+		}
+		return sourcePackage;
+	}
 
-			// overwrite Makedefs, the new one uses -std=gnu99 instead of -std=c99
-			// so libuart compiles properly
-			addFile(pkg, "Makedefs");
+	/** Adds auxiliary files for Eclipse C project. */
+	private void addEclipseCProjectFiles(CSourcePackage sourcePackage, String projectName) {
+		sourcePackage.addUnit(getEclipseProjectFile(projectName));
+	}
 
-		} catch(IOException | URISyntaxException e) {
-			throw new RuntimeException("could not add header and source files from lib", e);
+	/** Creates the code for all deployed components. */
+	private void addLogicalComponentCode(List<Pair<ExecutionUnit, Component>> deployedComponents,
+			ITransformationContext context, CSourcePackage sourcePackage)
+			throws ChainTransformationFailedException {
+		for(Pair<ExecutionUnit, Component> pair : deployedComponents) {
+			if(pair.getFirst() != modelElement) {
+				continue;
+			}
+			Component cmp = pair.getSecond();
+			ComponentProgram cprog =
+					createTransformedObjectFor(cmp, ComponentProgram.class, context);
+			CSourcePackage cPack = createTransformedObjectFor(cprog, CSourcePackage.class, context);
+			cPack.mergeInto(sourcePackage);
 		}
+	}
 
-		return pkg;
+	/** Creates the code for the data dictionary. */
+	private void
+			addDataDictionaryCode(ITransformationContext context, CSourcePackage sourcePackage)
+					throws ChainTransformationFailedException {
+		DataDictionary dd = getRootElement(modelElement, DataDictionary.class);
+		if(dd == null) {
+			dd = createDataDictionary();
+		}
+		CSourcePackage ddPackage = createTransformedObjectFor(dd, CSourcePackage.class, context);
+		ddPackage.mergeInto(sourcePackage);
 	}
 
 	private static void addFilesWithReference(CSourcePackage pkg, SourceUnit source,
@@ -147,60 +134,15 @@ public class RaspberryPIExecutable extends GenericExecutionUnitExecutable {
 		addUserHeaderInclude(source, reference);
 	}
 
-	/** {@inheritDoc} */
-	@Override
-	protected ComponentFunction createInitializeFunction(
-			List<Pair<ExecutionUnit, Component>> deployedComponents,
-			Set<PlatformConnectorUnit> usedUnits) {
-		return super.createInitializeFunction(deployedComponents, usedUnits);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected void
-			createReadAccess(IReadableExecutable exec, InputPort p, List<IStatementTerm> body) {
-		super.createReadAccess(exec, p, body);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected LocalFunction createReadInputFunction(
-			List<Pair<PlatformConnectorUnit, Port>> deployedPorts,
-			Set<GenericTransceiver> usedTransceivers) {
-		return super.createReadInputFunction(deployedPorts, usedTransceivers);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected ComponentFunction createStepFunction(
-			List<Pair<ExecutionUnit, Component>> deployedComponents,
-			List<Pair<PlatformConnectorUnit, Port>> deployedPorts,
-			Set<GenericTransceiver> usedTransceivers) {
-		return super.createStepFunction(deployedComponents, deployedPorts, usedTransceivers);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected LocalFunction createTerminationFunction(Set<PlatformConnectorUnit> usedUnits) {
-		return super.createTerminationFunction(usedUnits);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected void createWriteAccess(IWritableExecutable exec, OutputPort p,
-			List<IStatementTerm> body) {
-		super.createWriteAccess(exec, p, body);
-	}
-
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getInitialization() {
-		return funcCall("init_raspberryPI_ecu");
+		return null;
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getTermination() {
-		return funcCall("term_raspberryPI_ecu");
+		return null;
 	}
 }
diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/ProjectFile.stg b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/ProjectFile.stg
new file mode 100644
index 00000000..743d23b1
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/ProjectFile.stg
@@ -0,0 +1,30 @@
+group ProjectFile;
+
+ProjectFile(projectname) ::= <<
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>$projectname$</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
+>>
\ No newline at end of file
diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/RasPiCTemplates.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/RasPiCTemplates.java
new file mode 100644
index 00000000..ba111b33
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/templates/RasPiCTemplates.java
@@ -0,0 +1,70 @@
+/*--------------------------------------------------------------------------+
+$Id$
+|                                                                          |
+| Copyright 2017 fortiss GmbH                     |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.af3.platform.raspberry.generator.templates;
+
+import static org.fortiss.af3.generator.common.AF3GeneratorCommonActivator.getDefault;
+import static org.fortiss.af3.generator.common.utils.SourceModelElementFactory.createStaticContentSourceUnit;
+import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.antlr.stringtemplate.StringTemplate;
+import org.antlr.stringtemplate.StringTemplateGroup;
+import org.antlr.stringtemplate.language.DefaultTemplateLexer;
+import org.fortiss.af3.generator.common.model.source.AbstractUnit;
+import org.fortiss.af3.generator.common.model.source.StaticContentSourceUnit;
+
+/**
+ * Templates used by the RasPi C code generator.
+ * 
+ * @author hoelzl
+ * @author $Author$
+ * @version $Rev$
+ * @ConQAT.Rating RED Hash:
+ */
+public final class RasPiCTemplates {
+	/** Returns the '.project' file used for Eclipse project. */
+	public static AbstractUnit getEclipseProjectFile(String projectName) {
+		StringTemplate template = makeTemplate("ProjectFile.stg", "ProjectFile");
+		template.setAttribute("projectname", projectName);
+		StaticContentSourceUnit unit =
+				createStaticContentSourceUnit(".project", template.toString(), false);
+		return unit;
+	}
+
+	/** Evaluates the given template. */
+	protected static StringTemplate makeTemplate(String stgFile, String instance) {
+		StringTemplateGroup stg = loadResourceSTG(stgFile);
+		StringTemplate st = stg.getInstanceOf(instance);
+		return st;
+	}
+
+	/** Loads the given template using the class loader of the given class. */
+	private static StringTemplateGroup loadResourceSTG(String stgName) {
+		InputStreamReader in =
+				new InputStreamReader(RasPiCTemplates.class.getResourceAsStream(stgName));
+		StringTemplateGroup templates = new StringTemplateGroup(in, DefaultTemplateLexer.class);
+		try {
+			in.close();
+		} catch(IOException e) {
+			error(getDefault(), "AF3 generator could not load stringtemplate " + stgName + ".", e);
+		}
+		return templates;
+	}
+}
diff --git a/org.fortiss.af3.platform.raspberry/trunk/test-data/model/SCA-CAN-Test.af3_23 b/org.fortiss.af3.platform.raspberry/trunk/test-data/model/SCA-CAN-Test.af3_23
new file mode 100644
index 00000000..5dfe74be
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/test-data/model/SCA-CAN-Test.af3_23
@@ -0,0 +1,357 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<org-fortiss-af3-project:FileProject xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:org-fortiss-af3-component="http://www.fortiss.org/af3/component" xmlns:org-fortiss-af3-component-annotation="http://www.fortiss.org/af3/component/annotation" xmlns:org-fortiss-af3-component-behavior-code="http://www.fortiss.org/af3/component/behavior/code" xmlns:org-fortiss-af3-deployment="http://www.fortiss.org/af3/deployment" xmlns:org-fortiss-af3-expression="http://www.fortiss.org/af3/expression" xmlns:org-fortiss-af3-expression-definitions="http://www.fortiss.org/af3/expression/definitions" xmlns:org-fortiss-af3-expression-terms="http://www.fortiss.org/af3/expression/terms" xmlns:org-fortiss-af3-expression-terms-imperative="http://www.fortiss.org/af3/expression/terms/imperative" xmlns:org-fortiss-af3-expression-types="http://www.fortiss.org/af3/expression/types" xmlns:org-fortiss-af3-platform="http://www.fortiss.org/af3/platform" xmlns:org-fortiss-af3-platform-annotation="http://www.fortiss.org/af3/platform/annotation" xmlns:org-fortiss-af3-platform-raspberry="http://www.fortiss.org/af3/platform/raspberry" xmlns:org-fortiss-af3-platform-raspberry-gamepad="http://www.fortiss.org/af3/platform/raspberry/gamepad" xmlns:org-fortiss-af3-project="http://www.fortiss.org/af3/project" xmlns:org-fortiss-af3-project-configuration="http://www.fortiss.org/af3/project/configuration" xmlns:org-fortiss-af3-project-development="http://www.fortiss.org/af3/project/development" xmlns:org-fortiss-af3-project-execution="http://www.fortiss.org/af3/project/execution" xmlns:org-fortiss-af3-safety-annotation="http://www.fortiss.org/af3/safety/annotation" xmlns:org-fortiss-af3-timing-annotation="http://www.fortiss.org/af3/timing/annotation" xmlns:org-fortiss-tooling-base-model-layout="http://www.fortiss.org/tooling/base/model/layout" xmi:id="0" name="SCA-CAN Test" af3Version="2.11.0.qualifier">
+  <rootElements xsi:type="org-fortiss-af3-project:ProjectConfiguration" xmi:id="1" id="1">
+    <configurationElements xsi:type="org-fortiss-af3-project-configuration:TypeSystemConfiguration" xmi:id="2" id="2">
+      <typesystem xsi:type="org-fortiss-af3-expression:MicroTypeSystem"/>
+    </configurationElements>
+    <configurationElements xsi:type="org-fortiss-af3-project-configuration:DevelopmentProcessConfiguration" xmi:id="3" id="3">
+      <development xsi:type="org-fortiss-af3-project-development:ConstraintBasedDevelopmentProcess" currentObjective="4" constraintInstanceContainer="3">
+        <configurations xmi:id="4" id="4" name="Default configuration"/>
+      </development>
+    </configurationElements>
+  </rootElements>
+  <rootElements xsi:type="org-fortiss-af3-expression:DataDictionary" xmi:id="5" id="5">
+    <typeDefinitions xsi:type="org-fortiss-af3-expression-definitions:Enumeration" xmi:id="46" id="46" name="MyEnum">
+      <members xmi:id="47" id="47" name="First"/>
+      <members xmi:id="48" id="48" name="Second"/>
+    </typeDefinitions>
+  </rootElements>
+  <rootElements xsi:type="org-fortiss-af3-component:ComponentArchitecture" xmi:id="6" id="6" name="Component Architecture" referencedBy="//@rootElements.5/@componentArchitectureReference">
+    <containedElements xsi:type="org-fortiss-af3-component:Component" xmi:id="7" id="7" name="SCATest" comment="">
+      <containedElements xsi:type="org-fortiss-af3-component:Component" xmi:id="12" id="12" name="Gamepad_Input" comment="">
+        <specifications xsi:type="org-fortiss-af3-component:CausalityComponentSpecification" xmi:id="13" id="13" stronglyCausal="true"/>
+        <specifications xsi:type="org-fortiss-af3-component:VerifBehaviourComponentSpecification" xmi:id="14" id="14"/>
+        <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="15" id="15"/>
+        <specifications xsi:type="org-fortiss-af3-component-annotation:MemoryRequirement" xmi:id="16" id="16"/>
+        <specifications xsi:type="org-fortiss-af3-component-behavior-code:CodeSpecification" xmi:id="60" id="60">
+          <body>
+            <statements xsi:type="org-fortiss-af3-expression-terms-imperative:IfThenElse">
+              <guard xsi:type="org-fortiss-af3-expression-terms:FunctionCall">
+                <function xsi:type="org-fortiss-af3-expression-terms:PredefinedFunction" operator="GreaterThan"/>
+                <arguments xsi:type="org-fortiss-af3-expression-terms:Var" identifier="Button_1"/>
+                <arguments xsi:type="org-fortiss-af3-expression-terms:IntConst"/>
+              </guard>
+              <thenBlock>
+                <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Assignment">
+                  <variable identifier="sensorInput"/>
+                  <value xsi:type="org-fortiss-af3-expression-terms:IntConst" value="1"/>
+                </statements>
+              </thenBlock>
+              <elseBlock>
+                <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Assignment">
+                  <variable identifier="sensorInput"/>
+                  <value xsi:type="org-fortiss-af3-expression-terms:IntConst"/>
+                </statements>
+              </elseBlock>
+            </statements>
+            <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Return"/>
+          </body>
+        </specifications>
+        <connectors xsi:type="org-fortiss-af3-component:OutputPort" xmi:id="36" id="36" name="sensorInput" comment="" outgoing="40">
+          <specifications xsi:type="org-fortiss-af3-component:PortSpecification" xmi:id="37" id="37">
+            <type xsi:type="org-fortiss-af3-expression-types:TInt" lowerBound="0"/>
+            <initialValue xsi:type="org-fortiss-af3-expression-terms:IntConst"/>
+          </specifications>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="24" orientation="EAST"/>
+        </connectors>
+        <connectors xsi:type="org-fortiss-af3-component:InputPort" xmi:id="41" id="41" name="Button_1" comment="">
+          <specifications xsi:type="org-fortiss-af3-component:PortSpecification" xmi:id="42" id="42" NoValAllowed="false">
+            <type xsi:type="org-fortiss-af3-expression-types:TInt" lowerBound="0" upperBound="1"/>
+            <initialValue xsi:type="org-fortiss-af3-expression-terms:DefinedConst" value="NoVal"/>
+          </specifications>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="24" orientation="WEST"/>
+        </connectors>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos" x="24" y="144"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="217" height="121"/>
+      </containedElements>
+      <containedElements xsi:type="org-fortiss-af3-component:Component" xmi:id="22" id="22" name="Coordinator" comment="">
+        <specifications xsi:type="org-fortiss-af3-component:CausalityComponentSpecification" xmi:id="23" id="23" stronglyCausal="true"/>
+        <specifications xsi:type="org-fortiss-af3-component:VerifBehaviourComponentSpecification" xmi:id="24" id="24"/>
+        <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="25" id="25"/>
+        <specifications xsi:type="org-fortiss-af3-component-annotation:MemoryRequirement" xmi:id="26" id="26"/>
+        <specifications xsi:type="org-fortiss-af3-component-behavior-code:CodeSpecification" xmi:id="61" id="61">
+          <body>
+            <statements xsi:type="org-fortiss-af3-expression-terms-imperative:IfThenElse">
+              <guard xsi:type="org-fortiss-af3-expression-terms:FunctionCall">
+                <function xsi:type="org-fortiss-af3-expression-terms:PredefinedFunction" operator="Equal"/>
+                <arguments xsi:type="org-fortiss-af3-expression-terms:Var" identifier="sensorInput"/>
+                <arguments xsi:type="org-fortiss-af3-expression-terms:IntConst"/>
+              </guard>
+              <thenBlock>
+                <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Assignment">
+                  <variable identifier="actuatorOutput"/>
+                  <value xsi:type="org-fortiss-af3-expression-terms:IntConst" value="6000"/>
+                </statements>
+              </thenBlock>
+              <elseBlock>
+                <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Assignment">
+                  <variable identifier="actuatorOutput"/>
+                  <value xsi:type="org-fortiss-af3-expression-terms:IntConst"/>
+                </statements>
+              </elseBlock>
+            </statements>
+            <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Return"/>
+          </body>
+        </specifications>
+        <connectors xsi:type="org-fortiss-af3-component:InputPort" xmi:id="38" id="38" name="sensorInput" comment="" incoming="40">
+          <specifications xsi:type="org-fortiss-af3-component:PortSpecification" xmi:id="39" id="39">
+            <type xsi:type="org-fortiss-af3-expression-types:TInt" lowerBound="0"/>
+            <initialValue xsi:type="org-fortiss-af3-expression-terms:IntConst"/>
+          </specifications>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="24" orientation="WEST"/>
+        </connectors>
+        <connectors xsi:type="org-fortiss-af3-component:OutputPort" xmi:id="53" id="53" name="actuatorOutput" comment="" outgoing="57">
+          <specifications xsi:type="org-fortiss-af3-component:PortSpecification" xmi:id="54" id="54">
+            <type xsi:type="org-fortiss-af3-expression-types:TInt" lowerBound="0" upperBound="6000"/>
+            <initialValue xsi:type="org-fortiss-af3-expression-terms:DefinedConst" value="NoVal"/>
+          </specifications>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="24" orientation="EAST"/>
+        </connectors>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos" x="420" y="144"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="217" height="121"/>
+      </containedElements>
+      <containedElements xsi:type="org-fortiss-af3-component:Component" xmi:id="27" id="27" name="PWM Output" comment="">
+        <specifications xsi:type="org-fortiss-af3-component:CausalityComponentSpecification" xmi:id="28" id="28" stronglyCausal="true"/>
+        <specifications xsi:type="org-fortiss-af3-component:VerifBehaviourComponentSpecification" xmi:id="29" id="29"/>
+        <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="30" id="30"/>
+        <specifications xsi:type="org-fortiss-af3-component-annotation:MemoryRequirement" xmi:id="31" id="31"/>
+        <specifications xsi:type="org-fortiss-af3-component-behavior-code:CodeSpecification" xmi:id="62" id="62">
+          <body>
+            <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Assignment">
+              <variable identifier="PWM"/>
+              <value xsi:type="org-fortiss-af3-expression-terms:Var" identifier="actuatorOutput"/>
+            </statements>
+            <statements xsi:type="org-fortiss-af3-expression-terms-imperative:Return"/>
+          </body>
+        </specifications>
+        <connectors xsi:type="org-fortiss-af3-component:InputPort" xmi:id="55" id="55" name="actuatorOutput" comment="" incoming="57">
+          <specifications xsi:type="org-fortiss-af3-component:PortSpecification" xmi:id="56" id="56">
+            <type xsi:type="org-fortiss-af3-expression-types:TInt" lowerBound="0" upperBound="6000"/>
+            <initialValue xsi:type="org-fortiss-af3-expression-terms:DefinedConst" value="NoVal"/>
+          </specifications>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="24" orientation="WEST"/>
+        </connectors>
+        <connectors xsi:type="org-fortiss-af3-component:OutputPort" xmi:id="58" id="58" name="PWM" comment="">
+          <specifications xsi:type="org-fortiss-af3-component:PortSpecification" xmi:id="59" id="59" NoValAllowed="false">
+            <type xsi:type="org-fortiss-af3-expression-types:TInt" lowerBound="0" upperBound="6000"/>
+            <initialValue xsi:type="org-fortiss-af3-expression-terms:DefinedConst" value="NoVal"/>
+          </specifications>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+          <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="24" orientation="EAST"/>
+        </connectors>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos" x="912" y="144"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="217" height="121"/>
+      </containedElements>
+      <specifications xsi:type="org-fortiss-af3-component:CausalityComponentSpecification" xmi:id="8" id="8"/>
+      <specifications xsi:type="org-fortiss-af3-component:VerifBehaviourComponentSpecification" xmi:id="9" id="9"/>
+      <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="43" id="43"/>
+      <specifications xsi:type="org-fortiss-af3-component-annotation:MemoryRequirement" xmi:id="44" id="44"/>
+      <connections xsi:type="org-fortiss-af3-component:Channel" xmi:id="40" id="40" name="sensorInput" comment="" source="36" target="38">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+      </connections>
+      <connections xsi:type="org-fortiss-af3-component:Channel" xmi:id="57" id="57" name="actuatorOutput" comment="" source="53" target="55">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+      </connections>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="216" height="72"/>
+    </containedElements>
+    <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="45" id="45"/>
+  </rootElements>
+  <rootElements xsi:type="org-fortiss-af3-project-execution:ExecutionConfigurationStore" xmi:id="114" id="114">
+    <configurations xmi:id="115" id="115" name="Execonf" comment="" idReference="11"/>
+  </rootElements>
+  <rootElements xsi:type="org-fortiss-af3-platform:PlatformArchitecture" xmi:id="116" id="116" name="Platform Architecture" comment="" referencedBy="//@rootElements.5/@platformArchitectureReference">
+    <containedElements xsi:type="org-fortiss-af3-platform-raspberry:RaspberryPi" xmi:id="117" id="117" name="SensorUnit" canCoordinationID="253" ipAddress="192.168.21.241" cycleTime="100">
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:PowerConsumption" xmi:id="118" id="118"/>
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:HardwareCost" xmi:id="119" id="119"/>
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:MemoryPerNode" xmi:id="120" id="120"/>
+      <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="121" id="121"/>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry:CanConnector" xmi:id="137" id="137" name="CanConnector253" outgoing="143">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="96" orientation="SOUTH"/>
+      </connectors>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry-gamepad:Button1" xmi:id="146" id="146" name="Button1_Triangle">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="36" orientation="WEST"/>
+      </connectors>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos" x="84" y="72"/>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="241" height="277"/>
+    </containedElements>
+    <containedElements xsi:type="org-fortiss-af3-platform-raspberry:RaspberryPi" xmi:id="122" id="122" name="CoordinatorUnit" comment="" canCoordinationID="254" ipAddress="192.168.21.242" coordinatorUnit="true" cycleTime="100">
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:PowerConsumption" xmi:id="123" id="123"/>
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:HardwareCost" xmi:id="124" id="124"/>
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:MemoryPerNode" xmi:id="125" id="125"/>
+      <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="126" id="126"/>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry:CanConnector" xmi:id="138" id="138" name="CanConnector254" outgoing="144">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="96" orientation="SOUTH"/>
+      </connectors>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos" x="384" y="72"/>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="241" height="277"/>
+    </containedElements>
+    <containedElements xsi:type="org-fortiss-af3-platform-raspberry:RaspberryPi" xmi:id="128" id="128" name="ActuatorUnit" canCoordinationID="255" ipAddress="192.168.21.243" cycleTime="100">
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:PowerConsumption" xmi:id="129" id="129"/>
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:HardwareCost" xmi:id="130" id="130"/>
+      <specifications xsi:type="org-fortiss-af3-platform-annotation:MemoryPerNode" xmi:id="131" id="131"/>
+      <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="132" id="132"/>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry:CanConnector" xmi:id="139" id="139" name="CanConnector255" outgoing="145">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="96" orientation="SOUTH"/>
+      </connectors>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry:ActuatorPWM" xmi:id="147" id="147" name="PWM">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="24" orientation="EAST"/>
+      </connectors>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos" x="684" y="72"/>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="241" height="277"/>
+    </containedElements>
+    <containedElements xsi:type="org-fortiss-af3-platform-raspberry:CanBus" xmi:id="134" id="134" name="CanBus">
+      <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="135" id="135"/>
+      <specifications xsi:type="org-fortiss-af3-timing-annotation:TransmissionUnitBandwidth" xmi:id="136" id="136"/>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry:CanConnector" xmi:id="140" id="140" name="CanConnector253" incoming="143">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="96"/>
+      </connectors>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry:CanConnector" xmi:id="141" id="141" name="CanConnector254" incoming="144">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="396"/>
+      </connectors>
+      <connectors xsi:type="org-fortiss-af3-platform-raspberry:CanConnector" xmi:id="142" id="142" name="CanConnector255" incoming="145">
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="108" height="72"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="cpos"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="cdim" width="0" height="0"/>
+        <layoutData xsi:type="org-fortiss-tooling-base-model-layout:OffsetOrientation" key="coffsetorient" offset="696"/>
+      </connectors>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Point" key="pos" x="84" y="384"/>
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Dimension" key="dim" width="841" height="72"/>
+    </containedElements>
+    <specifications xsi:type="org-fortiss-af3-safety-annotation:SafetyIntegrityLevel" xmi:id="127" id="127"/>
+    <connections xsi:type="org-fortiss-af3-platform:TransmissionConnection" xmi:id="143" id="143" name="CanConnector253" comment="" source="137" target="140">
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+    </connections>
+    <connections xsi:type="org-fortiss-af3-platform:TransmissionConnection" xmi:id="144" id="144" name="CanConnector254" comment="" source="138" target="141">
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+    </connections>
+    <connections xsi:type="org-fortiss-af3-platform:TransmissionConnection" xmi:id="145" id="145" name="CanConnector255" comment="" source="139" target="142">
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+    </connections>
+  </rootElements>
+  <rootElements xsi:type="org-fortiss-af3-deployment:Deployment" xmi:id="148" id="148" name="Deployment">
+    <componentArchitectureReference reference="6"/>
+    <platformArchitectureReference reference="116"/>
+    <componentAllocations xmi:id="149" id="149" component="12" executionUnit="117">
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+    </componentAllocations>
+    <componentAllocations xmi:id="150" id="150" component="22" executionUnit="122">
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+    </componentAllocations>
+    <componentAllocations xmi:id="151" id="151" component="27" executionUnit="128">
+      <layoutData xsi:type="org-fortiss-tooling-base-model-layout:Points" key="points"/>
+    </componentAllocations>
+    <portAllocations xsi:type="org-fortiss-af3-deployment:InputPortAllocation" inputPort="41" receiver="146"/>
+    <portAllocations xsi:type="org-fortiss-af3-deployment:OutputPortAllocation" outputPort="58" transmitter="147"/>
+    <portAllocations xsi:type="org-fortiss-af3-deployment:TransceiverAllocation" port="36" transceiver="137"/>
+    <portAllocations xsi:type="org-fortiss-af3-deployment:TransceiverAllocation" port="38" transceiver="138"/>
+    <portAllocations xsi:type="org-fortiss-af3-deployment:TransceiverAllocation" port="53" transceiver="138"/>
+    <portAllocations xsi:type="org-fortiss-af3-deployment:TransceiverAllocation" port="55" transceiver="139"/>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="152" id="152" component="12" executionUnit="117">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="153" id="153"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="154" id="154" component="12" executionUnit="122">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="155" id="155"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="156" id="156" component="12" executionUnit="128">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="157" id="157"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="158" id="158" component="22" executionUnit="117">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="159" id="159"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="160" id="160" component="22" executionUnit="122">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="161" id="161"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="162" id="162" component="22" executionUnit="128">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="163" id="163"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="164" id="164" component="27" executionUnit="117">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="165" id="165"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="166" id="166" component="27" executionUnit="122">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="167" id="167"/>
+      </value>
+    </deploymentParameterMap>
+    <deploymentParameterMap>
+      <key/>
+      <value xmi:id="168" id="168" component="27" executionUnit="128">
+        <specifications xsi:type="org-fortiss-af3-timing-annotation:Wcet" xmi:id="169" id="169"/>
+      </value>
+    </deploymentParameterMap>
+  </rootElements>
+</org-fortiss-af3-project:FileProject>
-- 
GitLab