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);