ImagingTools Core SDK
CDeviceControllerProxyComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QTimer>
7
8// ACF includes
9#include <icomp/CComponentBase.h>
10#include <imod/CMultiModelDispatcherBase.h>
11#include <ilog/TLoggerCompWrap.h>
12#include <imod/TModelWrap.h>
13#include <imod/IModel.h>
14#include <imod/CModelUpdateBridge.h>
15
16// ImtCore includes
17#include <imtbase/CCollectionInfo.h>
18#include <imtbase/TModelUpdateBinder.h>
19#include <imtdev/IDeviceController.h>
20#include <imtdev/IDeviceInstance.h>
21#include <imtdev/IDeviceSpecification.h>
22
23
24namespace imtdev
25{
26
27
101 public QObject,
102 public ilog::CLoggerComponentBase,
103 public imod::CMultiModelDispatcherBase,
104 virtual public IDeviceController,
106{
107 Q_OBJECT
108public:
109 typedef ilog::CLoggerComponentBase BaseClass;
110
111 I_BEGIN_COMPONENT(CDeviceControllerProxyComp);
112 I_REGISTER_SUBELEMENT(DeviceTypeList);
113 I_REGISTER_SUBELEMENT_INTERFACE(DeviceTypeList, imtbase::ICollectionInfo, ExtractDeviceTypeList);
114 I_REGISTER_SUBELEMENT_INTERFACE(DeviceTypeList, imod::IModel, ExtractDeviceTypeList);
115 I_REGISTER_SUBELEMENT_INTERFACE(DeviceTypeList, istd::IChangeable, ExtractDeviceTypeList);
116 I_REGISTER_SUBELEMENT(DeviceList);
117 I_REGISTER_SUBELEMENT_INTERFACE(DeviceList, imtbase::ICollectionInfo, ExtractDeviceList);
118 I_REGISTER_SUBELEMENT_INTERFACE(DeviceList, imod::IModel, ExtractDeviceList);
119 I_REGISTER_SUBELEMENT_INTERFACE(DeviceList, istd::IChangeable, ExtractDeviceList);
120 I_REGISTER_SUBELEMENT(DeviceStateProvider);
121 I_REGISTER_SUBELEMENT_INTERFACE(DeviceStateProvider, IDeviceStateProvider, ExtractDeviceStateProvider);
122 I_REGISTER_SUBELEMENT_INTERFACE(DeviceStateProvider, imod::IModel, ExtractDeviceStateProvider);
123 I_REGISTER_SUBELEMENT_INTERFACE(DeviceStateProvider, istd::IChangeable, ExtractDeviceStateProvider);
124 I_REGISTER_SUBELEMENT(OverriddenDeviceInfo);
125 I_REGISTER_SUBELEMENT_INTERFACE(OverriddenDeviceInfo, imtbase::ICollectionInfo, ExtractOverriddenDeviceInfo);
126 I_REGISTER_SUBELEMENT_INTERFACE(OverriddenDeviceInfo, imod::IModel, ExtractOverriddenDeviceInfo);
127 I_REGISTER_SUBELEMENT_INTERFACE(OverriddenDeviceInfo, istd::IChangeable, ExtractOverriddenDeviceInfo);
128 I_REGISTER_INTERFACE(IDeviceController);
129 I_ASSIGN_MULTI_0(m_deviceControllerCompPtr, "DeviceControllers", "Device controllers", false);
130 I_ASSIGN_TO(m_deviceEnumeratorCompPtr, m_deviceControllerCompPtr, true);
131 I_ASSIGN(m_enableAttrPtr, "EnableEnumerationControl", "Enable automatic enumeration control if true", true, false);
132 I_ASSIGN(m_intervalAttrPtr, "EnumerationInterval", "Interval between starts of successive enumeration cycles (secs)\n0 - Continuous enumeration", true, 5);
133 I_END_COMPONENT;
134
136
137 // reimplemented (IDeviceController)
138 virtual const QByteArrayList& GetSupportedDeviceTypeIds() const override;
139 virtual const IDeviceSpecification* GetDeviceStaticInfo(const QByteArray& deviceTypeId) const override;
140 virtual const imtbase::ICollectionInfo& GetDeviceInstanceList() const override;
141 virtual bool SetDeviceInstanceName(const QByteArray& deviceId, const QString& name) override;
142 virtual bool SetDeviceInstanceDescription(const QByteArray& deviceId, const QString& description) override;
143 virtual DeviceInstancePtr GetDeviceInstance(const QByteArray& deviceId) const override;
144 virtual const IDeviceStateProvider& GetDeviceStateProvider() const override;
145 virtual imtdev::DeviceAccessorPtr OpenDevice(
146 const QByteArray& deviceId,
147 const iprm::IParamsSet* paramsPtr) override;
148 virtual bool CloseDevice(const QByteArray& deviceId) override;
149
150 // reimplemented (IDeviceEnumerator)
151 virtual IDeviceEnumerator::StartResult StartEnumeration(IDeviceEnumerator::IResultHandler* resultHandlerPtr) override;
152 virtual void CancelEnumeration() override;
153
154 // reimplemented (IDeviceEnumerationResultHandler)
155 virtual void OnEnumerationResult(
156 EnumerationResult result,
157 const IDeviceEnumerator* deviceEnumeratorPtr) override;
158
159protected:
160 // reimplemented (imod::CMultiModelDispatcherBase)
161 virtual void OnModelChanged(int modelId, const istd::IChangeable::ChangeSet& changeSet) override;
162
163 // reimplemented (icomp::CComponentBase)
164 virtual void OnComponentCreated() override;
165 virtual void OnComponentDestroyed() override;
166
167protected Q_SLOTS:
168 virtual void OnIntervalTimer();
169
170protected:
171 virtual void StartEnumeration();
172 virtual IDeviceEnumerator* GetCurrentDeviceEnumerator();
173 virtual IDeviceEnumerator* GetNextDeviceEnumerator();
174
175 virtual void UpdateDeviceTypeIdList();
176 virtual void UpdateDeviceList();
177 virtual IDeviceController* FindDeviceController(const QByteArray& deviceId) const;
178 virtual QByteArray GetDeviceTypeId(const QByteArray& deviceId) const;
179
180 template <class InteraceType>
181 static InteraceType* ExtractDeviceTypeList(CDeviceControllerProxyComp& parent)
182 {
183 return &parent.m_deviceTypeList;
184 }
185
186 template <class InteraceType>
187 static InteraceType* ExtractDeviceList(CDeviceControllerProxyComp& parent)
188 {
189 return &parent.m_deviceList;
190 }
191
192 template <class InteraceType>
193 static InteraceType* ExtractDeviceStateProvider(CDeviceControllerProxyComp& parent)
194 {
195 return &parent.m_deviceStateProvider;
196 }
197
198 template <class InteraceType>
199 static InteraceType* ExtractOverriddenDeviceInfo(CDeviceControllerProxyComp& parent)
200 {
201 return &parent.m_overriddenDeviceInfo;
202 }
203
204protected:
205 enum ModelId
206 {
207 MI_DEVICE_LIST_BASE = 0
208 };
209
210 class DeviceStateProvider : virtual public IDeviceStateProvider
211 {
212 public:
213 DeviceStateProvider();
214 void SetParent(CDeviceControllerProxyComp& parent);
215
216 // reimplemented (IDeviceStateProvider)
217 virtual DeviceState GetDeviceState(const QByteArray& deviceId) const override;
218
219 private:
220 CDeviceControllerProxyComp* m_parentPtr;
221 };
222
223protected:
224 I_MULTIREF(IDeviceController, m_deviceControllerCompPtr);
225 I_MULTIREF(IDeviceEnumerator, m_deviceEnumeratorCompPtr);
226 I_ATTR(bool, m_enableAttrPtr);
227 I_ATTR(int, m_intervalAttrPtr);
228
229 QByteArrayList m_supportedDeviceTypeIds;
230
231 QMap<QByteArray, IDeviceController*> m_deviceControllerMap;
232
233 imod::TModelWrap<imtbase::CCollectionInfo> m_deviceTypeList;
234 imod::TModelWrap<imtbase::CCollectionInfo> m_deviceList;
235 imod::TModelWrap<DeviceStateProvider> m_deviceStateProvider;
236 imod::TModelWrap<imtbase::CCollectionInfo> m_overriddenDeviceInfo;
237
238 imod::CModelUpdateBridge m_deviceStateProviderUpdateBridge;
239
240 int m_enumeratorIndex;
241 QTimer m_intervalTimer;
242 IDeviceEnumerator::IResultHandler* m_resultHandlerPtr;
243
244private:
245 void OnOverriddenDeviceInfoUpdated(const istd::IChangeable::ChangeSet& changeset, const imtbase::ICollectionInfo* objectPtr);
246
247private:
249};
250
251
252} // namespace imtdev
253
254
Proxy controller component aggregating multiple device controllers.
Common interface for controlling devices.
Callback interface for receiving enumeration results.
Interface for asynchronous device enumeration.
StartResult
Start enumeration result codes.
Interface for describing static information about a device type/class.
Interface for tracking device connection states.
DeviceState
Runtime state of a device.