|  |  | @ -62,7 +62,7 @@ std::atomic<bool> pigeon_active(false); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | ExitHandler do_exit; |  |  |  | ExitHandler do_exit; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | std::string get_time_str(const struct tm &time) { |  |  |  | static std::string get_time_str(const struct tm &time) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   char s[30] = {'\0'}; |  |  |  |   char s[30] = {'\0'}; | 
			
		
	
		
		
			
				
					
					|  |  |  |   std::strftime(s, std::size(s), "%Y-%m-%d %H:%M:%S", &time); |  |  |  |   std::strftime(s, std::size(s), "%Y-%m-%d %H:%M:%S", &time); | 
			
		
	
		
		
			
				
					
					|  |  |  |   return s; |  |  |  |   return s; | 
			
		
	
	
		
		
			
				
					|  |  | @ -78,6 +78,35 @@ bool check_all_connected(const std::vector<Panda *> &pandas) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   return true; |  |  |  |   return true; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | enum class SyncTimeDir { TO_PANDA, FROM_PANDA }; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | void sync_time(Panda *panda, SyncTimeDir dir) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (!panda->has_rtc) return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   setenv("TZ", "UTC", 1); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   struct tm sys_time = util::get_time(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   struct tm rtc_time = panda->get_rtc(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   if (dir == SyncTimeDir::TO_PANDA) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (util::time_valid(sys_time)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       // Write time to RTC if it looks reasonable
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       double seconds = difftime(mktime(&rtc_time), mktime(&sys_time)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if (std::abs(seconds) > 1.1) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         panda->set_rtc(sys_time); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         LOGW("Updating panda RTC. dt = %.2f System: %s RTC: %s", | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |               seconds, get_time_str(sys_time).c_str(), get_time_str(rtc_time).c_str()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } else if (dir == SyncTimeDir::FROM_PANDA) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (!util::time_valid(sys_time) && util::time_valid(rtc_time)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       const struct timeval tv = {mktime(&rtc_time), 0}; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       settimeofday(&tv, 0); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       LOGE("System time wrong, setting from RTC. System: %s RTC: %s", | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |            get_time_str(sys_time).c_str(), get_time_str(rtc_time).c_str()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | bool safety_setter_thread(std::vector<Panda *> pandas) { |  |  |  | bool safety_setter_thread(std::vector<Panda *> pandas) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   LOGD("Starting safety setter thread"); |  |  |  |   LOGD("Starting safety setter thread"); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -171,19 +200,7 @@ Panda *usb_connect(std::string serial="", uint32_t index=0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |   std::call_once(connected_once, &Panda::set_usb_power_mode, panda, cereal::PeripheralState::UsbPowerMode::CDP); |  |  |  |   std::call_once(connected_once, &Panda::set_usb_power_mode, panda, cereal::PeripheralState::UsbPowerMode::CDP); | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if (panda->has_rtc) { |  |  |  |   sync_time(panda.get(), SyncTimeDir::FROM_PANDA); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     setenv("TZ","UTC",1); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     struct tm sys_time = util::get_time(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     struct tm rtc_time = panda->get_rtc(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (!util::time_valid(sys_time) && util::time_valid(rtc_time)) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       LOGE("System time wrong, setting from RTC. System: %s RTC: %s", |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |            get_time_str(sys_time).c_str(), get_time_str(rtc_time).c_str()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       const struct timeval tv = {mktime(&rtc_time), 0}; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       settimeofday(&tv, 0); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   return panda.release(); |  |  |  |   return panda.release(); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -516,21 +533,8 @@ void peripheral_control_thread(Panda *panda) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // Write to rtc once per minute when no ignition present
 |  |  |  |     // Write to rtc once per minute when no ignition present
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if ((panda->has_rtc) && !ignition && (cnt % 120 == 1)) { |  |  |  |     if (!ignition && (cnt % 120 == 1)) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       // Write time to RTC if it looks reasonable
 |  |  |  |       sync_time(panda, SyncTimeDir::TO_PANDA); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       setenv("TZ","UTC",1); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       struct tm sys_time = util::get_time(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (util::time_valid(sys_time)) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         struct tm rtc_time = panda->get_rtc(); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         double seconds = difftime(mktime(&rtc_time), mktime(&sys_time)); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (std::abs(seconds) > 1.1) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           panda->set_rtc(sys_time); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           LOGW("Updating panda RTC. dt = %.2f System: %s RTC: %s", |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |                 seconds, get_time_str(sys_time).c_str(), get_time_str(rtc_time).c_str()); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       } |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |