summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-08-08 13:13:17 +0200
committerJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-08-08 14:34:28 +0200
commit2855c178b0457405f3b8bb6dfa4c7ebd0450b652 (patch)
treec69b26f3d984bf2f6cc0774f72d6acbd7ddae6e2
parent59fde8be87724184c89dee112499b4921caa82c6 (diff)
libcamera: device_match: Introduce USBDeviceMatch
Introduce a USB-specific DeviceMatch derived class. Generalize the DeviceMatch::match() function by making its only parameter a CameraDevice instance and dynamically cast to the correct derived class in the overloaded match() functions. Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
-rw-r--r--include/libcamera/internal/device_match.h21
-rw-r--r--src/libcamera/device_match.cpp25
2 files changed, 40 insertions, 6 deletions
diff --git a/include/libcamera/internal/device_match.h b/include/libcamera/internal/device_match.h
index 6df7dece..e6608cac 100644
--- a/include/libcamera/internal/device_match.h
+++ b/include/libcamera/internal/device_match.h
@@ -12,12 +12,12 @@
namespace libcamera {
-class MediaDevice;
+class CameraDevice;
class DeviceMatch
{
public:
- virtual bool match(const MediaDevice *device) const = 0;
+ virtual bool match(const CameraDevice *device) const = 0;
};
class MediaDeviceMatch : public DeviceMatch
@@ -26,11 +26,26 @@ public:
void add(const std::string &entity);
MediaDeviceMatch(const std::string &driver);
- bool match(const MediaDevice *device) const override;
+ bool match(const CameraDevice *device) const override;
private:
std::string driver_;
std::vector<std::string> entities_;
};
+class USBDeviceMatch : public DeviceMatch
+{
+public:
+ USBDeviceMatch(const std::string &vid, const std::string &pid)
+ : vid_(vid), pid_(pid)
+ {
+ }
+
+ bool match(const CameraDevice *device) const override;
+
+private:
+ std::string vid_;
+ std::string pid_;
+};
+
}; /* namespace libcamera */
diff --git a/src/libcamera/device_match.cpp b/src/libcamera/device_match.cpp
index 17937d43..8870649c 100644
--- a/src/libcamera/device_match.cpp
+++ b/src/libcamera/device_match.cpp
@@ -7,7 +7,9 @@
#include "libcamera/internal/device_match.h"
+#include "libcamera/internal/camera_device.h"
#include "libcamera/internal/media_device.h"
+#include "libcamera/internal/usb_device.h"
/**
* \file device_match.h
@@ -84,15 +86,17 @@ void MediaDeviceMatch::add(const std::string &entity)
*
* \return True if the media device matches the search pattern, false otherwise
*/
-bool MediaDeviceMatch::match(const MediaDevice *device) const
+bool MediaDeviceMatch::match(const CameraDevice *device) const
{
- if (driver_ != device->driver())
+ const MediaDevice *media = static_cast<const MediaDevice *>(device);
+
+ if (driver_ != media->driver())
return false;
for (const std::string &name : entities_) {
bool found = false;
- for (const MediaEntity *entity : device->entities()) {
+ for (const MediaEntity *entity : media->entities()) {
if (name == entity->name()) {
found = true;
break;
@@ -106,4 +110,19 @@ bool MediaDeviceMatch::match(const MediaDevice *device) const
return true;
}
+/**
+ * \brief Compare a search pattern with a USB device
+ * \param[in] device The USB device
+ *
+ * Matching is performed on the USB device vendorId and productId.
+ *
+ * \return True if the USB device matches the search pattern, false otherwise
+ */
+bool USBDeviceMatch::match(const CameraDevice *device) const
+{
+ const USBDevice *usb = static_cast<const USBDevice *>(device);
+
+ return usb->vid() == vid_ && usb->pid() == pid_;
+}
+
} /* namespace libcamera */