Browse Source

Implement debug ogging

Martijn Braam 1 year ago
parent
commit
72032906ba
6 changed files with 61 additions and 2 deletions
  1. 28 0
      src/log.c
  2. 7 1
      src/log.h
  3. 7 0
      src/mode.c
  4. 5 1
      src/mode.h
  5. 10 0
      src/parse.c
  6. 4 0
      src/pipeline.c

+ 28 - 0
src/log.c

@@ -1,7 +1,22 @@
 #include <stdarg.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include "log.h"
 
+static int loglevel = 0;
+
+void
+init_log(int level)
+{
+	loglevel = level;
+	char *debuglevel = getenv("LIBMEGAPIXELS_DEBUG");
+	if (debuglevel != NULL) {
+		char *end;
+		long env_level = strtol(debuglevel, &end, 10);
+		loglevel = (int) env_level;
+	}
+}
+
 void
 log_error(const char *fmt, ...)
 {
@@ -10,4 +25,17 @@ log_error(const char *fmt, ...)
 	fprintf(stderr, "[libmegapixels] ");
 	vfprintf(stderr, fmt, args);
 	va_end(args);
+}
+
+void
+log_debug(const char *fmt, ...)
+{
+	if (loglevel < 2) {
+		return;
+	}
+	va_list args;
+	va_start(args, fmt);
+	fprintf(stderr, "[libmegapixels] ");
+	vfprintf(stderr, fmt, args);
+	va_end(args);
 }

+ 7 - 1
src/log.h

@@ -1,4 +1,10 @@
 #pragma once
 
 void
-log_error(const char *fmt, ...);
+init_log(int level);
+
+void
+log_error(const char *fmt, ...);
+
+void
+log_debug(const char *fmt, ...);

+ 7 - 0
src/mode.c

@@ -2,6 +2,7 @@
 #include <linux/v4l2-subdev.h>
 #include <strings.h>
 #include <assert.h>
+#include <stdio.h>
 #include "mode.h"
 #include "libmegapixels.h"
 
@@ -320,4 +321,10 @@ libmegapixels_mode_equals(libmegapixels_mode *a, libmegapixels_mode *b)
 		return 0;
 	}
 	return 1;
+}
+
+int
+mode_snprintf(char *buf, size_t maxlen, libmegapixels_mode *mode)
+{
+	return snprintf(buf, maxlen, "%dx%d@%d %s", mode->width, mode->height, mode->rate, mode_lut[mode->format].name);
 }

+ 5 - 1
src/mode.h

@@ -1,4 +1,5 @@
 #include <stdint.h>
+#include "libmegapixels.h"
 
 #pragma once
 
@@ -15,4 +16,7 @@ int
 libmegapixels_v4l_pixfmt_to_index(uint32_t pixfmt);
 
 int
-libmegapixels_format_name_to_index(const char *name);
+libmegapixels_format_name_to_index(const char *name);
+
+int
+mode_snprintf(char *buf, size_t maxlen, libmegapixels_mode *mode);

+ 10 - 0
src/parse.c

@@ -181,10 +181,13 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
 {
 	const char *sensor_driver, *bridge_driver;
 	config_setting_t *root = config_lookup(cfg, name);
+	log_debug("Loading camera '%s'\n", name);
 	if (!config_setting_lookup_string(root, "SensorDriver", &sensor_driver)) {
+		log_debug("  Section is missing SensorDriver\n");
 		return -1;
 	}
 	if (!config_setting_lookup_string(root, "BridgeDriver", &bridge_driver)) {
+		log_debug("  Section is missing BridgeDriver\n");
 		return -1;
 	}
 	libmegapixels_camera *camera;
@@ -195,6 +198,7 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
 
 	int res = find_media_node(camera, bridge_driver, sensor_driver);
 	if (res < 0) {
+		log_debug("  Could not find media node with this sensor\n");
 		free(camera);
 		return -1;
 	}
@@ -255,6 +259,9 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
 		if (!config_setting_lookup_float(mode, "FNumber", &mm->f_number)) {
 			mm->f_number = 0.0f;
 		}
+		char modename[32] = {0};
+		mode_snprintf(modename, 31, mm);
+		log_debug("  Adding mode [%s]\n", modename);
 
 		config_setting_t *cmds = config_setting_lookup(mode, "Pipeline");
 		config_setting_t *cmd;
@@ -324,6 +331,7 @@ libmegapixels_load_file(libmegapixels_devconfig *config, const char *file)
 		log_error("Config already loaded\n");
 		return 0;
 	}
+	log_debug("Load config file %s\n", file);
 	config->loaded_config = 1;
 	config_t cfg;
 	config_setting_t *setting, *member;
@@ -438,6 +446,7 @@ libmegapixels_load_uvc(libmegapixels_devconfig *config)
 		log_error("libmegapixels_load_uvc was already called\n");
 		return 0;
 	}
+	log_debug("Loading UVC cameras\n");
 	config->loaded_uvc = 1;
 
 	struct dirent *dir;
@@ -500,5 +509,6 @@ int
 libmegapixels_init(libmegapixels_devconfig **config)
 {
 	*config = calloc(1, sizeof(libmegapixels_devconfig));
+	init_log(0);
 	return 1;
 }

+ 4 - 0
src/pipeline.c

@@ -10,6 +10,7 @@
 #include "libmegapixels.h"
 #include "log.h"
 #include "util.h"
+#include "mode.h"
 
 int
 setup_link(libmegapixels_camera *camera, uint32_t source_entity_id, uint32_t sink_entity_id,
@@ -204,6 +205,9 @@ libmegapixels_select_mode(libmegapixels_camera *camera, libmegapixels_mode *mode
 {
 	assert(camera->video_fd != 0);
 	assert(camera->sensor_fd != 0);
+	char modename[32] = {0};
+	mode_snprintf(modename, 31, mode);
+	log_debug("Setting '%s' mode to [%s]\n", camera->name, modename);
 	for (int i = 0; i < mode->num_cmds; i++) {
 		libmegapixels_cmd *cmd = mode->cmds[i];
 		struct v4l2_subdev_format subdev_fmt = {};