From 34e466e25e016fb087002e6bf23e41a4e7896910 Mon Sep 17 00:00:00 2001
From: Helge Brueger <noreply@fortiss.org>
Date: Tue, 30 May 2017 08:44:00 +0000
Subject: [PATCH] added first steps for codegen, added lib folder refs 7857

---
 .../trunk/META-INF/MANIFEST.MF                |   2 +-
 .../trunk/lib/inc-gen/data_dictionary.h       |  55 ++++++
 .../trunk/lib/inc/CanConnector.h              |  35 ++++
 .../trunk/lib/inc/io.h                        |  25 +++
 .../trunk/lib/src-gen/data_dictionary.c       | 170 ++++++++++++++++++
 .../trunk/lib/src/CanConnector.c              |  62 +++++++
 .../trunk/lib/src/io.c                        |  45 +++++
 .../trunk/lib/src/main.c                      |  12 ++
 .../executable/CanConnectorExecutable.java    |  50 +++++-
 .../executable/RaspberryPIExecutable.java     |  39 +++-
 10 files changed, 486 insertions(+), 9 deletions(-)
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/lib/inc-gen/data_dictionary.h
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/lib/inc/CanConnector.h
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/lib/inc/io.h
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/lib/src-gen/data_dictionary.c
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/lib/src/CanConnector.c
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/lib/src/io.c
 create mode 100644 org.fortiss.af3.platform.raspberry/trunk/lib/src/main.c

diff --git a/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF b/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF
index 1a01d6f3..50da611d 100644
--- a/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF
+++ b/org.fortiss.af3.platform.raspberry/trunk/META-INF/MANIFEST.MF
@@ -18,7 +18,7 @@ Require-Bundle: org.fortiss.af3.project,
  org.eclipse.core.runtime,
  org.eclipse.emf.ecore;visibility:=reexport,
  org.fortiss.tooling.base;visibility:=reexport,
- org.fortiss.af3.platform;bundle-version="2.5.0";visibility:=reexport,
+ org.fortiss.af3.platform;visibility:=reexport;bundle-version="2.5.0",
  org.fortiss.tooling.base.ui;bundle-version="2.11.0"
 Import-Package: org.fortiss.af3.deployment.generator,
  org.fortiss.af3.platform.model
