X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Futils%2Ftimer.cpp;h=9152a09652473dbec679528f227cfe8fbd78c382;hb=fae627b646e9ab709adbd0c60d7582176375e0c3;hp=a35a3e9f13170eb67998d9e869be9cbefe7bd1c9;hpb=9e444ade872bc436cf12bc12d03c3a5d51ac0b9e;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/utils/timer.cpp b/low-can-binding/utils/timer.cpp index a35a3e9f..9152a096 100644 --- a/low-can-binding/utils/timer.cpp +++ b/low-can-binding/utils/timer.cpp @@ -16,15 +16,16 @@ */ #include -#include +#include +#include #include "timer.hpp" long long int system_time_us() { struct timespec t_usec; - long long int timestamp_usec; - + long long int timestamp_usec = 0; + if(!::clock_gettime(CLOCK_MONOTONIC, &t_usec)) timestamp_usec = (t_usec.tv_nsec / 1000ll) + (t_usec.tv_sec* 1000000ll); return timestamp_usec; @@ -33,8 +34,8 @@ long long int system_time_us() long long int system_time_ms() { struct timespec t_msec; - long long int timestamp_msec; - + long long int timestamp_msec = 0; + if(!::clock_gettime(CLOCK_MONOTONIC, &t_msec)) timestamp_msec = (t_msec.tv_nsec / 1000000ll) + (t_msec.tv_sec* 1000ll); return timestamp_msec; @@ -43,8 +44,8 @@ long long int system_time_ms() long long int system_time_s() { struct timespec t_sec; - long long int timestamp_sec; - + long long int timestamp_sec = 0; + if(!::clock_gettime(CLOCK_MONOTONIC, &t_sec)) timestamp_sec = t_sec.tv_sec; return timestamp_sec; @@ -54,16 +55,37 @@ frequency_clock_t::frequency_clock_t() : unit_{1000000}, frequency_{10.0}, last_tick_{0}, time_function_{nullptr} {} - frequency_clock_t::frequency_clock_t(float frequency) : unit_{1000000}, frequency_{frequency}, last_tick_{0}, time_function_{nullptr} -{} +{ + if(frequency_ <= 0) + frequency_ = 2000; +} + +frequency_clock_t::frequency_clock_t(float frequency, uint64_t last_tick, time_function_t time_function) + : unit_{1000000}, frequency_{frequency}, last_tick_{0}, time_function_{nullptr} +{ + if(frequency_ <= 0) + frequency_ = 1; +} /// @brief Return the period in ms given the frequency in hertz. /// @param[in] frequency - Frequency to convert, in hertz -float frequency_clock_t::frequency_to_period() +float frequency_clock_t::frequency_to_period() const { - return 1 / frequency_ * unit_; + return frequency_ == 0 ? 0 : 1 / frequency_; +} + +/// @brief Return a timeval struct based on the frequency_ member. used to +/// specified CAN BCM timers. +const struct timeval frequency_clock_t::get_timeval_from_period() const +{ + struct timeval freq = {0, 0}; + float f; + freq.tv_usec = (long int)(std::modf(frequency_to_period(), &f) * unit_); + freq.tv_sec = (time_t)f; + + return freq; } bool frequency_clock_t::started() @@ -84,7 +106,7 @@ bool frequency_clock_t::elapsed(bool stagger) last_tick_ = get_time_function()() - (rand() % int(period)); // Make sure it ticks the the first call - elapsed_time = !started() ? period : get_time_function()() - last_tick_; + elapsed_time = !started() ? period : (float)get_time_function()() - (float)last_tick_; return frequency_ == 0 || elapsed_time >= period; } @@ -94,9 +116,14 @@ float frequency_clock_t::get_frequency() const return frequency_; } +uint64_t frequency_clock_t::get_last_tick() const +{ + return last_tick_; +} + /// @brief Force the clock to tick, regardless of it its time has actually /// elapsed. -void frequency_clock_t::tick() +void frequency_clock_t::tick(uint64_t timestamp) { - last_tick_ = get_time_function()(); -} \ No newline at end of file + last_tick_ = timestamp; +}