diff --git a/cmd/camera-streamer.c b/cmd/camera-streamer.c index da294f0..728c749 100644 --- a/cmd/camera-streamer.c +++ b/cmd/camera-streamer.c @@ -51,7 +51,14 @@ void camera_http_option(http_worker_t *worker, FILE *stream) bool headers = false; http_enum_params(worker, stream, camera_http_set_option, &headers); if (!headers) { - http_404(stream, "No options passed.\r\n"); + http_404(stream, ""); + fprintf(stream, "No options passed.\r\n"); + } + + fprintf(stream, "\r\nSet: /option?name=value\r\n\r\n"); + + if (camera) { + device_dump_options(camera->camera, stream); } } diff --git a/device/device.c b/device/device.c index 60f9fad..d3ab7d3 100644 --- a/device/device.c +++ b/device/device.c @@ -211,6 +211,13 @@ int device_video_force_key(device_t *dev) return 0; } +void device_dump_options(device_t *dev, FILE *stream) +{ + if (dev || dev->hw->device_dump_options) { + dev->hw->device_dump_options(dev, stream); + } +} + int device_set_fps(device_t *dev, int desired_fps) { if (!dev || dev->hw->device_set_fps(dev, desired_fps) < 0) diff --git a/device/device.h b/device/device.h index 50655c0..bdc2f6e 100644 --- a/device/device.h +++ b/device/device.h @@ -2,6 +2,7 @@ #include #include +#include typedef struct buffer_s buffer_t; typedef struct buffer_list_s buffer_list_t; @@ -13,6 +14,7 @@ typedef struct device_hw_s { void (*device_close)(device_t *dev); int (*device_set_decoder_start)(device_t *dev, bool do_on); int (*device_video_force_key)(device_t *dev); + void (*device_dump_options)(device_t *dev, FILE *stream); int (*device_set_fps)(device_t *dev, int desired_fps); int (*device_set_option)(device_t *dev, const char *key, const char *value); @@ -65,6 +67,7 @@ int device_set_stream(device_t *dev, bool do_on); int device_set_decoder_start(device_t *dev, bool do_on); int device_video_force_key(device_t *dev); +void device_dump_options(device_t *dev, FILE *stream); int device_set_fps(device_t *dev, int desired_fps); int device_set_option_string(device_t *dev, const char *option, const char *value); void device_set_option_list(device_t *dev, const char *option_list); diff --git a/device/libcamera/device.cc b/device/libcamera/device.cc index e09d601..5bc17ed 100644 --- a/device/libcamera/device.cc +++ b/device/libcamera/device.cc @@ -17,22 +17,12 @@ libcamera::ControlInfoMap::Map libcamera_control_list(device_t *dev) return controls_map; } -void libcamera_device_dump(device_t *dev) +void libcamera_device_dump_options(device_t *dev, FILE *stream) { auto &properties = dev->libcamera->camera->properties(); auto idMap = properties.idMap(); - for (auto const &control : libcamera_control_list(dev)) { - if (!control.first) - continue; - - auto control_id = control.first; - auto control_key = libcamera_device_option_normalize(control_id->name()); - auto control_info = control.second; - - LOG_VERBOSE(dev, "Available control: %s (%08x, type=%d): %s", - control_id->name().c_str(), control_id->id(), control_id->type(), control_info.toString().c_str()); - } + fprintf(stream, "Properties:\n"); for (auto const &control : properties) { if (!control.first) @@ -46,8 +36,25 @@ void libcamera_device_dump(device_t *dev) control_id_name = control_id_info->name(); } - LOG_VERBOSE(dev, "Property: %s (%08x, type=%d): %s", - control_id_name.c_str(), control_id, control_value.type(), control_value.toString().c_str()); + fprintf(stream, "- property: %s (%08x, type=%d): %s\n", + control_id_name.c_str(), control_id, control_value.type(), + control_value.toString().c_str()); + } + + fprintf(stream, "\n"); + fprintf(stream, "Options:\n"); + + for (auto const &control : libcamera_control_list(dev)) { + if (!control.first) + continue; + + auto control_id = control.first; + auto control_key = libcamera_device_option_normalize(control_id->name()); + auto control_info = control.second; + + fprintf(stream, "- available option: %s (%08x, type=%d): %s\n", + control_id->name().c_str(), control_id->id(), control_id->type(), + control_info.toString().c_str()); } } @@ -80,8 +87,6 @@ int libcamera_device_open(device_t *dev) } LOG_INFO(dev, "Device path=%s opened", dev->path); - - libcamera_device_dump(dev); return 0; error: diff --git a/device/libcamera/libcamera.cc b/device/libcamera/libcamera.cc index 6c43bcb..2030112 100644 --- a/device/libcamera/libcamera.cc +++ b/device/libcamera/libcamera.cc @@ -4,6 +4,7 @@ device_hw_t libcamera_device_hw = { .device_open = libcamera_device_open, .device_close = libcamera_device_close, + .device_dump_options = libcamera_device_dump_options, .device_set_fps = libcamera_device_set_fps, .device_set_option = libcamera_device_set_option, diff --git a/device/libcamera/libcamera.hh b/device/libcamera/libcamera.hh index f54ce12..8a75b23 100644 --- a/device/libcamera/libcamera.hh +++ b/device/libcamera/libcamera.hh @@ -57,6 +57,7 @@ typedef struct buffer_libcamera_s { int libcamera_device_open(device_t *dev); void libcamera_device_close(device_t *dev); +void libcamera_device_dump_options(device_t *dev, FILE *stream); int libcamera_device_set_fps(device_t *dev, int desired_fps); int libcamera_device_set_option(device_t *dev, const char *key, const char *value); diff --git a/html/index.html b/html/index.html index 7745dfe..0f92e09 100644 --- a/html/index.html +++ b/html/index.html @@ -55,6 +55,7 @@ The commands available on some cameras: