RENEWLab  1.1.0
RENEW project
logger.h
Go to the documentation of this file.
1 #pragma once
2 
3 /***************************************************************************
4  * Copyright (C) 2008 by H-Store Project *
5  * Brown University *
6  * Massachusetts Institute of Technology *
7  * Yale University *
8  * *
9  * This software may be modified and distributed under the terms *
10  * of the MIT license. See the LICENSE file for details. *
11  * *
12  * Copyright (C) 2018 by eRPC Project *
13  * Carnegie Mellon University *
14  ***************************************************************************/
15 
22 #include <ctime>
23 #include <string>
24 
25 // Log levels: higher means more verbose
26 #define MLPD_LOG_LEVEL_OFF 0
27 #define MLPD_LOG_LEVEL_ERROR 1 // Only fatal conditions
28 #define MLPD_LOG_LEVEL_WARN 2 // Conditions from which it's possible to recover
29 #define MLPD_LOG_LEVEL_INFO 3 // Reasonable to log (e.g., management packets)
30 #define MLPD_LOG_LEVEL_FRAME 4 // Per-frame logging
31 #define MLPD_LOG_LEVEL_SYMBOL 5 // Per-symbol logging
32 #define MLPD_LOG_LEVEL_TRACE 6 // Reserved for very high verbosity
33 
34 #define MLPD_LOG_DEFAULT_STREAM stdout
35 
36 // Log messages with "FRAME" or higher verbosity get written to
37 // mlpd_trace_file_or_default_stream. This can be stdout for basic debugging, or
38 // a file named "trace_file" for more involved debugging.
39 
40 //#define mlpd_trace_file_or_default_stream trace_file
41 #define mlpd_trace_file_or_default_stream MLPD_LOG_DEFAULT_STREAM
42 
43 // If MLPD_LOG_LEVEL is not defined, default to the highest level so that
44 // YouCompleteMe does not report compilation errors
45 #ifndef MLPD_LOG_LEVEL
46 #define MLPD_LOG_LEVEL MLPD_LOG_LEVEL_TRACE
47 #endif
48 
49 #if MLPD_LOG_LEVEL >= MLPD_LOG_LEVEL_ERROR
50 #define MLPD_ERROR(...) \
51  mlpd_output_log_header(MLPD_LOG_DEFAULT_STREAM, MLPD_LOG_LEVEL_ERROR); \
52  fprintf(MLPD_LOG_DEFAULT_STREAM, __VA_ARGS__); \
53  fflush(MLPD_LOG_DEFAULT_STREAM)
54 #else
55 #define MLPD_ERROR(...) ((void)0)
56 #endif
57 
58 #if MLPD_LOG_LEVEL >= MLPD_LOG_LEVEL_WARN
59 #define MLPD_WARN(...) \
60  mlpd_output_log_header(MLPD_LOG_DEFAULT_STREAM, MLPD_LOG_LEVEL_WARN); \
61  fprintf(MLPD_LOG_DEFAULT_STREAM, __VA_ARGS__); \
62  fflush(MLPD_LOG_DEFAULT_STREAM)
63 #else
64 #define MLPD_WARN(...) ((void)0)
65 #endif
66 
67 #if MLPD_LOG_LEVEL >= MLPD_LOG_LEVEL_INFO
68 #define MLPD_INFO(...) \
69  mlpd_output_log_header(MLPD_LOG_DEFAULT_STREAM, MLPD_LOG_LEVEL_INFO); \
70  fprintf(MLPD_LOG_DEFAULT_STREAM, __VA_ARGS__); \
71  fflush(MLPD_LOG_DEFAULT_STREAM)
72 #else
73 #define MLPD_INFO(...) ((void)0)
74 #endif
75 
76 #if MLPD_LOG_LEVEL >= MLPD_LOG_LEVEL_FRAME
77 #define MLPD_FRAME(...) \
78  mlpd_output_log_header(mlpd_trace_file_or_default_stream, \
79  MLPD_LOG_LEVEL_FRAME); \
80  fprintf(mlpd_trace_file_or_default_stream, __VA_ARGS__); \
81  fflush(mlpd_trace_file_or_default_stream)
82 #else
83 #define MLPD_FRAME(...) ((void)0)
84 #endif
85 
86 #if MLPD_LOG_LEVEL >= MLPD_LOG_LEVEL_SYMBOL
87 #define MLPD_SYMBOL(...) \
88  mlpd_output_log_header(mlpd_trace_file_or_default_stream, \
89  MLPD_LOG_LEVEL_SYMBOL); \
90  fprintf(mlpd_trace_file_or_default_stream, __VA_ARGS__); \
91  fflush(mlpd_trace_file_or_default_stream)
92 #else
93 #define MLPD_SYMBOL(...) ((void)0)
94 #endif
95 
96 #if MLPD_LOG_LEVEL >= MLPD_LOG_LEVEL_TRACE
97 #define MLPD_TRACE(...) \
98  mlpd_output_log_header(mlpd_trace_file_or_default_stream, \
99  MLPD_LOG_LEVEL_TRACE); \
100  fprintf(mlpd_trace_file_or_default_stream, __VA_ARGS__); \
101  fflush(mlpd_trace_file_or_default_stream)
102 #else
103 #define MLPD_TRACE(...) ((void)0)
104 #endif
105 
107 static std::string mlpd_get_formatted_time() {
108  struct timespec t;
109  clock_gettime(CLOCK_REALTIME, &t);
110  char buf[20];
111  uint32_t seconds = t.tv_sec % 100; // Rollover every 100 seconds
112  uint32_t usec = t.tv_nsec / 1000;
113 
114  sprintf(buf, "%u:%06u", seconds, usec);
115  return std::string(buf);
116 }
117 
118 // Output log message header
119 static inline void mlpd_output_log_header(FILE* stream, int level) {
120  std::string formatted_time = mlpd_get_formatted_time();
121 
122  const char* type;
123  switch (level) {
125  type = "ERROR";
126  break;
127  case MLPD_LOG_LEVEL_WARN:
128  type = "WARNG";
129  break;
130  case MLPD_LOG_LEVEL_INFO:
131  type = "INFOR";
132  break;
134  type = "FRAME";
135  break;
137  type = "SBFRM";
138  break;
140  type = "TRACE";
141  break;
142  default:
143  type = "UNKWN";
144  }
145 
146  fprintf(stream, "%s %s: ", formatted_time.c_str(), type);
147 }
148 
151 static inline bool is_log_level_reasonable() {
153 }
iris_py.type
type
Definition: iris_py.py:333
AGC_SIM_DEMO.level
level
Definition: AGC_SIM_DEMO.py:86
is_log_level_reasonable
static bool is_log_level_reasonable()
Definition: logger.h:151
MLPD_LOG_LEVEL_FRAME
#define MLPD_LOG_LEVEL_FRAME
Definition: logger.h:30
MLPD_LOG_LEVEL
#define MLPD_LOG_LEVEL
Definition: logger.h:46
mlpd_get_formatted_time
static std::string mlpd_get_formatted_time()
Return decent-precision time formatted as seconds:microseconds.
Definition: logger.h:107
fprintf
otherwise fprintf('Invalid MOD_ORDER(%d)! Must be in[2, 4, 16, 64]\n', MOD_ORDER)
t
t
Definition: getRxVec.m:172
MLPD_LOG_LEVEL_WARN
#define MLPD_LOG_LEVEL_WARN
Definition: logger.h:28
MLPD_LOG_LEVEL_SYMBOL
#define MLPD_LOG_LEVEL_SYMBOL
Definition: logger.h:31
mlpd_output_log_header
static void mlpd_output_log_header(FILE *stream, int level)
Definition: logger.h:119
sprintf
sprintf('wl_ofdm_plots_%s_txIQ', example_mode_string)
stream
activate reading stream[rx_vec_iris, data0_len]
Definition: rl_ofdm_calib.m:127
MLPD_LOG_LEVEL_ERROR
#define MLPD_LOG_LEVEL_ERROR
Definition: logger.h:27
MLPD_LOG_LEVEL_TRACE
#define MLPD_LOG_LEVEL_TRACE
Definition: logger.h:32
MLPD_LOG_LEVEL_INFO
#define MLPD_LOG_LEVEL_INFO
Definition: logger.h:29