Motorcortex Core  version: 2.7.6
drive_sim_basic.h
1 /*
2  * Developer : Mark Verrijt (mark.verrijt@vectioneer.com)
3  * All rights reserved. Copyright (c) 2019 VECTIONEER.
4  */
5 
6 #ifndef MOTORCORTEX_LIB_DRIVE_SIM_BASE_H
7 #define MOTORCORTEX_LIB_DRIVE_SIM_BASE_H
8 
9 #include "ct_module.h"
10 
11 namespace mcx {
12 
13 namespace drive {
14 
15 namespace sim {
16 
17 template<typename T>
19 public:
20  explicit DriveBasic(unsigned int num_channels = 1) : num_channels_(num_channels) {
21  target_position_ = new T[num_channels_]{};
22  target_torque_ = new T[num_channels_]{};
23  target_torque_offset_ = new T[num_channels_]{};
24 
25  position_value_ = new T[num_channels_]{};
26  torque_value_ = new T[num_channels_]{};
27  torque_sensor_value_ = new T[num_channels_]{};
28 
29  position_value_init_ = new T[num_channels_]{};
30 
31  drive_on_ = new bool[num_channels_]{};
32  }
33 
34  ~DriveBasic() override {
35  delete[] target_position_;
36  delete[] target_torque_;
37  delete[] target_torque_offset_;
38 
39  delete[] position_value_;
40  delete[] torque_value_;
41  delete[] torque_sensor_value_;
42 
43  delete[] position_value_init_;
44 
45  delete[] drive_on_;
46  };
47 
48 private:
49 
50  static constexpr unsigned int init_cycles_ = 100;
51 
52  void create_(const char* name, mcx::parameter_server::Parameter* parameter_server, uint64_t dt_micro_s) override {};
53 
54  bool initPhase1_() override {
55  addParameter("targetPosition", mcx::parameter_server::ParameterType::INPUT, target_position_, num_channels_);
56  addParameter("targetTorque", mcx::parameter_server::ParameterType::INPUT, target_torque_, num_channels_);
57  addParameter("targetTorqueOffset", mcx::parameter_server::ParameterType::INPUT, target_torque_offset_,
58  num_channels_);
59  addParameter("driveOn", mcx::parameter_server::ParameterType::INPUT, drive_on_, num_channels_);
60  addParameter("positionValueInit", mcx::parameter_server::ParameterType::INPUT, position_value_init_, num_channels_);
61  addParameter("positionValue", mcx::parameter_server::ParameterType::OUTPUT, position_value_, num_channels_);
62  addParameter("torqueValue", mcx::parameter_server::ParameterType::OUTPUT, torque_value_, num_channels_);
63  addParameter("torqueSensorValue", mcx::parameter_server::ParameterType::OUTPUT, torque_sensor_value_,
64  num_channels_);
65  return true;
66  };
67 
68  bool initPhase2_() override {
69  return true;
70  };
71 
72  bool startOp_() override {
73  return true;
74  };
75 
76  bool stopOp_() override {
77  return true;
78  };
79 
80  bool iterateOp_(const mcx::container::TaskTime& system_time, mcx::container::UserTime* user_time) override {
81  if (system_time.nr_of_cycles <= init_cycles_) {
82  memcpy(position_value_, position_value_init_, num_channels_ * sizeof(T));
83  }
84  for (unsigned int cnt = 0; cnt < num_channels_; ++cnt) {
85  if (drive_on_[cnt]) {
86  position_value_[cnt] = target_position_[cnt];
87 
88  // Not entirely correct but should work:
89  torque_value_[cnt] = target_torque_[cnt] + target_torque_offset_[cnt];
90  torque_sensor_value_[cnt] = torque_value_[cnt];
91  } else {
92  // Keep position fixed where it is
93 
94  // Torque = 0
95  torque_value_[cnt] = 0;
96  torque_sensor_value_[cnt] = 0;
97  }
98  }
99  return true;
100  };
101 
102 private:
103  const unsigned int num_channels_;
104  bool* drive_on_;
105 
106  T* position_value_init_;
107 
108  T* target_position_;
109  T* target_torque_;
110  T* target_torque_offset_;
111 
112  T* position_value_;
113  T* torque_value_;
114  T* torque_sensor_value_;
115 
116 };
117 
118 } // namespace sim
119 
120 } // namespace drive
121 
122 } // namespace mcx
123 
124 #endif /* MOTORCORTEX_LIB_DRIVE_SIM_BASE_H */
125 
mcx::container::Module::addParameter
parameter_server::ParamHandle addParameter(const char *id, parameter_server::ParameterType param_type, char *str_ptr, size_t length)
Helper function to register C-string member variable in the parameter tree.
Definition: ct_module.h:585
mcx::parameter_server::Parameter
Definition: ps_parameter.h:45
mcx::drive::sim::DriveBasic
Definition: drive_sim_basic.h:18
mcx::container::TaskTime
Internal time source.
Definition: ct_time.h:25
mcx::container::TaskTime::nr_of_cycles
uint64_t nr_of_cycles
Number of cycles from the start of the task.
Definition: ct_time.h:29
mcx::container::UserTime
External time source.
Definition: ct_time.h:40
mcx::container::Module
A building block of the Motorcortex components.
Definition: ct_module.h:64