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.
		
		
		
		
		
			
		
			
				
					
					
						
							711 lines
						
					
					
						
							22 KiB
						
					
					
				
			
		
		
	
	
							711 lines
						
					
					
						
							22 KiB
						
					
					
				| from cereal import log, car
 | |
| 
 | |
| from selfdrive.config import Conversions as CV
 | |
| 
 | |
| from selfdrive.locationd.calibration_helpers import Filter
 | |
| 
 | |
| AlertSize = log.ControlsState.AlertSize
 | |
| AlertStatus = log.ControlsState.AlertStatus
 | |
| VisualAlert = car.CarControl.HUDControl.VisualAlert
 | |
| AudibleAlert = car.CarControl.HUDControl.AudibleAlert
 | |
| EventName = car.CarEvent.EventName
 | |
| 
 | |
| # Alert priorities
 | |
| class Priority:
 | |
|   LOWEST = 0
 | |
|   LOWER = 1
 | |
|   LOW = 2
 | |
|   MID = 3
 | |
|   HIGH = 4
 | |
|   HIGHEST = 5
 | |
| 
 | |
| # Event types
 | |
| class ET:
 | |
|   ENABLE = 'enable'
 | |
|   PRE_ENABLE = 'preEnable'
 | |
|   NO_ENTRY = 'noEntry'
 | |
|   WARNING = 'warning'
 | |
|   USER_DISABLE = 'userDisable'
 | |
|   SOFT_DISABLE = 'softDisable'
 | |
|   IMMEDIATE_DISABLE = 'immediateDisable'
 | |
|   PERMANENT = 'permanent'
 | |
| 
 | |
| # get event name from enum
 | |
| EVENT_NAME = {v: k for k, v in EventName.schema.enumerants.items()}
 | |
| 
 | |
| class Events:
 | |
|   def __init__(self):
 | |
|     self.events = []
 | |
|     self.static_events = []
 | |
| 
 | |
|   @property
 | |
|   def names(self):
 | |
|     return self.events
 | |
| 
 | |
|   def __len__(self):
 | |
|     return len(self.events)
 | |
| 
 | |
|   def add(self, event_name, static=False):
 | |
|     if static:
 | |
|       self.static_events.append(event_name)
 | |
|     self.events.append(event_name)
 | |
| 
 | |
|   def clear(self):
 | |
|     self.events = self.static_events.copy()
 | |
| 
 | |
|   def any(self, event_type):
 | |
|     for e in self.events:
 | |
|       if event_type in EVENTS.get(e, {}).keys():
 | |
|         return True
 | |
|     return False
 | |
| 
 | |
|   def create_alerts(self, event_types, callback_args=[]):
 | |
|     ret = []
 | |
|     for e in self.events:
 | |
|       types = EVENTS[e].keys()
 | |
|       for et in event_types:
 | |
|         if et in types:
 | |
|           alert = EVENTS[e][et]
 | |
|           if not isinstance(alert, Alert):
 | |
|             alert = alert(*callback_args)
 | |
|           alert.alert_type = EVENT_NAME[e]
 | |
|           ret.append(alert)
 | |
|     return ret
 | |
| 
 | |
|   def add_from_msg(self, events):
 | |
|     for e in events:
 | |
|       self.events.append(e.name.raw)
 | |
| 
 | |
|   def to_msg(self):
 | |
|     ret = []
 | |
|     for event_name in self.events:
 | |
|       event = car.CarEvent.new_message()
 | |
|       event.name = event_name
 | |
|       for event_type in EVENTS.get(event_name, {}).keys():
 | |
|         setattr(event, event_type , True)
 | |
|       ret.append(event)
 | |
|     return ret
 | |
| 
 | |
| class Alert:
 | |
