Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rentz-Reichert2016-11-14 21:49:45 +0000
committerHenrik Rentz-Reichert2016-11-14 22:11:37 +0000
commit105abb24381b2dfeea978d7959ca51f3d22e100b (patch)
tree5544d974cde4aff58940e142ea9e507aab56d3d6 /plugins/org.eclipse.etrice.generator.c/src/org
parent8a4078146f66f99667774c2d1348a4d424d6c8a1 (diff)
downloadorg.eclipse.etrice-105abb24381b2dfeea978d7959ca51f3d22e100b.tar.gz
org.eclipse.etrice-105abb24381b2dfeea978d7959ca51f3d22e100b.tar.xz
org.eclipse.etrice-105abb24381b2dfeea978d7959ca51f3d22e100b.zip
Bug 507512 - [CGenerator] attributes, operations and handlers of port classes should be generated in derived protocol classes
* utils header includes base class utils * base class attributes, operations and handlers re-defined in derived Change-Id: I53b52b19152163ff426db82b4525dcec71f35dc2
Diffstat (limited to 'plugins/org.eclipse.etrice.generator.c/src/org')
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend4
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/ProtocolClassGen.xtend60
2 files changed, 39 insertions, 25 deletions
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend
index e27d01a2f..4639c8f7e 100644
--- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/CExtensions.xtend
@@ -353,6 +353,10 @@ class CExtensions implements ILanguageExtension {
"\""+(rc.eContainer as RoomModel).name.replaceAll("\\.","/")+"/"+rc.getCHeaderFileName+"\""
}
+ def getUtilsIncludePath(RoomClass rc) {
+ "\""+(rc.eContainer as RoomModel).name.replaceAll("\\.","/")+"/"+rc.getCUtilsFileName+"\""
+ }
+
override getTargetType(EnumerationType type) {
if (type.getPrimitiveType()!=null)
type.getPrimitiveType().getTargetName()
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 4cb4b94c7..f792caed0 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
@@ -124,7 +124,12 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
*/
«generateIncludeGuardBegin(filename)»
-
+
+ «IF pc.base!=null»
+ // include base class utils
+ #include «pc.base.utilsIncludePath»
+
+ «ENDIF»
#include «pc.includePath»
/*
@@ -199,24 +204,25 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
var portClassName = pc.getPortClassName(conj)
var replPortClassName = pc.getPortClassName(conj, true)
var messages = if (conj) pc.allIncomingMessages else pc.allOutgoingMessages
+ val allPortClasses = pc.getAllPortClasses(conj)
+ val allAttributes = allPortClasses.map[p|p.attributes].flatten.toList
+ val allOperations = allPortClasses.map[p|p.operations].flatten.toList
'''
typedef etPort «portClassName»;
typedef etReplPort «replPortClassName»;
- «IF pc.getPortClass(conj)!=null»
- «IF !(pc.getPortClass(conj).attributes.empty)»
- /* variable part of PortClass (RAM) */
- typedef struct «portClassName»_var «portClassName»_var;
- struct «portClassName»_var {
- «pc.getPortClass(conj).attributes.attributes»
- };
- «FOR a:pc.getPortClass(conj).attributes»
- «IF a.defaultValueLiteral!=null»
- «logger.logInfo(portClassName+" "+a.name+": Attribute initialization not supported in C")»
- «ENDIF»
- «ENDFOR»
- «ENDIF»
+ «IF !(allAttributes.empty)»
+ /* variable part of PortClass (RAM) */
+ typedef struct «portClassName»_var «portClassName»_var;
+ struct «portClassName»_var {
+ «allAttributes.attributes»
+ };
+ «FOR a:allAttributes»
+ «IF a.defaultValueLiteral!=null»
+ «logger.logInfo(portClassName+" "+a.name+": Attribute initialization not supported in C")»
+ «ENDIF»
+ «ENDFOR»
«ENDIF»
«FOR message : messages»
@@ -229,12 +235,12 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
«messageSignature(replPortClassName, message.name, "", ", int idx"+data)»;
«ENDFOR»
- «IF (pc.getPortClass(conj) != null)»
- «pc.getPortClass(conj).operations.operationsDeclaration(portClassName)»
+ «IF !(allOperations.empty)»
+ «allOperations.operationsDeclaration(portClassName)»
«ENDIF»
- «IF pc.handlesReceive(conj)»
- «FOR h:getReceiveHandlers(pc,conj)»
+ «IF pc.handlesReceiveIncludingSuper(conj)»
+ «FOR h:pc.getReceiveHandlersIncludingSuper(conj)»
void «portClassName»_«h.msg.name»_receiveHandler(«portClassName»* self, const etMessage* msg, void * actor, etActorReceiveMessage receiveMessageFunc);
«ENDFOR»
«ENDIF»
@@ -349,7 +355,7 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
}
def private portClassSource(ProtocolClass pc, Boolean conj) {
- val pclass = pc.getPortClass(conj)
+ val allPortClasses = pc.getAllPortClasses(conj)
val portClassName = pc.getPortClassName(conj)
val replPortClassName = pc.getPortClassName(conj, true)
val messages = if (conj) pc.allIncomingMessages else pc.allOutgoingMessages
@@ -414,12 +420,16 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
}
«ENDFOR»
- «IF pclass!=null»
- /* begin «portClassName» specific */
- «pclass.userCode.userCode»
+ «IF !allPortClasses.empty»
+ /* begin «portClassName» specific (including base classes) */
+ «FOR p : allPortClasses»
+ «p.userCode.userCode»
+ «ENDFOR»
- «pc.getPortClass(conj).operations.operationsImplementation(portClassName)»
- /* end «portClassName» specific */
+ «FOR p : allPortClasses»
+ «p.operations.operationsImplementation(portClassName)»
+ «ENDFOR»
+ /* end «portClassName» specific (including base classes) */
«ENDIF»
etInt32 «replPortClassName»_getReplication(const «replPortClassName»* self) {
@@ -470,7 +480,7 @@ class ProtocolClassGen extends GenericProtocolClassGenerator {
'''
/* receiver handlers */
- «FOR h:getReceiveHandlers(pc,conj)»
+ «FOR h:pc.getReceiveHandlers(conj)»
void «portClassName»_«h.msg.name»_receiveHandler(«portClassName»* self, const etMessage* msg, void * actor, etActorReceiveMessage receiveMessageFunc){
«AbstractGenerator::getInstance().getTranslatedCode(h.detailCode)»
/* hand over the message to the actor: */

Back to the top