You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							782 lines
						
					
					
						
							24 KiB
						
					
					
				
			
		
		
	
	
							782 lines
						
					
					
						
							24 KiB
						
					
					
				from cereal import car, log
 | 
						|
 | 
						|
# Priority
 | 
						|
class Priority:
 | 
						|
  LOWEST = 0
 | 
						|
  LOW_LOWEST = 1
 | 
						|
  LOW = 2
 | 
						|
  MID = 3
 | 
						|
  HIGH = 4
 | 
						|
  HIGHEST = 5
 | 
						|
 | 
						|
AlertSize = log.ControlsState.AlertSize
 | 
						|
AlertStatus = log.ControlsState.AlertStatus
 | 
						|
AudibleAlert = car.CarControl.HUDControl.AudibleAlert
 | 
						|
VisualAlert = car.CarControl.HUDControl.VisualAlert
 | 
						|
 | 
						|
class Alert():
 | 
						|
  def __init__(self,
 | 
						|
               alert_type,
 | 
						|
               alert_text_1,
 | 
						|
               alert_text_2,
 | 
						|
               alert_status,
 | 
						|
               alert_size,
 | 
						|
               alert_priority,
 | 
						|
               visual_alert,
 | 
						|
               audible_alert,
 | 
						|
               duration_sound,
 | 
						|
               duration_hud_alert,
 | 
						|
               duration_text,
 | 
						|
               alert_rate=0.):
 | 
						|
 | 
						|
    self.alert_type = alert_type
 | 
						|
    self.alert_text_1 = alert_text_1
 | 
						|
    self.alert_text_2 = alert_text_2
 | 
						|
    self.alert_status = alert_status
 | 
						|
    self.alert_size = alert_size
 | 
						|
    self.alert_priority = alert_priority
 | 
						|
    self.visual_alert = visual_alert
 | 
						|
    self.audible_alert = audible_alert
 | 
						|
 | 
						|
    self.duration_sound = duration_sound
 | 
						|
    self.duration_hud_alert = duration_hud_alert
 | 
						|
    self.duration_text = duration_text
 | 
						|
 | 
						|
    self.start_time = 0.
 | 
						|
    self.alert_rate = alert_rate
 | 
						|
 | 
						|
    # typecheck that enums are valid on startup
 | 
						|
    tst = car.CarControl.new_message()
 | 
						|
    tst.hudControl.visualAlert = self.visual_alert
 | 
						|
 | 
						|
  def __str__(self):
 | 
						|
    return self.alert_text_1 + "/" + self.alert_text_2 + " " + str(self.alert_priority) + "  " + str(
 | 
						|
      self.visual_alert) + " " + str(self.audible_alert)
 | 
						|
 | 
						|
  def __gt__(self, alert2):
 | 
						|
    return self.alert_priority > alert2.alert_priority
 | 
						|
 | 
						|
 | 
						|
