| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -5,7 +5,6 @@ from collections import defaultdict | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from dataclasses import dataclass | 
					 | 
					 | 
					 | 
					from dataclasses import dataclass | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from typing import List, Dict, Optional | 
					 | 
					 | 
					 | 
					from typing import List, Dict, Optional | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from cereal import car, log | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from common.basedir import BASEDIR | 
					 | 
					 | 
					 | 
					from common.basedir import BASEDIR | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from common.params import Params | 
					 | 
					 | 
					 | 
					from common.params import Params | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.controls.lib.events import Alert | 
					 | 
					 | 
					 | 
					from selfdrive.controls.lib.events import Alert | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -36,22 +35,9 @@ class AlertEntry: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    return frame <= self.end_frame | 
					 | 
					 | 
					 | 
					    return frame <= self.end_frame | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					class AlertManager: | 
					 | 
					 | 
					 | 
					class AlertManager: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def __init__(self): | 
					 | 
					 | 
					 | 
					  def __init__(self): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.reset() | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alerts: Dict[str, AlertEntry] = defaultdict(AlertEntry) | 
					 | 
					 | 
					 | 
					    self.alerts: Dict[str, AlertEntry] = defaultdict(AlertEntry) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def reset(self) -> None: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert: Optional[Alert] = None | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert_type: str = "" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert_text_1: str = "" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert_text_2: str = "" | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert_status = log.ControlsState.AlertStatus.normal | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert_size = log.ControlsState.AlertSize.none | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.visual_alert = car.CarControl.HUDControl.VisualAlert.none | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.audible_alert = car.CarControl.HUDControl.AudibleAlert.none | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert_rate: float = 0. | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def add_many(self, frame: int, alerts: List[Alert]) -> None: | 
					 | 
					 | 
					 | 
					  def add_many(self, frame: int, alerts: List[Alert]) -> None: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for alert in alerts: | 
					 | 
					 | 
					 | 
					    for alert in alerts: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      key = alert.alert_type | 
					 | 
					 | 
					 | 
					      key = alert.alert_type | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -61,30 +47,18 @@ class AlertManager: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      min_end_frame = self.alerts[key].start_frame + alert.duration | 
					 | 
					 | 
					 | 
					      min_end_frame = self.alerts[key].start_frame + alert.duration | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.alerts[key].end_frame = max(frame + 1, min_end_frame) | 
					 | 
					 | 
					 | 
					      self.alerts[key].end_frame = max(frame + 1, min_end_frame) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def process_alerts(self, frame: int, clear_event_type=None) -> None: | 
					 | 
					 | 
					 | 
					  def process_alerts(self, frame: int, clear_event_type=None) -> Optional[Alert]: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    current_alert = AlertEntry() | 
					 | 
					 | 
					 | 
					    current_alert = AlertEntry() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for k, v in self.alerts.items(): | 
					 | 
					 | 
					 | 
					    for v in self.alerts.values(): | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if v.alert is None: | 
					 | 
					 | 
					 | 
					      if not v.alert: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        continue | 
					 | 
					 | 
					 | 
					        continue | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if clear_event_type is not None and v.alert.event_type == clear_event_type: | 
					 | 
					 | 
					 | 
					      if clear_event_type and v.alert.event_type == clear_event_type: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        self.alerts[k].end_frame = -1 | 
					 | 
					 | 
					 | 
					        v.end_frame = -1 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # sort by priority first and then by start_frame | 
					 | 
					 | 
					 | 
					      # sort by priority first and then by start_frame | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      greater = current_alert.alert is None or (v.alert.priority, v.start_frame) > (current_alert.alert.priority, current_alert.start_frame) | 
					 | 
					 | 
					 | 
					      greater = current_alert.alert is None or (v.alert.priority, v.start_frame) > (current_alert.alert.priority, current_alert.start_frame) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if v.active(frame) and greater: | 
					 | 
					 | 
					 | 
					      if v.active(frame) and greater: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        current_alert = v | 
					 | 
					 | 
					 | 
					        current_alert = v | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # clear current alert | 
					 | 
					 | 
					 | 
					    return current_alert.alert | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.reset() | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.alert = current_alert.alert | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.alert is not None: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.alert_type = self.alert.alert_type | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.audible_alert = self.alert.audible_alert | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.visual_alert = self.alert.visual_alert | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.alert_text_1 = self.alert.alert_text_1 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.alert_text_2 = self.alert.alert_text_2 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.alert_status = self.alert.alert_status | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.alert_size = self.alert.alert_size | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.alert_rate = self.alert.alert_rate | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
  |