EEROS  1.0.0.0
API for the EEROS Real-Time Robotics Framework
I.hpp
Go to the documentation of this file.
1 #ifndef ORG_EEROS_CONTROL_I_HPP_
2 #define ORG_EEROS_CONTROL_I_HPP_
3 
5 
6 namespace eeros {
7  namespace control {
8 
9  template < typename T = double >
10  class I: public Block1i1o<T> {
11  public:
12  I() : first(true), enabled(false) { prev.clear(); clearLimits(); }
13 
14  virtual void run() {
15  if(first) { // first run, set output to init condition
16  this->out.getSignal().setValue(this->prev.getValue());
17  this->out.getSignal().setTimestamp(this->in.getSignal().getTimestamp());
18  this->prev.setTimestamp(this->out.getSignal().getTimestamp());
19  first = false;
20  }
21  else {
22  double tin = this->in.getSignal().getTimestamp() / 1000000000.0;
23  double tprev = this->prev.getTimestamp() / 1000000000.0;
24 
25  double dt = (tin - tprev);
26  T valin = this->in.getSignal().getValue();
27  T valprev = this->prev.getValue();
28  T output;
29  if(enabled) {
30  T val = valprev + valin * dt;
31  if ((val < upperLimit) && (val > lowerLimit)) output = val;
32  else output = valprev;
33  } else
34  output = valprev;
35  this->out.getSignal().setValue(output);
36  this->out.getSignal().setTimestamp(this->in.getSignal().getTimestamp());
37  this->prev = this->out.getSignal();
38  }
39  }
40 
41  virtual void enable() {
42  this->enabled = true;
43  }
44  virtual void disable() {
45  this->enabled = false;
46  }
47  virtual void setInitCondition(T val) {
48  this->prev.setValue(val);
49  }
50  virtual void setLimit(T upper, T lower) {
51  this->upperLimit = upper;
52  this->lowerLimit = lower;
53  T val = prev.getValue();
54  if (val > upper) prev.setValue(upper);
55  if (val < lower) prev.setValue(lower);
56  }
57 
58  protected:
59  bool first;
60  bool enabled;
63  private:
64  virtual void clearLimits() {
65  _clear<T>();
66  }
67  template <typename S> typename std::enable_if<std::is_integral<S>::value>::type _clear() {
68  upperLimit = std::numeric_limits<int32_t>::max();
69  lowerLimit = -upperLimit;
70  }
71  template <typename S> typename std::enable_if<std::is_floating_point<S>::value>::type _clear() {
72  upperLimit = std::numeric_limits<double>::max();
73  lowerLimit = -upperLimit;
74  }
75  template <typename S> typename std::enable_if<!std::is_arithmetic<S>::value && std::is_integral<typename S::value_type>::value>::type _clear() {
76  upperLimit.fill(std::numeric_limits<int32_t>::max());
77  lowerLimit = -upperLimit;
78  }
79  template <typename S> typename std::enable_if< !std::is_arithmetic<S>::value && std::is_floating_point<typename S::value_type>::value>::type _clear() {
80  upperLimit.fill(std::numeric_limits<double>::max());
81  lowerLimit = -upperLimit;
82  }
83 
84  };
85 
86  /********** Print functions **********/
87  template <typename T>
88  std::ostream& operator<<(std::ostream& os, I<T>& i) {
89  os << "Block integrator: '" << i.getName();
90  }
91  };
92 };
93 #endif /* ORG_EEROS_CONTROL_I_HPP_ */
Signal< T > prev
Definition: I.hpp:61
I()
Definition: I.hpp:12
Input< T > in
Definition: Block1i1o.hpp:27
T upperLimit
Definition: I.hpp:62
Definition: Config.hpp:14
Output< T > out
Definition: Block1i1o.hpp:28
virtual void setInitCondition(T val)
Definition: I.hpp:47
bool enabled
Definition: I.hpp:60
virtual void enable()
Definition: I.hpp:41
T lowerLimit
Definition: I.hpp:62
virtual void setLimit(T upper, T lower)
Definition: I.hpp:50
bool first
Definition: I.hpp:59
virtual void run()
Definition: I.hpp:14
Definition: Block1i1o.hpp:12
Definition: I.hpp:10
Definition: Signal.hpp:17
virtual void disable()
Definition: I.hpp:44