|  |  |  | @ -8,7 +8,7 @@ import time | 
			
		
	
		
			
				
					|  |  |  |  | import pycurl | 
			
		
	
		
			
				
					|  |  |  |  | import subprocess | 
			
		
	
		
			
				
					|  |  |  |  | from datetime import datetime | 
			
		
	
		
			
				
					|  |  |  |  | from multiprocessing import Process | 
			
		
	
		
			
				
					|  |  |  |  | from multiprocessing import Process, Event | 
			
		
	
		
			
				
					|  |  |  |  | from typing import NoReturn, Optional | 
			
		
	
		
			
				
					|  |  |  |  | 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 | 
			
		
	
		
			
				
					|  |  |  |  | ASSIST_DATA_FILE = '/tmp/xtra3grc.bin' | 
			
		
	
		
			
				
					|  |  |  |  | ASSIST_DATA_FILE_DOWNLOAD = ASSIST_DATA_FILE + '.download' | 
			
		
	
		
			
				
					|  |  |  |  | ASSISTANCE_URL = 'http://xtrapath3.izatcloud.net/xtra3grc.bin' | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | LOG_TYPES = [ | 
			
		
	
	
		
			
				
					|  |  |  | @ -126,7 +127,7 @@ def download_assistance(): | 
			
		
	
		
			
				
					|  |  |  |  |       cloudlog.error("Qcom assistance data larger than expected") | 
			
		
	
		
			
				
					|  |  |  |  |       return | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     with open(ASSIST_DATA_FILE, 'wb') as fp: | 
			
		
	
		
			
				
					|  |  |  |  |     with open(ASSIST_DATA_FILE_DOWNLOAD, 'wb') as fp: | 
			
		
	
		
			
				
					|  |  |  |  |       c = pycurl.Curl() | 
			
		
	
		
			
				
					|  |  |  |  |       c.setopt(pycurl.URL, ASSISTANCE_URL) | 
			
		
	
		
			
				
					|  |  |  |  |       c.setopt(pycurl.CONNECTTIMEOUT, 5) | 
			
		
	
	
		
			
				
					|  |  |  | @ -134,10 +135,17 @@ def download_assistance(): | 
			
		
	
		
			
				
					|  |  |  |  |       c.setopt(pycurl.WRITEDATA, fp) | 
			
		
	
		
			
				
					|  |  |  |  |       c.perform() | 
			
		
	
		
			
				
					|  |  |  |  |       c.close() | 
			
		
	
		
			
				
					|  |  |  |  |       os.rename(ASSIST_DATA_FILE_DOWNLOAD, ASSIST_DATA_FILE) | 
			
		
	
		
			
				
					|  |  |  |  |   except pycurl.error: | 
			
		
	
		
			
				
					|  |  |  |  |     cloudlog.exception("Failed to download assistance file") | 
			
		
	
		
			
				
					|  |  |  |  |     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(): | 
			
		
	
		
			
				
					|  |  |  |  |   try: | 
			
		
	
	
		
			
				
					|  |  |  | @ -237,7 +245,9 @@ def main() -> NoReturn: | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   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): | 
			
		
	
		
			
				
					|  |  |  |  |     cloudlog.warning("caught sig disabling quectel gps") | 
			
		
	
		
			
				
					|  |  |  |  |     gpio_set(GPIO.UBLOX_PWR_EN, False) | 
			
		
	
	
		
			
				
					|  |  |  | @ -249,11 +259,9 @@ def main() -> NoReturn: | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   # connect to modem | 
			
		
	
		
			
				
					|  |  |  |  |   diag = ModemDiag() | 
			
		
	
		
			
				
					|  |  |  |  |   download_assistance() | 
			
		
	
		
			
				
					|  |  |  |  |   want_assistance = not os.path.exists(ASSIST_DATA_FILE) | 
			
		
	
		
			
				
					|  |  |  |  |   setup_quectel(diag) | 
			
		
	
		
			
				
					|  |  |  |  |   want_assistance = True | 
			
		
	
		
			
				
					|  |  |  |  |   current_gps_time = utc_to_gpst(GPSTime.from_datetime(datetime.utcnow())) | 
			
		
	
		
			
				
					|  |  |  |  |   last_fetch_time = time.monotonic() | 
			
		
	
		
			
				
					|  |  |  |  |   cloudlog.warning("quectel setup done") | 
			
		
	
		
			
				
					|  |  |  |  |   gpio_init(GPIO.UBLOX_PWR_EN, True) | 
			
		
	
		
			
				
					|  |  |  |  |   gpio_set(GPIO.UBLOX_PWR_EN, True) | 
			
		
	
	
		
			
				
					|  |  |  | @ -267,13 +275,6 @@ def main() -> NoReturn: | 
			
		
	
		
			
				
					|  |  |  |  |         want_assistance = False | 
			
		
	
		
			
				
					|  |  |  |  |       else: | 
			
		
	
		
			
				
					|  |  |  |  |         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() | 
			
		
	
		
			
				
					|  |  |  |  |     if opcode != DIAG_LOG_F: | 
			
		
	
	
		
			
				
					|  |  |  | @ -364,6 +365,8 @@ def main() -> NoReturn: | 
			
		
	
		
			
				
					|  |  |  |  |       gps.flags = 1 if gps.verticalAccuracy != 500 else 0 | 
			
		
	
		
			
				
					|  |  |  |  |       if gps.flags: | 
			
		
	
		
			
				
					|  |  |  |  |         want_assistance = False | 
			
		
	
		
			
				
					|  |  |  |  |         stop_download_event.set() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       pm.send('gpsLocation', msg) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |