NAP
portalitemvec.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "portalitem.h"
9 #include "portalutils.h"
10 
11 // External Includes
12 #include <apivalue.h>
13 #include <apievent.h>
14 #include <parametervec.h>
15 #include <nap/signalslot.h>
16 
17 namespace nap
18 {
22  template<typename T>
23  class PortalItemVec : public PortalItem
24  {
25  RTTI_ENABLE(PortalItem)
26 
27  public:
28 
34  virtual bool init(utility::ErrorState& error) override;
35 
39  virtual void onDestroy() override;
40 
47  virtual bool processUpdate(const APIEvent& event, utility::ErrorState& error) override;
48 
52  virtual APIEventPtr getDescriptor() const override;
53 
57  virtual APIEventPtr getValue() const override;
58 
63  virtual void onParameterUpdate(T value);
64 
69 
71 
72  private:
73 
77  const std::vector<typename T::value_type> getVectorValues() const;
78 
82  bool setVectorValues(const std::vector<typename T::value_type>& values, utility::ErrorState& error);
83  };
84 
85 
87  // Portal Item Numeric Type Definitions
89 
94 
95 
97  // Template Definitions
99 
100  template<typename T>
102  {
103  mParameter->valueChanged.connect(mParameterUpdateSlot);
104  return true;
105  }
106 
107  template<typename T>
109  {
110  mParameter->valueChanged.disconnect(mParameterUpdateSlot);
111  }
112 
113  template<typename T>
115  {
116  updateSignal(*this);
117  }
118 
119  template<typename T>
121  {
122  // Check for the portal item value argument
123  const APIArgument* arg = event.getArgumentByName(nap::portal::itemValueArgName);
124  if (!error.check(arg != nullptr, "%s: update event missing argument %s", mID.c_str(), nap::portal::itemValueArgName))
125  return false;
126 
127  // Ensure that the argument is an array
128  if (!error.check(arg->isArray(), "%s: expected array for value argument, not %s", mID.c_str(), arg->getValueType().get_name().data()))
129  return false;
130 
131  // Cast the argument to an array of the basic data type
132  const std::vector<typename T::value_type>* values = arg->asArray<typename T::value_type>();
133  if (!error.check(values != nullptr, "%s: expected array of %s for value argument, not %s", mID.c_str(), RTTI_OF(typename T::value_type).get_name().data(), arg->getValueType().get_name().data()))
134  return false;
135 
136  return setVectorValues(*values, error);
137  }
138 
139  template<typename T>
141  {
142  APIEventPtr event = std::make_unique<APIEvent>(mParameter->getDisplayName(), mID);
143  event->addArgument<APIString>(nap::portal::itemTypeArgName, get_type().get_name().data());
144  event->addArgument<APIValue<std::vector<typename T::value_type>>>(nap::portal::itemValueArgName, getVectorValues());
145  event->addArgument<APIValue<typename T::value_type>>(nap::portal::itemMinArgName, mParameter->mMinimum);
146  event->addArgument<APIValue<typename T::value_type>>(nap::portal::itemMaxArgName, mParameter->mMaximum);
147  event->addArgument<APIBool>(nap::portal::itemClampArgName, mParameter->mClamp);
148  return event;
149  }
150 
151  template<typename T>
153  {
154  APIEventPtr event = std::make_unique<APIEvent>(mParameter->getDisplayName(), mID);
155  event->addArgument<APIValue<std::vector<typename T::value_type>>>(nap::portal::itemValueArgName, getVectorValues());
156  return event;
157  }
158 
159  template<typename T>
160  const std::vector<typename T::value_type> PortalItemVec<T>::getVectorValues() const
161  {
162  size_t length = mParameter->mValue.length();
163  std::vector<typename T::value_type> values(length);
164  std::memcpy(values.data(), &mParameter->mValue, sizeof(typename T::value_type) * length);
165  return values;
166  }
167 
168  template<typename T>
169  bool PortalItemVec<T>::setVectorValues(const std::vector<typename T::value_type>& values, utility::ErrorState& error)
170  {
171  // Ensure we have enough data
172  size_t length = mParameter->mValue.length();
173  if (!error.check(values.size() == length, "%s: expected a vector of size %i, received %i", mID.c_str(), length, values.size()))
174  return false;
175 
176  // Update the vector trough setValue so the parameter will trigger an update signal
177  T new_value;
178  std::memcpy(&new_value, values.data(), sizeof(typename T::value_type) * length);
179  mParameter->valueChanged.disconnect(mParameterUpdateSlot);
180  mParameter->setValue(new_value);
181  mParameter->valueChanged.connect(mParameterUpdateSlot);
182  return true;
183  }
184 }
185 
189 #define DEFINE_PORTAL_ITEM_VEC(Type) \
190  RTTI_BEGIN_CLASS(Type, "Portal vector item") \
191  RTTI_PROPERTY("Parameter", &Type::mParameter, nap::rtti::EPropertyMetaData::Required, "Vector parameter") \
192  RTTI_END_CLASS
nap::PortalItemVec::processUpdate
virtual bool processUpdate(const APIEvent &event, utility::ErrorState &error) override
Definition: portalitemvec.h:120
nap::APIValue
Definition: apivalue.h:56
nap::portal::itemValueArgName
constexpr const char * itemValueArgName
Name of the argument containing the portal item value in the portal item message.
Definition: portalutils.h:19
nap::portal::itemTypeArgName
constexpr const char * itemTypeArgName
Name of the argument containing the portal item type in the portal item message.
Definition: portalutils.h:18
nap::APIArgument::getValueType
const rtti::TypeInfo getValueType() const
nap::PortalItemVec
Definition: portalitemvec.h:23
nap::portal::itemMinArgName
constexpr const char * itemMinArgName
Name of the argument containing the minimum portal item value in the portal item message.
Definition: portalutils.h:20
nap::Slot< T >
nap::PortalItemVec::getDescriptor
virtual APIEventPtr getDescriptor() const override
Definition: portalitemvec.h:140
nap::rtti::ObjectPtr
Definition: objectptr.h:154
nap::PortalItemVec::mParameter
ResourcePtr< ParameterVec< T > > mParameter
Property: 'Parameter' the parameter linked to this portal item.
Definition: portalitemvec.h:70
nap::utility::ErrorState
Definition: errorstate.h:19
nap::PortalItemVec::init
virtual bool init(utility::ErrorState &error) override
Definition: portalitemvec.h:101
nap::PortalItem
Definition: portalitem.h:19
nap::portal::itemMaxArgName
constexpr const char * itemMaxArgName
Name of the argument containing the maximum portal item value in the portal item message.
Definition: portalutils.h:21
nap::APIEventPtr
std::unique_ptr< nap::APIEvent > APIEventPtr
Definition: apievent.h:179
nap::PortalItemVec::onDestroy
virtual void onDestroy() override
Definition: portalitemvec.h:108
nap::PortalItemVec::mParameterUpdateSlot
Slot< T > mParameterUpdateSlot
Definition: portalitemvec.h:68
nap::APIArgument::isArray
bool isArray() const
nap::PortalItemVec::getValue
virtual APIEventPtr getValue() const override
Definition: portalitemvec.h:152
nap
Definition: templateapp.h:17
nap::APIArgument
Definition: apiargument.h:22
nap::APIArgument::asArray
const std::vector< T > * asArray() const
Definition: apiargument.h:208
nap::portal::itemClampArgName
constexpr const char * itemClampArgName
Name of the argument containing the clamp value in the portal item message.
Definition: portalutils.h:22
nap::APIEvent
Definition: apievent.h:37
nap::PortalItemVec::onParameterUpdate
virtual void onParameterUpdate(T value)
Definition: portalitemvec.h:114