| 
						
						
						
					 | 
					 | 
					@ -1,11 +1,9 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#!/usr/bin/env python3 | 
					 | 
					 | 
					 | 
					#!/usr/bin/env python3 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import datetime | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import os | 
					 | 
					 | 
					 | 
					import os | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import struct | 
					 | 
					 | 
					 | 
					import datetime | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import usb1 | 
					 | 
					 | 
					 | 
					from panda import Panda | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					REQUEST_IN = usb1.ENDPOINT_IN | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE | 
					 | 
					 | 
					 | 
					MIN_DATE = datetime.datetime(year=2023, month=4, day=1) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					MIN_DATE = datetime.datetime(year=2021, month=4, day=1) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def set_time(logger): | 
					 | 
					 | 
					 | 
					def set_time(logger): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  sys_time = datetime.datetime.today() | 
					 | 
					 | 
					 | 
					  sys_time = datetime.datetime.today() | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -14,24 +12,28 @@ def set_time(logger): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return | 
					 | 
					 | 
					 | 
					    return | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  try: | 
					 | 
					 | 
					 | 
					  try: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ctx = usb1.USBContext() | 
					 | 
					 | 
					 | 
					    ps = Panda.list() | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    dev = ctx.openByVendorIDAndProductID(0xbbaa, 0xddcc) | 
					 | 
					 | 
					 | 
					    if len(ps) == 0: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if dev is None: | 
					 | 
					 | 
					 | 
					      logger.error("Failed to set time, no pandas found") | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      logger.info("No panda found") | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      return | 
					 | 
					 | 
					 | 
					      return | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # Set system time from panda RTC time | 
					 | 
					 | 
					 | 
					    for s in ps: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    dat = dev.controlRead(REQUEST_IN, 0xa0, 0, 0, 8) | 
					 | 
					 | 
					 | 
					      with Panda(serial=s) as p: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    a = struct.unpack("HBBBBBB", dat) | 
					 | 
					 | 
					 | 
					        if not p.is_internal(): | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    panda_time = datetime.datetime(a[0], a[1], a[2], a[4], a[5], a[6]) | 
					 | 
					 | 
					 | 
					          continue | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if panda_time > MIN_DATE: | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      logger.info(f"adjusting time from '{sys_time}' to '{panda_time}'") | 
					 | 
					 | 
					 | 
					        # Set system time from panda RTC time | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      os.system(f"TZ=UTC date -s '{panda_time}'") | 
					 | 
					 | 
					 | 
					        panda_time = p.get_datetime() | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        logger.info(f"adjusting time from '{sys_time}' to '{panda_time}'") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if panda_time > MIN_DATE: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          logger.info(f"adjusting time from '{sys_time}' to '{panda_time}'") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          os.system(f"TZ=UTC date -s '{panda_time}'") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        break | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  except Exception: | 
					 | 
					 | 
					 | 
					  except Exception: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    logger.warn("Failed to fetch time from panda") | 
					 | 
					 | 
					 | 
					    logger.exception("Failed to fetch time from panda") | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					if __name__ == "__main__": | 
					 | 
					 | 
					 | 
					if __name__ == "__main__": | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  import logging | 
					 | 
					 | 
					 | 
					  import logging | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  logging.basicConfig(level=logging.INFO) | 
					 | 
					 | 
					 | 
					  logging.basicConfig(level=logging.DEBUG) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  set_time(logging) | 
					 | 
					 | 
					 | 
					  set_time(logging) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
  |