From patchwork Thu May 23 00:55:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 1268 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E2EF660C0D for ; Thu, 23 May 2019 02:55:48 +0200 (CEST) X-Halon-ID: 7f33cb72-7cf5-11e9-8d05-005056917f90 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [89.233.230.99]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA id 7f33cb72-7cf5-11e9-8d05-005056917f90; Thu, 23 May 2019 02:55:46 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Thu, 23 May 2019 02:55:34 +0200 Message-Id: <20190523005534.9631-3-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190523005534.9631-1-niklas.soderlund@ragnatech.se> References: <20190523005534.9631-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/2] cam: Add CamApp class X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 May 2019 00:55:49 -0000 Add more structure to main.cpp by breaking up the logic into a CamApp class. This makes the code easier to read and removes all but one of the organically grown global variables. Signed-off-by: Niklas Söderlund Reviewed-by: Kieran Bingham --- src/cam/main.cpp | 171 +++++++++++++++++++++++++++++++---------------- 1 file changed, 112 insertions(+), 59 deletions(-) diff --git a/src/cam/main.cpp b/src/cam/main.cpp index fe7d4f90dbf14ffd..5ca8356025a0c9f9 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -18,17 +18,101 @@ using namespace libcamera; -OptionsParser::Options options; -std::shared_ptr camera; -EventLoop *loop; +class CamApp +{ +public: + CamApp(); + + int init(int argc, char **argv); + void cleanup(); + + int run(); + + EventLoop *loop; +private: + int parseOptions(int argc, char *argv[]); + + OptionsParser::Options options_; + CameraManager *cm_; + std::shared_ptr camera_; +}; + +CamApp::CamApp() + : cm_(nullptr), camera_(nullptr) +{ +} + +int CamApp::init(int argc, char **argv) +{ + int ret; + + ret = parseOptions(argc, argv); + if (ret < 0) + return ret == -EINTR ? 0 : ret; + + cm_ = CameraManager::instance(); + + ret = cm_->start(); + if (ret) { + std::cout << "Failed to start camera manager: " + << strerror(-ret) << std::endl; + return ret; + } -void signalHandler(int signal) + if (options_.isSet(OptCamera)) { + camera_ = cm_->get(options_[OptCamera]); + if (!camera_) { + std::cout << "Camera " + << std::string(options_[OptCamera]) + << " not found" << std::endl; + cm_->stop(); + return -ENODEV; + } + + if (camera_->acquire()) { + std::cout << "Failed to acquire camera" << std::endl; + camera_.reset(); + cm_->stop(); + return -EINVAL; + } + + std::cout << "Using camera " << camera_->name() << std::endl; + } + + loop = new EventLoop(cm_->eventDispatcher()); + + return 0; +} + +void CamApp::cleanup() { - std::cout << "Exiting" << std::endl; - loop->exit(); + delete loop; + + if (camera_) { + camera_->release(); + camera_.reset(); + } + + cm_->stop(); +} + +int CamApp::run() +{ + if (options_.isSet(OptList)) { + std::cout << "Available cameras:" << std::endl; + for (const std::shared_ptr &cam : cm_->cameras()) + std::cout << "- " << cam->name() << std::endl; + } + + if (options_.isSet(OptCapture)) { + Capture capture; + return capture.run(camera_.get(), loop, options_); + } + + return 0; } -static int parseOptions(int argc, char *argv[]) +int CamApp::parseOptions(int argc, char *argv[]) { KeyValueParser streamKeyValue; streamKeyValue.addOption("role", OptionString, @@ -58,77 +142,46 @@ static int parseOptions(int argc, char *argv[]) "help"); parser.addOption(OptList, OptionNone, "List all cameras", "list"); - options = parser.parse(argc, argv); - if (!options.valid()) + options_ = parser.parse(argc, argv); + if (!options_.valid()) return -EINVAL; - if (options.empty() || options.isSet(OptHelp)) { + if (options_.empty() || options_.isSet(OptHelp)) { parser.usage(); - return options.empty() ? -EINVAL : -EINTR; + return options_.empty() ? -EINVAL : -EINTR; } return 0; } +CamApp app; + +void signalHandler(int signal) +{ + std::cout << "Exiting" << std::endl; + + if (app.loop) + app.loop->exit(); +} + int main(int argc, char **argv) { int ret; - ret = parseOptions(argc, argv); - if (ret < 0) - return ret == -EINTR ? 0 : EXIT_FAILURE; - - CameraManager *cm = CameraManager::instance(); - - ret = cm->start(); - if (ret) { - std::cout << "Failed to start camera manager: " - << strerror(-ret) << std::endl; + ret = app.init(argc, argv); + if (ret) return EXIT_FAILURE; - } - - loop = new EventLoop(cm->eventDispatcher()); struct sigaction sa = {}; sa.sa_handler = &signalHandler; sigaction(SIGINT, &sa, nullptr); - if (options.isSet(OptList)) { - std::cout << "Available cameras:" << std::endl; - for (const std::shared_ptr &cam : cm->cameras()) - std::cout << "- " << cam->name() << std::endl; - } + ret = app.run(); - if (options.isSet(OptCamera)) { - camera = cm->get(options[OptCamera]); - if (!camera) { - std::cout << "Camera " - << std::string(options[OptCamera]) - << " not found" << std::endl; - goto out; - } + app.cleanup(); - if (camera->acquire()) { - std::cout << "Failed to acquire camera" << std::endl; - goto out; - } + if (ret) + return EXIT_FAILURE; - std::cout << "Using camera " << camera->name() << std::endl; - } - - if (options.isSet(OptCapture)) { - Capture capture; - ret = capture.run(camera.get(), loop, options); - } - - if (camera) { - camera->release(); - camera.reset(); - } -out: - delete loop; - - cm->stop(); - - return ret; + return 0; }