diff --git a/src/Clock.cpp b/src/Clock.cpp index 2c80205..4901852 100644 --- a/src/Clock.cpp +++ b/src/Clock.cpp @@ -6,17 +6,44 @@ #include "Clock.h" #include "mbed.h" -void clock_setup(void) { - // mbed reads the RTC at boot, do nothing for now -} +typedef std::chrono::time_point kernel_timepoint; +typedef std::chrono::duration kernel_duration; -struct timeval clock_time() { +Mutex clock_lock; +kernel_timepoint clock_timepoint; +struct timeval clock_timeval; + +struct timeval get_rtc_time() { struct timeval timeval; timeval.tv_sec = time(NULL); timeval.tv_usec = 0; return timeval; } +void clock_setup(void) { + clock_lock.lock(); + clock_timeval = get_rtc_time(); + clock_timepoint = Kernel::Clock::now(); + clock_lock.unlock(); +} + +struct timeval clock_time() { + clock_lock.lock(); + kernel_timepoint now = Kernel::Clock::now(); + std::chrono::microseconds elapsed = now - clock_timepoint; + clock_lock.unlock(); + + uint64_t microsecs = 0; + microsecs += clock_timeval.tv_usec; + microsecs += clock_timeval.tv_sec * 1000000; + microsecs += elapsed.count(); + + struct timeval time; + time.tv_sec = microsecs / 1000000; + time.tv_usec = microsecs % 1000000; + return time; +} + SNTPError clock_sync(NetworkInterface &net) { struct timeval time; SNTPError err; @@ -24,6 +51,10 @@ if (err != SNTPSuccess) { return err; } + clock_lock.lock(); + clock_timeval = time; + clock_timepoint = Kernel::Clock::now(); + clock_lock.unlock(); set_time(time.tv_sec); return SNTPSuccess; }