summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2018-12-29 00:28:04 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-01-22 14:03:41 +0100
commitfba3d0460750fb4123d66f55315dbd9b34cc3d90 (patch)
tree5834039a98a2b31495d91006f02d0246e8b94aba
parent1369c0b7c3d6b195badd0312a675d68506e51b2e (diff)
cam: add utility to control cameras
Provide a utility to interact with cameras. This initial state is limited and only supports listing cameras in the system and selecting a camera to interact with. There is not much a interacting possible yet with a camera so the tool simply exercise the API to get hold of a camera. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/cam/cam.cpp144
-rw-r--r--src/cam/meson.build7
-rw-r--r--src/meson.build1
3 files changed, 152 insertions, 0 deletions
diff --git a/src/cam/cam.cpp b/src/cam/cam.cpp
new file mode 100644
index 00000000..0f795be7
--- /dev/null
+++ b/src/cam/cam.cpp
@@ -0,0 +1,144 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * main.cpp - cam-ctl a tool to interact with the library
+ */
+
+#include <getopt.h>
+#include <iomanip>
+#include <iostream>
+#include <map>
+#include <string.h>
+
+#include <libcamera/libcamera.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+
+using namespace std;
+using namespace libcamera;
+
+enum Option {
+ OptCamera = 'c',
+ OptHelp = 'h',
+ OptList = 'l',
+ OptLast = 0,
+};
+
+struct OptionInfo {
+ Option id;
+ const char *name;
+ const char *arguments;
+ const char *description;
+};
+
+static struct OptionInfo option_info[] = {
+ { OptCamera, "camera", "<camera>", "Specify which camera to operate on" },
+ { OptHelp, "help", nullptr, "Display this help message" },
+ { OptList, "list", nullptr, "List all cameras" },
+ { OptLast, nullptr, nullptr, nullptr },
+};
+
+std::map<Option, std::string> options;
+
+void usage()
+{
+ struct OptionInfo *info;
+
+ cout << "Options:" << endl;
+ for (info = option_info; info->id != OptLast; info++) {
+ string arg(info->name);
+
+ if (info->arguments)
+ arg += string(" ") + info->arguments;
+
+ cout << " -" << static_cast<char>(info->id) << " --" <<
+ setw(20) << left << arg << " - " <<
+ info->description << endl;
+ }
+}
+
+int parseOptions(int argc, char **argv)
+{
+ char short_options[ARRAY_SIZE(option_info) * 2 + 1];
+ struct option long_options[ARRAY_SIZE(option_info)];
+ struct OptionInfo *info;
+ unsigned ids = 0, idl = 0;
+
+ memset(short_options, 0, sizeof(short_options));
+ memset(long_options, 0, sizeof(long_options));
+
+ for (info = option_info; info->id != OptLast; info++) {
+ short_options[ids++] = info->id;
+ if (info->arguments)
+ short_options[ids++] = ':';
+
+ long_options[idl].name = info->name;
+ long_options[idl].has_arg =
+ info->arguments ? required_argument : no_argument;
+ long_options[idl].flag = 0;
+ long_options[idl].val = info->id;
+ idl++;
+ }
+
+ while (true) {
+ int c = getopt_long(argc, argv, short_options, long_options, nullptr);
+
+ if (c == -1)
+ break;
+
+ if (!isalpha(c))
+ return EXIT_FAILURE;
+
+ options[static_cast<Option>(c)] = optarg ? string(optarg) : "";
+ }
+
+ return 0;
+}
+
+bool optSet(Option opt)
+{
+ return options.count(opt) != 0;
+}
+
+int main(int argc, char **argv)
+{
+ int ret;
+
+ ret = parseOptions(argc, argv);
+ if (ret == EXIT_FAILURE)
+ return ret;
+
+ if (argc == 1 || optSet(OptHelp)) {
+ usage();
+ return 0;
+ }
+
+ CameraManager *cm = CameraManager::instance();
+
+ ret = cm->start();
+ if (ret) {
+ cout << "Failed to start camera manager: " << strerror(-ret) << endl;
+ return EXIT_FAILURE;
+ }
+
+ if (optSet(OptList)) {
+ cout << "Available cameras:" << endl;
+ for (const std::shared_ptr<Camera> &camera : cm->cameras())
+ cout << "- " << camera->name() << endl;
+ }
+
+ if (optSet(OptCamera)) {
+ std::shared_ptr<Camera> cam = cm->get(options[OptCamera]);
+
+ if (cam) {
+ cout << "Using camera " << cam->name() << endl;
+ } else {
+ cout << "Camera " << options[OptCamera] << " not found" << endl;
+ }
+ }
+
+ cm->stop();
+
+ return 0;
+}
diff --git a/src/cam/meson.build b/src/cam/meson.build
new file mode 100644
index 00000000..809a40e0
--- /dev/null
+++ b/src/cam/meson.build
@@ -0,0 +1,7 @@
+cam_sources = files([
+ 'cam.cpp',
+])
+
+cam = executable('cam', cam_sources,
+ link_with : libcamera,
+ include_directories : libcamera_includes)
diff --git a/src/meson.build b/src/meson.build
index 4ce9668c..a7f2e75d 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1 +1,2 @@
subdir('libcamera')
+subdir('cam')