sot-core  4.11.6
Hierarchical task solver plug-in for dynamic-graph.
event.hh
Go to the documentation of this file.
1 // Copyright (c) 2018, Joseph Mirabel
2 // Authors: Joseph Mirabel (joseph.mirabel@laas.fr)
3 
4 #ifndef __SOT_EVENT_H__
5 #define __SOT_EVENT_H__
6 
7 #include <dynamic-graph/command-bind.h>
8 #include <dynamic-graph/command-getter.h>
9 #include <dynamic-graph/command-setter.h>
10 #include <dynamic-graph/entity.h>
11 #include <dynamic-graph/pool.h>
12 #include <dynamic-graph/signal-ptr.h>
13 #include <dynamic-graph/signal-time-dependent.h>
14 #include <dynamic-graph/signal.h>
15 
16 #include <sot/core/config.hh>
17 
18 namespace dynamicgraph {
19 namespace sot {
21 class SOT_CORE_DLLAPI Event : public dynamicgraph::Entity {
22  DYNAMIC_GRAPH_ENTITY_DECL();
23 
24  Event(const std::string &name)
25  : Entity(name), checkSOUT("Event(" + name + ")::output(bool)::check"),
26  conditionSIN(NULL, "Event(" + name + ")::input(bool)::condition"),
27  lastVal_(2) // lastVal_ should be different true and false.
28  {
29  checkSOUT.setFunction(boost::bind(&Event::check, this, _1, _2));
30  signalRegistration(conditionSIN);
31  signalRegistration(checkSOUT);
32 
33  using command::makeCommandVoid1;
34  std::string docstring = "\n"
35  " Add a signal\n";
36  addCommand("addSignal",
37  makeCommandVoid1(*this, &Event::addSignal, docstring));
38 
39  docstring = "\n"
40  " Get list of signals\n";
41  addCommand("list", new command::Getter<Event, std::string>(
42  *this, &Event::getSignalsByName, docstring));
43 
44  docstring =
45  "\n"
46  " Triggers an event only when condition goes from False to True\n";
47  addCommand("setOnlyUp", new command::Setter<Event, bool>(
48  *this, &Event::setOnlyUp, docstring));
49  }
50 
51  ~Event() {}
52 
54  virtual std::string getDocString() const {
55  return "Send an event when the input changes\n\n"
56  " The signal triggered is called whenever the condition is "
57  "satisfied.\n";
58  }
59 
60  void addSignal(const std::string &signal) {
61  std::istringstream iss(signal);
62  triggers.push_back(&PoolStorage::getInstance()->getSignal(iss));
63  }
64 
65  // Returns the Python string representation of the list of signal names.
66  std::string getSignalsByName() const {
67  std::ostringstream oss;
68  oss << "(";
69  for (Triggers_t::const_iterator _sig = triggers.begin();
70  _sig != triggers.end(); ++_sig)
71  oss << '\'' << (*_sig)->getName() << "\', ";
72  oss << ")";
73  return oss.str();
74  }
75 
76  void setOnlyUp(const bool &up) { onlyUp_ = up; }
77 
78 private:
79  typedef SignalBase<int> *Trigger_t;
80  typedef std::vector<Trigger_t> Triggers_t;
81 
82  bool &check(bool &ret, const int &time);
83 
84  Signal<bool, int> checkSOUT;
85 
86  Triggers_t triggers;
87  SignalPtr<bool, int> conditionSIN;
88 
89  bool lastVal_, onlyUp_;
90 };
91 } // namespace sot
92 } // namespace dynamicgraph
93 #endif // __SOT_EVENT_H__
dynamicgraph
Definition: abstract-sot-external-interface.hh:17
dynamicgraph::sot::PoolStorage::getInstance
static PoolStorage * getInstance()
Get unique instance of the class.
dynamicgraph::sot::Event
Event.
Definition: event.hh:21