|   def __init__(self,
 | |
|                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 = ""
 | |
|     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
 | |
| 
 | |
| class NoEntryAlert(Alert):
 | |
|   def __init__(self, alert_text_2, audible_alert=AudibleAlert.chimeError,
 | |
|                visual_alert=VisualAlert.none, duration_hud_alert=2.):
 | |
|     super().__init__("openpilot Unavailable", alert_text_2, AlertStatus.normal,
 | |
|                      AlertSize.mid, Priority.LOW, visual_alert,
 | |
|                      audible_alert, .4, duration_hud_alert, 3.)
 | |
| 
 | |
| 
 | |
| class SoftDisableAlert(Alert):
 | |
|   def __init__(self, alert_text_2):
 | |
|     super().__init__("TAKE CONTROL IMMEDIATELY", alert_text_2,
 | |
|                      AlertStatus.critical, AlertSize.full,
 | |
|                      Priority.MID, VisualAlert.steerRequired,
 | |
|                      AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
 | |
| 
 | |
| 
 | |
| class ImmediateDisableAlert(Alert):
 | |
|   def __init__(self, alert_text_2, alert_text_1="TAKE CONTROL IMMEDIATELY"):
 | |
|     super().__init__(alert_text_1, alert_text_2,
 | |
|                      AlertStatus.critical, AlertSize.full,
 | |
|                      Priority.HIGHEST, VisualAlert.steerRequired,
 | |
|                      AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
 | |
| 
 | |
| class EngagementAlert(Alert):
 | |
|   def __init__(self, audible_alert=True):
 | |
|     super().__init__("", "",
 | |
|                      AlertStatus.normal, AlertSize.none,
 | |
|                      Priority.MID, VisualAlert.none,
 | |
|                      audible_alert, .2, 0., 0.),
 | |
| 
 | |
| def below_steer_speed_alert(CP, sm, metric):
 | |
|   speed = CP.minSteerSpeed * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH)
 | |
|   unit = "kph" if metric else "mph"
 | |
|   return Alert(
 | |
|     "TAKE CONTROL",
 | |
|     "Steer Unavailable Below %d %s" % (speed, unit),
 | |
|     AlertStatus.userPrompt, AlertSize.mid,
 | |
|     Priority.MID, VisualAlert.steerRequired, AudibleAlert.none, 0., 0.4, .3)
 | |
| 
 | |
| def calibration_incomplete_alert(CP, sm, metric):
 | |
|   speed = int(Filter.MIN_SPEED * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH))
 | |
|   unit = "kph" if metric else "mph"
 | |
|   return Alert(
 | |
|     "Calibration in Progress: %d" % sm['liveCalibration'].calPerc,
 | |
|     "Drive Above %d %s" % (speed, unit),
 | |
|     AlertStatus.normal, AlertSize.mid,
 | |
|     Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2)
 | |
| 
 | |
| EVENTS = {
 | |
|   # ********** events with no alerts **********
 | |
| 
 | |
|   EventName.gasPressed: {ET.PRE_ENABLE: None},
 | |
| 
 | |
|   # ********** events only containing alerts displayed in all states **********
 | |
| 
 | |
|   EventName.debugAlert: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "DEBUG ALERT",
 | |
|       "",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.none, AudibleAlert.none, .1, .1, .1),
 | |
|   },
 | |
| 
 | |
|   EventName.startup: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Be ready to take over at any time",
 | |
|       "Always keep hands on wheel and eyes on road",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
 | |
|   },
 | |
| 
 | |
|   EventName.startupWhitePanda: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "WARNING: White panda is deprecated",
 | |
|       "Upgrade to comma two or black panda",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
 | |
|   },
 | |
| 
 | |
|   EventName.startupMaster: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "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.),
 | |
|   },
 | |
| 
 | |
|   EventName.startupNoControl: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Dashcam mode",
 | |
|       "Always keep hands on wheel and eyes on road",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
 | |
|   },
 | |
| 
 | |
|   EventName.startupNoCar: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "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.),
 | |
|   },
 | |
| 
 | |
|   EventName.invalidGiraffeToyota: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Unsupported Giraffe Configuration",
 | |
|       "Visit comma.ai/tg",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|   },
 | |
| 
 | |
|   EventName.whitePandaUnsupported: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "White Panda Is No Longer Supported",
 | |
|       "Upgrade to comma two or black panda",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("White panda is no longer supported"),
 | |
|   },
 | |
| 
 | |
|   EventName.invalidLkasSetting: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Stock LKAS is turned on",
 | |
|       "Turn off stock LKAS to engage",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|   },
 | |
| 
 | |
|   EventName.communityFeatureDisallowed: {
 | |
|     # LOW priority to overcome Cruise Error
 | |
|     ET.PERMANENT: Alert(
 | |
|       "",
 | |
|       "Community Feature Detected",
 | |
|       "Enable Community Features in Developer Settings",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|   },
 | |
| 
 | |
|   EventName.carUnrecognized: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Dashcam Mode",
 | |
|       "Car Unrecognized",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|   },
 | |
| 
 | |
|   EventName.stockAeb: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "BRAKE!",
 | |
|       "Stock AEB: Risk of Collision",
 | |
|       AlertStatus.critical, AlertSize.full,
 | |
|       Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 1., 2., 2.),
 | |
