OSSIA
Open Scenario System for Interactive Application
device_parameter.hpp
1 
2 #pragma once
3 
4 #include <ossia/network/base/node.hpp>
5 #include <ossia/network/base/protocol.hpp>
6 #include <ossia/network/common/complex_type.hpp>
7 #include <ossia/network/domain/domain.hpp>
8 #include <ossia/network/oscquery/oscquery_server.hpp>
9 #include <ossia/network/value/value.hpp>
10 
11 namespace ossia::net
12 {
13 
14 class OSSIA_EXPORT device_parameter : public ossia::net::parameter_base
15 {
16 
17 public:
18  device_parameter(
19  ossia::net::node_base& node, const ossia::val_type type,
20  const ossia::bounding_mode bounding, const ossia::access_mode access,
21  ossia::domain domain);
22 
23  virtual ~device_parameter();
24 
25  // Must be called when the hardware send a new value
26  // (typically from an event loop)
27  // This will NOT call device_update_value() in order to avoid loop
28  void device_value_change_event(const ossia::value& value);
29 
30  void pull_value() override;
31  ossia::value value() const override;
32 
36 
37  ossia::value set_value(const ossia::value& val) override;
38  ossia::value set_value(ossia::value&& v) override;
39 
40  ossia::val_type get_value_type() const noexcept override;
41  ossia::net::parameter_base& set_value_type(ossia::val_type) override { return *this; }
42 
43  ossia::access_mode get_access() const noexcept override;
44  ossia::net::parameter_base& set_access(ossia::access_mode) override { return *this; }
45 
46  const ossia::domain& get_domain() const noexcept override;
47  ossia::net::parameter_base& set_domain(const ossia::domain&) override { return *this; }
48 
49  ossia::bounding_mode get_bounding() const noexcept override;
50  ossia::net::parameter_base& set_bounding(ossia::bounding_mode) override
51  {
52  return *this;
53  }
54 
55  template <class ParamType = device_parameter, class... T>
56  static ParamType* create_device_parameter(
57  ossia::net::node_base& root_node, const std::string& path,
58  const ossia::value& initial_value, T&&... ctor_args)
59  {
60  static_assert(std::is_base_of<device_parameter, ParamType>::value);
61 
62  auto& param_node = ossia::net::create_node(root_node, path);
63  auto param = std::make_unique<ParamType>(param_node, std::forward<T>(ctor_args)...);
64 
65  ParamType* ret = param.get();
66 
67  param->set_value(initial_value);
68  param_node.set_parameter(std::move(param));
69 
70  return ret;
71  }
72 
73 protected:
74  virtual void device_update_value()
75  {
76  // Here should be the code that actually make the hardware update to
77  // current value
78  }
79 
80  ossia::value m_current_value{};
81 
82  const ossia::val_type m_type{};
83  const ossia::bounding_mode m_bounding{};
84  const ossia::access_mode m_access{};
85  const ossia::domain m_domain{};
86 };
87 }
The node_base class.
Definition: network/base/node.hpp:48
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48
The value class.
Definition: value.hpp:173
Definition: git_info.h:7
val_type
Enum to represent the types that a value can take.
Definition: parameter_properties.hpp:16
bounding_mode
Address behaviors at crossing domain boundaries.
Definition: parameter_properties.hpp:56
access_mode
Address behaviors at crossing domain boundaries time.
Definition: parameter_properties.hpp:46
OSSIA_EXPORT void push_value(const ossia::destination &addr, const ossia::value_with_unit &)
Send a value to a given destination.
Definition: ossia/network/base/parameter.cpp:151
OSSIA_EXPORT node_base & create_node(node_base &dev, std::string_view parameter_base)
Create a node in a device.
domain A domain of values
Definition: domain_base.hpp:23