diff --git a/src/Clock.cpp b/src/Clock.cpp index 4901852..a454af0 100644 --- a/src/Clock.cpp +++ b/src/Clock.cpp @@ -5,13 +5,14 @@ #include "Clock.h" #include "mbed.h" +#include -typedef std::chrono::time_point kernel_timepoint; -typedef std::chrono::duration kernel_duration; +using namespace std::chrono; + +typedef time_point kernel_timepoint; Mutex clock_lock; -kernel_timepoint clock_timepoint; -struct timeval clock_timeval; +microseconds clock_offset; struct timeval get_rtc_time() { struct timeval timeval; @@ -21,23 +22,26 @@ } void clock_setup(void) { + microseconds new_offset(0); + struct timeval rtc_time = get_rtc_time(); + kernel_timepoint kernel_time = Kernel::Clock::now(); + microseconds boot_offset = kernel_time.time_since_epoch(); + new_offset += microseconds(rtc_time.tv_usec); + new_offset += seconds(rtc_time.tv_sec); + new_offset -= boot_offset; clock_lock.lock(); - clock_timeval = get_rtc_time(); - clock_timepoint = Kernel::Clock::now(); + clock_offset = new_offset; clock_lock.unlock(); } struct timeval clock_time() { clock_lock.lock(); - kernel_timepoint now = Kernel::Clock::now(); - std::chrono::microseconds elapsed = now - clock_timepoint; + kernel_timepoint kernel_time = Kernel::Clock::now(); + microseconds curr_offset = clock_offset; clock_lock.unlock(); - - uint64_t microsecs = 0; - microsecs += clock_timeval.tv_usec; - microsecs += clock_timeval.tv_sec * 1000000; - microsecs += elapsed.count(); - + microseconds boot_offset = kernel_time.time_since_epoch(); + microseconds offsetted = curr_offset + boot_offset; + uint64_t microsecs = offsetted.count(); struct timeval time; time.tv_sec = microsecs / 1000000; time.tv_usec = microsecs % 1000000; @@ -52,8 +56,13 @@ return err; } clock_lock.lock(); - clock_timeval = time; - clock_timepoint = Kernel::Clock::now(); + microseconds new_offset(0); + kernel_timepoint kernel_time = Kernel::Clock::now(); + microseconds boot_offset = kernel_time.time_since_epoch(); + new_offset += microseconds(time.tv_usec); + new_offset += seconds(time.tv_sec); + new_offset -= boot_offset; + clock_offset = new_offset; clock_lock.unlock(); set_time(time.tv_sec); return SNTPSuccess;