9 #include "ps_actbuffer.h"
10 #include "ps_datacontainer.h"
11 #include "ps_handlers.h"
12 #include "ps_inbuffer.h"
14 #include "ps_outbuffer.h"
15 #include "ps_parambase.h"
16 #include "ps_paramtype.h"
22 #include <string_view>
25 namespace mcx::parameter_server {
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};
35 uint32_t update_counter{};
36 uint32_t sub_counter{};
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>;
46 friend class RingBufferManager;
59 Parameter* create(
const char* name,
Parameter* parent, UserGroup user_group = default_group,
60 uint32_t permissions = default_permissions);
62 Parameter* create(
const char* name,
size_t length,
Parameter* parent, UserGroup user_group = default_group,
63 uint32_t permissions = default_permissions);
71 Parameter* createPath(
const char* name, UserGroup user_group = default_group,
72 uint32_t permissions = default_permissions);
74 Parameter* createPath(
const char* name,
size_t length, UserGroup user_group = default_group,
75 uint32_t permissions = default_permissions);
78 addParameter(
const char* name,
79 ParameterType param_type,
81 uint32_t data_type_id,
85 uint32_t origin_length =
87 uint32_t input_buffer_length = DEFAULT_INPUT_BUFFER_LENGTH);
92 ParameterType param_type,
94 uint32_t data_type_id,
98 uint32_t origin_length =
100 uint32_t input_buffer_length = DEFAULT_INPUT_BUFFER_LENGTH);
102 SubHandle subscribe(
const char* path,
bool is_relative);
104 ReqHandle request(
const char* path,
bool is_relative);
106 PubHandle publish(
const char* path,
bool is_relative);
121 void setForceFlag(
bool overwrite_active)
override;
123 void setUserGroup(UserGroup user_group,
bool recursive)
override;
125 void setPermissions(Permission permission,
bool recursive)
override;
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);
130 void activateLink(
bool flag)
override;
132 bool checkPermissions(UserGroup user_group, uint32_t permissions);
134 Parameter* getParameter(
const char* path,
bool is_relative);
136 Parameter* getParameter(
const char* path,
int length,
bool is_relative);
138 void force(
const void* in_data, uint32_t size)
override;
142 void write(
const void* in_data, uint32_t size)
override;
144 void force(
const void* in_data, uint32_t offset, uint32_t size);
146 void write(
const void* in_data, uint32_t offset, uint32_t size);
150 uint32_t read(
void* out_data, uint32_t size,
struct timespec* update_time)
override;
154 template <
typename T,
int number_of_param = 1>
155 bool setParameterValue(
const char* relative_path,
const T& in_data);
157 template <
typename T>
158 bool setParameterValue(
const char* relative_path, std::initializer_list<T> in_data);
162 size_t getSize()
const override;
164 size_t getMaxSize()
const override;
166 uint32_t getTotalNumberOfNodes();
168 uint32_t getTotalNumberOfParams();
170 param_map_t* getChildren();
177 void overwriteInput();
178 void overwriteOutput();
179 void updateOutput(
const struct timespec& app_time);
181 void processActions();
183 uint32_t addRequest()
override;
185 uint32_t getReplyId()
override;
187 void startPublisher();
189 void stopPublisher();
193 bool isInputUpdated();
195 bool isLinkUpdated();
197 bool isOverwriteOutputUpdated();
199 bool isOverwriteInputUpdated();
201 bool isOutputUpdated();
203 bool compareAndSwapUpdateCounter(uint32_t& last_update_counter)
override;
205 uint32_t getOutputCounter();
207 void setUpdateOutputFlag(
bool newval)
override;
209 void setUpdateOutputOnceFlag(uint32_t length)
override;
211 void setUpdateOutputOnInputFlag(
bool newval)
override;
214 enum class ConversionType { NO_CONVERSION_NEEDED, ERROR_CONVERSION_NOT_FOUND, CONVERSION_FOUND };
216 static bool isFloat(uint32_t data_type);
219 ConversionData::CoversionClb* clb);
229 link_vector_t links_;
230 param_map_t children_;
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_;
242 static std::atomic<uint32_t> total_number_of_nodes_;
243 static std::atomic<uint32_t> total_number_of_params_;
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_{};
257 inline const ParameterInfo& Parameter::getInfo()
const {
return param_info_; }
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);
263 pub.write<T, number_of_param>(in_data);
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);
274 pub.write<T>(in_data);