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
12#include <nano_observer.hpp>
13
14#include <memory>
15#include <unordered_map>
16#include <verdigris>
17
18namespace ossia::net
19{
20class node_base;
21class parameter_base;
22}
23namespace Explorer
24{
25class DeviceDocumentPlugin;
26}
27namespace Device
28{
29struct DeviceSettings;
30class DeviceList;
31class ProtocolFactory;
32class DeviceEnumerator;
33}
34
35namespace JS
36{
37struct DeviceIdentifier : public QObject
38{
39 W_OBJECT(DeviceIdentifier)
40public:
41 explicit DeviceIdentifier(
42 QString cat, QString a, Device::DeviceSettings b, Device::ProtocolFactory* c)
43 : category{std::move(cat)}
44 , name{std::move(a)}
45 , settings{std::move(b)}
46 , protocol{c}
47 {
48 }
49 QString category;
50 QString name;
52 Device::ProtocolFactory* protocol{};
53
54 W_PROPERTY(QString, category MEMBER category)
55 W_PROPERTY(QString, name MEMBER name)
56 W_PROPERTY(Device::DeviceSettings, settings MEMBER settings)
57 W_PROPERTY(Device::ProtocolFactory*, protocol MEMBER protocol)
58};
59
60class GlobalDeviceEnumerator : public QObject
61{
63
64public:
65 explicit GlobalDeviceEnumerator();
66 // explicit GlobalDeviceEnumerator(const QString& uuid);
68
69 void setContext(const score::DocumentContext* doc);
70 W_SLOT(setContext)
71
72 void deviceAdded(
73 Device::ProtocolFactory* factory, const QString& category, const QString& name,
75 W_SIGNAL(deviceAdded, factory, category, name, settings)
76 void deviceRemoved(Device::ProtocolFactory* factory, const QString& name)
77 W_SIGNAL(deviceRemoved, factory, name)
78 QQmlListProperty<JS::DeviceIdentifier> devices();
79
80 W_PROPERTY(QQmlListProperty<JS::DeviceIdentifier>, devices READ devices)
81
82 bool enumerate() { return m_enumerate; }
83 void setEnumerate(bool b);
84 void enumerateChanged(bool b) W_SIGNAL(enumerateChanged, b)
85 W_PROPERTY(bool, enumerate READ enumerate WRITE setEnumerate NOTIFY enumerateChanged)
86
87 QString deviceType() { return m_uuid; }
88 void setDeviceType(const QString& b);
89 void deviceTypeChanged(const QString& b) W_SIGNAL(deviceTypeChanged, b)
90 W_PROPERTY(
91 QString, deviceType READ deviceType WRITE setDeviceType NOTIFY deviceTypeChanged)
92
93private:
94 void reprocess();
95 void clearEnumerators();
96 DeviceIdentifier* identifierFor(
97 const QString& category, const QString& name,
98 const Device::DeviceSettings& settings, Device::ProtocolFactory* proto);
99
100 const score::DocumentContext* doc{};
101
102 ossia::hash_map<
104 std::vector<std::tuple<QString, QString, Device::DeviceSettings>>>
105 m_known_devices;
106 ossia::hash_map<Device::ProtocolFactory*, Device::DeviceEnumerators>
107 m_current_enums;
108
114 std::vector<std::unique_ptr<DeviceIdentifier>> m_identifiers;
115
118 std::vector<DeviceIdentifier*> m_raw_list;
119 QString m_uuid;
120 Device::ProtocolFactory::ConcreteKey m_deviceType{};
121 bool m_enumerate{};
122};
123
125 : public QObject
126 , public Nano::Observer
127{
128 W_OBJECT(DeviceListener)
129
130public:
131 explicit DeviceListener();
133
134 QString deviceName() { return m_uuid; }
135 void setDeviceName(const QString& b);
136 void deviceNameChanged(const QString& b) W_SIGNAL(deviceNameChanged, b)
137 W_PROPERTY(
138 QString, deviceName READ deviceName WRITE setDeviceName NOTIFY deviceNameChanged)
139
140 QString deviceType() { return m_uuid; }
141 void setDeviceType(const QString& b);
142 void deviceTypeChanged(const QString& b) W_SIGNAL(deviceTypeChanged, b)
143 W_PROPERTY(
144 QString, deviceType READ deviceType WRITE setDeviceType NOTIFY deviceTypeChanged)
145
146 bool listen() { return m_listen; }
147 void setListen(bool b);
148 void listenChanged(bool b) W_SIGNAL(listenChanged, b)
149 W_PROPERTY(bool, listen READ listen WRITE setListen NOTIFY listenChanged)
150
151 // To QML
152 void message(const QString& address, QVariant value) W_SIGNAL(message, address, value);
153 void parameterCreated(const QString& address) W_SIGNAL(parameterCreated, address);
154
155private:
156 const score::DocumentContext* ctx{};
157 void init();
158 void on_deviceAdded(Device::DeviceInterface& dev);
159 void on_nodeCreated(const ossia::net::node_base&);
160 void on_parameterCreated(const ossia::net::parameter_base&);
161
162 QString m_name;
163 QString m_uuid;
164 Device::ProtocolFactory::ConcreteKey m_deviceType{};
165
166 bool m_listen{};
167};
168
169QString addressFromParameter(const ossia::net::parameter_base& p);
170}
171
172Q_DECLARE_METATYPE(JS::DeviceListener*)
173Q_DECLARE_METATYPE(JS::GlobalDeviceEnumerator*)
174W_REGISTER_ARGTYPE(JS::DeviceListener*)
175W_REGISTER_ARGTYPE(Device::ProtocolFactory*)
Definition DeviceInterface.hpp:107
Definition ProtocolFactoryInterface.hpp:52
Definition DeviceEnumerator.hpp:127
Definition DeviceEnumerator.hpp:61
GlobalDeviceEnumerator()
Definition DeviceEnumerator.cpp:26
Manipulation of Devices from Qt.
Definition AddressSettings.cpp:14
Definition DeviceSettings.hpp:20
Definition DeviceEnumerator.hpp:38
Definition DocumentContext.hpp:18