23 #include <glib/gprintf.h>
25 #include "libsigrok-internal.h"
28 #define LOG_PREFIX "log"
49 static int sr_logv(
void *cb_data,
int loglevel,
const char *format,
59 static void *sr_log_cb_data = NULL;
62 #define LOGLEVEL_TIMESTAMP SR_LOG_DBG
64 static int64_t sr_log_start_time = 0;
85 if (loglevel < SR_LOG_NONE || loglevel >
SR_LOG_SPEW) {
86 sr_err(
"Invalid loglevel %d.", loglevel);
90 if (loglevel >= LOGLEVEL_TIMESTAMP && sr_log_start_time == 0)
91 sr_log_start_time = g_get_monotonic_time();
93 cur_loglevel = loglevel;
95 sr_dbg(
"libsigrok loglevel set to %d.", loglevel);
130 sr_err(
"%s: cb was NULL", __func__);
137 sr_log_cb_data = cb_data;
158 sr_log_cb_data = NULL;
163 static int sr_logv(
void *cb_data,
int loglevel,
const char *format, va_list args)
165 uint64_t elapsed_us, minutes;
166 unsigned int rest_us, seconds, microseconds;
167 char *raw_output, *output;
168 int raw_len, raw_idx, idx, ret;
174 if (loglevel > cur_loglevel)
177 if (cur_loglevel >= LOGLEVEL_TIMESTAMP) {
178 elapsed_us = g_get_monotonic_time() - sr_log_start_time;
180 minutes = elapsed_us / G_TIME_SPAN_MINUTE;
181 rest_us = elapsed_us % G_TIME_SPAN_MINUTE;
182 seconds = rest_us / G_TIME_SPAN_SECOND;
183 microseconds = rest_us % G_TIME_SPAN_SECOND;
185 ret = g_fprintf(stderr,
"sr: [%.2" PRIu64
":%.2u.%.6u] ",
186 minutes, seconds, microseconds);
188 ret = fputs(
"sr: ", stderr);
191 if (ret < 0 || (raw_len = g_vasprintf(&raw_output, format, args)) < 0)
194 output = g_malloc0(raw_len + 1);
198 while (raw_idx < raw_len) {
199 if (raw_output[raw_idx] !=
'\n') {
200 output[idx] = raw_output[raw_idx];
206 g_fprintf(stderr,
"%s\n", output);
214 SR_PRIV int sr_log(
int loglevel,
const char *format, ...)
219 va_start(args, format);
220 ret = sr_log_cb(sr_log_cb_data, loglevel, format, args);
Generic/unspecified error.
Output very noisy debug messages.
The public libsigrok header file to be used by frontends.
int sr_log_loglevel_get(void)
Get the libsigrok loglevel.
int sr_log_loglevel_set(int loglevel)
Set the libsigrok loglevel.
int sr_log_callback_set_default(void)
Set the libsigrok log callback to the default built-in one.
int(* sr_log_callback)(void *cb_data, int loglevel, const char *format, va_list args)
int sr_log_callback_set(sr_log_callback cb, void *cb_data)
Set the libsigrok log callback to the specified function.