diff --git a/org.fortiss.af3.platform.raspberry/trunk/lib/inc-gen/data_dictionary.h b/org.fortiss.af3.platform.raspberry/trunk/lib/inc-gen/data_dictionary.h
new file mode 100644
index 00000000..b9570e11
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/lib/inc-gen/data_dictionary.h
@@ -0,0 +1,55 @@
+/* generated by AutoFOCUS 3 (2.11.0) on Tue May 16 17:42:09 CEST 2017 */
+#ifndef __HEADER_data_dictionary_h
+#define __HEADER_data_dictionary_h
+#if defined(__cplusplus)
+typedef bool GEN_TYPE_boolean;
+#else
+typedef enum Enum_TYPE_boolean {
+	false = 0, true = 1
+} GEN_TYPE_boolean;
+#endif
+
+typedef int GEN_TYPE_int;
+
+typedef double GEN_TYPE_double;
+
+/*extern GEN_TYPE_double abs(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double arctan(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double cos(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double cot(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double e();
+
+extern GEN_TYPE_double exp(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double ln(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double pi();
+
+extern GEN_TYPE_double sgn(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double sin(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double sqrt(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double tan(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double _sqrt(GEN_TYPE_double _X,GEN_TYPE_double _V);
+
+extern GEN_TYPE_double pow(GEN_TYPE_double _V,GEN_TYPE_double _N);
+
+extern GEN_TYPE_double factorial(GEN_TYPE_double _V);
+
+extern GEN_TYPE_double min(GEN_TYPE_double _a,GEN_TYPE_double _b);
+
+extern GEN_TYPE_double max(GEN_TYPE_double _a,GEN_TYPE_double _b);
+
+extern GEN_TYPE_double rad2deg(GEN_TYPE_double _A);
+
+extern GEN_TYPE_double deg2rad(GEN_TYPE_double _A);*/
+
+#endif // __HEADER_data_dictionary_h
+
diff --git a/org.fortiss.af3.platform.raspberry/trunk/lib/inc/CanConnector.h b/org.fortiss.af3.platform.raspberry/trunk/lib/inc/CanConnector.h
new file mode 100644
index 00000000..85a5d2a2
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/lib/inc/CanConnector.h
@@ -0,0 +1,35 @@
+#ifndef __CAN_H
+#define __CAN_H
+
+#include <stdio.h>
+
+#include "inc-gen/data_dictionary.h"
+
+// types
+typedef const char* PORT_T;
+
+// init, terminate, prepare
+void can_init();
+void can_terminate();
+
+void prepare_input_CanConnector();
+void finish_input_CanConnector();
+
+void prepare_output_CanConnector();
+void finish_output_CanConnector();
+
+// NOVAL
+GEN_TYPE_boolean can_is_noval(PORT_T port);
+GEN_TYPE_boolean can_set_noval(PORT_T port);
+
+// readers
+GEN_TYPE_boolean can_read_bool(PORT_T port);
+GEN_TYPE_double can_read_double(PORT_T port);
+GEN_TYPE_int can_read_int(PORT_T port);
+
+// writers
+void can_write_bool(PORT_T port, GEN_TYPE_boolean value);
+void can_write_double(PORT_T port, GEN_TYPE_double value);
+void can_write_int(PORT_T port, GEN_TYPE_int value);
+
+#endif // __CAN_H
diff --git a/org.fortiss.af3.platform.raspberry/trunk/lib/inc/io.h b/org.fortiss.af3.platform.raspberry/trunk/lib/inc/io.h
new file mode 100644
index 00000000..12856441
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/lib/inc/io.h
@@ -0,0 +1,25 @@
+#ifndef __IO_H
+#define __IO_H
+
+#include "inc-gen/data_dictionary.h"
+
+// init, terminate
+void init_left_stick();
+void term_left_stick();
+
+void init_right_stick();
+void term_right_stick();
+
+// NOVAL
+GEN_TYPE_boolean is_noval_left_stick();
+GEN_TYPE_boolean is_noval_right_stick();
+
+// readers
+GEN_TYPE_double read_left_stick();
+GEN_TYPE_double read_right_stick();
+
+// writers
+void write_left_stick(GEN_TYPE_double value);
+void write_right_stick(GEN_TYPE_double value);
+
+#endif // __IO_H
diff --git a/org.fortiss.af3.platform.raspberry/trunk/lib/src-gen/data_dictionary.c b/org.fortiss.af3.platform.raspberry/trunk/lib/src-gen/data_dictionary.c
new file mode 100644
index 00000000..1d778b9d
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/lib/src-gen/data_dictionary.c
@@ -0,0 +1,170 @@
+/* generated by AutoFOCUS 3 (2.11.0) on Tue May 16 17:42:09 CEST 2017 */
+#include "inc-gen/data_dictionary.h"
+
+/*GEN_TYPE_double abs(GEN_TYPE_double _V){
+	return _V * sgn(_V);
+}
+
+GEN_TYPE_double arctan(GEN_TYPE_double _V){
+	if (abs(_V) <= 1.0) {
+		return _V / (1 + (0.28 * _V) * _V);
+	}
+	else {
+		if (_V > 1) {
+			return pi() / 2.0 - _V / (_V * _V + 0.28);
+		}
+		else {
+			return -(pi() / 2.0) - _V / (_V * _V + 0.28);
+		}
+	}
+}
+
+GEN_TYPE_double cos(GEN_TYPE_double _V){
+	return sin((_V + pi() / 2.0));
+}
+
+GEN_TYPE_double cot(GEN_TYPE_double _V){
+	return cos(_V) / sin(_V);
+}
+
+GEN_TYPE_double e(){
+	return 2.718281828459;
+}
+
+GEN_TYPE_double exp(GEN_TYPE_double _V){
+	return ((((1 + _V) + (_V * _V) / 2) + ((_V * _V) * _V) / 6) + (((_V * _V) * _V) * _V) / 24) + ((((_V * _V) * _V) * _V) * _V) / 120;
+}
+
+GEN_TYPE_double ln(GEN_TYPE_double _V){
+	if (_V <= 0) {
+		return 0;
+	}
+	else {
+		return ((((_V - 1.0) - ((_V - 1.0) * (_V - 1.0)) / 2.0) + (((_V - 1) * (_V - 1)) * (_V - 1)) / 3.0) - ((((_V - 1) * (_V - 1)) * (_V - 1)) * (_V - 1)) / 4.0) + (((((_V - 1) * (_V - 1)) * (_V - 1)) * (_V - 1)) * (_V - 1)) / 5.0;
+	}
+}
+
+GEN_TYPE_double pi(){
+	return 3.14159265;
+}
+
+GEN_TYPE_double sgn(GEN_TYPE_double _V){
+	if (_V < 0) {
+		return -1;
+	}
+	else {
+		if (_V == 0) {
+			return 0;
+		}
+		else {
+			return 1;
+		}
+	}
+}
+
+GEN_TYPE_double sin(GEN_TYPE_double _V){
+	if (_V % (2 * pi()) < 0) {
+		return -sin((-_V));
+	}
+	else {
+		if (_V % (2 * pi()) > pi()) {
+			return -sin((_V % (2 * pi()) - pi()));
+		}
+		else {
+			if (_V % (2 * pi()) < 0) {
+				if (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())) < 0) {
+					return 0.225 * ((1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * -(1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
+				}
+				else {
+					return 0.225 * ((1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
+				}
+			}
+			else {
+				if (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())) < 0) {
+					return 0.225 * ((1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * -(1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
+				}
+				else {
+					return 0.225 * ((1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
+				}
+			}
+		}
+	}
+}
+
+GEN_TYPE_double sqrt(GEN_TYPE_double _V){
+	if (_V <= 0) {
+		return 0;
+	}
+	else {
+		return _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, ((_V + 1.0) / 2.0)))))))))));
+	}
+}
+
+GEN_TYPE_double tan(GEN_TYPE_double _V){
+	return sin(_V) / cos(_V);
+}
+
+GEN_TYPE_double _sqrt(GEN_TYPE_double _X,GEN_TYPE_double _V){
+	return 0.5 * (_V + _X / _V);
+}
+
+GEN_TYPE_double pow(GEN_TYPE_double _V,GEN_TYPE_double _N){
+	if (_N == 0) {
+		return 1;
+	}
+	else {
+		if (_N < 0) {
+			if (_V == 0) {
+				return 0;
+			}
+			else {
+				return 1.0 / pow(_V, (-_N));
+			}
+		}
+		else {
+			if (_N == 1) {
+				return _V;
+			}
+			else {
+				return _V * pow(_V, (_N - 1));
+			}
+		}
+	}
+}
+
+GEN_TYPE_double factorial(GEN_TYPE_double _V){
+	if (_V % 1 != 0) {
+		return factorial((_V - _V % 1));
+	}
+	else {
+		if (_V == 0 || _V == 1) {
+			return 1;
+		}
+		else {
+			return factorial((_V - 1)) * _V;
+		}
+	}
+}
+
+GEN_TYPE_double min(GEN_TYPE_double _a,GEN_TYPE_double _b){
+	if (_a < _b) {
+		return _a;
+	}
+	return _b;
+}
+
+GEN_TYPE_double max(GEN_TYPE_double _a,GEN_TYPE_double _b){
+	if (_a > _b) {
+		return _a;
+	}
+	return _b;
+}
+
+GEN_TYPE_double rad2deg(GEN_TYPE_double _A){
+	return (_A / pi()) * 180.0;
+}
+
+GEN_TYPE_double deg2rad(GEN_TYPE_double _A){
+	return (_A / 180.0) * pi();
+}*/
+
diff --git a/org.fortiss.af3.platform.raspberry/trunk/lib/src/CanConnector.c b/org.fortiss.af3.platform.raspberry/trunk/lib/src/CanConnector.c
new file mode 100644
index 00000000..29127b54
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/lib/src/CanConnector.c
@@ -0,0 +1,62 @@
+
+#include "inc/CanConnector.h"
+
+// init, terminate
+void can_init(const char* message) {
+	printf("initializing CAN\n");
+}
+
+void can_terminate() {
+	printf("terminating CAN\n");
+}
+
+void prepare_input_CanConnector() {
+
+}
+
+void finish_input_CanConnector() {
+
+}
+
+void prepare_output_CanConnector() {
+
+}
+
+void finish_output_CanConnector() {
+
+}
+
+// NOVAL
+GEN_TYPE_boolean can_is_noval(PORT_T port) {
+	return true;
+}
+
+GEN_TYPE_boolean can_set_noval(PORT_T port) {
+	return true;
+}
+
+// readers
+GEN_TYPE_boolean can_read_bool(PORT_T port) {
+	return false;
+}
+
+GEN_TYPE_double can_read_double(PORT_T port) {
+	return 0.0;
+}
+
+GEN_TYPE_int can_read_int(PORT_T port) {
+	return 0;
+}
+
+// writers
+void can_write_bool(PORT_T port, GEN_TYPE_boolean value) {
+
+}
+
+void can_write_double(PORT_T port, GEN_TYPE_double value) {
+
+}
+
+void can_write_int(PORT_T port, GEN_TYPE_int value) {
+
+}
diff --git a/org.fortiss.af3.platform.raspberry/trunk/lib/src/io.c b/org.fortiss.af3.platform.raspberry/trunk/lib/src/io.c
new file mode 100644
index 00000000..0e446a06
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/lib/src/io.c
@@ -0,0 +1,45 @@
+#include "inc/io.h"
+
+// init, terminate
+void init_left_stick() {
+
+}
+
+void term_left_stick() {
+
+}
+
+void init_right_stick() {
+
+}
+
+void term_right_stick() {
+
+}
+
+// NOVAL
+GEN_TYPE_boolean is_noval_left_stick() {
+	return false;
+}
+
+GEN_TYPE_boolean is_noval_right_stick() {
+	return false;
+}
+
+// readers
+GEN_TYPE_double read_left_stick() {
+	return 0.0;
+}
+
+GEN_TYPE_double read_right_stick() {
+	return 0.0;
+}
+
+// writers
+void write_left_stick(GEN_TYPE_double value) {
+
+}
+
+void write_right_stick(GEN_TYPE_double value) {
+
+}
diff --git a/org.fortiss.af3.platform.raspberry/trunk/lib/src/main.c b/org.fortiss.af3.platform.raspberry/trunk/lib/src/main.c
new file mode 100644
index 00000000..09054c94
--- /dev/null
+++ b/org.fortiss.af3.platform.raspberry/trunk/lib/src/main.c
@@ -0,0 +1,12 @@
+/*
+ * The main function and everything related to starting the application
+ */
+
+#include <stdio.h>
+
+int main(int argc, char* argv[]) {
+
+    // TODO add actual startup code here!
+    printf("Hello world!\n");
+
+}
diff --git a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CanConnectorExecutable.java b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CanConnectorExecutable.java
index d6fcdcf6..680e1347 100644
--- a/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CanConnectorExecutable.java
+++ b/org.fortiss.af3.platform.raspberry/trunk/src/org/fortiss/af3/platform/raspberry/generator/executable/CanConnectorExecutable.java
@@ -17,9 +17,16 @@ $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.rawString;
+
 import org.fortiss.af3.component.model.InputPort;
 import org.fortiss.af3.component.model.OutputPort;
 import org.fortiss.af3.expression.model.terms.IExpressionTerm;
