From patchwork Wed May 13 17:30:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 3792 X-Patchwork-Delegate: umang.jain@ideasonboard.com Return-Path: Received: from o1.f.az.sendgrid.net (o1.f.az.sendgrid.net [208.117.55.132]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 8ED6660DFF for ; Wed, 13 May 2020 19:30:02 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=uajain.com header.i=@uajain.com header.b="jTXSiAMJ"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uajain.com; h=from:subject:in-reply-to:references:mime-version:to:cc: content-transfer-encoding:content-type; s=s1; bh=vQG8D4Rs2e+3VRzx4T+kw1iaoiDSgpaV3ULjJUAPrsI=; b=jTXSiAMJl4n/amseeBFMogLG+3AnaNoyM9jqq55o3j4msCf5XAk8IoMj5UikBL4/BybI w3G9U0qRuWGvwk5dkf6T/6wtUXgumd/MH17vJ4znK3IVMegOEiSMVk2XrAVmwPLkYpK+o/ jr82yQycDMFHiQMjuEJdMXPqNTri46ScI= Received: by filter0072p3las1.sendgrid.net with SMTP id filter0072p3las1-6642-5EBC2E98-17B 2020-05-13 17:30:00.930007584 +0000 UTC m=+2402884.819728798 Received: from mail.uajain.com (unknown) by ismtpd0001p1maa1.sendgrid.net (SG) with ESMTP id 3v7NZwMDTz2Lz20o5j-dDw Wed, 13 May 2020 17:30:00.181 +0000 (UTC) From: Umang Jain Date: Wed, 13 May 2020 17:30:00 +0000 (UTC) Message-Id: <20200513172950.72685-5-email@uajain.com> In-Reply-To: <20200513172950.72685-1-email@uajain.com> References: <20200513172950.72685-1-email@uajain.com> Mime-Version: 1.0 X-SG-EID: 1Q40EQ7YGir8a9gjSIAdTjhngY657NMk9ckeo4dbHZDiOpywc/L3L9rFqlwE4KPcROc560Os82e1tQwAlD2FoFmN5OulnnhnFwgFz4a1BpblVayaQjtPgzBnzvPCHP5XF8rSK9ay1hcdUKpmjYejxIF4TLI7ULNS7cSUuzXvBcoi6PaATAHiIHsntyR2+mlCOMVhtqruEhw7HTnKfAE9R7e0FSmjTx0aqURAAWvRtcXQxEplTgK1x63U11jfVaHv To: libcamera-devel Subject: [libcamera-devel] [PATCH v2 4/5] qcam: main_window: Introduce hotplug support X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 May 2020 17:30:04 -0000 Signed-off-by: Umang Jain --- src/qcam/main_window.cpp | 83 ++++++++++++++++++++++++++++++++++++++++ src/qcam/main_window.h | 6 +++ 2 files changed, 89 insertions(+) diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index 7de0895..d595112 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -49,6 +49,43 @@ public: } }; +/** + * \brief Custom QEvent to signal hotplug or unplug + */ +class HotplugEvent : public QEvent +{ +public: + enum PLUGEVENT { + HOTPLUG, + UNPLUG + }; + + HotplugEvent(std::shared_ptr camera, PLUGEVENT event) + : QEvent(type()) + { + camera_ = camera; + plugEvent_ = event; + } + + ~HotplugEvent() + { + camera_.reset(); + } + + static Type type() + { + static int type = QEvent::registerEventType(); + return static_cast(type); + } + + PLUGEVENT getHotplugEvent() { return plugEvent_; } + Camera *getCamera() { return camera_.get(); } + +private: + std::shared_ptr camera_; + PLUGEVENT plugEvent_; +}; + MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options) : saveRaw_(nullptr), options_(options), cm_(cm), allocator_(nullptr), isCapturing_(false), captureRaw_(false) @@ -71,6 +108,10 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options) setCentralWidget(viewfinder_); adjustSize(); + /* Hotplug/unplug support */ + cm_->cameraAdded.connect(this, &MainWindow::addNewCamera); + cm_->cameraRemoved.connect(this, &MainWindow::removeCamera); + /* Open the camera and start capture. */ ret = openCamera(); if (ret < 0) { @@ -95,6 +136,9 @@ bool MainWindow::event(QEvent *e) if (e->type() == CaptureEvent::type()) { processCapture(); return true; + } else if (e->type() == HotplugEvent::type()) { + processHotplug(static_cast(e)); + return true; } return QMainWindow::event(e); @@ -525,6 +569,45 @@ void MainWindow::stopCapture() setWindowTitle(title_); } +/* ----------------------------------------------------------------------------- + * Camera hotplugging support + */ + +void MainWindow::processHotplug(HotplugEvent *e) +{ + Camera *camera = e->getCamera(); + HotplugEvent::PLUGEVENT event = e->getHotplugEvent(); + + if (event == HotplugEvent::PLUGEVENT::HOTPLUG) { + cameraCombo_->addItem(QString::fromStdString(camera->name())); + } else if (event == HotplugEvent::PLUGEVENT::UNPLUG) { + int camIndex = cameraCombo_->findText(QString::fromStdString(camera->name())); + + /* Check if the currently-streaming camera is removed. */ + if (camera == camera_.get()) { + toggleCapture(false); + cameraCombo_->setCurrentIndex(0); + } + cameraCombo_->removeItem(camIndex); + } +} + +void MainWindow::addNewCamera(std::shared_ptr camera) +{ + qInfo() << "Adding new camera:" << camera->name().c_str(); + QCoreApplication::postEvent(this, + new HotplugEvent(std::move(camera), + HotplugEvent::PLUGEVENT::HOTPLUG)); +} + +void MainWindow::removeCamera(std::shared_ptr camera) +{ + qInfo() << "Removing camera:" << camera->name().c_str(); + QCoreApplication::postEvent(this, + new HotplugEvent(std::move(camera), + HotplugEvent::PLUGEVENT::UNPLUG)); +} + /* ----------------------------------------------------------------------------- * Image Save */ diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index 59fa2d9..9108780 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -32,6 +32,8 @@ using namespace libcamera; class QAction; class QComboBox; +class HotplugEvent; + enum { OptCamera = 'c', OptHelp = 'h', @@ -87,8 +89,12 @@ private: int startCapture(); void stopCapture(); + void addNewCamera(std::shared_ptr camera); + void removeCamera(std::shared_ptr camera); + void requestComplete(Request *request); void processCapture(); + void processHotplug(HotplugEvent *e); void processViewfinder(FrameBuffer *buffer); /* UI elements */