31 #ifndef YARP_NO_DEPRECATED
47 std::mutex* mutex =
nullptr) :
70 #ifndef YARP_NO_DEPRECATED
82 #ifndef YARP_NO_DEPRECATED
93 std::mutex* mutex =
nullptr);
97 unsigned int m_runTimes{1};
102 return PrivateImpl::getEventNow(m_runTimes);
119 return step(getEventNow(),
true);
124 bool m_active = runTimer(m_runTimes, event);
137 double gcd(
double a,
double b)
144 if (fabs(b) < 0.001) {
147 return (
gcd(b, a - floor(a / b) * b));
154 std::map<size_t, MonoThreadTimer*> timers;
178 setPeriod(
gcd(getPeriod(),
t->m_settings.period));
180 setPeriod(
t->m_settings.period);
183 timers[timers.size()] =
t;
186 return timers.size() - 1;
194 if (!timers.size()) {
198 double new_gcd = timers.begin()->second->m_settings.period;
199 for (
auto& i : timers) {
200 new_gcd =
gcd(new_gcd, i.second->m_settings.period);
207 return timers.size();
211 #ifndef YARP_NO_DEPRECATED
217 PrivateImpl(sett, call, mutex)
222 singlInstance.
start();
231 PrivateImpl(sett, call, mutex)
236 singlInstance.
start();
245 singlInstance.
stop();
249 void TimerSingleton::run()
252 for (
auto t : timers) {
269 bool threadInit()
override;
270 bool singleStep{
false};
273 #ifndef YARP_NO_DEPRECATED
288 std::mutex* mutex =
nullptr) :
324 bool ThreadedTimer::threadInit()
330 #ifndef YARP_NO_DEPRECATED
354 return impl->startTimer();
359 return impl->stepTimer();
372 event.currentExpected = m_startStamp + iteration * m_settings.period;
373 event.lastExpected =
event.currentExpected - m_settings.period;
374 event.lastReal = m_lastReal;
375 event.lastDuration =
event.currentReal - m_lastReal;
376 event.runCount = iteration;
382 if (m_mutex !=
nullptr) {
386 #ifndef YARP_NO_DEPRECATED
387 if (m_old_mutex !=
nullptr) {
392 bool ret = m_callback(event);
394 #ifndef YARP_NO_DEPRECATED
395 if (m_old_mutex !=
nullptr) {
396 m_old_mutex->unlock();
400 if (m_mutex !=
nullptr) {
408 m_lastReal =
event.currentReal;
413 bool stop(m_settings.totalRunCount != 0 && m_settings.totalRunCount <= iteration);
416 stop |= m_settings.totalTime > 0.00001 && (m_settings.totalTime - timerAge) < m_settings.tolerance;
421 void ThreadedTimer::run()
423 if (getIterations() == 0 && !singleStep) {
428 if (!runTimer(this->getIterations(), event)) {
435 impl->m_settings = settings;
440 return impl->m_settings;
445 return impl->timerIsRunning();
double gcd(double a, double b)
void stopTimer() override
MonoThreadTimer(const TimerSettings &sett, const TimerCallback &call, yarp::os::Mutex *mutex)
~MonoThreadTimer() override
virtual yarp::os::YarpTimerEvent getEventNow()
bool stepTimer() override
virtual bool step(YarpTimerEvent event, bool singleStep)
bool startTimer() override
bool timerIsRunning() override
void stopTimer() override
ThreadedTimer(const TimerSettings &sett, const TimerCallback &call, std::mutex *mutex=nullptr)
bool stepTimer() override
~ThreadedTimer() override
bool startTimer() override
ThreadedTimer(const TimerSettings &sett, const TimerCallback &call, yarp::os::Mutex *mutex)
bool timerIsRunning() override
static TimerSingleton & self()
void removeTimer(size_t id)
size_t addTimer(MonoThreadTimer *t)
Basic wrapper for mutual exclusion.
An abstraction for a periodic thread.
bool setPeriod(double period)
Set the (new) period of the thread.
bool isRunning() const
Returns true when the thread is started, false otherwise.
void askToStop()
Stop the thread.
bool start()
Call this to start the thread.
void step()
Call this to "step" the thread rather than starting it.
void stop()
Call this to stop the thread, this call blocks until the thread is terminated (and releaseThread() ca...
yarp::os::YarpTimerEvent getEventNow(unsigned int iteration)
virtual bool startTimer()=0
yarp::os::Mutex * m_old_mutex
bool runTimer(unsigned int iteration, YarpTimerEvent event)
PrivateImpl(const TimerSettings &sett, TimerCallback call, std::mutex *mutex=nullptr)
virtual ~PrivateImpl()=default
virtual void stopTimer()=0
virtual bool timerIsRunning()=0
virtual bool stepTimer()=0
yarp::os::Timer::TimerCallback TimerCallback
PrivateImpl(const TimerSettings &sett, TimerCallback call, yarp::os::Mutex *mutex)
void setSettings(const yarp::os::TimerSettings &settings)
setSettings
const yarp::os::TimerSettings getSettings()
getSettings
Timer(const Timer &)=delete
std::function< bool(const yarp::os::YarpTimerEvent &)> TimerCallback
double now()
Return the current time in seconds, relative to an arbitrary starting point.
An interface to the operating system, including Port based communication.
double currentReal
currentReal When the current callback is actually being called
double currentExpected
currentExpected this is when the current callback should have been called
#define YARP_WARNING_POP
Ends a temporary alteration of the enabled warnings.
#define YARP_WARNING_PUSH
Starts a temporary alteration of the enabled warnings.
#define YARP_DISABLE_DEPRECATED_WARNING
Disable deprecated warnings in the following code.