48 lines
1.5 KiB
Python
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
|