Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Belle2020-09-29 15:09:17 +0000
committerJan Belle2020-09-29 15:09:17 +0000
commit0da1fc42cc8f28a833146703e639a05867236731 (patch)
treef1251db18972bbe4bd22687b7689f1f7033e5be1
parent0e4e2a1aac7424189b00a17f574dd048aaea131b (diff)
downloadorg.eclipse.etrice-0da1fc42cc8f28a833146703e639a05867236731.tar.gz
org.eclipse.etrice-0da1fc42cc8f28a833146703e639a05867236731.tar.xz
org.eclipse.etrice-0da1fc42cc8f28a833146703e639a05867236731.zip
[generator.c] Restore capability to produce data logs
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeGen.xtend47
-rw-r--r--plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/gen/NodeRunnerGen.xtend3
-rw-r--r--runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.c65
-rw-r--r--runtime/org.eclipse.etrice.runtime.c/src/common/debugging/etDataLogger.h135
-rw-r--r--runtime/org.eclipse.etrice.runtime.c/src/config/etRuntimeConfig.h5
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 */

Back to the top