|   },
 | |
| 
 | |
|   EventName.stockFcw: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "BRAKE!",
 | |
|       "Stock FCW: Risk of Collision",
 | |
|       AlertStatus.critical, AlertSize.full,
 | |
|       Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 1., 2., 2.),
 | |
|   },
 | |
| 
 | |
|   EventName.fcw: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "BRAKE!",
 | |
|       "Risk of Collision",
 | |
|       AlertStatus.critical, AlertSize.full,
 | |
|       Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.chimeWarningRepeat, 1., 2., 2.),
 | |
|   },
 | |
| 
 | |
|   EventName.ldw: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "TAKE CONTROL",
 | |
|       "Lane Departure Detected",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, 1., 2., 3.),
 | |
|   },
 | |
| 
 | |
|   # ********** events only containing alerts that display while engaged **********
 | |
| 
 | |
|   EventName.vehicleModelInvalid: {
 | |
|     ET.WARNING: Alert(
 | |
|       "Vehicle Parameter Identification Failed",
 | |
|       "",
 | |
|       AlertStatus.normal, AlertSize.small,
 | |
|       Priority.LOWEST, VisualAlert.steerRequired, AudibleAlert.none, .0, .0, .1),
 | |
|   },
 | |
| 
 | |
|   EventName.steerTempUnavailableMute: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TAKE CONTROL",
 | |
|       "Steering Temporarily Unavailable",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.none, AudibleAlert.none, .2, .2, .2),
 | |
|   },
 | |
| 
 | |
|   EventName.preDriverDistracted: {
 | |
|     ET.WARNING: Alert(
 | |
|       "KEEP EYES ON ROAD: Driver Distracted",
 | |
|       "",
 | |
|       AlertStatus.normal, AlertSize.small,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
 | |
|   },
 | |
| 
 | |
|   EventName.promptDriverDistracted: {
 | |
|     ET.WARNING: Alert(
 | |
|       "KEEP EYES ON ROAD",
 | |
|       "Driver Appears Distracted",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarning2Repeat, .1, .1, .1),
 | |
|   },
 | |
| 
 | |
|   EventName.driverDistracted: {
 | |
|     ET.WARNING: Alert(
 | |
|       "DISENGAGE IMMEDIATELY",
 | |
|       "Driver Was Distracted",
 | |
|       AlertStatus.critical, AlertSize.full,
 | |
|       Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, .1, .1),
 | |
|   },
 | |
| 
 | |
|   EventName.preDriverUnresponsive: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TOUCH STEERING WHEEL: No Face Detected",
 | |
|       "",
 | |
|       AlertStatus.normal, AlertSize.small,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
 | |
|   },
 | |
| 
 | |
|   EventName.promptDriverUnresponsive: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TOUCH STEERING WHEEL",
 | |
|       "Driver Is Unresponsive",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarning2Repeat, .1, .1, .1),
 | |
|   },
 | |
| 
 | |
|   EventName.driverUnresponsive: {
 | |
|     ET.WARNING: Alert(
 | |
|       "DISENGAGE IMMEDIATELY",
 | |
|       "Driver Was Unresponsive",
 | |
|       AlertStatus.critical, AlertSize.full,
 | |
|       Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, .1, .1),
 | |
|   },
 | |
| 
 | |
|   EventName.driverMonitorLowAcc: {
 | |
|     ET.WARNING: Alert(
 | |
|       "CHECK DRIVER FACE VISIBILITY",
 | |
|       "Driver Monitor Model Output Uncertain",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .4, 0., 1.),
 | |
|   },
 | |
| 
 | |
|   EventName.manualRestart: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TAKE CONTROL",
 | |
|       "Resume Driving Manually",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|   },
 | |
| 
 | |
|   EventName.resumeRequired: {
 | |
|     ET.WARNING: Alert(
 | |
|       "STOPPED",
 | |
|       "Press Resume to Move",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|   },
 | |
| 
 | |
|   EventName.belowSteerSpeed: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TAKE CONTROL",
 | |
|       "Steer Unavailable Below ",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.MID, VisualAlert.steerRequired, AudibleAlert.none, 0., 0.4, .3),
 | |
|   },
 | |
| 
 | |
