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