Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rentz-Reichert2012-02-23 15:00:11 +0000
committerHenrik Rentz-Reichert2012-02-23 15:00:11 +0000
commit2eef2a2c385bd5a3716cd390f7c14e6374f8cd5d (patch)
tree110a7e1d8a56674e681be17902538c65280a0a63 /plugins/org.eclipse.etrice.generator.c/src/org/eclipse
parent5cbe79fbf4dc676551eecd754a0a18a6844da71c (diff)
downloadorg.eclipse.etrice-2eef2a2c385bd5a3716cd390f7c14e6374f8cd5d.tar.gz
org.eclipse.etrice-2eef2a2c385bd5a3716cd390f7c14e6374f8cd5d.tar.xz
org.eclipse.etrice-2eef2a2c385bd5a3716cd390f7c14e6374f8cd5d.zip
[generator, generator.*] implemented code translation (in general) and replicated ports for C
Diffstat (limited to 'plugins/org.eclipse.etrice.generator.c/src/org/eclipse')
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend32
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CTranslationProvider.java90
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ProtocolClassGen.xtend64
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/SubSystemClassGen.xtend226
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java3
5 files changed, 232 insertions, 183 deletions
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend
index 608f61ab1..d1e052c41 100644
--- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ActorClassGen.xtend
@@ -94,19 +94,35 @@ class ActorClassGen extends GenericActorClassGenerator {
typedef struct «xpac.name» «xpac.name»;
/* const part of ActorClass (ROM) */
- typedef struct «xpac.name»_const {
-««« TODO: needed? const «xpac.name»* actor;
- /* Ports */
- «FOR ep : ac.getEndPorts()»
- const «ep.getPortClassName()» «ep.name»;
- «ENDFOR»
- } «xpac.name»_const;
+ «IF ac.allEndPorts.empty»
+ /* this actor class has no ports and thus no constant data */
+ «ELSE»
+ typedef struct «xpac.name»_const {
+ /* simple ports */
+ «FOR ep : ac.allEndPorts»
+ «IF ep.multiplicity==1»
+ const «ep.getPortClassName()» «ep.name»;
+ «ENDIF»
+ «ENDFOR»
+
+ /* replicated ports */
+ «FOR ep : ac.allEndPorts»
+ «IF ep.multiplicity!=1»
+ const etReplPort «ep.name»;
+ «ENDIF»
+ «ENDFOR»
+ } «xpac.name»_const;
+ «ENDIF»
/* variable part of ActorClass (RAM) */
struct «xpac.name» {
- const «xpac.name»_const* constData;
+ «IF !ac.allEndPorts.empty»
+ const «xpac.name»_const* constData;
+
+ «ENDIF»
«helpers.attributes(ac.allAttributes)»
«IF xpac.hasNonEmptyStateMachine»
+
«stateMachineGen.genDataMembers(xpac, ac)»
«ENDIF»
};
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CTranslationProvider.java b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CTranslationProvider.java
new file mode 100644
index 000000000..1ce05edd1
--- /dev/null
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CTranslationProvider.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2012 protos software gmbh (http://www.protos.de).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * Henrik Rentz-Reichert (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.generator.c.gen;
+
+import java.util.ArrayList;
+
+import org.eclipse.etrice.core.room.ActorClass;
+import org.eclipse.etrice.core.room.Attribute;
+import org.eclipse.etrice.core.room.DetailCode;
+import org.eclipse.etrice.core.room.InterfaceItem;
+import org.eclipse.etrice.core.room.Message;
+import org.eclipse.etrice.core.room.Operation;
+import org.eclipse.etrice.core.room.Port;
+import org.eclipse.etrice.generator.base.ITranslationProvider;
+import org.eclipse.etrice.generator.extensions.RoomExtensions;
+
+import com.google.inject.Inject;
+
+public class CTranslationProvider implements ITranslationProvider {
+
+ @Inject private RoomExtensions roomExt;
+ private ActorClass ac;
+
+ @Override
+ public void setActorClass(ActorClass ac) {
+ this.ac = ac;
+ }
+
+ @Override
+ public boolean translateMembers() {
+ return true;
+ }
+
+ @Override
+ public String getAttributeText(Attribute att, String orig) {
+ return "self->"+att.getName();
+ }
+
+ @Override
+ public String getOperationText(Operation op, ArrayList<String> args, String orig) {
+ StringBuilder result = new StringBuilder();
+ result.append(op.getName()+"(self");
+ for (String arg : args) {
+ result.append(", "+arg);
+ }
+ result.append(") /* ORIG: "+orig+" */");
+ return result.toString();
+ }
+
+ @Override
+ public String getInterfaceItemMessageText(InterfaceItem item, Message msg, ArrayList<String> args, String orig) {
+ String result = orig;
+ if (item instanceof Port) {
+ Port p = (Port) item;
+ if (p.getMultiplicity()==1)
+ result = roomExt.getPortClassName(p)+"_"+msg.getName()+"(&self->constData->"+item.getName()+")";
+ else
+ result = roomExt.getPortClassName(p)+"_"+msg.getName()+"_broadcast(&self->constData->"+item.getName()+")";
+
+ result += " /* "+orig+" */";
+ }
+ return result;
+ }
+
+ @Override
+ public String getInterfaceItemMessageValue(InterfaceItem item, Message msg, String orig) {
+ return null;
+ }
+
+ @Override
+ public boolean translateTags() {
+ return false;
+ }
+
+ @Override
+ public String translateTag(String tag, DetailCode code) {
+ return null;
+ }
+
+}
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ProtocolClassGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ProtocolClassGen.xtend
index d3b0dfd12..9955ae4d8 100644
--- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ProtocolClassGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ProtocolClassGen.xtend
@@ -46,7 +46,6 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
logger.logInfo("generating ProtocolClass source '"+pc.getCSourceFileName+"' in '"+path+"'")
fileAccess.setOutputPath(path)
fileAccess.generateFile(pc.getCSourceFileName, root.generateSourceFile(pc))
-
}
}
@@ -86,7 +85,6 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
«helpers.userCode(pc.userCode2)»
-
«generateIncludeGuardEnd(pc.name)»
'''
@@ -104,6 +102,13 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
#include "etMSCLogger.h"
«helpers.userCode(pc.userCode3)»
+
+ static void sendMessage(const etPort* self, etInt16 evtId) {
+ etMessage* msg = etMessageService_getMessageBuffer(self->msgService, sizeof(etMessage));
+ msg->address = self->peerAddress;
+ msg->evtID = evtId;
+ etMessageService_pushMessage(self->msgService, msg);
+ }
/*--------------------- port classes */
«portClassSource(pc, false)»
@@ -233,51 +238,58 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
}
def portClassHeader(ProtocolClass pc, Boolean conj){
- '''
- «var portClassName = pc.getPortClassName(conj)»
- «var pClass = pc.getPortClass(conj)»
+ var portClassName = pc.getPortClassName(conj)
+ var replPortClassName = pc.getPortClassName(conj, true)
+ var pClass = pc.getPortClass(conj)
+ var ports = if (conj) pc.getAllIncomingMessages() else pc.getAllOutgoingMessages()
- typedef etPort «portClassName»;
+ '''
- «IF !conj»
-««« send functions for outgoing messages
- «FOR message : pc.getAllOutgoingMessages()»
+ typedef etPort «portClassName»;
+ typedef etReplPort «replPortClassName»;
+
+ «FOR message : ports»
void «portClassName»_«message.name»(const «portClassName»* self);
+ void «replPortClassName»_«message.name»_broadcast(const «replPortClassName»* self);
+ void «replPortClassName»_«message.name»(const «replPortClassName»* self, int idx);
«ENDFOR»
- «ELSE»
-««« send functions for incoming messages
- «FOR message : pc.getAllIncomingMessages()»
- void «portClassName»_«message.name»(const «portClassName»* self);
- «ENDFOR»
- «ENDIF»
-
-
-««« «ClassOperationSignature(portClassName, "MyOperation1", "int a, int b", "void", true)»
-««« «ClassOperationSignature(portClassName, "MyOperation2", "", "int", false)»
-
-
'''
}
def portClassSource(ProtocolClass pc, Boolean conj){
var portClassName = pc.getPortClassName(conj)
+ var replPortClassName = pc.getPortClassName(conj, true)
var pClass = pc.getPortClass(conj)
var messages = if (conj) pc.allIncomingMessages else pc.allOutgoingMessages
var dir = if (conj) "IN_" else "OUT_"
'''
«FOR message : messages»
- void «portClassName»_«message.name»(const «portClassName»* self){
+
+ void «portClassName»_«message.name»(const «portClassName»* self) {
ET_MSC_LOGGER_SYNC_ENTRY("«portClassName»", "«message.name»")
if (self->receiveMessageFunc!=NULL) {
- etMessage* msg = etMessageService_getMessageBuffer(self->msgService, sizeof(etMessage));
- msg->address = self->peerAddress;
- msg->evtID = «memberInUse(pc.name, dir+message.name)»;
- etMessageService_pushMessage(self->msgService, msg);
+ sendMessage(self, «memberInUse(pc.name, dir+message.name)»);
}
ET_MSC_LOGGER_SYNC_EXIT
}
+ void «replPortClassName»_«message.name»_broadcast(const «replPortClassName»* self) {
+ int i;
+ ET_MSC_LOGGER_SYNC_ENTRY("«replPortClassName»", "«message.name»")
+ for (i=0; i<self->size; ++i) {
+ sendMessage((etPort*)(&self->ports[i]), «memberInUse(pc.name, dir+message.name)»);
+ }
+ ET_MSC_LOGGER_SYNC_EXIT
+ }
+
+ void «replPortClassName»_«message.name»(const «replPortClassName»* self, int idx) {
+ ET_MSC_LOGGER_SYNC_ENTRY("«replPortClassName»", "«message.name»")
+ if (0<=idx && idx<self->size) {
+ sendMessage((etPort*)(&self->ports[idx]), «memberInUse(pc.name, dir+message.name)»);
+ }
+ ET_MSC_LOGGER_SYNC_EXIT
+ }
«ENDFOR»
'''
}
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/SubSystemClassGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/SubSystemClassGen.xtend
index c8ae1a94d..a21209f8a 100644
--- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/SubSystemClassGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/SubSystemClassGen.xtend
@@ -13,6 +13,8 @@
package org.eclipse.etrice.generator.c.gen
+import java.util.HashMap
+import java.util.ArrayList
import com.google.inject.Inject
import com.google.inject.Singleton
import org.eclipse.etrice.core.room.SubSystemClass
@@ -217,46 +219,61 @@ class SubSystemClassGen {
«FOR ai : ssi.allContainedInstances»
/* instance «ai.path.getPathName()» */
- static const «ai.actorClass.name»_const «ai.path.getPathName()»_const = {
-««« TODO: needed? &«ai.path.getPathName()»,
- /* Ports: {myActor, etReceiveMessage, msgService, peerAddress, localId} */
- «FOR pi : ai.ports»
- «genPortInitializer(root, ai, pi)»
- «ENDFOR»
-
- };
- static «ai.actorClass.name» «ai.path.getPathName()» = {&«ai.path.getPathName()»_const};
+ «IF ai.ports.empty»
+ /* no ports, nothing to initialize statically */
+ «ELSE»
+ «genActorInstanceInitializer(root, ai)»
+ «ENDIF»
«ENDFOR»
+ '''
+ }
+
+ def private genActorInstanceInitializer(Root root, ActorInstance ai) {
+ var instName = ai.path.pathName
-
+ // list of replicated ports
+ var replPorts = new ArrayList<PortInstance>()
+ replPorts.addAll(ai.ports.filter(e|e.kind.literal!="RELAY" && e.port.multiplicity!=1))
+
+ // list of ports, simple first, then replicated
+ var ports = new ArrayList<PortInstance>()
+ ports.addAll(ai.ports.filter(e|e.kind.literal!="RELAY" && e.port.multiplicity==1).union(replPorts))
-««« «FOR ai : ssi.allContainedInstances»
-««« // actor instance «ai.path» itself => Systemport Address
-««« // TODOTJ: For each Actor, multiple addresses should be generated (actor?, systemport, debugport)
-««« Address addr_item_«ai.path.getPathName()» = new Address(0,«ai.threadId»,«ai.objId»);
-««« // interface items of «ai.path»
-««« «FOR pi : ai.orderedIfItemInstances»
-««« «IF pi instanceof ServiceImplInstance || pi.peers.size>1»
-««« «FOR peer : pi.peers»
-««« «var i = pi.peers.indexOf(peer)»
-««« Address addr_item_«pi.path.getPathName()»_«i» = new Address(0,«pi.threadId»,«pi.objId+i»);
-««« «ENDFOR»
-««« «ELSE»
-««« Address addr_item_«pi.path.getPathName()» = new Address(0,«ai.threadId»,«pi.objId»);
-««« «ENDIF»
-««« «ENDFOR»
-««« «ENDFOR»
+ // compute replicated port offsets
+ var offsets = new HashMap<PortInstance, Integer>()
+ var offset = 0
+ for (p: replPorts) {
+ offsets.put(p, offset)
+ offset = offset + p.peers.size
+ }
'''
- }
-
+ «IF !replPorts.empty»
+ static const etReplSubPort «instName»_repl_sub_ports[«offset»] = {
+ /* Replicated Sub Ports: {myActor, etReceiveMessage, msgService, peerAddress, localId, idx} */
+ «FOR pi : replPorts SEPARATOR ","»
+ «genReplSubPortInitializers(root, ai, pi)»
+ «ENDFOR»
+ };
+ «ENDIF»
+ static const «ai.actorClass.name»_const «instName»_const = {
+ /* Ports: {myActor, etReceiveMessage, msgService, peerAddress, localId} */
+ «FOR pi : ports SEPARATOR ","»
+ «IF pi.port.multiplicity==1»
+ «genPortInitializer(root, ai, pi)»
+ «ELSE»
+ {«pi.peers.size», «instName»_repl_sub_ports+«offsets.get(pi)»}
+ «ENDIF»
+ «ENDFOR»
+ };
+ static «ai.actorClass.name» «instName» = {&«instName»_const};
+ '''}
+
def private String genPortInitializer(Root root, ActorInstance ai, PortInstance pi) {
var recvMsg = if (pi.peers.empty) "NULL" else ai.actorClass.name+"_ReceiveMessage"
var objId = if (pi.peers.empty) 0 else pi.peers.get(0).objId
- // TODO: no replicated ports yet
-
"{&"+ai.path.getPathName()+", "
+recvMsg+", "
+"&msgService_Thread1, "
@@ -265,6 +282,25 @@ class SubSystemClassGen {
+"} /* Port "+pi.name+" */"
}
+ def private String genReplSubPortInitializers(Root root, ActorInstance ai, PortInstance pi) {
+ var result = ""
+
+ for (p: pi.peers) {
+ var idx = pi.peers.indexOf(p)
+ var comma = if (idx<pi.peers.size-1) "," else ""
+ result = result +
+ "{&"+ai.path.getPathName()+", "
+ +ai.actorClass.name+"_ReceiveMessage, "
+ +"&msgService_Thread1, "
+ +p.objId+", "
+ +(root.getExpandedActorClass(ai).getInterfaceItemLocalId(pi.port)+1)+", "
+ +idx
+ +"}"+comma+" /* Repl Sub Port "+pi.name+" idx +"+idx+"*/\n"
+ }
+
+ return result
+ }
+
def generateDispatcherFile(Root root, SubSystemInstance ssi, SubSystemClass ssc) {'''
/**
* @author generated by eTrice
@@ -284,9 +320,17 @@ class SubSystemClassGen {
«FOR ai : ssi.allContainedInstances»
/* interface items of «ai.path» */
«FOR pi : ai.orderedIfItemInstances»
- case «pi.objId»:
- etPort_receive(&«ai.path.pathName»_const.«pi.name», msg);
- break;
+ «IF pi instanceof PortInstance && (pi as PortInstance).port.multiplicity!=1»
+ «FOR peer: pi.peers»
+ case «pi.objId+pi.peers.indexOf(peer)»:
+ etPort_receive((etPort*)&«ai.path.pathName»_const.«pi.name».ports[«pi.peers.indexOf(peer)»], msg);
+ break;
+ «ENDFOR»
+ «ELSE»
+ case «pi.objId»:
+ etPort_receive(&«ai.path.pathName»_const.«pi.name», msg);
+ break;
+ «ENDIF»
«ENDFOR»
«ENDFOR»
@@ -299,121 +343,5 @@ class SubSystemClassGen {
'''
}
-// «var models = root.getReferencedModels(ssc)»
-// «FOR model : models»import «model.name».*;«ENDFOR»
-//
-//
-// «helpers.UserCode(ssc.userCode1)»
-//
-// public class «ssi.name» extends SubSystemClassBase{
-//
-// «helpers.UserCode(ssc.userCode2)»
-//
-// public «ssi.name»(IRTObject parent, String name) {
-// super(parent, name);
-// }
-//
-// @Override
-// public void receiveEvent(InterfaceItemBase ifitem, int evt, Object data){
-// }
-//
-// @Override
-// public void instantiateMessageServices(){
-//
-// RTServices.getInstance().getMsgSvcCtrl().addMsgSvc(new MessageService(this, new Address(0, 0, 0),"MessageService_Main"));
-// «FOR thread : ssc.threads»
-// RTServices.getInstance().getMsgSvcCtrl().addMsgSvc(new MessageService(this, new Address(0, «ssc.threads.indexOf(thread)+1», 0),"MessageService_«thread.name»", «thread.prio»));
-// «ENDFOR»
-// }
-//
-// @Override
-// public void instantiateActors(){
-// // all addresses
-// // Addresses for the Subsystem Systemport
-// «FOR ai : ssi.allContainedInstances.indexed(ssi.maxObjId)»
-// Address addr_item_SystemPort_«ssi.allContainedInstances.indexOf(ai.value)» = new Address(0,0,«ai.index1»);
-// «ENDFOR»
-//
-// «FOR ai : ssi.allContainedInstances»
-// // actor instance «ai.path» itself => Systemport Address
-// // TODOTJ: For each Actor, multiple addresses should be generated (actor?, systemport, debugport)
-// Address addr_item_«ai.path.getPathName()» = new Address(0,«ai.threadId»,«ai.objId»);
-// // interface items of «ai.path»
-// «FOR pi : ai.orderedIfItemInstances»
-// «IF pi instanceof ServiceImplInstance || pi.peers.size>1»
-// «FOR peer : pi.peers»
-// «var i = pi.peers.indexOf(peer)»
-// Address addr_item_«pi.path.getPathName()»_«i» = new Address(0,«pi.threadId»,«pi.objId+i»);
-// «ENDFOR»
-// «ELSE»
-// Address addr_item_«pi.path.getPathName()» = new Address(0,«ai.threadId»,«pi.objId»);
-// «ENDIF»
-// «ENDFOR»
-// «ENDFOR»
-//
-// // instantiate all actor instances
-// instances = new ActorClassBase[«ssi.allContainedInstances.size»];
-// «FOR ai : ssi.allContainedInstances»
-// instances[«ssi.allContainedInstances.indexOf(ai)»] = new «ai.actorClass.name»(
-// «IF ai.eContainer instanceof SubSystemInstance»
-// this,
-// «ELSE»
-// instances[«ssi.allContainedInstances.indexOf(ai.eContainer)»],
-// «ENDIF»
-// "«ai.name»",
-// // own interface item addresses
-// new Address[][] {{addr_item_«ai.path.getPathName()»}«IF !ai.orderedIfItemInstances.empty»,«ENDIF»
-// «FOR pi : ai.orderedIfItemInstances SEPARATOR ","»
-// {
-// «IF pi instanceof ServiceImplInstance || pi.peers.size>1»
-// «FOR peer : pi.peers SEPARATOR ","»
-// addr_item_«pi.path.getPathName()»_«pi.peers.indexOf(peer)»
-// «ENDFOR»
-// «ELSE»
-// addr_item_«pi.path.getPathName()»
-// «ENDIF»
-// }
-// «ENDFOR»
-// },
-// // peer interface item addresses
-// new Address[][] {{addr_item_SystemPort_«ssi.allContainedInstances.indexOf(ai)»}«IF !ai.orderedIfItemInstances.empty»,«ENDIF»
-// «FOR pi : ai.orderedIfItemInstances SEPARATOR ","»
-// {
-// «IF !(pi instanceof ServiceImplInstance) && pi.peers.isEmpty»
-// null
-// «ELSE»
-// «FOR pp : pi.peers SEPARATOR ","»
-// «IF pp instanceof ServiceImplInstance || pp.peers.size>1»
-// addr_item_«pp.path.getPathName()»_«pp.peers.indexOf(pi)»
-// «ELSE»
-// addr_item_«pp.path.getPathName()»
-// «ENDIF»
-// «ENDFOR»
-// «ENDIF»
-// }
-// «ENDFOR»
-// }
-// );
-// «ENDFOR»
-//
-// // create the subsystem system port
-// RTSystemPort = new RTSystemServicesProtocolConjPortRepl(this, "RTSystemPort",
-// 0, //local ID
-// // own addresses
-// new Address[]{
-// «FOR ai : ssi.allContainedInstances SEPARATOR ","»
-// addr_item_SystemPort_«ssi.allContainedInstances.indexOf(ai)»
-// «ENDFOR»
-// },
-// // peer addresses
-// new Address[]{
-// «FOR ai : ssi.allContainedInstances SEPARATOR ","»
-// addr_item_«ai.path.getPathName()»
-// «ENDFOR»
-// });
-//
-// }
-// };
-
} \ No newline at end of file
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java
index 32deefc75..ef3849a1b 100644
--- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java
@@ -14,7 +14,9 @@ package org.eclipse.etrice.generator.c.setup;
import org.eclipse.etrice.generator.base.AbstractGenerator;
import org.eclipse.etrice.generator.base.GeneratorBaseModule;
+import org.eclipse.etrice.generator.base.ITranslationProvider;
import org.eclipse.etrice.generator.c.Main;
+import org.eclipse.etrice.generator.c.gen.CTranslationProvider;
import org.eclipse.etrice.generator.c.gen.MainGen;
import org.eclipse.etrice.generator.generic.ILanguageExtension;
import org.eclipse.xtext.generator.IGenerator;
@@ -34,6 +36,7 @@ public class GeneratorModule extends GeneratorBaseModule {
// bind language specific code to generic Interfaces
binder.bind(ILanguageExtension.class).to(CExtensions.class);
+ binder.bind(ITranslationProvider.class).to(CTranslationProvider.class);
}
}

Back to the top