aboutsummaryrefslogtreecommitdiffstats
path: root/src/geniviextras/qdltregistration.cpp
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@pelagicore.com>2015-08-03 15:40:38 +0200
committerDominik Holland <dominik.holland@pelagicore.com>2015-08-03 15:40:38 +0200
commitf6142d4216eb6952c6d431968a890263282e01ad (patch)
treefc2b885d70c12b924c62a632dc59446b2d1713f1 /src/geniviextras/qdltregistration.cpp
parentb981a37047f7a4dbefe46186f2b7869ac06cdb33 (diff)
Added support to handle DLTs control messages
Once we get a dlt control messages and the logLevel for a dlt context was changed the QtLoggingCategory will be updated as well. This makes it possible to use <LoogingCategory>().isDebugEnabled() for not performant operations to generate more debug output.
Diffstat (limited to 'src/geniviextras/qdltregistration.cpp')
-rw-r--r--src/geniviextras/qdltregistration.cpp67
1 files changed, 61 insertions, 6 deletions
diff --git a/src/geniviextras/qdltregistration.cpp b/src/geniviextras/qdltregistration.cpp
index 672ab42..742ffaa 100644
--- a/src/geniviextras/qdltregistration.cpp
+++ b/src/geniviextras/qdltregistration.cpp
@@ -36,6 +36,13 @@
#include "qdltregistration_p.h"
#include <QDebug>
+#include <QLoggingCategory>
+
+void qtGeniviLogLevelChangedHandler(char context_id[], uint8_t log_level, uint8_t trace_status)
+{
+ globalDltRegistration()->d_ptr->dltLogLevelChanged(context_id, log_level, trace_status);
+}
+
Q_GLOBAL_STATIC(QDltRegistration, dltRegistration)
@@ -49,10 +56,13 @@ QDltRegistrationPrivate::QDltRegistrationPrivate()
{
}
-void QDltRegistrationPrivate::registerCategory(const char *categoryName, DltContext *dltContext, const char *dltCtxName, const char *dltCtxDescription)
+void QDltRegistrationPrivate::registerCategory(const QLoggingCategory* category, DltContext *dltContext, const char *dltCtxName, const char *dltCtxDescription)
{
DLT_REGISTER_CONTEXT(*dltContext, dltCtxName, dltCtxDescription);
- m_map.insert(QString::fromLatin1(categoryName), dltContext);
+ m_categoryName2DltContext.insert(QString::fromLatin1(category->categoryName()), dltContext);
+ m_ctxName2Category.insert(QString::fromLatin1(dltCtxName), const_cast<QLoggingCategory*>(category));
+ //TODO move to lamda once c++11 is ok to be used
+ DLT_REGISTER_LOG_LEVEL_CHANGED_CALLBACK(*dltContext, &qtGeniviLogLevelChangedHandler);
}
void QDltRegistrationPrivate::setDefaultContext(DltContext *dltContext)
@@ -63,13 +73,58 @@ void QDltRegistrationPrivate::setDefaultContext(DltContext *dltContext)
DltContext *QDltRegistrationPrivate::context(const char *categoryName)
{
const QString category = QString::fromLatin1(categoryName);
- if (!m_map.contains(category) && m_defaultContext)
+ if (!m_categoryName2DltContext.contains(category) && m_defaultContext)
return m_defaultContext;
- return m_map.value(category);
+ return m_categoryName2DltContext.value(category);
}
+void QDltRegistrationPrivate::dltLogLevelChanged(char context_id[], uint8_t log_level, uint8_t trace_status)
+{
+ Q_UNUSED(trace_status)
+
+ const QString contextName = QString::fromLatin1(context_id);
+ if (m_ctxName2Category.contains(contextName))
+ {
+ QList<QtMsgType> msgTypes;
+ //Enable all QtLoggingCategories with a lower severity than the DLT level
+ switch (log_level) {
+ case DLT_LOG_VERBOSE:
+ case DLT_LOG_DEBUG: msgTypes << QtDebugMsg << QtWarningMsg << QtCriticalMsg << QtFatalMsg;
+#if QT_VERSION >= 0x050500
+ msgTypes << QtInfoMsg;
+#endif
+ break;
+ case DLT_LOG_INFO: msgTypes << QtWarningMsg << QtCriticalMsg << QtFatalMsg;
+#if QT_VERSION >= 0x050500
+ msgTypes << QtInfoMsg;
+#endif
+ break;
+ case DLT_LOG_WARN: msgTypes << QtCriticalMsg << QtFatalMsg;
+#if QT_VERSION >= 0x050500
+ msgTypes << QtInfoMsg;
+#endif
+ break;
+ case DLT_LOG_ERROR: msgTypes << QtCriticalMsg << QtFatalMsg; break;
+ case DLT_LOG_FATAL: msgTypes << QtFatalMsg; break;
+ case DLT_LOG_OFF: msgTypes = QList<QtMsgType>(); break;
+ }
+
+ QtMsgType end = QtFatalMsg;
+#if QT_VERSION >= 0x050500
+ end = QtInfoMsg;
+#endif
+
+ for(int i = (int)QtDebugMsg; i <= (int)end; i++) {
+ QtMsgType type = (QtMsgType)i;
+ bool enabled = true;
+ if (!msgTypes.contains(type))
+ enabled = !enabled;
+ m_ctxName2Category.value(contextName)->setEnabled(type, enabled);
+ }
+ }
+}
QDltRegistration::QDltRegistration()
: d_ptr(new QDltRegistrationPrivate())
@@ -88,11 +143,11 @@ void QDltRegistration::registerApplication(const char *dltAppID, const char *dlt
DLT_REGISTER_APP(dltAppID, dltAppDescription);
}
-void QDltRegistration::registerCategory(const char *categoryName, const char *dltCtxName, const char *dltCtxDescription)
+void QDltRegistration::registerCategory(const QLoggingCategory* category, const char *dltCtxName, const char *dltCtxDescription)
{
Q_D(QDltRegistration);
//TODO memory leak
- d->registerCategory(categoryName, new DltContext, dltCtxName, dltCtxDescription);
+ d->registerCategory(category, new DltContext, dltCtxName, dltCtxDescription);
}
void QDltRegistration::setDefaultContext(const char *categoryName)