+import org.fortiss.af3.expression.model.terms.RawString;
+import org.fortiss.af3.expression.model.types.TBool;
+import org.fortiss.af3.expression.model.types.TDouble;
+import org.fortiss.af3.expression.model.types.TInt;
 import org.fortiss.af3.platform.generic.generator.executable.GenericTransceiverExecutable;
 import org.fortiss.af3.platform.model.generic.GenericTransceiver;
 import org.fortiss.af3.platform.raspberry.model.CanConnector;
@@ -42,36 +49,67 @@ public class CanConnectorExecutable extends GenericTransceiverExecutable {
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getInitialization() {
-		return super.getInitialization();
+		// init CAN bus on the given interface
+		return funcCall("can_init");
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getNoValGuardAccessor(InputPort logicalSignal) {
-		return super.getNoValGuardAccessor(logicalSignal);
+		// check for NOVAL on the given signal port
+		return funcCall("can_is_noval", literalString(logicalSignal.getName()));
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getNoValWriteAccessor(OutputPort logicalSignal) {
-		return super.getNoValWriteAccessor(logicalSignal);
+		// set NOVAL on the given signal port
+		return funcCall("can_set_noval", literalString(logicalSignal.getName()));
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getTermination() {
-		return super.getTermination();
+		// terminate the bus on the given interface
+		return funcCall("can_terminate");
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getValueReadAccessor(InputPort logicalSignal) {
-		return super.getValueReadAccessor(logicalSignal);
+		// read the value on the given signal port depending on the variable type
+		if(logicalSignal.getVariableType() instanceof TBool) {
+			return funcCall("can_read_bool", literalString(logicalSignal.getName()));
+		} else if(logicalSignal.getVariableType() instanceof TDouble) {
+			return funcCall("can_read_double", literalString(logicalSignal.getName()));
+		} else if(logicalSignal.getVariableType() instanceof TInt) {
+			return funcCall("can_read_int", literalString(logicalSignal.getName()));
+		} else {
+			throw new RuntimeException("unknown data type: " +
+					logicalSignal.getVariableType().getTypeClassName());
+		}
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public IExpressionTerm getValueWriteAccessor(OutputPort logicalSignal, IExpressionTerm value) {
-		return super.getValueWriteAccessor(logicalSignal, value);
+		// write the value on the given signal port depending on the variable type
+		if(logicalSignal.getVariableType() instanceof TBool) {
+			return funcCall("can_write_bool", literalString(logicalSignal.getName()), value);
+		} else if(logicalSignal.getVariableType() instanceof TDouble) {
+			return funcCall("can_write_double", literalString(logicalSignal.getName()), value);
+		} else if(logicalSignal.getVariableType() instanceof TInt) {
+			return funcCall("can_write_int", literalString(logicalSignal.getName()), value);
+		} else {
+			throw new RuntimeException("unknown data type: " +
+					logicalSignal.getVariableType().getTypeClassName());
+		}
+	}
+
+	/**
+	 * builds a constant literal C string including double quotes
+	 */
+	private RawString literalString(String str) {
+		return rawString("\"" + str + "\"");
 	}
 }
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 1ed83ee9..7b926aaa 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
@@ -18,7 +18,10 @@ $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.generator.common.utils.SourceModelElementFactory.createByteContentUnitForPluginFile;
 
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Set;
 
@@ -40,6 +43,7 @@ import org.fortiss.af3.platform.language.executable.IWritableExecutable;
 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;
 
@@ -65,8 +69,39 @@ public class RaspberryPIExecutable extends GenericExecutionUnitExecutable {
 	protected CSourcePackage createExecutionUnitSourcePackage(String name,
 			List<Pair<ExecutionUnit, Component>> deployedComponents,
 			List<Pair<PlatformConnectorUnit, Port>> deployedPorts, ITransformationContext context) {
-		return super.createExecutionUnitSourcePackage(name, deployedComponents, deployedPorts,
-				context);
+
+		CSourcePackage pkg =
+				super.createExecutionUnitSourcePackage(name, deployedComponents, deployedPorts,
+						context);
+
+		// Add source/header files here --> TODO
+		try {
+			// add main
+			addFile(pkg, "src/main.c");
+
+			// add IO
+			addFile(pkg, "inc/io.h");
+			addFile(pkg, "src/io.c");
+
+			// add CAN
+			addFile(pkg, "inc/CanConnector.h");
+			addFile(pkg, "src/CanConnector.c");
+
+			// add fix for dictionary, simply overwrite incorrect version (TODO!!)
+			addFile(pkg, "inc-gen/data_dictionary.h");
+			addFile(pkg, "src-gen/data_dictionary.c");
+
+		} catch(IOException | URISyntaxException e) {
+			throw new RuntimeException("could not add header and source files from lib", e);
+		}
+
+		return pkg;
+	}
+
+	private static void addFile(CSourcePackage pkg, String file) throws IOException,
+			URISyntaxException {
+		pkg.addUnit(createByteContentUnitForPluginFile(AF3PlatformRaspberryActivator.PLUGIN_ID,
+				"lib", file, false));
 	}
 
 	/** {@inheritDoc} */
-- 
GitLab