GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/sot/core/event.hh Lines: 0 34 0.0 %
Date: 2023-03-13 12:09:37 Branches: 0 80 0.0 %

Line Branch Exec Source
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 {
20
/// Event
21
///
22
/// This entity detects changes in value of an input boolean signal
23
///
24
/// Input signal is
25
///   - condition (boolean),
26
/// Output signal is
27
///   - check
28
/// output value is true if value of input signal changes with respect to the
29
/// evaluation.
30
///
31
/// Method addSignal stores signals that are recomputed each time the output
32
/// signal is recomputed and the value is true. One typical use case of this
33
/// feature consists in plugging the output signal to a ROS topic using
34
/// dynamicgraph::RosPublish entity (see dynamic_graph_bridge) and to call
35
/// addSignal with the trigger signal of the RosPublish entity as the input.
36
/// Thus each time the output signal changes value, the new value is published
37
/// to the ROS topic.
38
///
39
/// If command setOnlyUp is called with true as input, signals are recomputed
40
/// only if the output value switches from false to true.
41
42
class SOT_CORE_DLLAPI Event : public dynamicgraph::Entity {
43
  DYNAMIC_GRAPH_ENTITY_DECL();
44
45
  Event(const std::string &name)
46
      : Entity(name),
47
        checkSOUT("Event(" + name + ")::output(bool)::check"),
48
        conditionSIN(NULL, "Event(" + name + ")::input(bool)::condition"),
49
        lastVal_(2),  // lastVal_ should be different true and false.
50
        timeSinceUp_(0),
51
        repeatAfterNIterations_(0) {
52
    checkSOUT.setFunction(boost::bind(&Event::check, this, _1, _2));
53
    signalRegistration(conditionSIN);
54
    signalRegistration(checkSOUT);
55
56
    using command::makeCommandVoid1;
57
    std::string docstring =
58
        "\n"
59
        "    Add a signal\n";
60
    addCommand("addSignal",
61
               makeCommandVoid1(*this, &Event::addSignal, docstring));
62
63
    docstring =
64
        "\n"
65
        "    Get list of signals\n";
66
    addCommand("list", new command::Getter<Event, std::string>(
67
                           *this, &Event::getSignalsByName, docstring));
68
69
    docstring =
70
        "\n"
71
        "    Repease event if input signal remains True for a while\n"
72
        "      Input: number of iterations before repeating output\n."
73
        "        0 for no repetition";
74
    addCommand("repeat", new command::Setter<Event, int>(*this, &Event::repeat,
75
                                                         docstring));
76
  }
77
78
  ~Event() {}
79
80
  /// Header documentation of the python class
81
  virtual std::string getDocString() const {
82
    return "Send an event when the input changes\n\n"
83
           "  The signal triggered is called whenever the condition is "
84
           "satisfied.\n";
85
  }
86
87
  void addSignal(const std::string &signal) {
88
    std::istringstream iss(signal);
89
    triggers.push_back(&PoolStorage::getInstance()->getSignal(iss));
90
  }
91
92
  // Returns the Python string representation of the list of signal names.
93
  std::string getSignalsByName() const {
94
    std::ostringstream oss;
95
    oss << "(";
96
    for (Triggers_t::const_iterator _sig = triggers.begin();
97
         _sig != triggers.end(); ++_sig)
98
      oss << '\'' << (*_sig)->getName() << "\', ";
99
    oss << ")";
100
    return oss.str();
101
  }
102
103
  void repeat(const int &nbIterations) {
104
    repeatAfterNIterations_ = nbIterations;
105
  }
106
107
 private:
108
  typedef SignalBase<int> *Trigger_t;
109
  typedef std::vector<Trigger_t> Triggers_t;
110
111
  bool &check(bool &ret, const int &time);
112
113
  Signal<bool, int> checkSOUT;
114
115
  Triggers_t triggers;
116
  SignalPtr<bool, int> conditionSIN;
117
118
  bool lastVal_;
119
  int timeSinceUp_, repeatAfterNIterations_;
120
};
121
}  // namespace sot
122
}  // namespace dynamicgraph
123
#endif  // __SOT_EVENT_H__