Motorcortex Core  version: 2.7.6
ps_parameter.h
1 /*
2  * Developer : Alexey Zakharov (alexey.zakharov@vectioneer.com)
3  * All rights reserved. Copyright (c) 2015 VECTIONEER.
4  */
5 
6 #ifndef PS_PARAMETER_H
7 #define PS_PARAMETER_H
8 
9 #include "ps_actbuffer.h"
10 #include "ps_datacontainer.h"
11 #include "ps_handlers.h"
12 #include "ps_inbuffer.h"
13 #include "ps_info.h"
14 #include "ps_outbuffer.h"
15 #include "ps_parambase.h"
16 #include "ps_paramtype.h"
17 #include <atomic>
18 #include <map>
19 #include <pthread.h>
20 #include <set>
21 #include <string>
22 #include <string_view>
23 #include <vector>
24 
25 namespace mcx::parameter_server {
26 
27 // Length of input buffer must be power of 2
28 static constexpr size_t MAX_ACTION_BUFFER_LENGTH{1024};
29 static constexpr size_t DEFAULT_INPUT_BUFFER_LENGTH{4};
30 static constexpr size_t MAX_PATH_LENGTH{sizeof(motorcortex_ParameterInfo::path) - 1};
31 static constexpr size_t MAX_NAME_LENGTH{128};
32 
33 struct LinkData {
34  Parameter* param{};
35  uint32_t update_counter{};
36  uint32_t sub_counter{};
37  ConversionData conversion;
38 };
39 
40 using param_map_t = std::map<std::string, Parameter*, std::less<>>;
41 using param_vector_t = std::vector<Parameter*>;
42 using link_vector_t = std::vector<LinkData>;
44 
45 class Parameter : public ParameterBase {
46  friend class RingBufferManager;
47 
48  void init();
49 
50 public:
51  Parameter();
52 
53  explicit Parameter(unsigned int size);
54 
55  virtual ~Parameter();
56 
57  Parameter& operator=(const Parameter&) = delete;
58 
59  Parameter* create(const char* name, Parameter* parent, UserGroup user_group = default_group,
60  uint32_t permissions = default_permissions); // Creates and initialize current Node,
61  // attaches itself to given parent;
62  Parameter* create(const char* name, size_t length, Parameter* parent, UserGroup user_group = default_group,
63  uint32_t permissions = default_permissions); // Parent could be set to NULL;
64 
65  void destroy(); // Deallocate element and releases all related resources;
66 
67  void print(); // Print debug info;
68 
69  bool hasChildren();
70 
71  Parameter* createPath(const char* name, UserGroup user_group = default_group,
72  uint32_t permissions = default_permissions);
73 
74  Parameter* createPath(const char* name, size_t length, UserGroup user_group = default_group,
75  uint32_t permissions = default_permissions);
76 
78  addParameter(const char* name, // Name of the parameter;
79  ParameterType param_type, // Type of the parameter, for example: an input/output signal, model parameter
80  // or block parameter;
81  uint32_t data_type_id, // Data type id;
82  int data_type_size, // Data type size in bytes;
83  Unit unit, // Unit of the parameter,;
84  void* origin_ptr, // Pointer to the origin of the parameter in the model;
85  uint32_t origin_length =
86  1, // If origin_ptr point to an array, number of elements in this array, otherwise is set to 1);
87  uint32_t input_buffer_length = DEFAULT_INPUT_BUFFER_LENGTH);
88 
90  addParameter(Parameter* update_node, // pointer to the node which is responsible for updating parameter
91  const char* name, // Name of the parameter;
92  ParameterType param_type, // Type of the parameter, for example: an input/output signal, model parameter
93  // or block parameter;
94  uint32_t data_type_id, // Data type id;
95  int data_type_size, // Data type size in bytes;
96  Unit unit, // Unit of the parameter,;
97  void* origin_ptr, // Pointer to the origin of the parameter in the model;
98  uint32_t origin_length =
99  1, // If origin_ptr point to an array, number of elements in this array, otherwise is set to 1);
100  uint32_t input_buffer_length = DEFAULT_INPUT_BUFFER_LENGTH);
101 
102  SubHandle subscribe(const char* path, bool is_relative);
103 
104  ReqHandle request(const char* path, bool is_relative);
105 
106  PubHandle publish(const char* path, bool is_relative);
107 
108  LinkHandle link(ParameterPath source, ParameterPath destination);
109 
110  LinkHandle link(ParameterPath source, ParameterPath destination, double gain);
111 
112  LinkHandle link(ParameterPath source, ParameterPath destination, double gain, double offset);
113 
114  LinkHandle link(ParameterPath source, ParameterPath destination, double gain, double offset, bool inv_bool);
115 
116  LinkHandle link(ParameterPath source, ParameterPath destination, double gain, double offset, bool inv_bool,
117  bool clamp);
118 
119  OverwriteHandle overwrite(const char* path, bool is_relative);
120 
121  void setForceFlag(bool overwrite_active) override;
122 
123  void setUserGroup(UserGroup user_group, bool recursive) override;
124 
125  void setPermissions(Permission permission, bool recursive) override;
126 
127  bool addLink(Parameter* source_param, uint32_t src_el_offset, uint32_t src_el_count, uint32_t dst_el_offset,
128  double gain, double offset, bool inv_bool, bool clamp, bool activate_now);
129 
130  void activateLink(bool flag) override;
131 
132  bool checkPermissions(UserGroup user_group, uint32_t permissions);
133 
134  Parameter* getParameter(const char* path, bool is_relative);
135 
136  Parameter* getParameter(const char* path, int length, bool is_relative);
137 
138  void force(const void* in_data, uint32_t size) override;
139 
140  /* Copies data from given address to input buffer (Buffer is thread-safe);
141  * On success return true; */
142  void write(const void* in_data, uint32_t size) override;
143 
144  void force(const void* in_data, uint32_t offset, uint32_t size);
145 
146  void write(const void* in_data, uint32_t offset, uint32_t size);
147 
148  /* Copies current value to given address and return its length (Buffer is thread-safe);
149  * Returns timestamp of the value */
150  uint32_t read(void* out_data, uint32_t size, struct timespec* update_time) override;
151 
152  uint32_t read(DataContainer* data);
153 
154  template <typename T, int number_of_param = 1>
155  bool setParameterValue(const char* relative_path, const T& in_data);
156 
157  template <typename T>
158  bool setParameterValue(const char* relative_path, std::initializer_list<T> in_data);
159 
160  inline const ParameterInfo& getInfo() const override; // Returns parameter description;
161 
162  size_t getSize() const override;
163 
164  size_t getMaxSize() const override;
165 
166  uint32_t getTotalNumberOfNodes();
167 
168  uint32_t getTotalNumberOfParams();
169 
170  param_map_t* getChildren();
171 
172  Parameter* getParent();
173 
174  void updateLink();
175 
176  void updateInput(); // Function triggers update of output buffer from origin_ptr;
177  void overwriteInput(); // Function applies overwrite for input values;
178  void overwriteOutput(); // Function applies overwrite for output values;
179  void updateOutput(const struct timespec& app_time);
180 
181  void processActions();
182 
183  uint32_t addRequest() override;
184 
185  uint32_t getReplyId() override;
186 
187  void startPublisher();
188 
189  void stopPublisher();
190 
191  bool hasActions();
192 
193  bool isInputUpdated();
194 
195  bool isLinkUpdated();
196 
197  bool isOverwriteOutputUpdated();
198 
199  bool isOverwriteInputUpdated();
200 
201  bool isOutputUpdated();
202 
203  bool compareAndSwapUpdateCounter(uint32_t& last_update_counter) override;
204 
205  uint32_t getOutputCounter();
206 
207  void setUpdateOutputFlag(bool newval) override;
208 
209  void setUpdateOutputOnceFlag(uint32_t length) override;
210 
211  void setUpdateOutputOnInputFlag(bool newval) override;
212 
213 private:
214  enum class ConversionType { NO_CONVERSION_NEEDED, ERROR_CONVERSION_NOT_FOUND, CONVERSION_FOUND };
215 
216  static bool isFloat(uint32_t data_type);
217 
218  ConversionType selectConversion(const DataTypeInfo& src_info, const DataTypeInfo& dst_info, const OffsetData& offset,
219  ConversionData::CoversionClb* clb);
220 
221  DataContainer* origin_ptr_{};
222  DataContainer origin_copy_; /* Need to store origin value, before activate
223  * an overwrite */
224  DataContainer origin_; // Pointer to the variable to store;
225  inline DataContainer& getOrigin() { return *origin_ptr_; }
226 
227  Parameter* parent_node_{}; /* parent node, used for tree navigation */
228  Parameter* update_node_{}; /* note which is responsible for updating io buffers, by default = parent_node_ */
229  link_vector_t links_;
230  param_map_t children_; // Array with children nodes;
231  link_vector_t outputs_pub_;
232  param_vector_t outputs_pub_once_;
233  param_vector_t inputs_sub_;
234  param_vector_t inputs_sub_once_;
235  param_vector_t overwrite_inputs_;
236  param_vector_t overwrite_outputs_;
237  ParameterInfo param_info_; // Description info about parameter;
238  std::string name_; // Name of the current parameter;
239 
240  bool owned_{};
241 
242  static std::atomic<uint32_t> total_number_of_nodes_;
243  static std::atomic<uint32_t> total_number_of_params_;
244 
245  InputBuffer in_buffer_;
246  OverwriteBuffer overwrite_buffer_;
247  OutputBuffer out_buffer_;
248 
249  ActionBuffer act_buffer_;
250  uint32_t input_update_counter_{};
251  uint32_t output_update_counter_{};
252  bool update_output_flag_{};
253  bool update_output_once_flag_{};
254  bool update_output_on_input_flag_{};
255 };
256 
257 inline const ParameterInfo& Parameter::getInfo() const { return param_info_; }
258 
259 template <typename T, int number_of_param>
260 bool Parameter::setParameterValue(const char* relative_path, const T& in_data) {
261  PubHandle pub = publish(relative_path, true);
262  if (pub.isFound()) {
263  pub.write<T, number_of_param>(in_data);
264  return true;
265  }
266 
267  return false;
268 }
269 
270 template <typename T>
271 bool Parameter::setParameterValue(const char* relative_path, std::initializer_list<T> in_data) {
272  PubHandle pub = publish(relative_path, true);
273  if (pub.isFound()) {
274  pub.write<T>(in_data);
275  return true;
276  }
277 
278  return false;
279 }
280 
281 } // namespace mcx::parameter_server
282 
283 #endif /* PS_PARAMETER_H */
mcx::parameter_server::ParameterBase
Definition: ps_parambase.h:19
mcx::parameter_server::ParameterPath
Definition: ps_paramtype.h:17
mcx::parameter_server::Parameter
Definition: ps_parameter.h:45
mcx::parameter_server::ActionBuffer
Definition: ps_actbuffer.h:38
mcx::parameter_server::ReqHandle
Definition: ps_handlers.h:134
mcx::parameter_server::OutputBuffer
Definition: ps_outbuffer.h:17
mcx::parameter_server::DataContainer
Definition: ps_datacontainer.h:40
mcx::parameter_server::DataTypeInfo
Definition: ps_info.h:18
mcx::parameter_server::InputBuffer
Definition: ps_inbuffer.h:16
mcx::parameter_server::LinkHandle
Definition: ps_handlers.h:242
mcx::parameter_server::ConversionData
Definition: ps_datacontainer.h:32
mcx::parameter_server::LinkData
Definition: ps_parameter.h:33
mcx::parameter_server::ParameterInfo
Definition: ps_info.h:23
mcx::parameter_server::SubHandle
Definition: ps_handlers.h:182
mcx::parameter_server::OffsetData
Definition: ps_datacontainer.h:18
mcx::parameter_server::PubHandle
Definition: ps_handlers.h:208
mcx::parameter_server::OverwriteHandle
Definition: ps_handlers.h:260
mcx::parameter_server::ParamHandle
Definition: ps_handlers.h:43