diff options
author | Jan Belle | 2020-09-29 15:09:17 +0000 |
---|---|---|
committer | Jan Belle | 2020-09-29 15:09:17 +0000 |
commit | 0da1fc42cc8f28a833146703e639a05867236731 (patch) | |
tree | f1251db18972bbe4bd22687b7689f1f7033e5be1 | |
parent | 0e4e2a1aac7424189b00a17f574dd048aaea131b (diff) | |
download | org.eclipse.etrice-0da1fc42cc8f28a833146703e639a05867236731.tar.gz org.eclipse.etrice-0da1fc42cc8f28a833146703e639a05867236731.tar.xz org.eclipse.etrice-0da1fc42cc8f28a833146703e639a05867236731.zip |
[generator.c] Restore capability to produce data logs
Bug 550639
Change-Id: Ic114aec968ea614fee8525c7e318890f652848ea
5 files changed, 255 insertions, 0 deletions
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend index eb43a65e5..a0885f23e 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend @@ -43,6 +43,10 @@ import org.eclipse.etrice.generator.generic.ProcedureHelpers import org.eclipse.etrice.generator.generic.RoomExtensions import org.eclipse.etrice.generator.generic.TypeHelpers import org.eclipse.etrice.generator.fsm.base.IntelligentSeparator +import org.eclipse.etrice.core.common.base.LiteralType +import org.eclipse.etrice.core.room.EnumerationType +import org.eclipse.etrice.core.room.PrimitiveType +import org.eclipse.etrice.core.room.Message @Singleton class NodeGen { @@ -132,6 +136,9 @@ class NodeGen { val ssc = ssi.subSystemClass val clsname = nr.name+"_"+ssi.name val threads = nr.type.threads.filter(t|usedThreads.contains(t)) + val loggedPorts = ssi.eAllContents.filter(PortInstance) + .filter[!relay && port.conjugated && protocol.commType == CommunicationType.DATA_DRIVEN].toList + ''' /** * @author generated by eTrice @@ -148,6 +155,7 @@ class NodeGen { #include "debugging/etLogger.h" #include "debugging/etMSCLogger.h" + #include "debugging/etDataLogger.h" #include "messaging/etSystemProtocol.h" #include "osal/etTimer.h" #include "osal/etSema.h" @@ -167,6 +175,9 @@ class NodeGen { static void «clsname»_initActorInstances(void); static void «clsname»_constructActorInstances(void); + + static void logDataHeaders(); + static void logData(); /* include instances for all classes */ #include "«nr.getInstSourceFileName(ssi)»" @@ -242,6 +253,10 @@ class NodeGen { /* init all actors */ «clsname»_initActorInstances(); + + /* init data logging */ + logDataHeaders(); + logData(); ET_MSC_LOGGER_SYNC_EXIT } @@ -328,6 +343,23 @@ class NodeGen { ET_MSC_LOGGER_SYNC_EXIT } + + static void logDataHeaders() { + «FOR pi : loggedPorts» + «FOR msg : pi.protocol.incomingMessages.filter[data.refType.type.enumerationOrPrimitive]» + ET_DATA_LOGGER_LOG_STRING("«pi.path»/«msg.name»") + «ENDFOR» + «ENDFOR» + } + + static void logData() { + ET_DATA_LOGGER_NEW_ROW + «FOR pi : loggedPorts» + «FOR msg : pi.protocol.incomingMessages.filter[data.refType.type.enumerationOrPrimitive]» + «createLoggerCall(pi, msg)» + «ENDFOR» + «ENDFOR» + } ''' } @@ -660,6 +692,7 @@ class NodeGen { «IF !executedInstances.empty» if (msg->evtID == etSystemProtocol_IN_poll) { MsgDispatcher_«thread.name»_poll(); + logData(); } else «ENDIF» @@ -729,6 +762,20 @@ class NodeGen { ''' } + def private createLoggerCall(PortInstance pi, Message msg) { + val ai = pi.eContainer as ActorInstance + val data = ai.path.pathName + "." + pi.name + "." + msg.name + val type = if (msg.data.refType.type instanceof EnumerationType) LiteralType.INT + else (msg.data.refType.type as PrimitiveType).type + + switch (type) { + case LiteralType.BOOL: "ET_DATA_LOGGER_LOG_BOOL((int)"+data+")" + case LiteralType.CHAR: "ET_DATA_LOGGER_LOG_INT((int)"+data+")" + case LiteralType.INT: "ET_DATA_LOGGER_LOG_INT((int)"+data+")" + case LiteralType.REAL: "ET_DATA_LOGGER_LOG_DOUBLE((double)"+data+")" + } + } + def private checkDataPorts(SubSystemInstance comp) { val found = new HashSet<String>() for (ai: comp.allContainedInstances) { diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend index 62986a4ff..baabc44fe 100644 --- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend +++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend @@ -66,6 +66,7 @@ class NodeRunnerGen { #include "debugging/etLogger.h" #include "debugging/etMSCLogger.h" + #include "debugging/etDataLogger.h" #include "osal/etPlatformLifecycle.h" @@ -89,6 +90,7 @@ class NodeRunnerGen { etLogger_logInfo("*** T H E B E G I N ***"); ET_MSC_LOGGER_OPEN("main"); + ET_DATA_LOGGER_OPEN("main"); /* startup sequence of lifecycle */ «clsname»_init(); /* lifecycle init */ @@ -106,6 +108,7 @@ class NodeRunnerGen { «clsname»_destroy(); /* lifecycle destroy */ ET_MSC_LOGGER_CLOSE + ET_DATA_LOGGER_CLOSE etLogger_logInfo("*** T H E E N D ***"); etUserExit(); /* platform specific */ diff --git a/runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.c b/runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.c new file mode 100644 index 000000000..86acbb779 --- /dev/null +++ b/runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.c @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2013 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 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * CONTRIBUTORS: + * Henrik Rentz-Reichert (initial contribution) + * + *******************************************************************************/ + +#include "debugging/etDataLogger.h" +#include "debugging/etLogger.h" + +static etFileHandle etDataLogger_fileHandle = NULL; +static int etDataLogger_row = 0; + +/*TODO: move or replace ET_MAX_FILENAME_LEN */ +#define ET_MAX_FILENAME_LEN 256 + +void etDataLogger_open(const char* logPath, const char* logName) { + char path[ET_MAX_FILENAME_LEN]; + etDataLogger_row = 0; + sprintf(path, "%s/%s.data.csv", logPath, logName); + etDataLogger_fileHandle = etLogger_fopen(path, "w+"); +} + +void etDataLogger_close(void) { + if (etDataLogger_fileHandle != NULL) { + etLogger_fclose(etDataLogger_fileHandle); + } +} + +void etDataLogger_logString(const char* entry) { + if (etDataLogger_fileHandle != NULL) { + etLogger_fprintf(etDataLogger_fileHandle, ",%s", entry); + } +} + +void etDataLogger_logBool(int val) { + if (etDataLogger_fileHandle != NULL) { + etLogger_fprintf(etDataLogger_fileHandle, ",%d", val); + } +} + +void etDataLogger_logInt(int val) { + if (etDataLogger_fileHandle != NULL) { + etLogger_fprintf(etDataLogger_fileHandle, ",%d", val); + } +} + +void etDataLogger_logDouble(double val) { + if (etDataLogger_fileHandle != NULL) { + etLogger_fprintf(etDataLogger_fileHandle, ",%lf", val); + } +} + +void etDataLogger_newRow() { + if (etDataLogger_fileHandle != NULL) { + etLogger_fprintf(etDataLogger_fileHandle, "\n%d", etDataLogger_row++); + } +} diff --git a/runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.h b/runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.h new file mode 100644 index 000000000..2e0577f4f --- /dev/null +++ b/runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.h @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright (c) 2013 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 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * CONTRIBUTORS: + * Henrik Rentz-Reichert (initial contribution) + * + *******************************************************************************/ + +/** + * \file etDataLogger.h + * + * The data logger is a means that lets data driven send ports write their data to file + * in every cycle. Only one log file can be open at a time. The data are written + * in comma separated value (csv) format. + * + * \author Henrik Rentz-Reichert + */ + +#ifndef ETDATALOGGER_H_ +#define ETDATALOGGER_H_ + +#include "etRuntimeConfig.h" +#include "etDatatypes.h" + +ET_EXTERN_C_BEGIN + +/** + * opens a file for data logging + * + * \param logPath the path to the file + * \param logName the name of the log file + */ +void etDataLogger_open(const char* logPath, const char* logName); +/** + * closes a previously opened data log file + */ +void etDataLogger_close(void); + +/** + * writes a string to the log + * + * \param text the string to be written + */ +void etDataLogger_logString(const char* text); +/** + * writes a boolean value to the log (as integer) + * + * \param val the value to be written + */ +void etDataLogger_logBool(int val); +/** + * writes an integer value to the log + * \param val the value to be written + */ +void etDataLogger_logInt(int val); +/** + * writes a double value to the log + * \param val the value to be written + */ +void etDataLogger_logDouble(double val); +/** + * starts a new row of the log + */ +void etDataLogger_newRow(); + +#ifdef ET_DATA_LOGGER_ACTIVATE + #define ET_DATA_LOGGER_OPEN(name) \ + etDataLogger_open("log", name); + #define ET_DATA_LOGGER_CLOSE \ + etDataLogger_close(); + #define ET_DATA_LOGGER_LOG_STRING(text) \ + etDataLogger_logString(text); + #define ET_DATA_LOGGER_LOG_BOOL(val) \ + etDataLogger_logBool(val); + #define ET_DATA_LOGGER_LOG_INT(val) \ + etDataLogger_logInt(val); + #define ET_DATA_LOGGER_LOG_DOUBLE(val) \ + etDataLogger_logDouble(val); + #define ET_DATA_LOGGER_NEW_ROW \ + etDataLogger_newRow(); +#else + /** + * calls \ref etDataLogger_open(const char*, const char*) with path <code>tmp/log</code> + * or <code>void</code> if <code>ET_DATA_LOGGER_ACTIVATE</code> is not defined + */ + #define ET_DATA_LOGGER_OPEN(name) + /** + * calls \ref etDataLogger_close() + * or <code>void</code> if <code>ET_DATA_LOGGER_ACTIVATE</code> is not defined + */ + #define ET_DATA_LOGGER_CLOSE + /** + * calls etDataLogger_logString(const char*) + * or <code>void</code> if <code>ET_DATA_LOGGER_ACTIVATE</code> is not defined + * + * \param text the text to be written + */ + #define ET_DATA_LOGGER_LOG_STRING(text) + /** + * calls \ref etDataLogger_logBool(int val) + * or <code>void</code> if <code>ET_DATA_LOGGER_ACTIVATE</code> is not defined + * + * \param val the value to be written + */ + #define ET_DATA_LOGGER_LOG_BOOL(val) + /** + * calls \ref etDataLogger_logInt(int val) + * or <code>void</code> if <code>ET_DATA_LOGGER_ACTIVATE</code> is not defined + * + * \param val the value to be written + */ + #define ET_DATA_LOGGER_LOG_INT(val) + /** + * calls \ref etDataLogger_logDouble(double val) + * or <code>void</code> if <code>ET_DATA_LOGGER_ACTIVATE</code> is not defined + * + * \param val the value to be written + */ + #define ET_DATA_LOGGER_LOG_DOUBLE(val) + /** + * calls \ref etDataLogger_newRow() + * or <code>void</code> if <code>ET_DATA_LOGGER_ACTIVATE</code> is not defined + */ + #define ET_DATA_LOGGER_NEW_ROW +#endif + +ET_EXTERN_C_END + +#endif /* ETDATALOGGER_H_ */ diff --git a/runtime/org.eclipse.etrice.runtime.c/src/config/etRuntimeConfig.h b/runtime/org.eclipse.etrice.runtime.c/src/config/etRuntimeConfig.h index acaefbd9a..1709b5f0a 100644 --- a/runtime/org.eclipse.etrice.runtime.c/src/config/etRuntimeConfig.h +++ b/runtime/org.eclipse.etrice.runtime.c/src/config/etRuntimeConfig.h @@ -42,6 +42,11 @@ /** switches the logging of synchronous messages on, needs \ref ET_MSC_LOGGER_ACTIVATE */ #define ET_ASYNC_MSC_LOGGER_ACTIVATE +/* data logger */ + +/** switches the data logger on */ +#undef ET_DATA_LOGGER_ACTIVATE + /* timing and scheduling */ /* #define FREQUENCY 10L */ /* #define ET_RUNTIME_MAXLOOP 100 */ |