Fix pps clock when not connected to gps
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
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
|
||||
Reference in New Issue
Block a user