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 1a01d6f3b4833c9ea3620c672e3f65315b01eaa3..50da611d41e7e57eba6447b40e6234a9a0b2b5dd 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 0000000000000000000000000000000000000000..b9570e1140355919215e9813bb997b102ddc9899 --- /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 0000000000000000000000000000000000000000..85a5d2a2e4c4562399a78ff23fc78324bdca0f3f --- /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 0000000000000000000000000000000000000000..12856441b6b1fd8ce25e71d700b7f775b6b2fd15 --- /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 0000000000000000000000000000000000000000..1d778b9d9233731c34a467fd764387b7f3de61e6 --- /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 0000000000000000000000000000000000000000..29127b54665ca7a3e9bf7b7f710f766d66a09a6d --- /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 0000000000000000000000000000000000000000..0e446a061228e145396990584ea232579c92c089 --- /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 0000000000000000000000000000000000000000..09054c94ba4bfbea20cfb423a9d40f66ab4b9a35 --- /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 d6fcdcf6d622b4970cc71e72b29bdd51e93b4d5f..680e1347892fd4ee13d1b9313cae2b851196c9f1 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 1ed83ee9ce2bb861cb6d53750121103dfd7640a5..7b926aaa2e848b6bbe20c63ec2a29c705073985b 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} */