| /******************************************************************************* |
| * Copyright (c) 2011 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) |
| * Thomas Schuetz (changed for C code generator) |
| * |
| *******************************************************************************/ |
| |
| package org.eclipse.etrice.generator.c.gen |
| |
| import com.google.inject.Inject |
| import com.google.inject.Singleton |
| import org.eclipse.etrice.core.genmodel.etricegen.Root |
| import org.eclipse.etrice.core.genmodel.etricegen.SubSystemInstance |
| import org.eclipse.xtext.generator.JavaIoFileSystemAccess |
| import org.eclipse.etrice.generator.generic.RoomExtensions |
| import org.eclipse.etrice.core.etmap.util.ETMapUtil |
| import org.eclipse.etrice.core.common.base.util.BaseHelpers |
| import org.eclipse.etrice.generator.c.Main |
| |
| @Singleton |
| class NodeRunnerGen { |
| |
| @Inject extension BaseHelpers |
| @Inject extension JavaIoFileSystemAccess fileAccess |
| @Inject extension CExtensions |
| @Inject extension RoomExtensions |
| |
| def doGenerate(Root root) { |
| var first = true |
| for (nr : ETMapUtil::getNodeRefs()) { |
| for (instpath : ETMapUtil::getSubSystemInstancePaths(nr)) { |
| val ssi = root.getInstance(instpath) as SubSystemInstance |
| if (ssi!=null) { |
| val clsname = nr.name+"_"+ssi.name |
| fileAccess.setOutputPath(ssi.subSystemClass.generationTargetPath+ssi.subSystemClass.getPath) |
| fileAccess.generateFile( clsname+"_Runner.c", root.generateSourceFile(ssi, first)) |
| first = false |
| } |
| } |
| } |
| } |
| |
| def generateSourceFile(Root root, SubSystemInstance ssi, boolean first) { |
| val nr = ETMapUtil::getNodeRef(ssi) |
| val clsname = nr.name+"_"+ssi.name |
| val logData = Main.getSettings.isGenerateDataInstrumentation && ssi.subSystemClass.annotations.isAnnotationPresent("DataLogging") |
| ''' |
| /** |
| * @author generated by eTrice |
| * |
| * this class contains the main function running Node «nr.name» with SubSystem «ssi.name» |
| * it instantiates Node «nr.name» with SubSystem «ssi.name» and starts and ends the lifecycle |
| */ |
| |
| #include <string.h> |
| |
| #include "«nr.getCHeaderFileName(ssi)»" |
| |
| #include "debugging/etLogger.h" |
| #include "debugging/etMSCLogger.h" |
| #include "debugging/etDataLogger.h" |
| |
| #include "osal/etPlatformLifecycle.h" |
| |
| /** |
| * «Main.getSettings.mainMethodName» function |
| * creates components and starts and stops the lifecycle |
| */ |
| |
| int «Main.getSettings.mainMethodName»(int argc, char** argv) { |
| etBool runAsTest = ET_FALSE; |
| |
| #ifdef ET_DO_NOT_USE_ARGC_ARGV |
| #else |
| if (argc>1 && strcmp(argv[1], "-headless")==0) |
| runAsTest = ET_TRUE; |
| if (argc>1 && strcmp(argv[1], "-run_as_test")==0) |
| runAsTest = ET_TRUE; |
| #endif |
| |
| etUserEntry(); /* platform specific */ |
| |
| etLogger_logInfo("*** T H E B E G I N ***"); |
| ET_MSC_LOGGER_OPEN("main"); |
| «IF logData» |
| ET_DATA_LOGGER_OPEN("main"); |
| «ENDIF» |
| |
| /* startup sequence of lifecycle */ |
| «clsname»_init(); /* lifecycle init */ |
| «clsname»_start(); /* lifecycle start */ |
| |
| etUserPreRun(); /* platform specific */ |
| |
| /* run Scheduler */ |
| «clsname»_run(runAsTest); |
| |
| etUserPostRun(); /* platform specific */ |
| |
| /* shutdown sequence of lifecycle */ |
| «clsname»_stop(); /* lifecycle stop */ |
| «clsname»_destroy(); /* lifecycle destroy */ |
| |
| «IF logData» |
| ET_DATA_LOGGER_CLOSE |
| «ENDIF» |
| ET_MSC_LOGGER_CLOSE |
| etLogger_logInfo("*** T H E E N D ***"); |
| |
| etUserExit(); /* platform specific */ |
| |
| return 0; |
| } |
| |
| ''' |
| } |
| } |