summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-09-14 03:35:12 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-09-14 15:05:29 +0300
commit98dff063f2f497434978a46f9a676307365fd878 (patch)
tree2dae2d556b855009a733f2fea1b591ea224b12a4
parent304574420d0dd5949e73df9e238eb136a21af1a3 (diff)
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>
-rw-r--r--src/libcamera/include/utils.h10
-rw-r--r--src/libcamera/utils.cpp50
2 files changed, 60 insertions, 0 deletions
diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
index 47a42258..52eee8ac 100644
--- a/src/libcamera/include/utils.h
+++ b/src/libcamera/include/utils.h
@@ -8,7 +8,10 @@
#define __LIBCAMERA_UTILS_H__
#include <algorithm>
+#include <chrono>
#include <memory>
+#include <string>
+#include <sys/time.h>
#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));
}
+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 libcamera */
diff --git a/src/libcamera/utils.cpp b/src/libcamera/utils.cpp
index afbdd834..928db254 100644
--- a/src/libcamera/utils.cpp
+++ b/src/libcamera/utils.cpp
@@ -7,6 +7,8 @@
#include "utils.h"
+#include <iomanip>
+#include <sstream>
#include <stdlib.h>
#include <string.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
*/
+/**
+ * \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 libcamera */