14#include <dpsim/Config.h>
24 using Ticks = std::chrono::nanoseconds;
87template <
class Rep,
class Period>
88struct timespec to_timespec(
std::chrono::duration<Rep, Period> dur) {
89 auto nsDur = std::chrono::duration_cast<std::chrono::nanoseconds>(dur);
93 ts.tv_sec = nsDur.count() / 1000000000;
94 ts.tv_nsec = nsDur.count() % 1000000000;
106template <
typename Clock,
typename Duration>
109 const std::chrono::time_point<Clock, Duration> &time_point) {
110 const auto sys_time_point =
111 std::chrono::time_point_cast<typename Clock::duration, Clock>(time_point);
112 const std::time_t time = Clock::to_time_t(sys_time_point);
115 ((__GNUC__ == 4) && __GNUC_MINOR__ > 8 && __GNUC_REVISION__ > 1)
118 localtime_r(&time, &tm);
119 return stream << std::put_time(&tm,
"%c");
120#elif defined(_MSC_VER)
122 ctime_s(buffer, 26, &time);
124 return stream << buffer;
127 ctime_r(&time, buffer);
129 return stream << buffer;
133template <
typename Rep,
typename Period>
135 const std::chrono::duration<Rep, Period> &dur) {
137 using namespace std::chrono;
141 if (dur == dur.zero())
144 auto h = duration_cast<hours>(d);
146 auto m = duration_cast<minutes>(d);
148 auto s = duration_cast<seconds>(d);
150 auto ms = duration_cast<milliseconds>(d);
152 auto us = duration_cast<microseconds>(d);
154 auto ns = duration_cast<nanoseconds>(d);
156 long long vals[] = {h.count(), m.count(), s.count(),
157 ms.count(), us.count(), ns.count()};
158 const char *units[] = {
"hrs",
"mins",
"secs",
"msecs",
"usecs",
"nsecs"};
160 for (
int i = 0; i < 6; i++) {
167 stream << vals[i] <<
" " << units[i];
std::ostream & operator<<(std::ostream &stream, const std::chrono::time_point< Clock, Duration > &time_point)
spdlog::level::level_enum Level
std::shared_ptr< spdlog::logger > Log
IntervalTimePoint mNextTick
void setStartTime(const StartTimePoint &start)
enum DPsim::Timer::State mState
void start()
Start real-time timer.
void start(const StartTimePoint &startAt)
void setInterval(double dt)
const long long & overruns()
std::chrono::nanoseconds Ticks
std::chrono::time_point< StartClock, Ticks > StartTimePoint
void stop()
Stop real-time timer.
CPS::Logger::Log mSLog
Logger.
void sleep()
Suspend thread execution until next tick.
void setInterval(const Ticks &intv)
std::chrono::system_clock StartClock
std::chrono::steady_clock IntervalClock
Timer(int flags=0, CPS::Logger::Level logLevel=CPS::Logger::Level::debug)
std::chrono::time_point< IntervalClock, Ticks > IntervalTimePoint
CPS::Logger::Level mLogLevel
Timer log level.