Files

48 lines
1.5 KiB
Python

import time
class SystemClock:
def __init__(self):
self._update_time_ns = time.monotonic_ns()
self._time = (0, 0, 0, 0)
self._previous_timestamp = 0
self._previous_utc_h = 0
def update(self):
self._update_time()
current_timestamp = self.utc_timestamp
if self._previous_utc_h == 23 and self.utc_time[0] == 0:
current_timestamp += 86400
delta = current_timestamp - self._previous_timestamp
self._previous_timestamp = current_timestamp
self._previous_utc_h = self.utc_time[0]
return delta
def _update_time(self):
current_time = time.monotonic_ns()
time_diff = current_time - self._update_time_ns
self._update_time_ns = current_time
s, ns = divmod(self._time[3]+time_diff, 1e9)
m, s = divmod(self._time[2]+s, 60)
h, m = divmod(self._time[1]+m, 60)
_, h = divmod(self._time[0]+h, 24)
self._time = (h, m, s, ns)
def update_from_pps_clock(self, pps_time, pps_ref_monotonic):
self._time = pps_time[:]
self._update_time_ns = pps_ref_monotonic
self._update_time()
self._previous_timestamp = self.utc_timestamp
@property
def utc_time(self):
self._update_time()
return self._time
@property
def utc_timestamp(self):
return self._time[0] * 3600 + self._time[1] * 60 + self._time[2] + (self._time[3] / 1_000_000_000)
@property
def update_time_ns(self):
return self._update_time_ns