qcom gps: Always pull in thread (#28951)

* Laikad: cleanup zmq cloudlog warnings

* Handle in cloudlog

* whitespace

* whitespace

* Always pull in thread

* Stop downloading when you have fix

* check if exist

* Atomic move after download

* Increase wait

* merge
pull/28954/head
Harald Schäfer 2 years ago committed by GitHub
parent 8f3037c956
commit 601d133bba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      system/sensord/rawgps/rawgpsd.py
  2. 2
      system/sensord/rawgps/test_rawgps.py

@ -8,7 +8,7 @@ import time
import pycurl import pycurl
import subprocess import subprocess
from datetime import datetime from datetime import datetime
from multiprocessing import Process from multiprocessing import Process, Event
from typing import NoReturn, Optional from typing import NoReturn, Optional
from struct import unpack_from, calcsize, pack from struct import unpack_from, calcsize, pack
@ -31,6 +31,7 @@ from system.sensord.rawgps.structs import (dict_unpacker, position_report, relis
DEBUG = int(os.getenv("DEBUG", "0"))==1 DEBUG = int(os.getenv("DEBUG", "0"))==1
ASSIST_DATA_FILE = '/tmp/xtra3grc.bin' ASSIST_DATA_FILE = '/tmp/xtra3grc.bin'
ASSIST_DATA_FILE_DOWNLOAD = ASSIST_DATA_FILE + '.download'
ASSISTANCE_URL = 'http://xtrapath3.izatcloud.net/xtra3grc.bin' ASSISTANCE_URL = 'http://xtrapath3.izatcloud.net/xtra3grc.bin'
LOG_TYPES = [ LOG_TYPES = [
@ -126,7 +127,7 @@ def download_assistance():
cloudlog.error("Qcom assistance data larger than expected") cloudlog.error("Qcom assistance data larger than expected")
return return
with open(ASSIST_DATA_FILE, 'wb') as fp: with open(ASSIST_DATA_FILE_DOWNLOAD, 'wb') as fp:
c = pycurl.Curl() c = pycurl.Curl()
c.setopt(pycurl.URL, ASSISTANCE_URL) c.setopt(pycurl.URL, ASSISTANCE_URL)
c.setopt(pycurl.CONNECTTIMEOUT, 5) c.setopt(pycurl.CONNECTTIMEOUT, 5)
@ -134,10 +135,17 @@ def download_assistance():
c.setopt(pycurl.WRITEDATA, fp) c.setopt(pycurl.WRITEDATA, fp)
c.perform() c.perform()
c.close() c.close()
os.rename(ASSIST_DATA_FILE_DOWNLOAD, ASSIST_DATA_FILE)
except pycurl.error: except pycurl.error:
cloudlog.exception("Failed to download assistance file") cloudlog.exception("Failed to download assistance file")
return return
def downloader_loop(event):
if os.path.exists(ASSIST_DATA_FILE):
os.remove(ASSIST_DATA_FILE)
while not os.path.exists(ASSIST_DATA_FILE) and not event.is_set():
download_assistance()
time.sleep(10)
def inject_assistance(): def inject_assistance():
try: try:
@ -237,7 +245,9 @@ def main() -> NoReturn:
wait_for_modem() wait_for_modem()
assist_fetch_proc = None stop_download_event = Event()
assist_fetch_proc = Process(target=downloader_loop, args=(stop_download_event,))
assist_fetch_proc.start()
def cleanup(proc): def cleanup(proc):
cloudlog.warning("caught sig disabling quectel gps") cloudlog.warning("caught sig disabling quectel gps")
gpio_set(GPIO.UBLOX_PWR_EN, False) gpio_set(GPIO.UBLOX_PWR_EN, False)
@ -249,11 +259,9 @@ def main() -> NoReturn:
# connect to modem # connect to modem
diag = ModemDiag() diag = ModemDiag()
download_assistance()
want_assistance = not os.path.exists(ASSIST_DATA_FILE)
setup_quectel(diag) setup_quectel(diag)
want_assistance = True
current_gps_time = utc_to_gpst(GPSTime.from_datetime(datetime.utcnow())) current_gps_time = utc_to_gpst(GPSTime.from_datetime(datetime.utcnow()))
last_fetch_time = time.monotonic()
cloudlog.warning("quectel setup done") cloudlog.warning("quectel setup done")
gpio_init(GPIO.UBLOX_PWR_EN, True) gpio_init(GPIO.UBLOX_PWR_EN, True)
gpio_set(GPIO.UBLOX_PWR_EN, True) gpio_set(GPIO.UBLOX_PWR_EN, True)
@ -267,13 +275,6 @@ def main() -> NoReturn:
want_assistance = False want_assistance = False
else: else:
os.remove(ASSIST_DATA_FILE) os.remove(ASSIST_DATA_FILE)
if want_assistance and time.monotonic() - last_fetch_time > 10:
if assist_fetch_proc is None or not assist_fetch_proc.is_alive(): # type: ignore
cloudlog.warning("fetching assistance data")
assist_fetch_proc = Process(target=download_assistance)
assist_fetch_proc.start()
last_fetch_time = time.monotonic()
opcode, payload = diag.recv() opcode, payload = diag.recv()
if opcode != DIAG_LOG_F: if opcode != DIAG_LOG_F:
@ -364,6 +365,8 @@ def main() -> NoReturn:
gps.flags = 1 if gps.verticalAccuracy != 500 else 0 gps.flags = 1 if gps.verticalAccuracy != 500 else 0
if gps.flags: if gps.flags:
want_assistance = False want_assistance = False
stop_download_event.set()
pm.send('gpsLocation', msg) pm.send('gpsLocation', msg)

@ -62,7 +62,7 @@ class TestRawgpsd(unittest.TestCase):
if i == 1: if i == 1:
os.system("sudo systemctl stop systemd-resolved") os.system("sudo systemctl stop systemd-resolved")
managed_processes['rawgpsd'].start() managed_processes['rawgpsd'].start()
self._wait_for_output(7) self._wait_for_output(10)
assert self.sm.updated['qcomGnss'] assert self.sm.updated['qcomGnss']
managed_processes['rawgpsd'].stop() managed_processes['rawgpsd'].stop()

Loading…
Cancel
Save