Motorcortex Core  version: 2.7.6
ps_datacontainer.h
1 /*
2  * Developer : Alexey Zakharov (alexey.zakharov@vectioneer.com)
3  * All rights reserved. Copyright (c) 2015 VECTIONEER.
4  */
5 
6 #ifndef PS_DATACONTAINER_H
7 #define PS_DATACONTAINER_H
8 
9 #include "utl_log.h"
10 #include <cstdint>
11 #include <ctime>
12 #include <functional>
13 
14 namespace mcx {
15 
16 namespace parameter_server {
17 
18 struct OffsetData {
19  size_t src_byte_offset;
20  size_t src_el_byte_size;
21  size_t src_el_count;
22 
23  size_t dst_byte_offset;
24  size_t dst_el_byte_size;
25 
26  double gain;
27  double offset;
28  bool inv_bool;
29  bool clamp;
30 };
31 
33  using CoversionClb =
34  std::function<void(uint8_t*, const uint8_t*, size_t size, const ConversionData& conversion_data)>;
35  bool conversion_on;
36  OffsetData offset_data;
37  CoversionClb copy_clb;
38 };
39 
41 public:
42  enum class Type {
43  NONE,
44  PARAMETER_FIXED,
45  PARAMETER_VARIABLE,
46  INPUT_BUFFER,
47  OUTPUT_BUFFER,
48  EXTERNAL,
49  };
50 
51  DataContainer();
52 
53  DataContainer(Type type, const void* data_ptr, size_t offset_bytes, size_t length_bytes);
54 
55  virtual ~DataContainer();
56 
57  bool allocate(Type type, size_t length_bytes);
58 
59  void deallocate();
60 
61  DataContainer(const DataContainer& orig) = delete;
62 
63  inline DataContainer& operator=(const DataContainer& orig) {
64  log_assert((orig.getSize() + orig.getOffset()) <= getMaxSize(), "Source offset: {}, length: {} > length: {}",
65  orig.getOffset(), orig.getSize(), getMaxSize()) app_time_ = orig.app_time_;
66  switch (type_) {
67  case Type::NONE:
68  break;
69  case Type::EXTERNAL:
70  /* copy data to an output buffer */
71  offset_bytes_.offset = 0;
72  offset_bytes_.size = orig.getOffset() + orig.getSize();
73  memcpy(data_.ui_ptr, orig.getData(), offset_bytes_.size);
74  return *this;
75  case Type::OUTPUT_BUFFER:
76  /* copy data to an output buffer */
77  if (orig.getType() == Type::PARAMETER_VARIABLE) {
78  offset_bytes_.offset = 0;
79  offset_bytes_.size = orig.getOffset() + orig.getSize();
80  } else {
81  offset_bytes_.offset = 0;
82  offset_bytes_.size = orig.getMaxSize();
83  }
84  memcpy(data_.ui_ptr, orig.getData(), offset_bytes_.size);
85  return *this;
86  case Type::INPUT_BUFFER:
87  /* copy data to input buffer */
88  offset_bytes_.offset = orig.getOffset();
89  offset_bytes_.size = orig.getSize();
90  memcpy(data_.ui_ptr, orig.getData(), offset_bytes_.size);
91  return *this;
92  case Type::PARAMETER_VARIABLE:
93  offset_bytes_.offset = 0;
94  offset_bytes_.size = orig.getOffset() + orig.getSize();
95  case Type::PARAMETER_FIXED:
96  /* do not copy size and offset */
97  memcpy(data_.ui_ptr + orig.getOffset(), orig.getData(), orig.getSize());
98  return *this;
99  }
100 
101  return *this;
102  }
103 
104  void setDataPtr(Type type, const void* data_ptr, size_t offset_bytes, size_t length_bytes);
105 
106  void readWithConversion(DataContainer* dst, const ConversionData& conversion);
107 
108  inline size_t getMaxSize() const { return offset_bytes_.max_size; }
109 
110  inline size_t getSize() const { return offset_bytes_.size; }
111 
112  inline size_t getOffset() const { return offset_bytes_.offset; }
113 
114  inline const uint8_t* getData() const { return data_.ui_ptr; }
115 
116  inline Type getType() const { return type_; }
117 
118  void setSize(size_t size) {
119  if (size < offset_bytes_.max_size) {
120  offset_bytes_.size = size;
121  } else {
122  offset_bytes_.size = offset_bytes_.max_size;
123  }
124  }
125 
126  inline void setTime(const struct timespec& app_time) { app_time_ = app_time; }
127 
128  const struct timespec& getTime() const { return app_time_; }
129 
130 private:
131  Type type_{Type::NONE};
132 
133  bool allocated_{};
134 
135  struct {
136  size_t offset;
137  size_t size;
138  size_t max_size;
139  } offset_bytes_{};
140 
141  union {
142  const void* v_ptr;
143  uint8_t* ui_ptr;
144  } data_{};
145 
146  struct timespec app_time_ {};
147 };
148 
149 } // namespace parameter_server
150 
151 } // namespace mcx
152 
153 #endif /* PS_DATACONTAINER_H */
mcx::parameter_server::DataContainer::app_time_
Definition: ps_datacontainer.h:146
mcx::parameter_server::DataContainer
Definition: ps_datacontainer.h:40
mcx::parameter_server::ConversionData
Definition: ps_datacontainer.h:32
mcx::parameter_server::OffsetData
Definition: ps_datacontainer.h:18