2 #include <State/Widgets/AddressFragmentLineEdit.hpp>
4 #include <Explorer/DefaultProtocolFactory.hpp>
6 #include <Crousti/Concepts.hpp>
8 #include <ossia/network/base/protocol.hpp>
9 #include <ossia/network/generic/generic_device.hpp>
11 #include <QFormLayout>
15 template <
typename Node>
16 class Protocol final :
public ossia::net::protocol_base
19 explicit Protocol(
const ossia::net::network_context_ptr& ctx)
20 : ossia::net::protocol_base{flags{}}
24 template <
bool Input,
typename Field>
25 ossia::net::parameter_base* create_node(ossia::net::node_base& root, Field& f)
27 ossia::net::node_base* node{};
28 if constexpr(avnd::has_path<Field>)
30 static constexpr
auto name = avnd::get_path<Field>();
31 node = &ossia::net::create_node(root, name);
35 static constexpr
auto name = avnd::get_name<Field>();
38 node = &ossia::net::create_node(root, fmt::format(
"/in/{}", name));
42 node = &ossia::net::create_node(root, fmt::format(
"/out/{}", name));
46 using val_t = std::decay_t<decltype(f.value)>;
47 return node->create_parameter(oscr::type_for_arg<val_t>());
50 void set_field_value(
auto& f,
const ossia::value& v)
52 oscr::from_ossia_value(f, v, f.value);
53 if_possible(f.update(impl));
57 void set_device(ossia::net::device_base& dev)
override
60 auto& root = dev.get_root_node();
61 inputs.resize(avnd::input_introspection<Node>::size);
62 avnd::input_introspection<Node>::for_all_n(
63 avnd::get_inputs(impl), [&]<std::size_t I>(
auto& f, avnd::field_index<I>) {
64 inputs[I] = create_node<true>(root, f);
65 inputs[I]->add_callback(
66 [&f,
this](
const ossia::value& v) { set_field_value(f, v); });
69 outputs.resize(avnd::output_introspection<Node>::size);
70 avnd::output_introspection<Node>::for_all_n(
71 avnd::get_outputs(impl), [&]<std::size_t I>(
auto& f, avnd::field_index<I>) {
72 outputs[I] = create_node<false>(root, f);
76 bool push(
const ossia::net::parameter_base& param,
const ossia::value& v)
override
79 for(
int i = 0; i < inputs.size(); i++)
84 avnd::input_introspection<Node>::for_nth(
85 avnd::get_inputs(impl), i,
86 [
this, &v](
auto& f) { this->set_field_value(f, v); });
93 void process_on_input()
97 avnd::output_introspection<Node>::for_all_n(
98 avnd::get_outputs(impl), [&]<std::size_t I>(
auto& f, avnd::field_index<I>) {
99 SCORE_ASSERT(outputs[I]);
100 outputs[I]->set_value(oscr::to_ossia_value(f, f.value));
104 bool pull(ossia::net::parameter_base&)
override {
return false; }
105 bool push_raw(
const ossia::net::full_parameter_data&)
override {
return false; }
106 bool observe(ossia::net::parameter_base&,
bool)
override {
return false; }
107 bool update(ossia::net::node_base& node_base)
override {
return false; }
110 std::vector<ossia::net::parameter_base*> inputs;
111 std::vector<ossia::net::parameter_base*> outputs;
114 template <
typename Node_T>
121 : OwningDeviceInterface{settings}
124 m_capas.canRefreshTree =
true;
125 m_capas.canAddNode =
false;
126 m_capas.canRemoveNode =
false;
127 m_capas.canRenameNode =
false;
128 m_capas.canSetProperties =
false;
129 m_capas.canSerialize =
false;
134 bool reconnect()
override
138 auto protocol = std::make_unique<Protocol<Node_T>>(this->m_ctx.networkContext());
139 auto dev = std::make_unique<ossia::net::generic_device>(
140 std::move(protocol), settings().name.toStdString());
142 m_dev = std::move(dev);
143 deviceChanged(
nullptr, m_dev.get());
147 void disconnect()
override { OwningDeviceInterface::disconnect(); }
150 const Explorer::DeviceDocumentPlugin& m_ctx;
153 template <
typename Node>
161 m_deviceNameEdit->setText(
"SpatGRIS");
162 auto layout =
new QFormLayout;
163 layout->addRow(tr(
"Name"), m_deviceNameEdit);
173 s.name = m_deviceNameEdit->text();
174 s.protocol = oscr::uuid_from_string<Node>();
180 m_deviceNameEdit->setText(settings.name);
184 QLineEdit* m_deviceNameEdit{};
187 template <
typename Node>
192 return oscr::uuid_from_string<Node>();
195 QString prettyName()
const noexcept
override
197 return QString::fromUtf8(avnd::get_name<Node>().data());
199 QString category()
const noexcept
override {
return StandardCategories::software; }
200 Device::DeviceEnumerators
208 const Explorer::DeviceDocumentPlugin& plugin,
218 s.protocol = concreteKey();
220 s.deviceSpecificSettings = QVariant{};
232 QVariant makeProtocolSpecificSettings(
const VisitorVariant& visitor)
const override
237 void serializeProtocolSpecificSettings(
238 const QVariant& data,
const VisitorVariant& visitor)
const override
242 bool checkCompatibility(
250 template <
typename... Nodes>
251 static void instantiate_device(
255 if(key == Device::ProtocolFactory::static_interfaceKey())
Definition: DeviceInterface.hpp:66
Definition: DeviceInterface.hpp:184
Definition: ProtocolFactoryInterface.hpp:44
Definition: DefaultProtocolFactory.hpp:10
Definition: AddressFragmentLineEdit.hpp:9
Definition: AvndDevice.hpp:116
Definition: AvndDevice.hpp:189
Definition: AvndDevice.hpp:17
Definition: DeviceSettings.hpp:16
The VisitorVariant struct.
Definition: VisitorInterface.hpp:26
Used to access all the application-wide state and structures.
Definition: ApplicationContext.hpp:24
Definition: DocumentContext.hpp:18