|   EventName.preLaneChangeLeft: {
 | |
|     ET.WARNING: Alert(
 | |
|       "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),
 | |
|   },
 | |
| 
 | |
|   EventName.preLaneChangeRight: {
 | |
|     ET.WARNING: Alert(
 | |
|       "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),
 | |
|   },
 | |
| 
 | |
|   EventName.laneChange: {
 | |
|     ET.WARNING: Alert(
 | |
|       "Changing Lane",
 | |
|       "Monitor Other Vehicles",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1),
 | |
|   },
 | |
| 
 | |
|   EventName.steerSaturated: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TAKE CONTROL",
 | |
|       "Turn Exceeds Steering Limit",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, 1., 2., 3.),
 | |
|   },
 | |
| 
 | |
|   # ********** events that affect controls state transitions **********
 | |
| 
 | |
|   EventName.pcmEnable: {
 | |
|     ET.ENABLE: EngagementAlert(AudibleAlert.chimeEngage),
 | |
|   },
 | |
| 
 | |
|   EventName.buttonEnable: {
 | |
|     ET.ENABLE: EngagementAlert(AudibleAlert.chimeEngage),
 | |
|   },
 | |
| 
 | |
|   EventName.pcmDisable: {
 | |
|     ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
 | |
|   },
 | |
| 
 | |
|   EventName.buttonCancel: {
 | |
|     ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
 | |
|   },
 | |
| 
 | |
|   EventName.brakeHold: {
 | |
|     ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Brake Hold Active"),
 | |
|   },
 | |
| 
 | |
|   EventName.parkBrake: {
 | |
|     ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Park Brake Engaged"),
 | |
|   },
 | |
| 
 | |
|   EventName.pedalPressed: {
 | |
|     ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Pedal Pressed During Attempt",
 | |
|                               visual_alert=VisualAlert.brakePressed),
 | |
|   },
 | |
| 
 | |
|   EventName.wrongCarMode: {
 | |
|     ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Main Switch Off",
 | |
|                               duration_hud_alert=0.),
 | |
|   },
 | |
| 
 | |
|   EventName.steerTempUnavailable: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TAKE CONTROL",
 | |
|       "Steering Temporarily Unavailable",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, .4, 2., 3.),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable",
 | |
|                               duration_hud_alert=0.),
 | |
|   },
 | |
| 
 | |
|   EventName.posenetInvalid: {
 | |
|     ET.WARNING: Alert(
 | |
|       "TAKE CONTROL",
 | |
|       "Vision Model Output Uncertain",
 | |
|       AlertStatus.userPrompt, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, .4, 2., 3.),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Vision Model Output Uncertain"),
 | |
|   },
 | |
| 
 | |
|   EventName.outOfSpace: {
 | |
|     ET.NO_ENTRY: NoEntryAlert("Out of Storage Space",
 | |
|                               duration_hud_alert=0.),
 | |
|   },
 | |
| 
 | |
|   EventName.sensorDataInvalid: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "No Data from Device Sensors",
 | |
|       "Reboot your Device",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("No Data from Device Sensors"),
 | |
|   },
 | |
| 
 | |
|   EventName.soundsUnavailable: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Speaker not found",
 | |
|       "Reboot your Device",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Speaker not found"),
 | |
|   },
 | |
| 
 | |
|   EventName.tooDistracted: {
 | |
|     ET.NO_ENTRY: NoEntryAlert("Distraction Level Too High"),
 | |
|   },
 | |
| 
 | |
|   EventName.overheat: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("System Overheated"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("System overheated"),
 | |
|   },
 | |
| 
 | |
|   EventName.wrongGear: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Gear not D"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Gear not D"),
 | |
|   },
 | |
| 
 | |
|   EventName.calibrationInvalid: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Calibration Invalid: Reposition Device and Recalibrate"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Calibration Invalid: Reposition Device & Recalibrate"),
 | |
|   },
 | |
| 
 | |
|   EventName.calibrationIncomplete: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Calibration in Progress"),
 | |
|     ET.PERMANENT: calibration_incomplete_alert,
 | |
|     ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"),
 | |
|   },
 | |
| 
 | |
|   EventName.doorOpen: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Door Open"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Door open"),
 | |
|   },
 | |
| 
 | |
|   EventName.seatbeltNotLatched: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Seatbelt Unlatched"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Seatbelt unlatched"),
 | |
|   },
 | |
| 
 | |
|   EventName.espDisabled: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("ESP Off"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("ESP Off"),
 | |
|   },
 | |
| 
 | |
|   EventName.lowBattery: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Low Battery"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Low Battery"),
 | |
|   },
 | |
| 
 | |
|   EventName.commIssue: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Communication Issue between Processes"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Communication Issue between Processes",
 | |
|                               audible_alert=AudibleAlert.chimeDisengage),
 | |
|   },
 | |
