EEROS  0.4.1.0
API for the EEROS Real-Time Robotics Framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Saturation.hpp
Go to the documentation of this file.
1 #ifndef ORG_EEROS_CONTROL_SATURATION_HPP_
2 #define ORG_EEROS_CONTROL_SATURATION_HPP_
3 
5 #include <eeros/math/Matrix.hpp>
6 #include <type_traits>
7 
8 namespace eeros {
9  namespace control {
10 
11  template<typename T = double, typename enable = void>
12  class Saturation;
13 
14  // Non arithmetic types (container types like std::vector or eeros::math::Matrix)
15  template<typename T>
16  class Saturation<T, typename std::enable_if<!std::is_arithmetic<T>::value >::type> : public Block1i1o<T> {
17 
18  public:
19  Saturation() : enabled(false) {
20  for(unsigned int i = 0; i < lowerLimit.size(); i++) {
21  lowerLimit[i] = 0;
22  upperLimit[i] = 0;
23  }
24  }
25 
26  Saturation(T sym) : enabled(true) {
27  lowerLimit = -sym;
28  upperLimit = sym;
29  }
30 
31  Saturation(T lower, T upper) : enabled(true) {
32  lowerLimit = lower;
33  upperLimit = upper;
34  }
35 
36  virtual void run() {
37  T outVal = this->in.getSignal().getValue();
38  if(enabled) {
39  for(unsigned int i = 0; i < outVal.size(); i++) {
40  if(outVal[i] > upperLimit[i]) outVal[i] = upperLimit[i];
41  if(outVal[i] < lowerLimit[i]) outVal[i] = lowerLimit[i];
42  }
43  }
44  this->out.getSignal().setValue(outVal);
45  this->out.getSignal().setTimestamp(this->in.getSignal().getTimestamp());
46  }
47 
48  virtual void enable() {
49  enabled = true;
50  }
51 
52  virtual void disable() {
53  enabled = false;
54  }
55 
56  virtual void setLimit(T lower, T upper) {
57  lowerLimit = lower;
58  upperLimit = upper;
59  }
60 
61  protected:
62  T lowerLimit, upperLimit;
63  bool enabled;
64  };
65 
66  // Arithmetic types
67  template<typename T>
68  class Saturation<T, typename std::enable_if<std::is_arithmetic<T>::value >::type> : public Block1i1o<T> {
69 
70  public:
71  Saturation() : enabled(false) {
72  lowerLimit = 0;
73  upperLimit = 0;
74  }
75 
76  Saturation(T sym) : enabled(true) {
77  lowerLimit = -sym;
78  upperLimit = sym;
79  }
80 
81  Saturation(T lower, T upper) : enabled(true) {
82  lowerLimit = lower;
83  upperLimit = upper;
84  }
85 
86  virtual void run() {
87  T outVal = this->in.getSignal().getValue();
88  if(enabled) {
89  if(outVal > upperLimit) outVal = upperLimit;
90  if(outVal < lowerLimit) outVal = lowerLimit;
91  }
92  this->out.getSignal().setValue(outVal);
93  this->out.getSignal().setTimestamp(this->in.getSignal().getTimestamp());
94  }
95 
96  virtual void enable() {
97  enabled = true;
98  }
99 
100  virtual void disable() {
101  enabled = false;
102  }
103 
104  virtual void setLimit(T lower, T upper) {
105  lowerLimit = lower;
106  upperLimit = upper;
107  }
108 
109  protected:
110  T lowerLimit, upperLimit;
111  bool enabled;
112  };
113 
114  };
115 };
116 
117 #endif /* ORG_EEROS_CONTROL_SATURATION_HPP_ */
Definition: Saturation.hpp:12
type
Definition: Sequencer.hpp:15
Definition: Block1i1o.hpp:12
int i
Definition: RingBufferTest.cpp:12