Loading...
Searching...
No Matches
DeviceEnumerator.hpp
1#pragma once
2
3#include <State/Address.hpp>
4
5#include <Device/Protocol/DeviceSettings.hpp>
6#include <Device/Protocol/ProtocolFactoryInterface.hpp>
7
8#include <ossia-qt/value_metatypes.hpp>
9
10#include <QQmlListProperty>
11#include <QQmlParserStatus>
12#include <QStringList>
13
14#include <nano_observer.hpp>
15
16#include <memory>
17#include <unordered_map>
18#include <verdigris>
19
20namespace ossia::net
21{
22class node_base;
23class parameter_base;
24}
25namespace Explorer
26{
27class DeviceDocumentPlugin;
28}
29namespace Device
30{
31struct DeviceSettings;
32class DeviceList;
33class ProtocolFactory;
34class DeviceEnumerator;
35}
36
37namespace JS
38{
39struct DeviceIdentifier : public QObject
40{
41 W_OBJECT(DeviceIdentifier)
42public:
43 explicit DeviceIdentifier(
44 QString cat, QString a, Device::DeviceSettings b, Device::ProtocolFactory* c)
45 : category{std::move(cat)}
46 , name{std::move(a)}
47 , settings{std::move(b)}
48 , protocol{c}
49 {
50 }
51 QString category;
52 QString name;
54 Device::ProtocolFactory* protocol{};
55
56 W_PROPERTY(QString, category MEMBER category)
57 W_PROPERTY(QString, name MEMBER name)
58 W_PROPERTY(Device::DeviceSettings, settings MEMBER settings)
59 W_PROPERTY(Device::ProtocolFactory*, protocol MEMBER protocol)
60};
61
69 : public QObject
70 , public QQmlParserStatus
71{
73 W_INTERFACE(QQmlParserStatus)
74
75public:
76 explicit GlobalDeviceEnumerator();
77 // explicit GlobalDeviceEnumerator(const QString& uuid);
79
80 void classBegin() override;
81 void componentComplete() override;
82
83 void setContext(const score::DocumentContext* doc);
84 W_SLOT(setContext)
85
86 void deviceAdded(
87 Device::ProtocolFactory* factory, const QString& category, const QString& name,
89 W_SIGNAL(deviceAdded, factory, category, name, settings)
90 void deviceRemoved(Device::ProtocolFactory* factory, const QString& name)
91 W_SIGNAL(deviceRemoved, factory, name)
92 QQmlListProperty<JS::DeviceIdentifier> devices();
93
94 W_PROPERTY(QQmlListProperty<JS::DeviceIdentifier>, devices READ devices)
95
96 bool enumerate() { return m_enumerate; }
97 void setEnumerate(bool b);
98 void enumerateChanged(bool b) W_SIGNAL(enumerateChanged, b)
99 W_PROPERTY(bool, enumerate READ enumerate WRITE setEnumerate NOTIFY enumerateChanged)
100
101 QString deviceType() const;
102 void setDeviceType(const QString& b);
103 void deviceTypeChanged(const QString& b) W_SIGNAL(deviceTypeChanged, b)
104 W_PROPERTY(
105 QString, deviceType READ deviceType WRITE setDeviceType NOTIFY deviceTypeChanged)
106
107 QStringList deviceTypes() const { return m_deviceTypes; }
108 void setDeviceTypes(const QStringList& b);
109 void deviceTypesChanged(const QStringList& b) W_SIGNAL(deviceTypesChanged, b)
110 W_PROPERTY(
111 QStringList, deviceTypes READ deviceTypes WRITE setDeviceTypes NOTIFY
112 deviceTypesChanged)
113
114private:
116 void requestReprocess();
117 void reprocess();
118 void clearEnumerators();
119 DeviceIdentifier* identifierFor(
120 const QString& category, const QString& name,
121 const Device::DeviceSettings& settings, Device::ProtocolFactory* proto);
122
123 const score::DocumentContext* doc{};
124
125 ossia::hash_map<
127 std::vector<std::tuple<QString, QString, Device::DeviceSettings>>>
128 m_known_devices;
129 ossia::hash_map<Device::ProtocolFactory*, Device::DeviceEnumerators>
130 m_current_enums;
131
137 std::vector<std::unique_ptr<DeviceIdentifier>> m_identifiers;
138
141 std::vector<DeviceIdentifier*> m_raw_list;
142
146 QStringList m_deviceTypes;
147 bool m_enumerate{};
148
151 bool m_qmlCreating{};
152};
153
155 : public QObject
156 , public Nano::Observer
157{
158 W_OBJECT(DeviceListener)
159
160public:
161 explicit DeviceListener();
163
164 QString deviceName() { return m_uuid; }
165 void setDeviceName(const QString& b);
166 void deviceNameChanged(const QString& b) W_SIGNAL(deviceNameChanged, b)
167 W_PROPERTY(
168 QString, deviceName READ deviceName WRITE setDeviceName NOTIFY deviceNameChanged)
169
170 QString deviceType() { return m_uuid; }
171 void setDeviceType(const QString& b);
172 void deviceTypeChanged(const QString& b) W_SIGNAL(deviceTypeChanged, b)
173 W_PROPERTY(
174 QString, deviceType READ deviceType WRITE setDeviceType NOTIFY deviceTypeChanged)
175
176 bool listen() { return m_listen; }
177 void setListen(bool b);
178 void listenChanged(bool b) W_SIGNAL(listenChanged, b)
179 W_PROPERTY(bool, listen READ listen WRITE setListen NOTIFY listenChanged)
180
181 // To QML
182 void message(const QString& address, QVariant value) W_SIGNAL(message, address, value);
183 void parameterCreated(const QString& address) W_SIGNAL(parameterCreated, address);
184
185private:
186 const score::DocumentContext* ctx{};
187 void init();
188 void on_deviceAdded(Device::DeviceInterface& dev);
189 void on_nodeCreated(const ossia::net::node_base&);
190 void on_parameterCreated(const ossia::net::parameter_base&);
191
192 QString m_name;
193 QString m_uuid;
194 Device::ProtocolFactory::ConcreteKey m_deviceType{};
195
196 bool m_listen{};
197};
198
199QString addressFromParameter(const ossia::net::parameter_base& p);
200}
201
202Q_DECLARE_METATYPE(JS::DeviceListener*)
203Q_DECLARE_METATYPE(JS::GlobalDeviceEnumerator*)
204W_REGISTER_ARGTYPE(JS::DeviceListener*)
205W_REGISTER_ARGTYPE(Device::ProtocolFactory*)
Definition DeviceInterface.hpp:107
Definition ProtocolFactoryInterface.hpp:52
Definition DeviceEnumerator.hpp:157
Definition DeviceEnumerator.hpp:71
GlobalDeviceEnumerator()
Definition DeviceEnumerator.cpp:29
Manipulation of Devices from Qt.
Definition AddressSettings.cpp:14
Definition DeviceSettings.hpp:20
Definition DeviceEnumerator.hpp:40
Definition DocumentContext.hpp:18