diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-01-22 05:03:54 +0200 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2019-01-22 14:04:09 +0100 |
commit | f5e48ebf447ec15ba653fa3524e9b9de8e5eb736 (patch) | |
tree | 8b0b926612198fffa218e77a6d557f539aafc44f /src/cam/cam.cpp | |
parent | fba3d0460750fb4123d66f55315dbd9b34cc3d90 (diff) |
cam: Extract option parser to separate file
And turn it into an OptionsParser object.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'src/cam/cam.cpp')
-rw-r--r-- | src/cam/cam.cpp | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/src/cam/cam.cpp b/src/cam/cam.cpp deleted file mode 100644 index 0f795be7..00000000 --- a/src/cam/cam.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* 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; -} |