From 1cce6281b5d919783c9635b999d10b3c7116b656 Mon Sep 17 00:00:00 2001 From: Pierrick C Date: Mon, 10 Sep 2018 10:01:36 +0200 Subject: [PATCH] Fix the use of GPS as time source in the new cameteo module --- circuitpython/code/cameteo.py | 40 ++++++++++++++++++++++------------- circuitpython/code/main.py | 5 ++++- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/circuitpython/code/cameteo.py b/circuitpython/code/cameteo.py index ff1f0b8..3921e30 100644 --- a/circuitpython/code/cameteo.py +++ b/circuitpython/code/cameteo.py @@ -328,7 +328,7 @@ class GPSData(Data): def __init__(self, name="GPS", update_interval=0, write_interval=60, send_interval=60, enable=True, enable_pin=DigitalInOut(board.A5), - rtc=None, debug=False): + debug=False): Data.__init__(self, name=name, update_interval=update_interval, @@ -342,7 +342,6 @@ class GPSData(Data): 'alt': float(), 'qual': int(), 'age': int()} - self._rtc = rtc self._enable = enable self._gps_last_fix = int() self._gps_current_fix = int() @@ -370,8 +369,6 @@ class GPSData(Data): self._gps.timestamp_utc.tm_hour, self._gps.timestamp_utc.tm_min, self._gps.timestamp_utc.tm_sec) - if self._rtc is not None: - set_clock_from_localtime(self._rtc) if self._gps.has_fix: self._gps_last_fix = self._gps_current_fix self.data['lat'] = self._gps.latitude @@ -397,25 +394,23 @@ class GPSData(Data): self._gps.send_command('PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0') self._gps.send_command('PMTK220,1000') # 1000 ms refresh rate - if self._rtc is not None: - rtc.set_time_source(self._rtc) - if self.debug: - print("GPS is the time source!") - def disable(self): """Disable GPS module""" if self._enable: self._enable = False self._gps_en_pin.value = not self._enable # Set enable pin high to disable GPS module - # Switch backto internal RTC - rtc.set_time_source(rtc.RTC()) + + @property + def datetime(self): + """Wrapper to feed rtc.set_time_source()""" + return self._gps.timestamp_utc ############# # Functions # ############# -def set_clock_from_localtime(clock, treshold=2.0): +def set_clock_from_localtime(clock, threshold=2.0, debug=False): """ Compare internal RTC and date-time from time.localtime() and set the RTC date/time to this value if the difference is more or equal to @@ -423,9 +418,24 @@ def set_clock_from_localtime(clock, treshold=2.0): The source of time.localtime() can be set with rtc.set_time_source() """ + if debug: + print("Clock date/time : " + TIME_FORMAT.format(*clock.datetime[0:6])) + print("Local date/time : " + TIME_FORMAT.format(*time.localtime()[0:6])) + + # Check if time.localtime() is valid and can be converted in seconds + try: + local_seconds = time.mktime(time.localtime()) + except OverflowError as err: + print(err) + print("Local time source : " + TIME_FORMAT.format(*time.localtime()[0:6])) + print("Wait some time to have proper time from time source...") + return 1 + # Max difference between GPS and internal RTC (in seconds): - if abs(time.mktime(time.localtime()) - time.mktime(clock.datetime)) >= treshold: - # print("Clock difference with GPS!") - # print("Previous date/time : " + TIME_FORMAT.format(*clock.datetime[0:6])) + if abs(local_seconds - time.mktime(clock.datetime)) >= threshold: + print("Clock difference with GPS!") + print("Previous date/time : " + TIME_FORMAT.format(*clock.datetime[0:6])) clock.datetime = time.localtime() # Trust localtime if there is a bias print("Clocks synced !") + + return 0 diff --git a/circuitpython/code/main.py b/circuitpython/code/main.py index 6b0ddad..59b6faa 100644 --- a/circuitpython/code/main.py +++ b/circuitpython/code/main.py @@ -91,10 +91,12 @@ else: sys_data = cameteo.SysData(debug=False) bme_data = cameteo.BME280Data() -gps_data = cameteo.GPSData(rtc=CLOCK) +gps_data = cameteo.GPSData() data = [gps_data, sys_data, bme_data] +rtc.set_time_source(gps_data, debug=True) + # Init timers last_update = last_sent_packet = last_written_data = time.monotonic() @@ -108,6 +110,7 @@ while True: for src in data: src.update(current_time, verbose=PRINT_DATA) + cameteo.set_clock_from_localtime(CLOCK, threshold=2.0) for src in data: src.write_on_flash(current_time)