Skip to content
Snippets Groups Projects
Commit 49339310 authored by Florian Hölzl's avatar Florian Hölzl
Browse files

Added port code generation.

refs 3079
parent 5040a9d3
No related branches found
No related tags found
No related merge requests found
#ifndef INC_TEMP_ACTUATOR_H_
#define INC_TEMP_ACTUATOR_H_
#include <stdint.h>
void temp_actuator_initialize(const char * device);
int temp_actuator_get_position(uint8_t channel);
int temp_actuator_set_target(uint8_t channel, uint16_t target);
void temp_actuator_terminate();
#endif /* INC_TEMP_ACTUATOR_H_ */
No preview for this file type
......@@ -23,11 +23,23 @@ import java.util.List;
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.generator.common.model.source.AbstractUnit;
import org.fortiss.af3.platform.model.ExecutionUnit;
import org.fortiss.af3.platform.model.PlatformConnectorUnit;
import org.fortiss.af3.platform.model.Receiver;
import org.fortiss.af3.platform.model.Transmitter;
import org.fortiss.af3.platform.raspberry.model.ActuatorPWM;
import org.fortiss.af3.platform.raspberry.model.RaspberryPi;
import org.fortiss.af3.platform.raspberry.model.gamepad.Button1;
import org.fortiss.af3.platform.raspberry.model.gamepad.Button2;
import org.fortiss.af3.platform.raspberry.model.gamepad.Button3;
import org.fortiss.af3.platform.raspberry.model.gamepad.Button4;
import org.fortiss.af3.platform.raspberry.model.gamepad.GamepadReceiverBase;
import org.fortiss.af3.platform.raspberry.model.gamepad.Left_StickX_Position;
import org.fortiss.af3.platform.raspberry.model.gamepad.Left_StickY_Position;
import org.fortiss.tooling.kernel.extension.data.ITransformationContext;
/**
......@@ -43,35 +55,110 @@ class MainGenerator {
public AbstractUnit createMain(RaspberryPi executionUnit,
List<Pair<ExecutionUnit, Component>> deployedComponents,
List<Pair<PlatformConnectorUnit, Port>> deployedPorts, ITransformationContext context) {
String includes = createIncludes(deployedComponents);
String includes = createIncludes(deployedComponents, deployedPorts);
// TODO: syncbox code
String initCode = createInitCode(deployedComponents);
String workerCode = createWorkerCode(deployedComponents);
String workerCode = createWorkerCode(deployedComponents, deployedPorts);
return getMainCFile(executionUnit.getName(), executionUnit.isCoordinatorUnit(),
executionUnit.getCanCoordinationID(), executionUnit.getCycleTime(), 250, includes,
"// TODO\n", initCode, workerCode);
}
/** Creates the includes of the system headers. */
private String createIncludes(List<Pair<ExecutionUnit, Component>> deployedComponents) {
private String createIncludes(List<Pair<ExecutionUnit, Component>> deployedComponents,
List<Pair<PlatformConnectorUnit, Port>> deployedPorts) {
StringBuilder sb = new StringBuilder();
for(Pair<ExecutionUnit, Component> p : deployedComponents) {
Component c = p.getSecond();
sb.append("#include <" + c.getName() + "_ID_" + c.getId() + ".h>\n");
}
boolean useGamepad = false;
boolean usePWM = false;
for(Pair<PlatformConnectorUnit, Port> p : deployedPorts) {
if(!useGamepad && p.getFirst() instanceof GamepadReceiverBase) {
sb.append("#include <gamepad.h>\n");
useGamepad = true;
}
if(!usePWM && p.getFirst() instanceof ActuatorPWM) {
sb.append("#include <temp_actuator.h>\n");
usePWM = true;
}
}
return sb.toString();
}
/** Create the worker code. */
private String createWorkerCode(List<Pair<ExecutionUnit, Component>> deployedComponents) {
private String createWorkerCode(List<Pair<ExecutionUnit, Component>> deployedComponents,
List<Pair<PlatformConnectorUnit, Port>> deployedPorts) {
StringBuilder sb = new StringBuilder();
for(Pair<PlatformConnectorUnit, Port> p : deployedPorts) {
if(p.getFirst() instanceof Receiver && p.getSecond() instanceof InputPort) {
sb.append(createReadCode((Receiver)p.getFirst(), (InputPort)p.getSecond()));
}
}
for(Pair<ExecutionUnit, Component> p : deployedComponents) {
Component c = p.getSecond();
sb.append(makeCall("perform_step", c));
}
for(Pair<PlatformConnectorUnit, Port> p : deployedPorts) {
if(p.getFirst() instanceof Transmitter && p.getSecond() instanceof OutputPort) {
sb.append(createWriteCode((Transmitter)p.getFirst(), (OutputPort)p.getSecond()));
}
}
return sb.toString();
}
/** Returns the port and ID identifier. */
private String portName(Port port) {
return port.getName() + "_ID_" + port.getId();
}
/** Creates the read code for the given receiver and port. */
private String createWriteCode(Transmitter transmitter, OutputPort outport) {
if(transmitter instanceof ActuatorPWM) {
ActuatorPWM act = (ActuatorPWM)transmitter;
String result = "if(!noval_" + portName(outport) + ") {\n";
result +=
"temp_actuator_set_target(" + act.getChannelID() + ", (uint16_t)" +
portName(outport) + ");\n";
result += "}\n";
return result;
}
return "";
}
/** Creates the read code for the given receiver and port. */
private String createReadCode(Receiver receiver, InputPort inport) {
if(receiver instanceof Button1) {
return gamepadReadCode("gamepad_get_button_state", "GAMEPAD_BUTTON_1", inport);
}
if(receiver instanceof Button2) {
return gamepadReadCode("gamepad_get_button_state", "GAMEPAD_BUTTON_2", inport);
}
if(receiver instanceof Button3) {
return gamepadReadCode("gamepad_get_button_state", "GAMEPAD_BUTTON_3", inport);
}
if(receiver instanceof Button4) {
return gamepadReadCode("gamepad_get_button_state", "GAMEPAD_BUTTON_4", inport);
}
if(receiver instanceof Left_StickX_Position) {
return gamepadReadCode("gamepad_get_axis_position",
"GAMEPAD_AXIS_LEFT_STICK_HORIZONTAL", inport);
}
if(receiver instanceof Left_StickY_Position) {
return gamepadReadCode("gamepad_get_axis_position", "GAMEPAD_AXIS_LEFT_STICK_VERTICAL",
inport);
}
return "";
}
/** Creates read code for gamepad state. */
private String gamepadReadCode(String gamepadFun, String btnId, InputPort inport) {
String noval = "noval_" + portName(inport) + " = false;\n";
String setBtn = portName(inport) + " = " + gamepadFun + "(" + btnId + ");\n";
return noval + setBtn;
}
/** Create the initialize code. */
private String createInitCode(List<Pair<ExecutionUnit, Component>> deployedComponents) {
StringBuilder sb = new StringBuilder();
......
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