| 
 | |
|   EventName.radarCommIssue: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Radar Communication Issue"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Radar Communication Issue",
 | |
|                               audible_alert=AudibleAlert.chimeDisengage),
 | |
|   },
 | |
| 
 | |
|   EventName.radarCanError: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Radar Error: Restart the Car"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Radar Error: Restart the Car"),
 | |
|   },
 | |
| 
 | |
|   EventName.radarFault: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Radar Error: Restart the Car"),
 | |
|     ET.NO_ENTRY : NoEntryAlert("Radar Error: Restart the Car"),
 | |
|   },
 | |
| 
 | |
|   EventName.lowMemory: {
 | |
|     ET.SOFT_DISABLE: SoftDisableAlert("Low Memory: Reboot Your Device"),
 | |
|     ET.PERMANENT: Alert(
 | |
|       "RAM Critically Low",
 | |
|       "Reboot your Device",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY : NoEntryAlert("Low Memory: Reboot Your Device",
 | |
|                                audible_alert=AudibleAlert.chimeDisengage),
 | |
|   },
 | |
| 
 | |
|   EventName.controlsFailed: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Failed"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Controls Failed"),
 | |
|   },
 | |
| 
 | |
|   EventName.controlsMismatch: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"),
 | |
|   },
 | |
| 
 | |
|   EventName.canError: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Error: Check Connections"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("CAN Error: Check Connections"),
 | |
|   },
 | |
| 
 | |
|   EventName.steerUnavailable: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"),
 | |
|     ET.PERMANENT: Alert(
 | |
|       "LKAS Fault: Restart the car to engage",
 | |
|       "",
 | |
|       AlertStatus.normal, AlertSize.small,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"),
 | |
|   },
 | |
| 
 | |
|   EventName.brakeUnavailable: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"),
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Cruise Fault: Restart the car to engage",
 | |
|       "",
 | |
|       AlertStatus.normal, AlertSize.small,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"),
 | |
|   },
 | |
| 
 | |
|   EventName.gasUnavailable: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Gas Fault: Restart the Car"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Gas Error: Restart the Car"),
 | |
|   },
 | |
| 
 | |
|   EventName.reverseGear: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Reverse Gear"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Reverse Gear"),
 | |
|   },
 | |
| 
 | |
|   EventName.cruiseDisabled: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Is Off"),
 | |
|   },
 | |
| 
 | |
|   EventName.plannerError: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Planner Solution Error"),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Planner Solution Error"),
 | |
|   },
 | |
| 
 | |
|   EventName.relayMalfunction: {
 | |
|     ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Harness Malfunction"),
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Harness Malfunction",
 | |
|       "Please Check Hardware",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Harness Malfunction"),
 | |
|   },
 | |
| 
 | |
|   EventName.noTarget: {
 | |
|     ET.IMMEDIATE_DISABLE: Alert(
 | |
|       "openpilot Canceled",
 | |
|       "No close lead car",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.HIGH, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | |
|     ET.NO_ENTRY : NoEntryAlert("No Close Lead Car"),
 | |
|   },
 | |
| 
 | |
|   EventName.speedTooLow: {
 | |
|     ET.IMMEDIATE_DISABLE: Alert(
 | |
|       "openpilot Canceled",
 | |
|       "Speed too low",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.HIGH, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Speed Too Low"),
 | |
|   },
 | |
| 
 | |
|   EventName.speedTooHigh: {
 | |
|     ET.IMMEDIATE_DISABLE: Alert(
 | |
|       "Speed Too High",
 | |
|       "Slow down to resume operation",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarning2Repeat, 2.2, 3., 4.),
 | |
|     ET.NO_ENTRY: Alert(
 | |
|       "Speed Too High",
 | |
|       "Slow down to engage",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
 | |
|   },
 | |
| 
 | |
|   EventName.internetConnectivityNeeded: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Please connect to Internet",
 | |
|       "An Update Check Is Required to Engage",
 | |
|       AlertStatus.normal, AlertSize.mid,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Please Connect to Internet",
 | |
|                               audible_alert=AudibleAlert.chimeDisengage),
 | |
|   },
 | |
| 
 | |
|   EventName.lowSpeedLockout: {
 | |
|     ET.PERMANENT: Alert(
 | |
|       "Cruise Fault: Restart the car to engage",
 | |
|       "",
 | |
|       AlertStatus.normal, AlertSize.small,
 | |
|       Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
 | |
|     ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"),
 | |
|   },
 | |
| 
 | |
| }
 | |
| 
 |