YARP
Yet Another Robot Platform
MonitorEvent.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #ifndef MONITOREVENT_INC
7 #define MONITOREVENT_INC
8 
9 #include <string>
10 #include <mutex>
11 #include <yarp/os/Time.h>
12 #include <vector>
13 
14 
15 class MonitorBinding;
16 
18 {
19 public:
20  MonitorEvent(const char* _name, MonitorBinding* _owner, double lf=-1.0) :
21  owner(_owner),
22  name(_name ? _name : ""),
23  lifetime(lf), // default: infinite life time
24  create_time(yarp::os::Time::now())
25  {
26  }
27 
28  MonitorBinding* owner; // event's owner
29  std::string name; // event's symbolic name
30  double lifetime; // event's life time in second. negative value means infinite life time.
31  double create_time; // event's creation or updating time
32 };
33 
34 
39 {
40 public:
41  typedef std::vector<MonitorEvent> vector_type;
42  typedef vector_type::iterator iterator;
43  typedef vector_type::const_iterator const_iterator;
44 
45  void setEvent(const char* name, MonitorBinding* owner, double lifetime=-1.0)
46  {
47  // if event already exists just update the create_time and lifetime
48  MonitorEventRecord::iterator itr = findEvent(name, owner);
49  if(itr != events.end())
50  {
51  (*itr).create_time = yarp::os::Time::now();
52  (*itr).lifetime = lifetime;
53  return;
54  }
55  events.push_back(MonitorEvent(name, owner, lifetime));
56  }
57 
58  void unsetEvent(const char* name, MonitorBinding* owner)
59  {
60  MonitorEventRecord::iterator itr = findEvent(name, owner);
61  if(itr == events.end()) {
62  return;
63  }
64  events.erase(itr);
65  }
66 
67  bool hasEvent(const char* name)
68  {
70  for(itr=events.begin(); itr<events.end(); itr++) {
71  if((*itr).name == name)
72  {
73  if((*itr).lifetime < 0.0) {
74  return true;
75  }
76  if((yarp::os::Time::now() - (*itr).create_time) < (*itr).lifetime) {
77  return true;
78  }
79  events.erase(itr); // remove expired event
80  return false;
81  }
82  }
83  return false;
84  }
85 
86  void lock()
87  {
88  mutex.lock();
89  }
90 
91  void unlock()
92  {
93  mutex.unlock();
94  }
95 
97  {
98  static MonitorEventRecord __instance_MonitorEventRecord;
99  return __instance_MonitorEventRecord;
100  }
101 
102 private:
103  MonitorEventRecord() = default;
104  MonitorEventRecord(MonitorEventRecord const &) = delete;
105  void operator=(MonitorEventRecord const &) = delete;
106 
107  MonitorEventRecord::iterator findEvent(const char* name, MonitorBinding* owner)
108  {
110  for(itr=events.begin(); itr<events.end(); itr++) {
111  if (((*itr).name == name) && ((*itr).owner == owner)) {
112  return itr;
113  }
114  }
115  return events.end();
116  }
117 
118 
119 private:
120  vector_type events;
121  std::mutex mutex;
122 };
123 
124 #endif // MONITOREVENT_INC
A singleton class to record the port monitor events.
Definition: MonitorEvent.h:39
void setEvent(const char *name, MonitorBinding *owner, double lifetime=-1.0)
Definition: MonitorEvent.h:45
std::vector< MonitorEvent > vector_type
Definition: MonitorEvent.h:41
vector_type::iterator iterator
Definition: MonitorEvent.h:42
void unsetEvent(const char *name, MonitorBinding *owner)
Definition: MonitorEvent.h:58
static MonitorEventRecord & getInstance()
Definition: MonitorEvent.h:96
bool hasEvent(const char *name)
Definition: MonitorEvent.h:67
vector_type::const_iterator const_iterator
Definition: MonitorEvent.h:43
MonitorEvent(const char *_name, MonitorBinding *_owner, double lf=-1.0)
Definition: MonitorEvent.h:20
double lifetime
Definition: MonitorEvent.h:30
MonitorBinding * owner
Definition: MonitorEvent.h:28
double create_time
Definition: MonitorEvent.h:31
std::string name
Definition: MonitorEvent.h:29
yarp::rosmsg::std_msgs::Time Time
Definition: Time.h:21
double now()
Return the current time in seconds, relative to an arbitrary starting point.
Definition: Time.cpp:121
The main, catch-all namespace for YARP.
Definition: dirs.h:16