libcamera: utils: Add clock helpers

In preparation for standardisation of the std::chrono::steady_clock as
the libcamera default clock, define aliases for the clock, duration and
time point, and add helper functions to convert a duration to a timespec
and a time point to a string. More helpers will be added later as
needed.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2019-09-14 03:35:12 +03:00
parent 304574420d
commit 98dff063f2
2 changed files with 60 additions and 0 deletions

View file

@ -8,7 +8,10 @@
#define __LIBCAMERA_UTILS_H__ #define __LIBCAMERA_UTILS_H__
#include <algorithm> #include <algorithm>
#include <chrono>
#include <memory> #include <memory>
#include <string>
#include <sys/time.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
@ -53,6 +56,13 @@ const T& clamp(const T& v, const T& lo, const T& hi)
return std::max(lo, std::min(v, hi)); return std::max(lo, std::min(v, hi));
} }
using clock = std::chrono::steady_clock;
using duration = std::chrono::steady_clock::duration;
using time_point = std::chrono::steady_clock::time_point;
struct timespec duration_to_timespec(const duration &value);
std::string time_point_to_string(const time_point &time);
} /* namespace utils */ } /* namespace utils */
} /* namespace libcamera */ } /* namespace libcamera */

View file

@ -7,6 +7,8 @@
#include "utils.h" #include "utils.h"
#include <iomanip>
#include <sstream>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
@ -93,6 +95,54 @@ char *secure_getenv(const char *name)
* \return lo if v is less than lo, hi if v is greater than hi, otherwise v * \return lo if v is less than lo, hi if v is greater than hi, otherwise v
*/ */
/**
* \typedef clock
* \brief The libcamera clock (monotonic)
*/
/**
* \typedef duration
* \brief The libcamera duration related to libcamera::utils::clock
*/
/**
* \typedef time_point
* \brief The libcamera time point related to libcamera::utils::clock
*/
/**
* \brief Convert a duration to a timespec
* \param[in] value The duration
* \return A timespec expressing the duration
*/
struct timespec duration_to_timespec(const duration &value)
{
uint64_t nsecs = std::chrono::duration_cast<std::chrono::nanoseconds>(value).count();
struct timespec ts;
ts.tv_sec = nsecs / 1000000000ULL;
ts.tv_nsec = nsecs % 1000000000ULL;
return ts;
}
/**
* \brief Convert a time point to a string representation
* \param[in] time The time point
* \return A string representing the time point in hh:mm:ss.nanoseconds format
*/
std::string time_point_to_string(const time_point &time)
{
uint64_t nsecs = std::chrono::duration_cast<std::chrono::nanoseconds>(time.time_since_epoch()).count();
unsigned int secs = nsecs / 1000000000ULL;
std::ostringstream ossTimestamp;
ossTimestamp.fill('0');
ossTimestamp << secs / (60 * 60) << ":"
<< std::setw(2) << (secs / 60) % 60 << ":"
<< std::setw(2) << secs % 60 << "."
<< std::setw(9) << nsecs % 1000000000ULL;
return ossTimestamp.str();
}
} /* namespace utils */ } /* namespace utils */
} /* namespace libcamera */ } /* namespace libcamera */