@ -72,25 +72,25 @@ def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM
if " REPLAY " in os . environ :
branch = " replay "
return StartupAlert ( " WARNING: This branch is not tested " , branch , alert_status = AlertStatus . userPrompt )
return StartupAlert ( " 警告:此分支未经测试 " , branch , alert_status = AlertStatus . userPrompt )
def below_engage_speed_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
return NoEntryAlert ( f " Drive above { get_display_speed ( CP . minEnableSpeed , metric ) } to engage " )
return NoEntryAlert ( f " 请将时速提高至 { get_display_speed ( CP . minEnableSpeed , metric ) } 来启用 " )
def below_steer_speed_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
return Alert (
f " Steer Unavailable Below { get_display_speed ( CP . minSteerSpeed , metric ) } " ,
f " 转向在 { get_display_speed ( CP . minSteerSpeed , metric ) } 以下不可用 " ,
" " ,
AlertStatus . userPrompt , AlertSize . small ,
Priority . LOW , VisualAlert . steerRequired , AudibleAlert . prompt , 0.4 )
Priority . LOW , VisualAlert . none , AudibleAlert . prompt , 0.4 )
def calibration_incomplete_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
first_word = ' Recalibration ' if sm [ ' liveCalibration ' ] . calStatus == log . LiveCalibrationData . Status . recalibrating else ' Calibration '
first_word = ' 重新校准 ' if sm [ ' liveCalibration ' ] . calStatus == log . LiveCalibrationData . Status . recalibrating else ' 校准 '
return Alert (
f " { first_word } in Progress: { sm [ ' liveCalibration ' ] . calPerc : .0f } % " ,
f " Drive Above { get_display_speed ( MIN_SPEED_FILTER , metric ) } " ,
f " { first_word } 进行中: { sm [ ' liveCalibration ' ] . calPerc : .0f } % " ,
f " 请将时速提高至 { get_display_speed ( MIN_SPEED_FILTER , metric ) } 进行校准 " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOWEST , VisualAlert . none , AudibleAlert . none , .2 )
@ -107,57 +107,57 @@ def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM
def out_of_space_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
full_perc = round ( 100. - sm [ ' deviceState ' ] . freeSpacePercent )
return NormalPermanentAlert ( " Out of Storage" , f " { full_perc } % full " )
return NormalPermanentAlert ( " 存储空间不足" , f " 已用 { full_perc } % " )
def posenet_invalid_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
mdl = sm [ ' modelV2 ' ] . velocity . x [ 0 ] if len ( sm [ ' modelV2 ' ] . velocity . x ) else math . nan
err = CS . vEgo - mdl
msg = f " Speed Error: { err : .1f } m/s "
return NoEntryAlert ( msg , alert_text_1 = " Posenet Speed Invalid " )
msg = f " 速度误差: { err : .1f } 米/秒 "
return NoEntryAlert ( msg , alert_text_1 = " Posenet 速度无效 " )
def process_not_running_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
not_running = [ p . name for p in sm [ ' managerState ' ] . processes if not p . running and p . shouldBeRunning ]
msg = ' , ' . join ( not_running )
return NoEntryAlert ( msg , alert_text_1 = " Process Not Running " )
return NoEntryAlert ( msg , alert_text_1 = " 进程未运行 " )
def comm_issue_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
bs = [ s for s in sm . data . keys ( ) if not sm . all_checks ( [ s , ] ) ]
msg = ' , ' . join ( bs [ : 4 ] ) # can't fit too many on one line
return NoEntryAlert ( msg , alert_text_1 = " Communication Issue Between Processes " )
return NoEntryAlert ( msg , alert_text_1 = " 进程间通信问题 " )
def camera_malfunction_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
all_cams = ( ' roadCameraState ' , ' driverCameraState ' , ' wideRoadCameraState ' )
bad_cams = [ s . replace ( ' State ' , ' ' ) for s in all_cams if s in sm . data . keys ( ) and not sm . all_checks ( [ s , ] ) ]
return NormalPermanentAlert ( " Camera Malfunction " , ' , ' . join ( bad_cams ) )
return NormalPermanentAlert ( " 摄像头故障 " , ' , ' . join ( bad_cams ) )
def calibration_invalid_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
rpy = sm [ ' liveCalibration ' ] . rpyCalib
yaw = math . degrees ( rpy [ 2 ] if len ( rpy ) == 3 else math . nan )
pitch = math . degrees ( rpy [ 1 ] if len ( rpy ) == 3 else math . nan )
angles = f " Remount Device (Pitch: { pitch : .1f } °, Yaw : { yaw : .1f } °) "
return NormalPermanentAlert ( " Calibration Invalid " , angles )
angles = f " 请重新安装设备 (俯仰角: { pitch : .1f } °, 偏航角 : { yaw : .1f } °) "
return NormalPermanentAlert ( " 校准无效 " , angles )
def paramsd_invalid_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
if not sm [ ' liveParameters ' ] . angleOffsetValid :
angle_offset_deg = sm [ ' liveParameters ' ] . angleOffsetDeg
title = " Steering misalignment detected "
text = f " Angle offset too high (Offset : { angle_offset_deg : .1f } °) "
title = " 转向系统未对准 "
text = f " 角度偏移过大 (偏移量 : { angle_offset_deg : .1f } °) "
elif not sm [ ' liveParameters ' ] . steerRatioValid :
steer_ratio = sm [ ' liveParameters ' ] . steerRatio
title = " Steer ratio mismatch "
text = f " Steering rack geometry may be off (Ratio : { steer_ratio : .1f } ) "
title = " 转向传动比不匹配 "
text = f " 转向齿条几何可能不正确 (传动比 : { steer_ratio : .1f } ) "
elif not sm [ ' liveParameters ' ] . stiffnessFactorValid :
stiffness_factor = sm [ ' liveParameters ' ] . stiffnessFactor
title = " Abnormal tire stiffness "
text = f " Check tires, pressure, or alignment (Factor : { stiffness_factor : .1f } ) "
title = " 轮胎刚度异常 "
text = f " 请检查轮胎、胎压或定位 (系数 : { stiffness_factor : .1f } ) "
else :
return NoEntryAlert ( " paramsd Temporary Error " )
return NoEntryAlert ( " paramsd 临时错误 " )
return NoEntryAlert ( alert_text_1 = title , alert_text_2 = text )
@ -165,27 +165,27 @@ def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster,
cpu = max ( sm [ ' deviceState ' ] . cpuTempC , default = 0. )
gpu = max ( sm [ ' deviceState ' ] . gpuTempC , default = 0. )
temp = max ( ( cpu , gpu , sm [ ' deviceState ' ] . memoryTempC ) )
return NormalPermanentAlert ( " System Overheated " , f " { temp : .0f } °C " )
return NormalPermanentAlert ( " 系统过热 " , f " { temp : .0f } °C " )
def low_memory_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
return NormalPermanentAlert ( " Low Memory" , f " { sm [ ' deviceState ' ] . memoryUsagePercent } % used " )
return NormalPermanentAlert ( " 内存不足" , f " 已用 { sm [ ' deviceState ' ] . memoryUsagePercent } % " )
def high_cpu_usage_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
x = max ( sm [ ' deviceState ' ] . cpuUsagePercent , default = 0. )
return NormalPermanentAlert ( " High CPU Usage" , f " { x } % used " )
return NormalPermanentAlert ( " CPU使用率过高" , f " 已用 { x } % " )
def modeld_lagging_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
return NormalPermanentAlert ( " Driving Model Lagging" , f " { sm [ ' modelV2 ' ] . frameDropPerc : .1f } % frames dropped " )
return NormalPermanentAlert ( " 驾驶模型滞后" , f " 已丢帧 { sm [ ' modelV2 ' ] . frameDropPerc : .1f } % " )
def joystick_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
gb = sm [ ' carControl ' ] . actuators . accel / 4.
steer = sm [ ' carControl ' ] . actuators . torque
vals = f " Gas: { round ( gb * 100. ) } %, Steer : { round ( steer * 100. ) } % "
return NormalPermanentAlert ( " Joystick Mode " , vals )
vals = f " 油门: { round ( gb * 100. ) } %, 转向 : { round ( steer * 100. ) } % "
return NormalPermanentAlert ( " 操纵杆模式 " , vals )
def longitudinal_maneuver_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
@ -200,18 +200,25 @@ def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messagi
def personality_changed_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
personality = str ( personality ) . title ( )
return NormalPermanentAlert ( f " Driving Personality: { personality } " , duration = 1.5 )
personality_en = " "
if personality == " Aggressive " :
personality_en = " 激进 "
elif personality == " Standard " :
personality_en = " 标准 "
elif personality == " Relaxed " :
personality_en = " 舒适 "
return NormalPermanentAlert ( f " 驾驶风格: { personality_en } " , duration = 1.5 )
def invalid_lkas_setting_alert ( CP : car . CarParams , CS : car . CarState , sm : messaging . SubMaster , metric : bool , soft_disable_time : int , personality ) - > Alert :
text = " Toggle stock LKAS on or off to engage "
text = " 请切换原厂LKAS状态以启用 "
if CP . brand == " tesla " :
text = " Switch to Traffic-Aware Cruise Control to engage "
text = " 请切换到交通感知巡航控制以启用 "
elif CP . brand == " mazda " :
text = " Enable your car' s LKAS to engage "
text = " 请启用您的车辆LKAS以启用 "
elif CP . brand == " nissan " :
text = " Disable your car' s stock LKAS to engage "
return NormalPermanentAlert ( " Invalid LKAS setting " , text )
text = " 请禁用您的车辆原厂LKAS以启用 "
return NormalPermanentAlert ( " 无效的LKAS设置 " , text )
@ -225,21 +232,21 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . joystickDebug : {
ET . WARNING : joystick_alert ,
ET . PERMANENT : NormalPermanentAlert ( " Joystick Mode " ) ,
ET . PERMANENT : NormalPermanentAlert ( " 操纵杆模式 " ) ,
} ,
EventName . longitudinalManeuver : {
ET . WARNING : longitudinal_maneuver_alert ,
ET . PERMANENT : NormalPermanentAlert ( " Longitudinal Maneuver Mode " ,
" Ensure road ahead is clear " ) ,
ET . PERMANENT : NormalPermanentAlert ( " 纵向操作模式 " ,
" 确保前方道路畅通 " ) ,
} ,
EventName . selfdriveInitializing : {
ET . NO_ENTRY : NoEntryAlert ( " System Initializing " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 系统初始化中 " ) ,
} ,
EventName . startup : {
ET . PERMANENT : StartupAlert ( " Be ready to take over at any time " )
ET . PERMANENT : StartupAlert ( " 请随时准备接管您的车辆控制权 " )
} ,
EventName . startupMaster : {
@ -247,28 +254,28 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
} ,
EventName . startupNoControl : {
ET . PERMANENT : StartupAlert ( " Dashcam mode " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Dashcam mode " ) ,
ET . PERMANENT : StartupAlert ( " 仅行车记录仪模式 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 仅行车记录仪模式 " ) ,
} ,
EventName . startupNoCar : {
ET . PERMANENT : StartupAlert ( " Dashcam mode for unsupported car " ) ,
ET . PERMANENT : StartupAlert ( " 不支持车辆的行车记录仪模式 " ) ,
} ,
EventName . startupNoSecOcKey : {
ET . PERMANENT : NormalPermanentAlert ( " Dashcam Mode " ,
" Security Key Not Available " ,
ET . PERMANENT : NormalPermanentAlert ( " 仅行车记录仪模式 " ,
" 安全密钥不可用 " ,
priority = Priority . HIGH ) ,
} ,
EventName . dashcamMode : {
ET . PERMANENT : NormalPermanentAlert ( " Dashcam Mode " ,
ET . PERMANENT : NormalPermanentAlert ( " 行车记录仪模式 " ,
priority = Priority . LOWEST ) ,
} ,
EventName . invalidLkasSetting : {
ET . PERMANENT : invalid_lkas_setting_alert ,
ET . NO_ENTRY : NoEntryAlert ( " Invalid LKAS setting " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 车道保持辅助系统( LKAS) 设置无效 " ) ,
} ,
EventName . cruiseMismatch : {
@ -279,40 +286,40 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# read-only mode. This can be solved by adding your fingerprint.
# See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information
EventName . carUnrecognized : {
ET . PERMANENT : NormalPermanentAlert ( " Dashcam Mode " ,
" Car Unrecognized " ,
ET . PERMANENT : NormalPermanentAlert ( " 行车记录仪模式 " ,
" 车辆未识别 " ,
priority = Priority . LOWEST ) ,
} ,
EventName . aeb : {
ET . PERMANENT : Alert (
" BRAKE! " ,
" Emergency Braking: Risk of Collision " ,
" 刹车! " ,
" 紧急制动:可能发生碰撞 " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , VisualAlert . fcw , AudibleAlert . none , 2. ) ,
ET . NO_ENTRY : NoEntryAlert ( " AEB : Risk of Collision " ) ,
ET . NO_ENTRY : NoEntryAlert ( " AEB :可能发生碰撞 " ) ,
} ,
EventName . stockAeb : {
ET . PERMANENT : Alert (
" BRAKE! " ,
" Stock AEB: Risk of Collision " ,
" 刹车! " ,
" 原厂AEB: 可能发生碰撞 " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , VisualAlert . fcw , AudibleAlert . none , 2. ) ,
ET . NO_ENTRY : NoEntryAlert ( " Stock AEB: Risk of Collision " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 原厂AEB: 可能发生碰撞 " ) ,
} ,
EventName . fcw : {
ET . PERMANENT : Alert (
" BRAKE! " ,
" Risk of Collision " ,
" 刹车! " ,
" 可能发生碰撞 " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , VisualAlert . fcw , AudibleAlert . warningSoft , 2. ) ,
} ,
EventName . ldw : {
ET . PERMANENT : Alert (
" Lane Departure Detected " ,
" 监测偏离车道 " ,
" " ,
AlertStatus . userPrompt , AlertSize . small ,
Priority . LOW , VisualAlert . ldw , AudibleAlert . prompt , 3. ) ,
@ -322,7 +329,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . steerTempUnavailableSilent : {
ET . WARNING : Alert (
" Steering Temporarily Unavailable " ,
" 转向暂时不可用 " ,
" " ,
AlertStatus . userPrompt , AlertSize . small ,
Priority . LOW , VisualAlert . steerRequired , AudibleAlert . prompt , 1.8 ) ,
@ -330,7 +337,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . preDriverDistracted : {
ET . PERMANENT : Alert (
" Pay Attention " ,
" 请注意 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , .1 ) ,
@ -338,23 +345,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . promptDriverDistracted : {
ET . PERMANENT : Alert (
" Pay Attention " ,
" Driver Distracted " ,
" 请注意 " ,
" 驾驶员分心 " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . MID , VisualAlert . steerRequired , AudibleAlert . promptDistracted , .1 ) ,
} ,
EventName . driverDistracted : {
ET . PERMANENT : Alert (
" DISENGAGE IMMEDIATELY " ,
" Driver Distracted " ,
" 立即解除控制 " ,
" 驾驶员分心 " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGH , VisualAlert . steerRequired , AudibleAlert . warningImmediate , .1 ) ,
} ,
EventName . preDriverUnresponsive : {
ET . PERMANENT : Alert (
" Touch Steering Wheel: No Face Detected " ,
" 触摸方向盘:未检测到面部 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , VisualAlert . steerRequired , AudibleAlert . none , .1 ) ,
@ -362,31 +369,31 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . promptDriverUnresponsive : {
ET . PERMANENT : Alert (
" Touch Steering Wheel " ,
" Driver Unresponsive " ,
" 触摸方向盘 " ,
" 驾驶员无响应 " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . MID , VisualAlert . steerRequired , AudibleAlert . promptDistracted , .1 ) ,
} ,
EventName . driverUnresponsive : {
ET . PERMANENT : Alert (
" DISENGAGE IMMEDIATELY " ,
" Driver Unresponsive " ,
" 立即解除控制 " ,
" 驾驶员无响应 " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGH , VisualAlert . steerRequired , AudibleAlert . warningImmediate , .1 ) ,
} ,
EventName . manualRestart : {
ET . WARNING : Alert (
" TAKE CONTROL " ,
" Resume Driving Manually " ,
" 接管控制 " ,
" 请手动继续驾驶 " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , .2 ) ,
} ,
EventName . resumeRequired : {
ET . WARNING : Alert (
" Press Resume to Exit Standstill " ,
" 按恢复键以解除停止状态 " ,
" " ,
AlertStatus . userPrompt , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , .2 ) ,
@ -398,7 +405,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . preLaneChangeLeft : {
ET . WARNING : Alert (
" Steer Left to Start Lane Change Once Safe " ,
" 请确认安全后进行左转变道 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , .1 ) ,
@ -406,7 +413,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . preLaneChangeRight : {
ET . WARNING : Alert (
" Steer Right to Start Lane Change Once Safe " ,
" 请确认安全后进行右转变道 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , .1 ) ,
@ -414,7 +421,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . laneChangeBlocked : {
ET . WARNING : Alert (
" Car Detected in Blindspot " ,
" 盲点检测到车辆 " ,
" " ,
AlertStatus . userPrompt , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . prompt , .1 ) ,
@ -422,7 +429,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . laneChange : {
ET . WARNING : Alert (
" Changing Lanes " ,
" 正在变道 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , .1 ) ,
@ -430,41 +437,41 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . steerSaturated : {
ET . WARNING : Alert (
" Take Control " ,
" Turn Exceeds Steering Limit " ,
" 请接管控制 " ,
" 转向超出限制 " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , VisualAlert . steerRequired , AudibleAlert . promptRepeat , 2. ) ,
} ,
# Thrown when the fan is driven at >50% but is not rotating
EventName . fanMalfunction : {
ET . PERMANENT : NormalPermanentAlert ( " Fan Malfunction" , " Likely Hardware Issue " ) ,
ET . PERMANENT : NormalPermanentAlert ( " 风扇故障" , " 可能是硬件问题 " ) ,
} ,
# Camera is not outputting frames
EventName . cameraMalfunction : {
ET . PERMANENT : camera_malfunction_alert ,
ET . SOFT_DISABLE : soft_disable_alert ( " Camera Malfunction " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Camera Malfunction: Reboot Your Device " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 摄像头故障 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 摄像头故障:请重启设备 " ) ,
} ,
# Camera framerate too low
EventName . cameraFrameRate : {
ET . PERMANENT : NormalPermanentAlert ( " Camera Frame Rate Low" , " Reboot your Device " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " Camera Frame Rate Low " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Camera Frame Rate Low: Reboot Your Device " ) ,
ET . PERMANENT : NormalPermanentAlert ( " 摄像头帧率低" , " 请重启设备 " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 摄像头帧率低 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 摄像头帧率低:请重启设备 " ) ,
} ,
# Unused
EventName . locationdTemporaryError : {
ET . NO_ENTRY : NoEntryAlert ( " locationd Temporary Error " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " locationd Temporary Error " ) ,
ET . NO_ENTRY : NoEntryAlert ( " locationd 临时错误 " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " locationd 临时错误 " ) ,
} ,
EventName . locationdPermanentError : {
ET . NO_ENTRY : NoEntryAlert ( " locationd Permanent Error " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " locationd Permanent Error " ) ,
ET . PERMANENT : NormalPermanentAlert ( " locationd Permanent Error " ) ,
ET . NO_ENTRY : NoEntryAlert ( " locationd 永久错误 " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " locationd 永久错误 " ) ,
ET . PERMANENT : NormalPermanentAlert ( " locationd 永久错误 " ) ,
} ,
# openpilot tries to learn certain parameters about your car by observing
@ -477,13 +484,13 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# bad alignment or bad sensor data. If this happens consistently consider creating an issue on GitHub
EventName . paramsdTemporaryError : {
ET . NO_ENTRY : paramsd_invalid_alert ,
ET . SOFT_DISABLE : soft_disable_alert ( " paramsd Temporary Error " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " paramsd 临时错误 " ) ,
} ,
EventName . paramsdPermanentError : {
ET . NO_ENTRY : NoEntryAlert ( " paramsd Permanent Error " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " paramsd Permanent Error " ) ,
ET . PERMANENT : NormalPermanentAlert ( " paramsd Permanent Error " ) ,
ET . NO_ENTRY : NoEntryAlert ( " paramsd 永久错误 " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " paramsd 永久错误 " ) ,
ET . PERMANENT : NormalPermanentAlert ( " paramsd 永久错误 " ) ,
} ,
# ********** events that affect controls state transitions **********
@ -502,12 +509,12 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . buttonCancel : {
ET . USER_DISABLE : EngagementAlert ( AudibleAlert . disengage ) ,
ET . NO_ENTRY : NoEntryAlert ( " Cancel Pressed " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 取消按钮被按下 " ) ,
} ,
EventName . brakeHold : {
ET . WARNING : Alert (
" Press Resume to Exit Brake Hold " ,
" 按恢复键以解除制动保持 " ,
" " ,
AlertStatus . userPrompt , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , .2 ) ,
@ -515,23 +522,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . parkBrake : {
ET . USER_DISABLE : EngagementAlert ( AudibleAlert . disengage ) ,
ET . NO_ENTRY : NoEntryAlert ( " Parking Brake Engaged " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 停车制动已启用 " ) ,
} ,
EventName . pedalPressed : {
ET . USER_DISABLE : EngagementAlert ( AudibleAlert . disengage ) ,
ET . NO_ENTRY : NoEntryAlert ( " Pedal Pressed " ,
ET . NO_ENTRY : NoEntryAlert ( " 踏板被按下 " ,
visual_alert = VisualAlert . brakePressed ) ,
} ,
EventName . steerDisengage : {
ET . USER_DISABLE : EngagementAlert ( AudibleAlert . disengage ) ,
ET . NO_ENTRY : NoEntryAlert ( " Steering Pressed " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 方向盘被转动 " ) ,
} ,
EventName . preEnableStandstill : {
ET . PRE_ENABLE : Alert (
" Release Brake to Engage " ,
" 释放制动以启用 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOWEST , VisualAlert . none , AudibleAlert . none , .1 , creation_delay = 1. ) ,
@ -559,27 +566,27 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
} ,
EventName . resumeBlocked : {
ET . NO_ENTRY : NoEntryAlert ( " Press Set to Engage " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 请按设定键以启用 " ) ,
} ,
EventName . wrongCruiseMode : {
ET . USER_DISABLE : EngagementAlert ( AudibleAlert . disengage ) ,
ET . NO_ENTRY : NoEntryAlert ( " Adaptive Cruise Disabled " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 自适应巡航已禁用 " ) ,
} ,
EventName . steerTempUnavailable : {
ET . SOFT_DISABLE : soft_disable_alert ( " Steering Temporarily Unavailable " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Steering Temporarily Unavailable " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 转向暂时不可用 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 转向暂时不可用 " ) ,
} ,
EventName . steerTimeLimit : {
ET . SOFT_DISABLE : soft_disable_alert ( " Vehicle Steering Time Limit " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Vehicle Steering Time Limit " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 车辆转向时间限制 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 车辆转向时间限制 " ) ,
} ,
EventName . outOfSpace : {
ET . PERMANENT : out_of_space_alert ,
ET . NO_ENTRY : NoEntryAlert ( " Out of Storage " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 出库 " ) ,
} ,
EventName . belowEngageSpeed : {
@ -588,19 +595,19 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . sensorDataInvalid : {
ET . PERMANENT : Alert (
" Sensor Data Invalid " ,
" Possible Hardware Issue " ,
" 传感器数据无效 " ,
" 可能是硬件问题 " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOWER , VisualAlert . none , AudibleAlert . none , .2 , creation_delay = 1. ) ,
ET . NO_ENTRY : NoEntryAlert ( " Sensor Data Invalid " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " Sensor Data Invalid " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 传感器数据无效 " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 传感器数据无效 " ) ,
} ,
EventName . noGps : {
} ,
EventName . tooDistracted : {
ET . NO_ENTRY : NoEntryAlert ( " Distraction Level Too High " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 注意力分散程度过高 " ) ,
} ,
EventName . excessiveActuation : {
@ -610,13 +617,13 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
EventName . overheat : {
ET . PERMANENT : overheat_alert ,
ET . SOFT_DISABLE : soft_disable_alert ( " System Overheated " ) ,
ET . NO_ENTRY : NoEntryAlert ( " System Overheated " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 系统过热 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 系统过热 " ) ,
} ,
EventName . wrongGear : {
ET . SOFT_DISABLE : user_soft_disable_alert ( " Gear not D " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Gear not D " ) ,
ET . SOFT_DISABLE : user_soft_disable_alert ( " 挡位不在D挡 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 挡位不在D挡 " ) ,
} ,
# This alert is thrown when the calibration angles are outside of the acceptable range.
@ -626,40 +633,40 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# See https://comma.ai/setup for more information
EventName . calibrationInvalid : {
ET . PERMANENT : calibration_invalid_alert ,
ET . SOFT_DISABLE : soft_disable_alert ( " Calibration Invalid: Remount Device & Recalibrate " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Calibration Invalid: Remount Device & Recalibrate " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 校准无效:重新安装设备并重新校准 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 校准无效:重新安装设备并重新校准 " ) ,
} ,
EventName . calibrationIncomplete : {
ET . PERMANENT : calibration_incomplete_alert ,
ET . SOFT_DISABLE : soft_disable_alert ( " Calibration Incomplete " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Calibration in Progress " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 校准未完成 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 校准进行中 " ) ,
} ,
EventName . calibrationRecalibrating : {
ET . PERMANENT : calibration_incomplete_alert ,
ET . SOFT_DISABLE : soft_disable_alert ( " Device Remount Detected: Recalibrating " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Remount Detected: Recalibrating " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 设备重新安装检测到:重新校准中 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 设备重新安装检测到:重新校准中 " ) ,
} ,
EventName . doorOpen : {
ET . SOFT_DISABLE : user_soft_disable_alert ( " Door Open " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Door Open " ) ,
ET . SOFT_DISABLE : user_soft_disable_alert ( " 车门开启 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 车门开启 " ) ,
} ,
EventName . seatbeltNotLatched : {
ET . SOFT_DISABLE : user_soft_disable_alert ( " Seatbelt Unlatched " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Seatbelt Unlatched " ) ,
ET . SOFT_DISABLE : user_soft_disable_alert ( " 安全带未系 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 安全带未系 " ) ,
} ,
EventName . espDisabled : {
ET . SOFT_DISABLE : soft_disable_alert ( " Electronic Stability Control Disabled " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Electronic Stability Control Disabled " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 电子稳定控制系统已禁用 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 电子稳定控制系统已禁用 " ) ,
} ,
EventName . lowBattery : {
ET . SOFT_DISABLE : soft_disable_alert ( " Low Battery " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Low Battery " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 电池电量低 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 电池电量低 " ) ,
} ,
# Different openpilot services communicate between each other at a certain
@ -667,41 +674,41 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# is thrown. This can mean a service crashed, did not broadcast a message for
# ten times the regular interval, or the average interval is more than 10% too high.
EventName . commIssue : {
ET . SOFT_DISABLE : soft_disable_alert ( " Communication Issue Between Processes " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 进程间通信问题 " ) ,
ET . NO_ENTRY : comm_issue_alert ,
} ,
EventName . commIssueAvgFreq : {
ET . SOFT_DISABLE : soft_disable_alert ( " Low Communication Rate Between Processes " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Low Communication Rate Between Processes " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 进程间通信速率低 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 进程间通信速率低 " ) ,
} ,
EventName . selfdrivedLagging : {
ET . SOFT_DISABLE : soft_disable_alert ( " System Lagging " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Selfdrive Process Lagging: Reboot Your Device " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 系统滞后 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 自驾车进程滞后:请重启设备 " ) ,
} ,
# Thrown when manager detects a service exited unexpectedly while driving
EventName . processNotRunning : {
ET . NO_ENTRY : process_not_running_alert ,
ET . SOFT_DISABLE : soft_disable_alert ( " Process Not Running " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 进程未运行 " ) ,
} ,
EventName . radarFault : {
ET . SOFT_DISABLE : soft_disable_alert ( " Radar Error: Restart the Car " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Radar Error: Restart the Car " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 雷达错误:请重启车辆 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 雷达错误:请重启车辆 " ) ,
} ,
EventName . radarTempUnavailable : {
ET . SOFT_DISABLE : soft_disable_alert ( " Radar Temporarily Unavailable " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Radar Temporarily Unavailable " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 雷达暂时不可用 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 雷达暂时不可用 " ) ,
} ,
# Every frame from the camera should be processed by the model. If modeld
# is not processing frames fast enough they have to be dropped. This alert is
# thrown when over 20% of frames are dropped.
EventName . modeldLagging : {
ET . SOFT_DISABLE : soft_disable_alert ( " Driving Model Lagging " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Driving Model Lagging " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 驾驶模型滞后 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 驾驶模型滞后 " ) ,
ET . PERMANENT : modeld_lagging_alert ,
} ,
@ -711,45 +718,45 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# usually means the model has trouble understanding the scene. This is used
# as a heuristic to warn the driver.
EventName . posenetInvalid : {
ET . SOFT_DISABLE : soft_disable_alert ( " Posenet Speed Invalid " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " Posenet 速度无效 " ) ,
ET . NO_ENTRY : posenet_invalid_alert ,
} ,
# When the localizer detects an acceleration of more than 40 m/s^2 (~4G) we
# alert the driver the device might have fallen from the windshield.
EventName . deviceFalling : {
ET . SOFT_DISABLE : soft_disable_alert ( " Device Fell Off Mount " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Device Fell Off Mount " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 设备从支架掉落 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 设备从支架掉落 " ) ,
} ,
EventName . lowMemory : {
ET . SOFT_DISABLE : soft_disable_alert ( " Low Memory: Reboot Your Device " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 内存不足:请重启设备 " ) ,
ET . PERMANENT : low_memory_alert ,
ET . NO_ENTRY : NoEntryAlert ( " Low Memory: Reboot Your Device " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 内存不足:请重启设备 " ) ,
} ,
EventName . accFaulted : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " Cruise Fault: Restart the Car " ) ,
ET . PERMANENT : NormalPermanentAlert ( " Cruise Fault: Restart the car to engage " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Cruise Fault: Restart the Car " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " 巡航故障:请重启车辆 " ) ,
ET . PERMANENT : NormalPermanentAlert ( " 巡航故障:重启车辆以启用 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 巡航故障:请重启车辆 " ) ,
} ,
EventName . espActive : {
ET . SOFT_DISABLE : soft_disable_alert ( " Electronic Stability Control Active " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Electronic Stability Control Active " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " 电子稳定控制系统激活中 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 电子稳定控制系统激活中 " ) ,
} ,
EventName . controlsMismatch : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " Controls Mismatch " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Controls Mismatch " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " 控制不匹配 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 控制不匹配 " ) ,
} ,
# Sometimes the USB stack on the device can get into a bad state
# causing the connection to the panda to be lost
EventName . usbError : {
ET . SOFT_DISABLE : soft_disable_alert ( " USB Error: Reboot Your Device " ) ,
ET . PERMANENT : NormalPermanentAlert ( " USB Error: Reboot Your Device " ) ,
ET . NO_ENTRY : NoEntryAlert ( " USB Error: Reboot Your Device " ) ,
ET . SOFT_DISABLE : soft_disable_alert ( " USB 错误:请重启设备 " ) ,
ET . PERMANENT : NormalPermanentAlert ( " USB 错误:请重启设备 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " USB 错误:请重启设备 " ) ,
} ,
# This alert can be thrown for the following reasons:
@ -757,45 +764,45 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# - CAN data is received, but some message are not received at the right frequency
# If you're not writing a new car port, this is usually cause by faulty wiring
EventName . canError : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " CAN Error " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " CAN 总线错误 " ) ,
ET . PERMANENT : Alert (
" CAN Error: Check Connections " ,
" CAN 总线错误:请检查连接 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , 1. , creation_delay = 1. ) ,
ET . NO_ENTRY : NoEntryAlert ( " CAN Error: Check Connections " ) ,
ET . NO_ENTRY : NoEntryAlert ( " CAN 总线错误:请检查连接 " ) ,
} ,
EventName . canBusMissing : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " CAN Bus Disconnected " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " CAN 总线断开连接 " ) ,
ET . PERMANENT : Alert (
" CAN Bus Disconnected: Likely Faulty Cable " ,
" CAN 总线断开连接:可能电缆故障 " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , VisualAlert . none , AudibleAlert . none , 1. , creation_delay = 1. ) ,
ET . NO_ENTRY : NoEntryAlert ( " CAN Bus Disconnected: Check Connections " ) ,
ET . NO_ENTRY : NoEntryAlert ( " CAN 总线断开连接:请检查连接 " ) ,
} ,
EventName . steerUnavailable : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " LKAS Fault: Restart the Car " ) ,
ET . PERMANENT : NormalPermanentAlert ( " LKAS Fault: Restart the car to engage " ) ,
ET . NO_ENTRY : NoEntryAlert ( " LKAS Fault: Restart the Car " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " LKAS 故障:请重启车辆 " ) ,
ET . PERMANENT : NormalPermanentAlert ( " LKAS 故障:重启车辆以启用 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " LKAS 故障:请重启车辆 " ) ,
} ,
EventName . reverseGear : {
ET . PERMANENT : Alert (
" Reverse\n Gear " ,
" 倒车中 " ,
" " ,
AlertStatus . normal , AlertSize . full ,
Priority . LOWEST , VisualAlert . none , AudibleAlert . none , .2 , creation_delay = 0.5 ) ,
ET . USER_DISABLE : ImmediateDisableAlert ( " Reverse Gear " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Reverse Gear " ) ,
ET . USER_DISABLE : ImmediateDisableAlert ( " 倒档 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 倒档 " ) ,
} ,
# On cars that use stock ACC the car can decide to cancel ACC for various reasons.
# When this happens we can no long control the car so the user needs to be warned immediately.
EventName . cruiseDisabled : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " Cruise Is Off " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " 巡航已关闭 " ) ,
} ,
# When the relay in the harness box opens the CAN bus between the LKAS camera
@ -803,15 +810,15 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# are received on the car side this usually means the relay hasn't opened correctly
# and this alert is thrown.
EventName . relayMalfunction : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " Harness Relay Malfunction " ) ,
ET . PERMANENT : NormalPermanentAlert ( " Harness Relay Malfunction" , " Check Hardware " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Harness Relay Malfunction " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " 线束继电器故障 " ) ,
ET . PERMANENT : NormalPermanentAlert ( " 线束继电器故障" , " 检查硬件 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 线束继电器故障 " ) ,
} ,
EventName . speedTooLow : {
ET . IMMEDIATE_DISABLE : Alert (
" openpilot Canceled " ,
" Speed too low " ,
" openpilot 已取消 " ,
" 速度过低 " ,
AlertStatus . normal , AlertSize . mid ,
Priority . HIGH , VisualAlert . none , AudibleAlert . disengage , 3. ) ,
} ,
@ -819,17 +826,17 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
# When the car is driving faster than most cars in the training data, the model outputs can be unpredictable.
EventName . speedTooHigh : {
ET . WARNING : Alert (
" Speed Too High " ,
" Model uncertain at this speed " ,
" 速度过高 " ,
" 在此速度下模型不稳定 " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . HIGH , VisualAlert . steerRequired , AudibleAlert . promptRepeat , 4. ) ,
ET . NO_ENTRY : NoEntryAlert ( " Slow down to engage " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 减速以进行接合 " ) ,
} ,
EventName . vehicleSensorsInvalid : {
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " Vehicle Sensors Invalid " ) ,
ET . PERMANENT : NormalPermanentAlert ( " Vehicle Sensors Calibrating" , " Drive to Calibrate " ) ,
ET . NO_ENTRY : NoEntryAlert ( " Vehicle Sensors Calibrating " ) ,
ET . IMMEDIATE_DISABLE : ImmediateDisableAlert ( " 车辆传感器无效 " ) ,
ET . PERMANENT : NormalPermanentAlert ( " 车辆传感器校准中" , " 行驶以校准 " ) ,
ET . NO_ENTRY : NoEntryAlert ( " 车辆传感器校准中 " ) ,
} ,
EventName . personalityChanged : {
@ -837,7 +844,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
} ,
EventName . userBookmark : {
ET . PERMANENT : NormalPermanentAlert ( " Bookmark Saved " , duration = 1.5 ) ,
ET . PERMANENT : NormalPermanentAlert ( " 书签已保存 " , duration = 1.5 ) ,
} ,
EventName . audioFeedback : {