[libcamera-devel,v2,1/2] libcamera: utils: Add clock helpers

Message ID 20190914110620.23290-1-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • [libcamera-devel,v2,1/2] libcamera: utils: Add clock helpers
Related show

Commit Message

Laurent Pinchart Sept. 14, 2019, 11:06 a.m. UTC
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>
---
 src/libcamera/include/utils.h | 10 +++++++
 src/libcamera/utils.cpp       | 50 +++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+)

Comments

Niklas Söderlund Sept. 14, 2019, 11:44 a.m. UTC | #1
Hi Laurent,

Thanks for your work.

On 2019-09-14 14:06:19 +0300, Laurent Pinchart wrote:
> 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>
> ---
>  src/libcamera/include/utils.h | 10 +++++++
>  src/libcamera/utils.cpp       | 50 +++++++++++++++++++++++++++++++++++
>  2 files changed, 60 insertions(+)
> 
> diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
> index 47a422587338..52eee8ac2804 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 afbdd8349790..fe7ec53302a3 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 (monotonous)

I would s/monotonous/monotonic/ but it's just bike shedding ;-)

With or without this addressed,

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> + */
> +
> +/**
> + * \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 */
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

Patch

diff --git a/src/libcamera/include/utils.h b/src/libcamera/include/utils.h
index 47a422587338..52eee8ac2804 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 afbdd8349790..fe7ec53302a3 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 (monotonous)
+ */
+
+/**
+ * \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 */