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>
This commit is contained in:
Laurent Pinchart 2019-01-22 05:03:54 +02:00 committed by Niklas Söderlund
parent fba3d04607
commit f5e48ebf44
5 changed files with 341 additions and 145 deletions

85
src/cam/main.cpp Normal file
View file

@ -0,0 +1,85 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* main.cpp - cam - The libcamera swiss army knife
*/
#include <iostream>
#include <map>
#include <string.h>
#include <libcamera/libcamera.h>
#include "options.h"
using namespace libcamera;
OptionsParser::Options options;
enum {
OptCamera = 'c',
OptHelp = 'h',
OptList = 'l',
};
static int parseOptions(int argc, char *argv[])
{
OptionsParser parser;
parser.addOption(OptCamera, "Specify which camera to operate on",
"camera", OptionsParser::ArgumentRequired,
"camera");
parser.addOption(OptHelp, "Display this help message", "help");
parser.addOption(OptList, "List all cameras", "list");
options = std::move(parser.parse(argc, argv));
if (!options.valid())
return -EINVAL;
if (argc == 1 || options.isSet(OptHelp)) {
parser.usage();
return 1;
}
return 0;
}
int main(int argc, char **argv)
{
int ret;
ret = parseOptions(argc, argv);
if (ret < 0)
return EXIT_FAILURE;
CameraManager *cm = CameraManager::instance();
ret = cm->start();
if (ret) {
std::cout << "Failed to start camera manager: "
<< strerror(-ret) << std::endl;
return EXIT_FAILURE;
}
if (options.isSet(OptList)) {
std::cout << "Available cameras:" << std::endl;
for (const std::shared_ptr<Camera> &camera : cm->cameras())
std::cout << "- " << camera->name() << std::endl;
}
if (options.isSet(OptCamera)) {
std::shared_ptr<Camera> cam = cm->get(options[OptCamera]);
if (cam) {
std::cout << "Using camera " << cam->name() << std::endl;
} else {
std::cout << "Camera " << options[OptCamera]
<< " not found" << std::endl;
}
}
cm->stop();
return 0;
}