From: Marcus Comstedt Date: Wed, 16 Jul 2014 14:45:48 +0000 (+0200) Subject: Install logging callbacks for Android X-Git-Tag: pulseview-0.3.0~568 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=9137928c9a711ff6d7bf25c9627236d3c61f069e Install logging callbacks for Android --- diff --git a/CMakeLists.txt b/CMakeLists.txt index dd423f6b..733bfe1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -258,6 +258,10 @@ if(WIN32) list(APPEND pulseview_SOURCES pulseviewico.rc) endif() +if(ANDROID) + list(APPEND pulseview_SOURCES android/loghandler.cpp) +endif() + if(Qt5Core_FOUND) qt5_wrap_cpp(pulseview_HEADERS_MOC ${pulseview_HEADERS}) qt5_wrap_ui(pulseview_FORMS_HEADERS ${pulseview_FORMS}) @@ -339,6 +343,10 @@ if(WIN32) list(APPEND PULSEVIEW_LINK_LIBS "-lqsvg") endif() +if(ANDROID) + list(APPEND PULSEVIEW_LINK_LIBS "-llog") +endif() + if(ANDROID) add_library(${PROJECT_NAME} SHARED ${pulseview_SOURCES} diff --git a/android/loghandler.cpp b/android/loghandler.cpp new file mode 100644 index 00000000..b5024204 --- /dev/null +++ b/android/loghandler.cpp @@ -0,0 +1,104 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2014 Marcus Comstedt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifdef ENABLE_DECODE +#include /* First, so we avoid a _POSIX_C_SOURCE warning. */ +#endif + +#include + +#include +#include + +#include "android/loghandler.h" + +namespace pv { + +int AndroidLogHandler::sr_callback(void *cb_data, int loglevel, const char *format, va_list args) +{ + static const int prio[] = { + [SR_LOG_NONE] = ANDROID_LOG_SILENT, + [SR_LOG_ERR] = ANDROID_LOG_ERROR, + [SR_LOG_WARN] = ANDROID_LOG_WARN, + [SR_LOG_INFO] = ANDROID_LOG_INFO, + [SR_LOG_DBG] = ANDROID_LOG_DEBUG, + [SR_LOG_SPEW] = ANDROID_LOG_VERBOSE, + }; + int ret; + + /* This specific log callback doesn't need the void pointer data. */ + (void)cb_data; + + /* Only output messages of at least the selected loglevel(s). */ + if (loglevel > sr_log_loglevel_get()) + return SR_OK; /* TODO? */ + + if (loglevel < SR_LOG_NONE) + loglevel = SR_LOG_NONE; + else if (loglevel > SR_LOG_SPEW) + loglevel = SR_LOG_SPEW; + + ret = __android_log_vprint(prio[loglevel], "sr", format, args); + + return ret; +} + +int AndroidLogHandler::srd_callback(void *cb_data, int loglevel, const char *format, va_list args) +{ +#ifdef ENABLE_DECODE + static const int prio[] = { + [SRD_LOG_NONE] = ANDROID_LOG_SILENT, + [SRD_LOG_ERR] = ANDROID_LOG_ERROR, + [SRD_LOG_WARN] = ANDROID_LOG_WARN, + [SRD_LOG_INFO] = ANDROID_LOG_INFO, + [SRD_LOG_DBG] = ANDROID_LOG_DEBUG, + [SRD_LOG_SPEW] = ANDROID_LOG_VERBOSE, + }; + int ret; + + /* This specific log callback doesn't need the void pointer data. */ + (void)cb_data; + + /* Only output messages of at least the selected loglevel(s). */ + if (loglevel > srd_log_loglevel_get()) + return SRD_OK; /* TODO? */ + + if (loglevel < SRD_LOG_NONE) + loglevel = SRD_LOG_NONE; + else if (loglevel > SRD_LOG_SPEW) + loglevel = SRD_LOG_SPEW; + + ret = __android_log_vprint(prio[loglevel], "srd", format, args); + + return ret; +#else + return 0; +#endif +} + +void AndroidLogHandler::install_callbacks() +{ + sr_log_callback_set(sr_callback, NULL); +#ifdef ENABLE_DECODE + srd_log_callback_set(srd_callback, NULL); +#endif +} + +} // namespace pv + diff --git a/android/loghandler.h b/android/loghandler.h new file mode 100644 index 00000000..e49158ad --- /dev/null +++ b/android/loghandler.h @@ -0,0 +1,39 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2014 Marcus Comstedt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PULSEVIEW_ANDROID_LOGHANDLER_H +#define PULSEVIEW_ANDROID_LOGHANDLER_H + +#include + +namespace pv { + +class AndroidLogHandler +{ +private: + static int sr_callback(void *cb_data, int loglevel, const char *format, va_list args); + static int srd_callback(void *cb_data, int loglevel, const char *format, va_list args); + +public: + static void install_callbacks(); +}; + +} // namespace pv + +#endif // PULSEVIEW_ANDROID_LOGHANDLER_H diff --git a/main.cpp b/main.cpp index 23f3f623..0d59baef 100644 --- a/main.cpp +++ b/main.cpp @@ -36,6 +36,9 @@ #include "pv/devicemanager.h" #include "pv/mainwindow.h" +#ifdef ANDROID +#include "android/loghandler.h" +#endif #include "config.h" @@ -71,6 +74,10 @@ int main(int argc, char *argv[]) QApplication::setApplicationName("PulseView"); QApplication::setOrganizationDomain("sigrok.org"); +#ifdef ANDROID + pv::AndroidLogHandler::install_callbacks(); +#endif + // Parse arguments while (1) { static const struct option long_options[] = {