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