diff options
author | Dominik Holland <dominik.holland@pelagicore.com> | 2015-08-03 15:40:38 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@pelagicore.com> | 2015-08-03 15:40:38 +0200 |
commit | f6142d4216eb6952c6d431968a890263282e01ad (patch) | |
tree | fc2b885d70c12b924c62a632dc59446b2d1713f1 /src/geniviextras/qdltregistration.cpp | |
parent | b981a37047f7a4dbefe46186f2b7869ac06cdb33 (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.cpp | 67 |
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) |