text: from cereal import car, log
  
  # Priority
  class Priority:
    LOWEST = 0
    LOWER = 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(
        "waitingMode",
        "WAITING...",
        "Press gas/resume to gain full control!",
        AlertStatus.userPrompt, AlertSize.mid,
        Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, .4, 2., 0.2),
  
    Alert(
        "longControlDisabled",
        "BRAKE PRESSED",
        "Longitudinal Control Disabled",
        AlertStatus.userPrompt, AlertSize.mid,
        Priority.LOW, VisualAlert.none, AudibleAlert.none, .4, 2., 0.2),
  
    Alert(
        "trafficSlow",
        "TRAFFIC LIGHT - SLOW DOWN",
        "Red traffic light ahead",
        AlertStatus.userPrompt, AlertSize.mid,
        Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, 0.1, 2., 0.2),
  
    Alert(
        "trafficGreen",
        "TRAFFIC LIGHT - GREEN",
        "Green traffic light ahead",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., 0.2),
  
    Alert(
        "trafficDead",
        "TRAFFICD IS DEAD",
        "trafficd not responding!",
        AlertStatus.critical, AlertSize.mid,
        Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.chimeWarning2, 2., .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 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",
        "Do not forget to PRAY!",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 8.),
  
    Alert(
        "startupMaster",
        "WARNING: This branch is not tested",
        "Always keep hands on wheel and eyes on road",
        AlertStatus.userPrompt, AlertSize.mid,
        Priority.LOWER, 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.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
  
    Alert(
        "startupNoCar",
        "Dashcam mode for unsupported car",
        "Always keep hands on wheel and eyes on road",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
  
    Alert("dfButtonAlert",
          "Using profile: ",
          "",
          AlertStatus.normal, AlertSize.mid,
          Priority.LOWER, VisualAlert.none, AudibleAlert.chimeWarning1, 0.2, 0., 2.),
  
    Alert("dfButtonAlertNoSound",
          "Using profile: ",
          "",
          AlertStatus.normal, AlertSize.mid,
          Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0.2, 0., 2.),
  
    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.),
  
    Alert(
        "rightALCbsm",
        "Vehicle in Right Lane",
        "Waiting for Lane to be clear",
        AlertStatus.userPrompt, AlertSize.mid,
        Priority.MID, VisualAlert.steerRequired, AudibleAlert.none, 0., 0.4, .3),
  
    Alert(
        "leftALCbsm",
        "Vehicle in Left Lane",
        "Waiting for Lane to be clear",
        AlertStatus.userPrompt, AlertSize.mid,
        Priority.MID, VisualAlert.steerRequired, AudibleAlert.none, 0., 0.4, .3),
  
    Alert(
        "preventALC",
        "TAKE CONTROL",
        "Lane Change Cancelled, Lane Unsafe",
        AlertStatus.critical, AlertSize.full,
        Priority.HIGH, VisualAlert.none, AudibleAlert.chimeWarningRepeat, .4, 3., 3.,),
  
    Alert("dfButtonAlert",
          "Using profile: ",
          "",
          AlertStatus.normal, AlertSize.mid,
          Priority.LOWER, VisualAlert.none, AudibleAlert.chimeWarning1, 0.2, 0., 2.),
  
    # 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",
        "Calibration Needs Data. 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(
        "wrongGearArne",
        "TAKE CONTROL IMMEDIATELY",
        "Gear not yet in D",
        AlertStatus.critical, AlertSize.full,
        Priority.MID, VisualAlert.steerRequired, AudibleAlert.none, .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(
        "reverseGearArne",
        "REVERSING",
        "Reverse Gear",
        AlertStatus.critical, AlertSize.full,
        Priority.HIGHEST, VisualAlert.steerRequired, AudibleAlert.none, 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.normal, AlertSize.mid,
        Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeError, 2.2, 3., 4.),
  
    Alert(
        "relayMalfunction",
        "TAKE CONTROL IMMEDIATELY",
        "Harness Malfunction",
        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.),
  
    Alert(
        "speedTooHigh",
        "Speed Too High",
        "Slow down to resume operation",
        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 & 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(
        "reverseGearArneNoEntry",
        "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.),
  
    Alert(
        "speedTooHighNoEntry",
        "Speed Too High",
        "Slow down to engage",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
  
    Alert(
        "relayMalfunctionNoEntry",
        "openpilot Unavailable",
        "Harness Malfunction",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
  
    # permanent alerts
    Alert(
        "steerUnavailablePermanent",
        "LKAS Fault: Restart the car to engage",
        "",
        AlertStatus.normal, AlertSize.small,
        Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
  
    Alert(
        "brakeUnavailablePermanent",
        "Cruise Fault: Restart the car to engage",
        "",
        AlertStatus.normal, AlertSize.small,
        Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
  
    Alert(
        "lowSpeedLockoutPermanent",
        "Cruise Fault: Restart the car to engage",
        "",
        AlertStatus.normal, AlertSize.small,
        Priority.LOWER, 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.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
  
    Alert(
        "invalidLkasSettingPermanent",
        "Stock LKAS is turned on",
        "Turn off stock LKAS to engage",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOWER, 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.LOWER, 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.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
  
    Alert(
        "soundsUnavailablePermanent",
        "Speaker not found",
        "Reboot your Device",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
  
    Alert(
        "lowMemoryPermanent",
        "RAM Critically Low",
        "Reboot your Device",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
  
    Alert(
        "carUnrecognizedPermanent",
        "Dashcam Mode",
        "Car Unrecognized",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
  
    Alert(
        "relayMalfunctionPermanent",
        "Harness Malfunction",
        "Please Check Hardware",
        AlertStatus.normal, AlertSize.mid,
        Priority.LOWER, 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),
  
    Alert(
        "ldwPermanent",
        "TAKE CONTROL",
        "Lane Departure Detected",
        AlertStatus.userPrompt, AlertSize.mid,
        Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., 2., 2.),
  ]
  