diff --git a/system/sensord/rawgps/rawgpsd.py b/system/sensord/rawgps/rawgpsd.py index 8f243af9a5..539a6308a7 100755 --- a/system/sensord/rawgps/rawgpsd.py +++ b/system/sensord/rawgps/rawgpsd.py @@ -5,7 +5,9 @@ import signal import itertools import math import time +import pycurl import subprocess +from datetime import datetime from typing import NoReturn from struct import unpack_from, calcsize, pack @@ -107,6 +109,38 @@ def gps_enabled() -> bool: except subprocess.CalledProcessError as exc: raise Exception("failed to execute QGPS mmcli command") from exc +def download_and_inject_assistance(): + assist_data_file = '/tmp/xtra3grc.bin' + assistance_url = 'http://xtrapath3.izatcloud.net/xtra3grc.bin' + try: + c = pycurl.Curl() + c.setopt(c.URL, assistance_url) + c.setopt(c.NOBODY, 1) + c.setopt(pycurl.CONNECTTIMEOUT, 2) + c.perform() + c.close() + bytes_n = c.getinfo(c.CONTENT_LENGTH_DOWNLOAD) + if bytes_n > 1e5: + cloudlog.exception("Qcom assistance data larger than expected") + return + with open(assist_data_file, "wb") as fp: + c = pycurl.Curl() + c.setopt(pycurl.URL, assistance_url) + c.setopt(pycurl.CONNECTTIMEOUT, 5) + + c.setopt(pycurl.WRITEDATA, fp) + c.perform() + c.close() + except pycurl.error as e: + cloudlog.exception(f'Failed to download assistance file with error: {e}') + if os.path.isfile(assist_data_file): + try: + subprocess.check_call(f"mmcli -m any --timeout 30 --location-inject-assistance-data={assist_data_file}", shell=True) + except subprocess.CalledProcessError: + cloudlog.exception("rawgps.mmcli_command_failed") + if os.path.isfile(assist_data_file): + os.remove(assist_data_file) + def setup_quectel(diag: ModemDiag): # enable OEMDRE in the NV # TODO: it has to reboot for this to take effect @@ -120,13 +154,20 @@ def setup_quectel(diag: ModemDiag): if gps_enabled(): at_cmd("AT+QGPSEND") + #at_cmd("AT+QGPSDEL=0") # disable DPO power savings for more accuracy at_cmd("AT+QGPSCFG=\"dpoenable\",0") # don't automatically turn on GNSS on powerup at_cmd("AT+QGPSCFG=\"autogps\",0") - at_cmd("AT+QGPSSUPLURL=\"supl.google.com:7275\"") + # Do internet assistance + at_cmd("AT+QGPSXTRA=1") + download_and_inject_assistance() + #at_cmd("AT+QGPSXTRADATA?") + time_str = datetime.utcnow().strftime("%Y/%m/%d,%H:%M:%S") + at_cmd(f"AT+QGPSXTRATIME=0,\"{time_str}\",1,1,1000") + at_cmd("AT+QGPSCFG=\"outport\",\"usbnmea\"") at_cmd("AT+QGPS=1")