[libcamera-devel] [PATCH 2/2] cam: Add CamApp class

Niklas Söderlund niklas.soderlund at ragnatech.se
Thu May 23 02:55:34 CEST 2019


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 <niklas.soderlund at ragnatech.se>
---
 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> 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> 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<Camera> &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<Camera> &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;
 }
-- 
2.21.0



More information about the libcamera-devel mailing list