1 // ---------------------------------------------------------------------------- 2 // debug.h 3 // 4 // Copyright (C) 2008 5 // Stelios Bounanos, M0GLD 6 // 7 // This file is part of fldigi. 8 // 9 // fldigi is free software; you can redistribute it and/or modify 10 // it under the terms of the GNU General Public License as published by 11 // the Free Software Foundation; either version 3 of the License, or 12 // (at your option) any later version. 13 // 14 // fldigi is distributed in the hope that it will be useful, 15 // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 // 19 // You should have received a copy of the GNU General Public License 20 // along with this program. If not, see <http://www.gnu.org/licenses/>. 21 // ---------------------------------------------------------------------------- 22 23 #ifndef _DEBUG_H_ 24 #define _DEBUG_H_ 25 26 #include "util.h" 27 28 class debug 29 { 30 public: 31 enum level_e { QUIET_LEVEL, ERROR_LEVEL, WARN_LEVEL, INFO_LEVEL, DEBUG_LEVEL, LOG_NLEVELS }; 32 enum source_e { 33 LOG_RIGCONTROL = 1 << 0, LOG_RPC = 1 << 1, LOG_OTHER = 1 << 2 34 }; 35 static void start(const char* filename); 36 static void stop(void); 37 static void log(level_e level, const char* func, const char* srcf, int line, 38 const char* format, ...) format__(printf, 5, 6); 39 static void elog(const char* func, const char* srcf, int line, const char* text); 40 static void show(void); 41 static void resize(int x, int y, int w, int h); 42 static void position(int x, int y); 43 static void font(int); 44 static void font_size(int); 45 static level_e level; 46 static uint32_t mask; 47 private: 48 static void sync_text(void*); 49 debug(const char* filename); 50 debug(const debug&); 51 debug& operator=(const debug&); 52 ~debug(); 53 static debug* inst; 54 }; 55 56 #define LOG(level__, source__, ...) \ 57 do { \ 58 if (level__ <= debug::level && source__ & debug::mask) \ 59 debug::log(level__, __func__, __FILE__, __LINE__, __VA_ARGS__); \ 60 } while (0) 61 62 #define LOG_DEBUG(...) LOG(debug::DEBUG_LEVEL, log_source_, __VA_ARGS__) 63 #define LOG_INFO(...) LOG(debug::INFO_LEVEL, log_source_, __VA_ARGS__) 64 #define LOG_WARN(...) LOG(debug::WARN_LEVEL, log_source_, __VA_ARGS__) 65 #define LOG_ERROR(...) LOG(debug::ERROR_LEVEL, log_source_, __VA_ARGS__) 66 #define LOG_QUIET(...) LOG(debug::QUIET_LEVEL, log_source_, __VA_ARGS__) 67 68 #define LOG_PERROR(msg__) \ 69 do { \ 70 if (debug::ERROR_LEVEL <= debug::level && log_source_ & debug::mask) \ 71 debug::elog(__func__, __FILE__, __LINE__, msg__); \ 72 } while (0) 73 74 unused__ static uint32_t log_source_ = debug::LOG_OTHER; 75 #if defined(__GNUC__) && (__GNUC__ >= 3) 76 # define LOG_FILE_SOURCE(source__) \ 77 __attribute__((constructor)) \ 78 static void log_set_source_(void) { log_source_ = source__; } 79 #else 80 # define LOG_FILE_SOURCE(source__) 81 #endif 82 83 #define LOG_SET_SOURCE(source__) log_source_ = source__ 84 85 extern int debug_visible(); 86 87 #endif // _DEBUG_H_ 88 89 // Local Variables: 90 // mode: c++ 91 // c-file-style: "linux" 92 // End: 93