24
24
#include < dynamic-graph/pool.h>
25
25
#include < dynamic-graph/command-bind.h>
26
26
#include < dynamic-graph/command-getter.h>
27
+ #include < dynamic-graph/command-setter.h>
27
28
28
29
#include < sot/core/config.hh>
29
30
@@ -57,6 +58,12 @@ namespace dynamicgraph {
57
58
" Get list of signals\n " ;
58
59
addCommand (" list" , new command::Getter<Event, std::string>
59
60
(*this , &Event::getSignalsByName, docstring));
61
+
62
+ docstring =
63
+ " \n "
64
+ " Triggers an event only when condition goes from False to True\n " ;
65
+ addCommand (" setOnlyUp" , new command::Setter<Event, bool >
66
+ (*this , &Event::setOnlyUp, docstring));
60
67
}
61
68
62
69
~Event () {}
@@ -87,6 +94,11 @@ namespace dynamicgraph {
87
94
return oss.str ();
88
95
}
89
96
97
+ void setOnlyUp (const bool & up)
98
+ {
99
+ onlyUp_ = up;
100
+ }
101
+
90
102
private:
91
103
typedef SignalBase<int >* Trigger_t;
92
104
typedef std::vector<Trigger_t> Triggers_t;
@@ -95,11 +107,14 @@ namespace dynamicgraph {
95
107
{
96
108
const bool & val = conditionSIN (time);
97
109
ret = (val != lastVal_);
110
+ bool trigger = onlyUp_ ? (!lastVal_ && val) : ret;
98
111
if (ret) {
99
112
lastVal_ = val;
100
- for (Triggers_t::const_iterator _s = triggers.begin ();
101
- _s != triggers.end (); ++_s)
102
- (*_s)->recompute (time);
113
+ if (trigger) {
114
+ for (Triggers_t::const_iterator _s = triggers.begin ();
115
+ _s != triggers.end (); ++_s)
116
+ (*_s)->recompute (time);
117
+ }
103
118
}
104
119
return ret;
105
120
}
@@ -109,7 +124,7 @@ namespace dynamicgraph {
109
124
Triggers_t triggers;
110
125
SignalPtr <bool , int > conditionSIN;
111
126
112
- bool lastVal_;
127
+ bool lastVal_, onlyUp_ ;
113
128
};
114
129
} // namespace sot
115
130
} // namespace dynamicgraph
0 commit comments