1 // ----------------------------------------------------------------------------
2 //	  debug.h
3 //
4 // Copyright (C) 2008, 2012
5 //			  Stelios Bounanos, M0GLD; Dave Freese, W1HKJ
6 //
7 // This file is part of FLAMP.
8 //
9 // This 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 // This software 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 
24 #ifndef _DEBUG_H_
25 #define _DEBUG_H_
26 
27 #include "util.h"
28 
29 class debug
30 {
31 public:
32 	enum level_e { QUIET_LEVEL, ERROR_LEVEL, WARN_LEVEL, INFO_LEVEL, DEBUG_LEVEL, LOG_NLEVELS };
33 	enum source_e {
34 		LOG_RIGCONTROL = 1 << 0, LOG_RPC = 1 << 1, LOG_OTHER = 1 << 2
35 	};
36 	static void start(const char* filename);
37 	static void stop(void);
38 	static void log(level_e level, const char* func, const char* srcf, int line,
39 					const char* format, ...) format__(printf, 5, 6);
40 	static void slog(level_e level, const char* func, const char* srcf, int line,
41 					 const char* format, ...) format__(printf, 5, 6);
42 
43 	static void elog(const char* func, const char* srcf, int line, const char* text);
44 	static void show(void);
45 	static level_e level;
46 	static uint32_t mask;
47 private:
48 	static void sync_text(void *);
49 	static void append_dbg_buffer(char * message);
50 	debug(const char* filename);
51 	debug(const debug&);
52 	debug& operator=(const debug&);
53 	~debug();
54 	static debug* inst;
55 };
56 
57 #define LOG(level__, source__, ...)							\
58 do {										\
59 if (level__ <= debug::level && source__ & debug::mask)			\
60 debug::log(level__, __func__, __FILE__, __LINE__, __VA_ARGS__); \
61 } while (0)
62 
63 #define LOG_DEBUG(...) LOG(debug::DEBUG_LEVEL, log_source_, __VA_ARGS__)
64 #define LOG_INFO(...) LOG(debug::INFO_LEVEL, log_source_, __VA_ARGS__)
65 #define LOG_WARN(...) LOG(debug::WARN_LEVEL, log_source_, __VA_ARGS__)
66 #define LOG_ERROR(...) LOG(debug::ERROR_LEVEL, log_source_, __VA_ARGS__)
67 #define LOG_QUIET(...) LOG(debug::QUIET_LEVEL, log_source_, __VA_ARGS__)
68 
69 #define SLOG(level__, source__, ...)							\
70 do {										\
71 if (level__ <= debug::level && source__ & debug::mask)			\
72 debug::slog(level__, __func__, __FILE__, __LINE__, __VA_ARGS__); \
73 } while (0)
74 
75 #define SLOG_DEBUG(...) SLOG(debug::DEBUG_LEVEL, log_source_, __VA_ARGS__)
76 #define SLOG_INFO(...) SLOG(debug::INFO_LEVEL, log_source_, __VA_ARGS__)
77 #define SLOG_WARN(...) SLOG(debug::WARN_LEVEL, log_source_, __VA_ARGS__)
78 #define SLOG_ERROR(...) SLOG(debug::ERROR_LEVEL, log_source_, __VA_ARGS__)
79 #define SLOG_QUIET(...) SLOG(debug::QUIET_LEVEL, log_source_, __VA_ARGS__)
80 
81 #define LOG_PERROR(msg__)								\
82 do {										\
83 if (debug::ERROR_LEVEL <= debug::level && log_source_ & debug::mask)	\
84 debug::elog(__func__, __FILE__, __LINE__, msg__);		\
85 } while (0)
86 
87 unused__ static uint32_t log_source_ = debug::LOG_OTHER;
88 #if defined(__GNUC__) && (__GNUC__ >= 3)
89 #  define LOG_FILE_SOURCE(source__)						\
90 __attribute__((constructor))						\
91 static void log_set_source_(void) { log_source_ = source__; }
92 #else
93 #  define LOG_FILE_SOURCE(source__)
94 #endif
95 
96 #define LOG_SET_SOURCE(source__) log_source_ = source__
97 
98 #endif // _DEBUG_H_
99 
100 // Local Variables:
101 // mode: c++
102 // c-file-style: "linux"
103 // End:
104