Skip to content
Snippets Groups Projects
Commit 34e466e2 authored by fortissBot's avatar fortissBot
Browse files

added first steps for codegen, added lib folder

refs 7857
parent 6f0805ec
No related branches found
No related tags found
No related merge requests found
Showing
with 486 additions and 9 deletions
...@@ -18,7 +18,7 @@ Require-Bundle: org.fortiss.af3.project, ...@@ -18,7 +18,7 @@ Require-Bundle: org.fortiss.af3.project,
org.eclipse.core.runtime, org.eclipse.core.runtime,
org.eclipse.emf.ecore;visibility:=reexport, org.eclipse.emf.ecore;visibility:=reexport,
org.fortiss.tooling.base;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" org.fortiss.tooling.base.ui;bundle-version="2.11.0"
Import-Package: org.fortiss.af3.deployment.generator, Import-Package: org.fortiss.af3.deployment.generator,
org.fortiss.af3.platform.model org.fortiss.af3.platform.model
......
/* 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
#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
#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
/* 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();
}*/
#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) {
}
#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) {
}
/*
* 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");
}
...@@ -17,9 +17,16 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $ ...@@ -17,9 +17,16 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
+--------------------------------------------------------------------------*/ +--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.raspberry.generator.executable; 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.InputPort;
import org.fortiss.af3.component.model.OutputPort; import org.fortiss.af3.component.model.OutputPort;
import org.fortiss.af3.expression.model.terms.IExpressionTerm; 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.generic.generator.executable.GenericTransceiverExecutable;
import org.fortiss.af3.platform.model.generic.GenericTransceiver; import org.fortiss.af3.platform.model.generic.GenericTransceiver;
import org.fortiss.af3.platform.raspberry.model.CanConnector; import org.fortiss.af3.platform.raspberry.model.CanConnector;
...@@ -42,36 +49,67 @@ public class CanConnectorExecutable extends GenericTransceiverExecutable { ...@@ -42,36 +49,67 @@ public class CanConnectorExecutable extends GenericTransceiverExecutable {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public IExpressionTerm getInitialization() { public IExpressionTerm getInitialization() {
return super.getInitialization(); // init CAN bus on the given interface
return funcCall("can_init");
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public IExpressionTerm getNoValGuardAccessor(InputPort logicalSignal) { 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} */ /** {@inheritDoc} */
@Override @Override
public IExpressionTerm getNoValWriteAccessor(OutputPort logicalSignal) { 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} */ /** {@inheritDoc} */
@Override @Override
public IExpressionTerm getTermination() { public IExpressionTerm getTermination() {
return super.getTermination(); // terminate the bus on the given interface
return funcCall("can_terminate");
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public IExpressionTerm getValueReadAccessor(InputPort logicalSignal) { 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} */ /** {@inheritDoc} */
@Override @Override
public IExpressionTerm getValueWriteAccessor(OutputPort logicalSignal, IExpressionTerm value) { 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 + "\"");
} }
} }
...@@ -18,7 +18,10 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $ ...@@ -18,7 +18,10 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
package org.fortiss.af3.platform.raspberry.generator.executable; 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.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.List;
import java.util.Set; import java.util.Set;
...@@ -40,6 +43,7 @@ import org.fortiss.af3.platform.language.executable.IWritableExecutable; ...@@ -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.ExecutionUnit;
import org.fortiss.af3.platform.model.PlatformConnectorUnit; import org.fortiss.af3.platform.model.PlatformConnectorUnit;
import org.fortiss.af3.platform.model.generic.GenericTransceiver; 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.af3.platform.raspberry.model.RaspberryPi;
import org.fortiss.tooling.kernel.extension.data.ITransformationContext; import org.fortiss.tooling.kernel.extension.data.ITransformationContext;
...@@ -65,8 +69,39 @@ public class RaspberryPIExecutable extends GenericExecutionUnitExecutable { ...@@ -65,8 +69,39 @@ public class RaspberryPIExecutable extends GenericExecutionUnitExecutable {
protected CSourcePackage createExecutionUnitSourcePackage(String name, protected CSourcePackage createExecutionUnitSourcePackage(String name,
List<Pair<ExecutionUnit, Component>> deployedComponents, List<Pair<ExecutionUnit, Component>> deployedComponents,
List<Pair<PlatformConnectorUnit, Port>> deployedPorts, ITransformationContext context) { 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} */ /** {@inheritDoc} */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment