diff --git a/include/Clock.h b/include/Clock.h index be196c3..7fc28e2 100644 --- a/include/Clock.h +++ b/include/Clock.h @@ -7,15 +7,20 @@ #define CLOCK_H #include "NetworkInterface.h" +#include "mbed.h" #include "sntp.h" #include #include +typedef std::chrono::time_point kernel_timepoint; + struct timeval microseconds_to_timeval(std::chrono::microseconds val); std::chrono::microseconds timeval_to_microseconds(struct timeval val); void clock_setup(void); -std::chrono::microseconds clock_time(void); +std::chrono::microseconds clock_time(kernel_timepoint time); +kernel_timepoint kernel_time(std::chrono::microseconds time); +std::chrono::microseconds clock_now(void); SNTPError clock_sync(NetworkInterface &net); diff --git a/src/Clock.cpp b/src/Clock.cpp index ec31bb8..3dfc0bb 100644 --- a/src/Clock.cpp +++ b/src/Clock.cpp @@ -7,7 +7,6 @@ #include "mbed.h" using namespace std::chrono; -typedef time_point kernel_timepoint; Mutex clock_lock; microseconds boot_start; @@ -36,8 +35,7 @@ clock_lock.unlock(); } -microseconds clock_time(void) { - kernel_timepoint kernel_time = Kernel::Clock::now(); +microseconds clock_time(kernel_timepoint kernel_time) { clock_lock.lock(); microseconds curr_offset = boot_start; clock_lock.unlock(); @@ -45,6 +43,19 @@ return boot_start + uptime; } +kernel_timepoint kernel_time(microseconds clock_time) { + clock_lock.lock(); + microseconds curr_offset = boot_start; + clock_lock.unlock(); + microseconds boot_offset = clock_time - curr_offset; + milliseconds offset_ms = duration_cast(boot_offset); + return kernel_timepoint(offset_ms); +} + +std::chrono::microseconds clock_now(void) { + return clock_time(Kernel::Clock::now()); +} + SNTPError clock_sync(NetworkInterface &net) { struct timeval time; SNTPError err; @@ -79,7 +90,7 @@ } const char *clock_iso8601string(void) { - microseconds time = clock_time(); + microseconds time = clock_now(); struct timeval val = microseconds_to_timeval(time); const char *timestring = clock_timestring(val, "%Y-%m-%dT%H:%M:%S"); diff --git a/src/main.cpp b/src/main.cpp index a008a4b..6bf547b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -90,6 +90,17 @@ tr_info("The new time is %s", clock_iso8601string()); } + for (int i = 0; i < 5; ++i) { + std::chrono::microseconds now = clock_now(); + now += std::chrono::seconds(1); + now = std::chrono::floor( + now); + kernel_timepoint wait_time = kernel_time(now); + ThisThread::sleep_until(wait_time); + tr_info("Slept to nearest second. The new time " + "is %s", + clock_iso8601string()); + } } }