blob: 181a815be41710758fcc0d73003a2c4238dc8799 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Draeger Medical GmbH (http://www.draeger.com).
* 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:
* Peter Karlitschek (initial contribution)
*
*******************************************************************************/
package org.eclipse.etrice.generator.cpp.gen
import com.google.inject.Inject
import com.google.inject.Singleton
import org.eclipse.etrice.core.etmap.util.ETMapUtil
import org.eclipse.etrice.core.genmodel.etricegen.Root
import org.eclipse.etrice.core.genmodel.etricegen.SubSystemInstance
import org.eclipse.etrice.core.genmodel.etricegen.SystemInstance
import org.eclipse.etrice.generator.cpp.Main
import org.eclipse.etrice.generator.fsm.base.FileSystemHelpers
import org.eclipse.etrice.generator.fsm.base.IGeneratorFileIo
import org.eclipse.etrice.generator.generic.RoomExtensions
@Singleton
class NodeRunnerGen {
@Inject extension RoomExtensions roomExt
@Inject extension CppExtensions
@Inject extension FileSystemHelpers
@Inject IGeneratorFileIo fileIO
def doGenerate(Root root) {
for (nr : ETMapUtil::getNodeRefs()) {
for (instpath : ETMapUtil::getSubSystemInstancePaths(nr)) {
val ssi = root.getInstance(instpath) as SubSystemInstance
if (ssi!=null && ssi.subSystemClass.validGenerationLocation) {
val filepath = ssi.subSystemClass.generationTargetPath+ssi.subSystemClass.getPath
val infopath = ssi.subSystemClass.generationInfoPath+ssi.subSystemClass.getPath
fileIO.generateFile("generating SubSystemRunner declaration", filepath, infopath, nr.getCppClassName(ssi)+"Runner.h", root.generateHeaderFile(ssi))
fileIO.generateFile("generating SubSystemRunner implementation", filepath, infopath, nr.getCppClassName(ssi)+"Runner.cpp", root.generateSourceFile(ssi))
}
}
}
}
def generateHeaderFile(Root root, SubSystemInstance ssc) {
val cc = ssc.subSystemClass
val nr = ETMapUtil::getNodeRef(ssc)
val clsname = nr.getCppClassName(ssc)
'''
/**
* @author generated by eTrice
*
* this class contains the main function running component «ssc.name»
* it instantiates «ssc.name» and starts and ends the lifecycle
*/
«generateIncludeGuardBegin(cc, 'Runner')»
«cc.generateNamespaceBegin»
#include "common/modelbase/SubSystemRunnerBase.h"
class «clsname+"Runner"» : public etRuntime::SubSystemRunnerBase {
};
«cc.generateNamespaceEnd»
«generateIncludeGuardEnd(cc, 'Runner')»
'''
}
def generateSourceFile(Root root, SubSystemInstance ssc) {
val cc = ssc.subSystemClass
val nr = ETMapUtil::getNodeRef(ssc)
val clsname = nr.getCppClassName(ssc)
'''
/**
* @author generated by eTrice
*
* this class contains the main function running component «ssc.name»
* it instantiates «ssc.name» and starts and ends the lifecycle
*/
#include "«clsname»Runner.h"
#include "«clsname».h"
#include "common/modelbase/RTSystem.h"
#include "common/containers/String.h"
#include "common/containers/Vector.h"
#include "common/containers/Set.h"
#include "common/containers/Map.h"
using namespace etRuntime;
«cc.generateNamespaceBegin»
/**
* «Main.getSettings.mainMethodName» function
* creates components and starts and stops the lifecycle
*/
int «Main.getSettings.mainMethodName»(int argc, char* argv[]) {
// instantiate the main component
RTSystem* sys = «IF ssc.eContainer instanceof SystemInstance»new RTSystem("«(ssc.eContainer as SystemInstance).name»")«ELSE»0«ENDIF»;
«clsname»* main_component = new «clsname»(sys, "«ssc.name»");
«clsname»Runner::run(*main_component, argc, argv);
««« // TODO JH crash
//delete sys;
printf("String allocations %d and deallocations %d\n", etRuntime::String::getNAllocations(), etRuntime::String::getNDeallocations());
printf("String creations %d and destructions %d\n", etRuntime::String::getNCreated(), etRuntime::String::getNDestroyed());
printf("Vector allocations %d and deallocations %d\n", etRuntime::VectorStats::getNAllocations(), etRuntime::VectorStats::getNDeallocations());
printf("Vector creations %d and destructions %d\n", etRuntime::VectorStats::getNCreated(), etRuntime::VectorStats::getNDestroyed());
printf("Set creations %d and destructions %d\n", etRuntime::SetStats::getNCreated(), etRuntime::SetStats::getNDestroyed());
printf("Map creations %d and destructions %d\n", etRuntime::MapStats::getNCreated(), etRuntime::MapStats::getNDestroyed());
fflush(stdout);
return 0;
}
«cc.generateNamespaceEnd»
'''
}
}