20 #include <baseapp/timing_thread.h>
24 #define CFG_PREFIX "/fawkes/mainapp/"
37 FawkesTimingThread::FawkesTimingThread() : Thread(
"FawkesTimingThread", Thread::OPMODE_CONTINUOUS)
46 FawkesTimingThread::init()
48 clock_ = Clock::instance();
49 loop_start_ =
new Time(clock_);
50 loop_end_ =
new Time(clock_);
52 syncpoint_loop_start_ = syncpoint_manager->
get_syncpoint(name(),
"/preloop/start");
53 syncpoint_loop_end_ = syncpoint_manager->
get_syncpoint(name(),
"/postloop/end");
56 desired_loop_time_usec_ = config->
get_uint(
"/fawkes/mainapp/desired_loop_time");
58 desired_loop_time_usec_ = 0;
59 logger->
log_info(name(),
"Desired loop time not set, assuming 0");
61 desired_loop_time_sec_ = (float)desired_loop_time_usec_ / 1000000.f;
64 min_loop_time_usec_ = config->
get_uint(
"/fawkes/mainapp/min_loop_time");
66 min_loop_time_usec_ = 0;
67 logger->
log_info(name(),
"Minimal loop time not set, assuming 0");
69 min_loop_time_sec_ = (float)min_loop_time_usec_ / 1000000.f;
72 enable_looptime_warnings_ = config->
get_bool(
"/fawkes/mainapp/enable_looptime_warnings");
73 if (!enable_looptime_warnings_) {
74 logger->
log_debug(name(),
"loop time warnings are disabled");
77 enable_looptime_warnings_ =
true;
87 FawkesTimingThread::loop()
89 syncpoint_loop_start_->wait(name());
90 loop_start_->stamp_systime();
92 syncpoint_loop_end_->wait(name());
93 loop_end_->stamp_systime();
94 float loop_time = *loop_end_ - loop_start_;
96 if (loop_time < min_loop_time_usec_) {
97 logger->
log_warn(name(),
"Minimal loop time not reached, extending loop");
98 usleep(min_loop_time_usec_ - loop_time);
99 loop_end_->stamp_systime();
100 loop_time = *loop_end_ - loop_start_;
103 if (desired_loop_time_sec_ > 0) {
104 if (enable_looptime_warnings_) {
107 if (loop_time > 1.1 * desired_loop_time_sec_) {
109 "Loop time exceeded, "
110 "desired: %f sec (%u usec), actual: %f sec",
111 desired_loop_time_sec_,
112 desired_loop_time_usec_,
116 "Desired loop time achieved, "
117 "desired: %f sec (%u usec), actual: %f sec",
118 desired_loop_time_sec_,
119 desired_loop_time_usec_,
130 FawkesTimingThread::finalize()
virtual unsigned int get_uint(const char *path)=0
Get value from configuration which is of type unsigned int.
virtual bool get_bool(const char *path)=0
Get value from configuration which is of type bool.
Base class for exceptions in Fawkes.
virtual void log_info(const char *component, const char *format,...)
Log informational message.
virtual void log_warn(const char *component, const char *format,...)
Log warning message.
virtual void log_debug(const char *component, const char *format,...)
Log debug message.
void release_syncpoint(const std::string &component, RefPtr< SyncPoint > syncpoint)
Release a SyncPoint.
RefPtr< SyncPoint > get_syncpoint(const std::string &component, const std::string &identifier)
Get a SyncPoint.
A class for handling time.
Fawkes library namespace.