ALERTS = [
 | 
						|
  # Miscellaneous alerts
 | 
						|
  Alert(
 | 
						|
      "enable",
 | 
						|
      "",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.none,
 | 
						|
      Priority.MID, VisualAlert.none, AudibleAlert.chimeEngage, .2, 0., 0.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "disable",
 | 
						|
      "",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.none,
 | 
						|
      Priority.MID, VisualAlert.none, AudibleAlert.chimeDisengage, .2, 0., 0.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "fcw",
 | 
						|
      "BRAKE!",
 | 
						|
      "Risk of Collision",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.chimeWarningRepeat, 1., 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "fcwStock",
 | 
						|
      "BRAKE!",
 | 
						|
      "Risk of Collision",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 1., 2., 2.),  # no EON chime for stock FCW
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "steerSaturated",
 | 
						|
      "TAKE CONTROL",
 | 
						|
      "Turn Exceeds Steering Limit",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, 1., 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "steerTempUnavailable",
 | 
						|
      "TAKE CONTROL",
 | 
						|
      "Steering Temporarily Unavailable",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "steerTempUnavailableMute",
 | 
						|
      "TAKE CONTROL",
 | 
						|
      "Steering Temporarily Unavailable",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.none, .2, .2, .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "preDriverDistracted",
 | 
						|
      "KEEP EYES ON ROAD: Driver Appears Distracted",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.small,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "promptDriverDistracted",
 | 
						|
      "KEEP EYES ON ROAD",
 | 
						|
      "Driver Appears Distracted",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarning2, .1, .1, .1),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "driverDistracted",
 | 
						|
      "DISENGAGE IMMEDIATELY",
 | 
						|
      "Driver Was Distracted",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, .1, .1),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "preDriverUnresponsive",
 | 
						|
      "TOUCH STEERING WHEEL: No Face Detected",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.small,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "promptDriverUnresponsive",
 | 
						|
      "TOUCH STEERING WHEEL",
 | 
						|
      "Driver Is Unresponsive",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarning2, .1, .1, .1),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "driverUnresponsive",
 | 
						|
      "DISENGAGE IMMEDIATELY",
 | 
						|
      "Driver Was Unresponsive",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, .1, .1),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "driverMonitorLowAcc",
 | 
						|
      "CHECK DRIVER FACE VISIBILITY",
 | 
						|
      "Driver Monitor Model Output Uncertain",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .4, 0., 1.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "geofence",
 | 
						|
      "DISENGAGEMENT REQUIRED",
 | 
						|
      "Not in Geofenced Area",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, .1, .1),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "startup",
 | 
						|
      "Be ready to take over at any time",
 | 
						|
      "Always keep hands on wheel and eyes on road",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "startupMaster",
 | 
						|
      "WARNING: This branch is not tested",
 | 
						|
      "Always keep hands on wheel and eyes on road",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "startupNoControl",
 | 
						|
      "Dashcam mode",
 | 
						|
      "Always keep hands on wheel and eyes on road",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "startupNoCar",
 | 
						|
      "Dashcam mode with unsupported car",
 | 
						|
      "Always keep hands on wheel and eyes on road",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "ethicalDilemma",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Ethical Dilemma Detected",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 1., 3., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "steerTempUnavailableNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Steering Temporarily Unavailable",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 0., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "manualRestart",
 | 
						|
      "TAKE CONTROL",
 | 
						|
      "Resume Driving Manually",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "resumeRequired",
 | 
						|
      "STOPPED",
 | 
						|
      "Press Resume to Move",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "belowSteerSpeed",
 | 
						|
      "TAKE CONTROL",
 | 
						|
      "Steer Unavailable Below ",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.none, 0., 0.4, .3),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "debugAlert",
 | 
						|
      "DEBUG ALERT",
 | 
						|
      "",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.none, .1, .1, .1),
 | 
						|
  Alert(
 | 
						|
      "preLaneChangeLeft",
 | 
						|
      "Steer Left to Start Lane Change",
 | 
						|
      "Monitor Other Vehicles",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "preLaneChangeRight",
 | 
						|
      "Steer Right to Start Lane Change",
 | 
						|
      "Monitor Other Vehicles",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "laneChange",
 | 
						|
      "Changing Lane",
 | 
						|
      "Monitor Other Vehicles",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "posenetInvalid",
 | 
						|
      "TAKE CONTROL",
 | 
						|
      "Vision Model Output Uncertain",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, .4, 2., 3.),
 | 
						|
 | 
						|
  # Non-entry only alerts
 | 
						|
  Alert(
 | 
						|
      "wrongCarModeNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Main Switch Off",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 0., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "dataNeededNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Data Needed for Calibration. Upload Drive, Try Again",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 0., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "outOfSpaceNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Out of Storage Space",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 0., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "pedalPressedNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Pedal Pressed During Attempt",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, "brakePressed", AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "speedTooLowNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Speed Too Low",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "brakeHoldNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Brake Hold Active",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "parkBrakeNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Park Brake Engaged",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "lowSpeedLockoutNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Cruise Fault: Restart the Car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "lowBatteryNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Low Battery",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "sensorDataInvalidNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "No Data from Device Sensors",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "soundsUnavailableNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Speaker not found",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "tooDistractedNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Distraction Level Too High",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  # Cancellation alerts causing soft disabling
 | 
						|
  Alert(
 | 
						|
      "overheat",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "System Overheated",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "wrongGear",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Gear not D",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "calibrationInvalid",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Calibration Invalid: Reposition Device and Recalibrate",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "calibrationIncomplete",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Calibration in Progress",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "doorOpen",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Door Open",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "seatbeltNotLatched",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Seatbelt Unlatched",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "espDisabled",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "ESP Off",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "lowBattery",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Low Battery",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "commIssue",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Communication Issue between Processes",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "radarCommIssue",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Radar Communication Issue",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "radarCanError",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Radar Error: Restart the Car",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "radarFault",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Radar Error: Restart the Car",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "lowMemory",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Low Memory: Reboot Your Device",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | 
						|
 | 
						|
  # Cancellation alerts causing immediate disabling
 | 
						|
  Alert(
 | 
						|
      "controlsFailed",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Controls Failed",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "controlsMismatch",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Controls Mismatch",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "canError",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "CAN Error: Check Connections",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "steerUnavailable",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "LKAS Fault: Restart the Car",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "brakeUnavailable",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Cruise Fault: Restart the Car",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "gasUnavailable",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Gas Fault: Restart the Car",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "reverseGear",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Reverse Gear",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "cruiseDisabled",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Cruise Is Off",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "plannerError",
 | 
						|
      "TAKE CONTROL IMMEDIATELY",
 | 
						|
      "Planner Solution Error",
 | 
						|
      AlertStatus.critical, AlertSize.full,
 | 
						|
      Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | 
						|
 | 
						|
  # not loud cancellations (user is in control)
 | 
						|
  Alert(
 | 
						|
      "noTarget",
 | 
						|
      "openpilot Canceled",
 | 
						|
      "No close lead car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.HIGH, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "speedTooLow",
 | 
						|
      "openpilot Canceled",
 | 
						|
      "Speed too low",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.HIGH, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | 
						|
 | 
						|
  # Cancellation alerts causing non-entry
 | 
						|
  Alert(
 | 
						|
      "overheatNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "System overheated",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "wrongGearNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Gear not D",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "calibrationInvalidNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Calibration Invalid: Reposition Device and Recalibrate",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "calibrationIncompleteNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Calibration in Progress",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "doorOpenNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Door open",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "seatbeltNotLatchedNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Seatbelt unlatched",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "espDisabledNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "ESP Off",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "geofenceNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Not in Geofenced Area",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.MID, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "radarCanErrorNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Radar Error: Restart the Car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "radarFaultNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Radar Error: Restart the Car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "posenetInvalidNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Vision Model Output Uncertain",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "controlsFailedNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Controls Failed",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "canErrorNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "CAN Error: Check Connections",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "steerUnavailableNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "LKAS Fault: Restart the Car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "brakeUnavailableNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Cruise Fault: Restart the Car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "gasUnavailableNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Gas Error: Restart the Car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "reverseGearNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Reverse Gear",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "cruiseDisabledNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Cruise is Off",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "noTargetNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "No Close Lead Car",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "plannerErrorNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Planner Solution Error",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "commIssueNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Communication Issue between Processes",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "radarCommIssueNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Radar Communication Issue",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "internetConnectivityNeededNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Please Connect to Internet",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "lowMemoryNoEntry",
 | 
						|
      "openpilot Unavailable",
 | 
						|
      "Low Memory: Reboot Your Device",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | 
						|
 | 
						|
  # permanent alerts
 | 
						|
  Alert(
 | 
						|
      "steerUnavailablePermanent",
 | 
						|
      "LKAS Fault: Restart the car to engage",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.small,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "brakeUnavailablePermanent",
 | 
						|
      "Cruise Fault: Restart the car to engage",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.small,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "lowSpeedLockoutPermanent",
 | 
						|
      "Cruise Fault: Restart the car to engage",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.small,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "calibrationIncompletePermanent",
 | 
						|
      "Calibration in Progress: ",
 | 
						|
      "Drive Above ",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "invalidGiraffeToyotaPermanent",
 | 
						|
      "Unsupported Giraffe Configuration",
 | 
						|
      "Visit comma.ai/tg",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "internetConnectivityNeededPermanent",
 | 
						|
      "Please connect to Internet",
 | 
						|
      "An Update Check Is Required to Engage",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "communityFeatureDisallowedPermanent",
 | 
						|
      "Community Feature Detected",
 | 
						|
      "Enable Community Features in Developer Settings",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),  # LOW priority to overcome Cruise Error
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "sensorDataInvalidPermanent",
 | 
						|
      "No Data from Device Sensors",
 | 
						|
      "Reboot your Device",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "soundsUnavailablePermanent",
 | 
						|
      "Speaker not found",
 | 
						|
      "Reboot your Device",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "lowMemoryPermanent",
 | 
						|
      "RAM Critically Low",
 | 
						|
      "Reboot your Device",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "carUnrecognizedPermanent",
 | 
						|
      "Dashcam Mode",
 | 
						|
      "Car Unrecognized",
 | 
						|
      AlertStatus.normal, AlertSize.mid,
 | 
						|
      Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | 
						|
 | 
						|
  Alert(
 | 
						|
      "vehicleModelInvalid",
 | 
						|
      "Vehicle Parameter Identification Failed",
 | 
						|
      "",
 | 
						|
      AlertStatus.normal, AlertSize.small,
 | 
						|
      Priority.LOWEST, VisualAlert.steerRequired, AudibleAlert.none, .0, .0, .1),
 | 
						|
 | 
						|
  # offroad alerts
 | 
						|
  Alert(
 | 
						|
      "ldwPermanent",
 | 
						|
      "TAKE CONTROL",
 | 
						|
      "Lane Departure Detected",
 | 
						|
      AlertStatus.userPrompt, AlertSize.mid,
 | 
						|
      Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, 1., 2., 3.),
 | 
						|
]
 | 
						|
 |